Udostępnij przez


DispatchReadWrite z wykorzystaniem buforowanego wejścia/wyjścia

Każdy sterownik urządzenia najniższego poziomu, który konfiguruje swoje obiekty urządzenia do buforowanego wejścia/wyjścia, spełnia żądanie odczytu, zwracając dane przesyłane z urządzenia do zablokowanego w pamięci systemowej bufora w Irp-AssociatedIrp.SystemBuffer. Spełnia ono żądanie zapisu, przesyłając dane z tego samego buforu na urządzenie.

W związku z tym procedura DispatchReadWrite takiego sterownika urządzenia zwykle wykonuje następujące czynności po otrzymaniu żądania przeniesienia:

  1. Wywołuje metodę IoGetCurrentIrpStackLocation i określa kierunek żądania transferu.

  2. Sprawdza poprawność parametrów żądania.

    • W przypadku żądania odczytu procedura zwykle sprawdza wartość IoStackLocation-Parameters.Read.Length> sterownika, aby określić, czy bufor jest wystarczająco duży, aby odbierać dane przesyłane z urządzenia.

      Na przykład sterownik klasy klawiatury systemowej przetwarza żądania odczytu pochodzące tylko z wątku wejściowego użytkownika Win32. Ten sterownik definiuje strukturę, KEYBOARD_INPUT_DATA, w której mają być przechowywane naciśnięcia klawiszy urządzenia, a w danym momencie przechowuje pewną liczbę tych struktur w wewnętrznym buforze cyklicznym w celu spełnienia żądań odczytu w miarę ich napływu.

    • W przypadku żądania zapisu rutyna zwykle sprawdza wartość w Parameters.Write.Length i weryfikuje dane w Irp-AssociatedIrp.SystemBuffer> pod kątem ważności, jeśli to konieczne: oznacza to, że jeśli uruchomione urządzenie akceptuje tylko pakiety danych strukturalnych zawierające elementy ze zdefiniowanymi zakresami wartości.

  3. Jeśli jakiekolwiek parametry są nieprawidłowe, procedura DispatchReadWrite natychmiast kończy IRP, zgodnie z opisem w sekcji Kończenie IRP. W przeciwnym razie procedura przekazuje IRP do dalszego przetwarzania przez inne procedury sterowników, zgodnie z opisem w temacie Przekazywanie IRP w dół stosu sterowników.

Sterowniki urządzeń najniższego poziomu, które używają buforowanych operacji we/wy, zwykle muszą spełnić żądanie przeniesienia, odczytując lub zapisując dane o rozmiarze określonym przez inicjatora żądania. Taki sterownik może zdefiniować strukturę danych przychodzących z urządzenia lub wysyłanych do urządzenia i może buforować dane ustrukturyzowane wewnętrznie, jak robi sterownik klasy klawiatury systemowej.

Sterowniki buforujące dane wewnętrznie powinny obsługiwać żądania IRP_MJ_FLUSH_BUFFERS , a także obsługiwać żądania IRP_MJ_SHUTDOWN .

Sterownik najwyższego poziomu w łańcuchu jest zwykle odpowiedzialny za sprawdzanie parametrów wejściowego protokołu IRP przed przekazaniem żądania odczytu/zapisu do niższych sterowników. W związku z tym wiele sterowników niższego poziomu może zakładać, że ich lokalizacje stosu operacji wejścia/wyjścia w IRP dla odczytu/zapisu mają prawidłowe parametry. Jeśli sterownik najniższego poziomu w łańcuchu ma świadomość ograniczeń specyficznych dla urządzeń dotyczących transferów danych, ten sterownik ma obowiązek sprawdzenia poprawności parametrów w lokalizacji stosu I/O.