[适用于 KMDF 和 UMDF]
WdfIoTargetWdmGetTargetFileHandle 方法返回与指定远程 I/O 目标关联的文件的句柄。
语法
HANDLE WdfIoTargetWdmGetTargetFileHandle(
[in] WDFIOTARGET IoTarget
);
参数
[in] IoTarget
远程 I/O 目标对象的句柄。 此句柄是从上一次调用 WdfIoTargetCreate获取的。
返回值
如果驱动程序在调用 WdfIoTargetOpen时指定了对象名称,WdfIoTargetWdmGetTargetFileHandle 返回与指定 I/O 目标关联的文件句柄。 否则,WdfIoTargetWdmGetTargetFileHandle 返回 NULL。
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
注解
对于 KMDF,返回的文件句柄是在任意线程上下文中有效的内核模式句柄。 有关驱动程序如何使用此文件句柄的信息,请参阅 使用文件句柄。
WdfIoTargetWdmGetTargetFileHandle 方法返回的文件句柄有效,直到驱动程序调用 WdfIoTargetClose 或 WdfIoTargetCloseForQueryRemove,或删除远程 I/O 目标对象为止。 如果驱动程序为远程 I/O 目标对象提供 EvtCleanupCallback 函数,并且如果在关闭远程 I/O 目标之前删除该对象,指针将有效,直到 EvtCleanupCallback 函数返回。
如果驱动程序在删除 WDM 设备对象后尝试访问该对象,驱动程序可能会导致系统崩溃。 toastmon 示例演示了驱动程序如何提供 EvtIoTargetQueryRemove 回调函数,以便在删除 I/O 目标时收到通知。
对于 UMDF,WdfIoTargetWdmGetTargetFileHandle 仅返回在当前进程中有效的 Win32 HANDLE。 旧版 UMDF 驱动程序(版本 1.x) 调用 IWDFDevice::RetrieveDeviceName 以获取基础内核模式设备的名称,然后使用 createFile打开句柄。 然后,驱动程序可以使用 DeviceIoControl将 I/O 直接发送到较低设备。 从 UMDF 2.15 开始,UMDF v2 驱动程序可以通过文件(WDF_IO_TARGET_OPEN_PARAMS_INIT_OPEN_BY_FILE)打开本地 I/O 目标,并使用 WdfIoTargetWdmGetTargetFileHandle检索文件句柄。 当远程目标关闭或删除时,框架将打开并关闭文件句柄。 文件句柄在上述 WdfIoTargetWdmGetTargetFileHandle 协定内保持有效。
警告
如果 UMDF v2 驱动程序调用 WdfIoTargetWdmGetTargetFileHandle 从使用 WDF_IO_TARGET_OPEN_PARAMS_INIT_OPEN_BY_FILE打开的远程目标获取 Win32 句柄,请不要使用 DeviceIoControl等 API 提交重叠/异步 I/O。 这样做可能会使托管驱动程序的进程崩溃。 如果驱动程序必须提交重叠的 I/O,则它还必须设置 OVERLAPPED 结构的 hEvent 成员的低序位。 这是因为框架在内部将句柄绑定到 I/O 完成端口。 设置低序位的有效事件句柄使 I/O 完成不排队到完成端口。
有关 WdfIoTargetWdmGetTargetFileHandle的详细信息,请参阅 获取有关常规 I/O 目标的信息。
有关 I/O 目标的详细信息,请参阅 使用 I/O 目标。
例子
下面的代码示例获取与指定远程 I/O 目标关联的文件的句柄。
HANDLE h;
h = WdfIoTargetWdmGetTargetFileHandle(IoTarget);
旧版 UMDF 驱动程序(版本 1.x) 调用 IWDFDevice::RetrieveDeviceName 以获取基础内核模式设备的名称,然后使用 CreateFile打开句柄。 然后,驱动程序使用 DeviceIoControl将 I/O 直接发送到设备。
从 UMDF 2.15 开始,驱动程序按文件打开本地 I/O 目标并检索其句柄。 框架打开并关闭文件句柄。 文件句柄在 WdfIoTargetWdmGetTargetFileHandle的协定内保持有效。
NTSTATUS status;
WDF_IO_TARGET_OPEN_PARAMS params;
WDFIOTARGET ioTarget = NULL;
HANDLE handle = NULL;
status = WdfIoTargetCreate(Device, &attr, &ioTarget);
if (!NT_SUCCESS(status)) {
// error handling
}
WDF_IO_TARGET_OPEN_PARAMS_INIT_OPEN_BY_FILE(¶ms, NULL);
status = WdfIoTargetOpen(ioTarget, ¶ms);
if (!NT_SUCCESS(status)) {
// error handling
}
handle = WdfIoTargetWdmGetTargetFileHandle(ioTarget);
if (handle == NULL) {
// error handling
}
if (ioTarget != NULL) {
WdfIoTargetClose(ioTarget);
}
// You can now call DeviceIoControl(handle, ...) etc.
// NOTE: See Warning above on submitting overlapped or asynchronous I/O
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.15 |
标头 | wdfiotarget.h (包括 Wdf.h) |
图书馆 | Wdf01000.sys(请参阅框架库版本控制。 |
IRQL | <=DISPATCH_LEVEL |
DDI 符合性规则 | DriverCreate(kmdf),KmdfIrql(kmdf),KmdfIrql2(kmdf),KmdfIrqlExplicit(kmdf) |