最后从C和C2220返回状态



如果我使用代码

NTSTATUS
Register (_In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType)
{
    NTSTATUS status = STATUS_FLT_DO_NOT_ATTACH;
    try {
        if (VolumeFilesystemType != FLT_FSTYPE_NTFS) {
            status = STATUS_NOT_SUPPORTED;
            leave;
        }
        ...
    }
    finally {
        if (!NT_SUCCESS(status)) {
            KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "AAFileFilter!Failed to register with status: %xn", status));
            return STATUS_FLT_DO_NOT_ATTACH;
        }
        else
        {
            return  STATUS_SUCCESS;
        }
    }
}

我得到C2220警告C4532。如果我将代码更改为

...
    finally {
        if (!NT_SUCCESS(status)) {
            KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "AAFileFilter!Failed to register with status: %xn", status));
        }
    }
    if (NT_SUCCESS(status)) 
    {
        return STATUS_SUCCESS;
    }
    else
    {
        return STATUS_FLT_DO_NOT_ATTACH;
    }
}
  • 警告了. .不明白是什么原因?在这两种情况下,代码应该完全相同。(我在C中使用VS2013与WindowsKernelModeDriver8.1项目)

使用return语句或longjmp运行时函数退出try-finally语句被认为是异常终止。您可能会得到一个警告,警告被视为错误。

p。微软对C语言的支持简直是垃圾

你得到编译器错误的最有可能的原因是因为这不是有效的c。

  • try在C中不存在(但在c++, Java, c#中)。
  • finally在C中不存在(但在Java, c#中)。
  • leave;是无效的C,除非这是一些宏你还没有发布。
  • 自1999年以来,返回值而不包含返回语句的函数在C中是无效的。他们很愚蠢,因为c的发明。

您可能必须启用非标准语言扩展,或者切换到严格符合的C编译器。Visual Studio因其不符合标准而臭名昭著。

相关内容

  • 没有找到相关文章

最新更新