如果我使用代码
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因其不符合标准而臭名昭著。