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

另请参阅

WdfIoTargetCreate

WdfIoTargetWdmGetTargetFileObject