"FltStartFiltering has not been called" 尝试在 DriverEntry 中附加卷时出错
"FltStartFiltering has not been called" Error of trying to attach a volume in DriverEntry
我试图在驱动程序服务启动时附加卷,但我得到“过滤器尚未准备好附加到卷,因为它尚未完成初始化(尚未调用 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);
}
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)。 ”,然后我立即出现蓝屏。我已经调用了 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);
}
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。
祝你好运。