Initialisieren eines allgemeinen E/A-Ziels

Das Framework initialisiert das lokale E/A-Ziel eines Treibers für ein Gerät, wenn der Treiber WdfDeviceCreate aufruft. Um ein Handle für das lokale E/A-Ziel eines Geräts abzurufen, ruft der Treiber WdfDeviceGetIoTarget auf.

Die meisten Treiber senden Anforderungen nur an ihr lokales E/A-Ziel.

Um ein Remote-E/A-Ziel für ein Gerät zu initialisieren, muss der Treiber:

  1. Rufen Sie WdfIoTargetCreate auf, um ein E/A-Zielobjekt zu erstellen.

  2. Rufen Sie WdfIoTargetOpen auf, um ein E/A-Ziel zu öffnen, damit der Treiber Anforderungen an das Ziel senden kann.

Wenn der Treiber WdfIoTargetOpen aufruft, identifiziert er in der Regel das Remote-E/A-Ziel, indem er eine Unicode-Zeichenfolge bereitstellt, die einen Objektnamen darstellt. Dieser Name kann ein Gerät, eine Datei oder eine Geräteschnittstelle identifizieren. Das Framework sendet E/A-Anforderungen an den Anfang des Treiberstapels, der den Objektnamen unterstützt.

In seltenen Fällen kann ein Treiber ein Remote-E/A-Ziel identifizieren, indem er einen Zeiger auf eine WDM-DEVICE_OBJECT-Struktur (Windows Driver Model) angibt. Dieser Zeiger identifiziert einen anderen Treiber innerhalb des Stapels des aufrufenden Treibers. Frameworkbasierte Treiber verwenden diese Technik nur selten, da sie selten Zugriff auf die DEVICE_OBJECT Strukturen anderer Treiber haben.

Das folgende Beispiel zeigt, wie der Ndisedge-Beispieltreiber die oben genannte Technik verwendet, um ein E/A-Remoteziel zu erstellen und zu öffnen:

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