Udostępnij przez


Przekazywanie żądań we/wy

Gdy sterownik odbiera żądanie we/wy, którego nie może przetworzyć, zazwyczaj wykonuje jedną z następujących czynności:

  • Przekazuje ono odebrane żądanie do innego sterownika.

  • Tworzy dodatkowe żądania i wysyła je do innego sterownika.

Sterowniki oparte na strukturze przekazują żądania przez przy użyciu obiektów docelowych we/wy, które reprezentują inne sterowniki w systemie. Sterowniki mogą używać dowolnej z następujących technik do przekazywania żądania do docelowego obiektu I/O:

  • Sterownik może przekazywać żądania I/O do kolejnego, niższego sterownika, wywołując WdfDeviceGetIoTarget, a następnie WdfRequestFormatRequestUsingCurrentType, a na koniec WdfRequestSend.

    Ta technika jest przydatna tylko wtedy, gdy sterownik otrzyma żądanie, którego nie musi modyfikować przed przekazaniem.

  • Sterownik może wywołać WdfFdoInitSetFilter, aby zarejestrować się jako sterownik filtru.

    Jeśli filtrujący sterownik nie udostępnia kolejki we/wy dla określonego typu żądania we/wy, platforma automatycznie przekazuje żądania tego typu do sterownika znajdującego się niżej w hierarchii.

  • Zazwyczaj sterownik funkcji sprawdza zawartość każdego żądania we/wy. Jeśli sterownik funkcji nie może przetworzyć żądania, może zmodyfikować żądanie i przekazać je do obiektu docelowego we/wy. Może też utworzyć jedno lub więcej nowych żądań i wysłać je do celu I/O.

    Obiekt docelowy we/wy platformy definiuje kilka metod wysyłania żądań we/wy do innych sterowników. Na przykład sterownik może wywołać WdfIoTargetFormatRequestForRead, a następnie WdfRequestSend, aby wysłać żądanie odczytu do obiektu docelowego we/wy. Aby uzyskać więcej informacji na temat docelowych obiektów I/O, zapoznaj się z Using I/O Targets.

    Rzadko autor sterowników może chcieć określić zawartość podstawowego WDM miejsca stosu we/wy przed wysłaniem żądania do docelowego celu we/wy. W takich przypadkach sterownik może wywołać WdfRequestWdmFormatUsingStackLocation, zanim wywoła WdfRequestSend.

Czasami sterownik musi wysłać to samo żądanie do kilku obiektów docelowych we/wy, zazwyczaj dlatego, że sterownik musi wysłać jedno polecenie do wszystkich swoich urządzeń. Przed wysłaniem żądania do docelowego obiektu I/O sterownik może wywołać WdfRequestChangeTarget, aby sprawdzić dostępność docelowego obiektu I/O.

Sterownik musi ostatecznie ukończyć każde żądanie, które jest przekazywane do docelowego obiektu we/wy, chyba że podczas wywoływania WdfRequestSend ustawia flagę WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

Należy pamiętać, że gdy sterownik przekazuje żądanie, framework nie przenosi obiektu żądania frameworka ze sterownika wysyłającego do sterownika odbierającego. Zamiast tego struktura tworzy nowy obiekt żądania w sterowniku, który odbiera żądanie. Tylko podstawowy pakiet żądań we/wy (IRP) jest przesyłany z jednego sterownika do drugiego.