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.
Z wyjątkiem sterowników systemu plików sterownik wyższego poziomu zwykle nie ma żadnych wewnętrznych kolejek sterowników dla irps. Taka procedura DispatchReadWrite sterownika może przekazać IRP-y z prawidłowymi parametrami do niższych sterowników, prawdopodobnie po skonfigurowaniu procedury IoCompletion, jak opisano w Przekazywanie IRP-ów w dół stosu sterowników.
Jednak procedura DispatchReadWrite sterownika klasy SCSI jest odpowiedzialna za podzielenie dużych żądań transferu, w razie potrzeby, zanim wyśle protokół IRP z głównym kodem funkcji IRP_MJ_READ lub IRP_MJ_WRITE do pary sterowników portów SCSI/miniportu. Aby uzyskać więcej informacji, zobacz procedurę SplitTransferRequest sterownika klasy magazynu.
Jeśli sterownik wyższego poziomu przydziela co najmniej jeden pakiet IRP, który konfiguruje dla następnego niższego sterownika w swojej procedurze DispatchReadWrite, aby zażądać pewnej liczby transferów częściowych, procedura DispatchReadWrite musi wywołać IoSetCompletionRoutine dla każdego IRP przydzielonego przez sterownik. Sterownik musi zarejestrować swoją procedurę IoCompletion, aby śledzić, ile danych jest przesyłanych w każdej operacji częściowego transferu, tak aby procedura IoCompletion mogła zwolnić wszystkie IRP-y przydzielone przez sterownik i ostatecznie zakończyć oryginalne żądanie.
Jeśli podstawowy sterownik kontroluje urządzenie nośnika wymiennego, wszystkie pakiety IR przydzielone przez sterownik wyższego poziomu muszą mieć kontekst wątku. Aby skonfigurować kontekst wątku, sterownik przydzielania musi ustawić nakładkę Irp-Tail.Overlay>. Wątek w każdym nowo przydzielonym IRP z tej samej wartości w przychodzącym IRP transferu. Aby uzyskać więcej informacji, zobacz Obsługa nośnika wymiennego.
Jeśli podstawowy sterownik urządzenia zwraca IRP dla częściowego transferu z błędem, procedura IoCompletion może ponowić próbę żądania częściowego transferu lub ukończyć oryginalny IRP, ustawiając jego blok stanu we/wy z błędem zwróconym przez sterownik, po uwolnieniu wszystkich IRP i pamięci przydzielonej przez sterownik wyższego poziomu.
Jeśli procedura DispatchReadWrite sterownika wyższego poziomu przydziela pamięć na potrzeby operacji częściowego transferu, a jej alokacja będzie uzyskiwana przez procedurę IoCompletion sterownika (lub przez podstawowy sterownik urządzenia), procedura DispatchReadWrite musi przydzielić pamięć z niestronicowanej puli.