Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
Wywołuje metodę IoGetCurrentIrpStackLocation i określa kierunek żądania transferu.
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.
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.