Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Gdy rutyna wysyłania sterownika odbiera IRP, musi wywołać IoGetCurrentIrpStackLocation, aby sprawdzić własną lokalizację stosu we/wy i określić, czy wszystkie jego parametry są prawidłowe. Jeśli sterownik nie może spełnić i ukończyć samego żądania, może wykonać jedną z następujących czynności:
Przekaż IRP do dalszego przetwarzania przez sterowniki niższego poziomu.
Utwórz co najmniej jeden nowy adres IP i przekaż je do sterowników niższego poziomu.
Sterownik wyższego poziomu powinien przekazać żądanie we/wy do następnego niższego sterownika w następujący sposób:
Jeśli sterownik przekaże wejściowy protokół IRP do następnego sterownika niższego poziomu, procedura wysyłania powinna wywołać metodę IoSkipCurrentIrpStackLocation lub IoCopyCurrentIrpStackLocationToNext , aby skonfigurować lokalizację stosu we/wy następnego niższego sterownika.
Jeśli sterownik wywołuje funkcję IoAllocateIrp w celu przydzielenia co najmniej jednego dodatkowego IRP dla niższych sterowników, rutyna dyspozycyjna musi zainicjować lokalizację stosu we/wy następnego niższego sterownika, wykonując kroki opisane w Przetwarzaniu IRP w sterowniku Intermediate-Level.
Rutyna wysyłania może modyfikować niektóre parametry w lokalizacji stosu we/wy następnego niższego sterownika w przypadku niektórych żądań. Na przykład sterownik wyższego poziomu może zmodyfikować parametry dla dużego żądania transferu, gdy bazowe urządzenie ma znany limit pojemności transferu, i ponownie użyć protokołu IRP do wysyłania żądań częściowego transferu do bazowego sterownika urządzenia.
Wywołaj metodę IoSetCompletionRoutine.
Jeśli procedura wysyłania przekazuje odebrany IRP do następnego niższego sterownika, ustawienie procedury IoCompletion jest opcjonalne, ale przydatne, ponieważ procedura może wykonywać takie zadania, jak określanie, w jaki sposób niższe sterowniki zakończyły żądanie, ponowne użycie IRP przy transferach częściowych, aktualizacja stanu utrzymywanego przez sterownik, jeśli śledzi IRP, i ponawianie żądania zwróconego z powodu błędu.
Jeśli procedura wysyłkowa przydzieliła nowe IRP-y, ustawienie procedury IoCompletion jest wymagane, ponieważ procedura musi zwolnić każdy IRP po zakończeniu działania sterowników niższego poziomu.
Aby uzyskać więcej informacji na temat procedur IoCompletion, zobacz Zakończenie IRP.
Wywołaj usługę IoCallDriver z każdą funkcją IRP, która ma być przetwarzana przez niższe sterowniki.
Zwróć odpowiednią wartość NTSTATUS, taką jak:
STATUS_OCZEKUJĄCY
Sterownik zwykle zwraca STATUS_PENDING, jeśli wejściowy protokół IRP jest żądaniem asynchronicznym, takim jak IRP_MJ_READ lub IRP_MJ_WRITE.
Wynik wywołania usługi IoCallDriver
Sterownik często zwraca wynik wywołania funkcji IoCallDriver, jeśli wejściowy protokół IRP jest żądaniem synchronicznym, takim jak IRP_MJ_CREATE.
Sterownik urządzenia najniższego poziomu przekazuje wszelkie IRP, których nie może ukończyć w procedurze wysyłania, do innych rutyn sterownika.
Wywołaj metodę IoMarkIrpPending przy użyciu wejściowego protokołu IRP.
Wywołaj IoStartPacket, aby przekazać lub ustawić w kolejce IRP do procedury StartIo sterownika, chyba że sterownik zarządza własną wewnętrzną kolejką IRP, zgodnie z opisem w Driver-Managed kolejki IRP.
Jeśli sterownik nie ma procedury StartIo, ale obsługuje anulowane IRP, musi albo zarejestrować procedurę Anuluj, albo zaimplementować bezpieczną kolejkę IRP dla anulowania. Aby uzyskać więcej informacji na temat procedur anulowania Anuluj, zobacz Anulowanie IRP.
Zwróć STATUS_PENDING.