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 方法返回的文件句柄有效,直到驱动程序调用 WdfIoTargetCloseWdfIoTargetCloseForQueryRemove,或删除远程 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(&params, NULL);

status = WdfIoTargetOpen(ioTarget, &params);

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)

另请参阅

WdfIoTargetCreate

WdfIoTargetWdmGetTargetFileObject