我在文件系统过滤器驱动程序中使用下一个EvtIoWrite回调函数:
VOID
MyDriverEvtIoWrite(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t UnusedLength
)
{
WDFFILEOBJECT file;
file = WdfRequestGetFileObject(Request);
if (file != NULL)
{
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "File is not null!\n"));
}
}
我得到了永远的null文件对象,从未看到“文件不为空!”信息。为什么呢?
根据WdfRequestGetFileObject method
返回值
WdfRequestGetFileObject返回框架文件对象的句柄, 如果框架已为指定的请求创建了文件对象。 否则,此方法返回NULL。 (司机通常会测试一个 仅当NULL设置WdfFileObjectCanBeOptional位时才返回NULL WDF_FILEOBJECT_CONFIG结构中的标志。)如果发生错误检查 驱动程序提供无效的对象句柄。备注
WdfRequestGetFileObject方法返回NULL,如果:
您的驱动程序>没有调用WdfDeviceInitSetFileObjectConfig并指定了一个 WDF_FILEOBJECT_CLASS值导致框架创建文件 对象。
另一个驱动程序发送了读取,写入或I / O控制请求 没有先发送请求类型的驱动程序 WdfRequestTypeCreate。
但我尊重这个规则。这里是MyDriverEvtDeviceAdd函数。
NTSTATUS
MyDriverEvtDeviceAdd(
IN WDFDRIVER Driver,
IN PWDFDEVICE_INIT DeviceInit
)
{
WDF_FILEOBJECT_CONFIG_INIT(
&fileConfig,
AAVolProcessFileCreate,
WDF_NO_EVENT_CALLBACK,
WDF_NO_EVENT_CALLBACK // not interested in Cleanup
);
fileConfig.FileObjectClass = WdfFileObjectWdfCanUseFsContext;
WDF_OBJECT_ATTRIBUTES attributes;
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
WdfDeviceInitSetFileObjectConfig(DeviceInit,
&fileConfig,
&attributes);
}