WdfIoTargetWdmGetTargetFileHandle 函数 (wdfiotarget.h)
[适用于 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) |
Library | Wdf01000.sys (请参阅框架库 Versioning.) |
IRQL | <=DISPATCH_LEVEL |
DDI 符合性规则 | DriverCreate (kmdf) 、 KmdfIrql (kmdf) 、 KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf) |