我正在使用代码作为
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: %x\n", status));
return STATUS_FLT_DO_NOT_ATTACH;
}
else
{
return STATUS_SUCCESS;
}
}
}
我得到了 C2220对于 warning C4532 .如果我将代码更改为
...
finally {
if (!NT_SUCCESS(status)) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "AAFileFilter!Failed to register with status: %x\n", status));
}
}
if (NT_SUCCESS(status))
{
return STATUS_SUCCESS;
}
else
{
return STATUS_FLT_DO_NOT_ATTACH;
}
}
- 警告消失.. 不明白这是什么原因?在这两种情况下,代码对我来说应该完全一样。 (我在 C 中使用 VS2013 和 WindowsKernelModeDriver8.1 项目)
最佳答案
使用 return 语句或 longjmp 运行时函数退出 try-finally 语句被视为异常终止。您可能会收到有关此的警告,并且警告被视为错误。
附言。 Microsoft 对 C 的支持很糟糕。
关于c - 最后从 C 和 C2220 返回状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24242437/