Инициализация общего целевого объекта ввода-вывода

Платформа инициализирует локальный целевой объект ввода-вывода драйвера для устройства, когда драйвер вызывает WdfDeviceCreate. Чтобы получить дескриптор локального целевого объекта ввода-вывода устройства, драйвер вызывает WdfDeviceGetIoTarget.

Большинство драйверов отправляют запросы только в локальный целевой объект ввода-вывода.

Чтобы инициализировать удаленный целевой объект ввода-вывода для устройства, драйвер должен:

  1. Вызовите WdfIoTargetCreate , чтобы создать целевой объект ввода-вывода.

  2. Вызовите WdfIoTargetOpen , чтобы открыть целевой объект ввода-вывода, чтобы драйвер смог отправлять к нему запросы.

Когда драйвер вызывает WdfIoTargetOpen, он обычно определяет удаленный целевой объект ввода-вывода, предоставляя строку Юникода, представляющую имя объекта. Это имя может идентифицировать устройство, файл или интерфейс устройства. Платформа отправляет запросы ввода-вывода в верхнюю часть стека драйверов, который поддерживает имя объекта.

В редких случаях драйвер может определить удаленный целевой объект ввода-вывода, указав указатель на DEVICE_OBJECT структуру модели драйвера Windows (WDM). Этот указатель идентифицирует другой драйвер в стеке вызывающего драйвера. Драйверы на основе платформы редко используют этот метод, так как они редко имеют доступ к структурам DEVICE_OBJECT других драйверов.

В следующем примере показано, как пример драйвера Ndisedge использует описанный выше метод для создания и открытия удаленного целевого объекта ввода-вывода:

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;
    }