“未调用 FltStartFiltering”尝试在 DriverEntry 中附加卷的错误
Posted
技术标签:
【中文标题】“未调用 FltStartFiltering”尝试在 DriverEntry 中附加卷的错误【英文标题】:"FltStartFiltering has not been called" Error of trying to attach a volume in DriverEntry 【发布时间】:2018-06-03 16:22:03 【问题描述】:我尝试在驱动程序服务启动时附加卷,但我得到“过滤器尚未准备好附加到卷,因为它尚未完成初始化(尚未调用 FltStartFiltering)。 “然后我立即蓝屏。我已经调用了 FltStartFiltering 但我不知道为什么它不起作用。
下面是我的代码:
status = FltRegisterFilter(DriverObject,
&FilterRegistration,
&MiniSpyData.Filter);
if (!NT_SUCCESS(status))
leave;
status = FltBuildDefaultSecurityDescriptor(&sd,
FLT_PORT_ALL_ACCESS);
if (!NT_SUCCESS(status))
leave;
RtlInitUnicodeString(&uniString, WOODY_PORT_NAME);
InitializeObjectAttributes(&oa,
&uniString,
OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
NULL,
sd);
status = FltCreateCommunicationPort(MiniSpyData.Filter,
&MiniSpyData.ServerPort,
&oa,
NULL,
SpyConnect,
SpyDisconnect,
SpyMessage,
1);
FltFreeSecurityDescriptor(sd);
if (!NT_SUCCESS(status))
leave;
//
// We are now ready to start filtering
//
status = FltStartFiltering(MiniSpyData.Filter);
if (!NT_SUCCESS(status))
FltUnregisterFilter(MiniSpyData.Filter);
else
//Here is what I want to attach
RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1");
PFLT_VOLUME vol;
FltGetVolumeFromName(&MiniSpyData.Filter, &uniString, &vol);
status = FltAttachVolume(&MiniSpyData.Filter, vol, NULL, NULL);
【问题讨论】:
调用中的FltGetVolumeFromName
和FltAttachVolume
不能是&MiniSpyData.Filter
,而是MiniSpyData.Filter
- 如果出现致命错误。也作为一般说明 - 你称之为FltAttachVolume
? fltmgr 自动将过滤器附加到现有卷
非常感谢!这是我的错。现在它可以工作了...如果我重新启动 PC,过滤器驱动程序将不会附加。我检查了服务,它确实在运行......
除非我调用 FltAttachVolume() ...但是如果我在 DriverEntry 中调用 FltAttachVolume(),它可以附加一次服务加载,但几秒钟后又蓝屏了。我需要检查再次编码...感谢您的帮助
过滤器驱动程序不会附加必须自动附加,除非它不是 xp/2000。 The filter manager automatically notifies a minifilter driver about an available volume by calling its InstanceSetupCallback routine on the first create operation after the volume is mounted.
【参考方案1】:
RtlInitUnicodeString(&uniString, L"\\Device\\HarddiskVolume1");
PFLT_VOLUME vol;
FltGetVolumeFromName(&MiniSpyData.Filter, &uniString, &vol);
status = FltAttachVolume(&MiniSpyData.Filter, vol, NULL, NULL);
上面的部分根本不需要并且也是错误的。 让我解释一下:
-
FltGetVolumeFromName 例程将 PFLT_FILTER 作为第一个参数,根据我在您的代码中看到的内容,您给它一个 PFLT_FILTER*
您不需要手动附加到卷,因为您将自动附加并在您的实例上下文中被调用,除非您在实例上下文注册标志中设置 FLTFL_INSTANCE_SETUP_MANUAL_ATTACHMENT。详情请参阅this。
您不希望在启动期间执行此操作,因为卷可能还不存在,因此您可能会出现 BSOD。
祝你好运。
【讨论】:
以上是关于“未调用 FltStartFiltering”尝试在 DriverEntry 中附加卷的错误的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 Swift 的“尝试”?导致“尝试的结果?未使用”? [复制]