初始化常规 I/O 目标

当驱动程序调用 WdfDeviceCreate 时,框架为设备初始化驱动程序的本地 I/O 目标。 若要检索设备的本地 I/O 目标的句柄,驱动程序会调用 WdfDeviceGetIoTarget

大多数驱动程序仅将请求发送到其本地 I/O 目标。

若要初始化设备的远程 I/O 目标,驱动程序必须:

  1. 调用 WdfIoTargetCreate 来创建 I/O 目标对象。

  2. 调用 WdfIoTargetOpen 打开 I/O 目标,以便驱动程序可以向其发送请求。

当驱动程序调用 WdfIoTargetOpen 时,它通常通过提供表示 对象名称的 Unicode 字符串来标识远程 I/O 目标。 此名称可以标识设备、文件或设备接口。 框架将 I/O 请求发送到支持对象名称的驱动程序堆栈顶部。

极少数情况下,驱动程序可能会通过提供指向 Windows 驱动程序模型的指针来标识远程 I/O 目标, (WDM) DEVICE_OBJECT 结构。 此指针标识调用驱动程序堆栈中的另一个驱动程序。 基于框架的驱动程序很少使用此方法,因为它们很少有权访问其他驱动程序 的DEVICE_OBJECT 结构。

以下示例演示 Ndisedge 示例驱动程序如何使用上述技术创建和打开远程 I/O 目标:

status = WdfIoTargetCreate(Adapter->WdfDevice,
                        WDF_NO_OBJECT_ATTRIBUTES,
                        &Adapter->IoTarget);
    if (!NT_SUCCESS(status)) {
        DEBUGP(MP_ERROR, ("WdfIoTargetCreate failed 0x%x\n",
               status));
        return status;
    }

    WDF_IO_TARGET_OPEN_PARAMS_INIT_CREATE_BY_NAME(&openParams,
                                &fileName,
                                STANDARD_RIGHTS_ALL
                                );

    status = WdfIoTargetOpen(Adapter->IoTarget,
                        &openParams);
    if (!NT_SUCCESS(status)) {
        DEBUGP(MP_ERROR, ("WdfIoTargetOpen failed 0x%x\n", status));
        return status;
    }