Udostępnij przez


Inicjowanie ogólnego celu we/wy

Platforma inicjuje lokalny docelowy punkt wejścia/wyjścia sterownika dla urządzenia, gdy sterownik wywołuje WdfDeviceCreate. Aby pobrać uchwyt do lokalnego obiektu docelowego wejścia/wyjścia urządzenia, sterownik wywołuje WdfDeviceGetIoTarget.

Większość sterowników wysyła żądania tylko do lokalnego obiektu docelowego we/wy.

Aby zainicjować zdalny element docelowy we/wy dla urządzenia, sterownik musi:

  1. Wywołaj WdfIoTargetCreate, aby utworzyć obiekt docelowy I/O.

  2. Wywołaj WdfIoTargetOpen, aby otworzyć cel we/wy, tak aby sterownik mógł wysyłać do niego żądania.

Gdy sterownik wywołuje WdfIoTargetOpen, zazwyczaj identyfikuje zdalny obiekt docelowy we/wy, podając ciąg Unicode reprezentujący nazwę obiektu . Ta nazwa może identyfikować urządzenie, plik lub interfejs urządzenia. Framework wysyła żądania we/wy na szczyt stosu sterowników, który obsługuje nazwę obiektu.

Rzadko sterownik może zidentyfikować zdalny cel we/wy, podając wskaźnik do struktury DEVICE_OBJECT modelu sterowników systemu Windows (WDM). Ten wskaźnik identyfikuje inny sterownik w obrębie stosu sterownika wywołującego. Sterowniki oparte na strukturze ramowej rzadko używają tej techniki, ponieważ rzadko mają dostęp do struktur DEVICE_OBJECT innych sterowników.

Poniższy przykład pokazuje, jak przykładowy sterownik Ndisedge używa powyższej techniki do tworzenia i otwierania zdalnego celu wejścia/wyjścia.

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