Udostępnij przez


Przykładowe żądanie we/wy — szczegóły

Rysunek ilustrujący otwieranie obiektu pliku przedstawia protokół IRP z dwoma lokalizacjami stosu we/wy, ale protokół IRP może mieć dowolną liczbę lokalizacji stosu we/wy, w zależności od liczby sterowników warstwowych, które będą obsługiwać określone żądanie.

Na poniższej ilustracji przedstawiono bardziej szczegółowo, jak sterowniki na rysunku Otwierania obiektu pliku używają procedur obsługi we/wy (procedury IoXxx ) do przetwarzania IRP dla żądania odczytu lub zapisu.

diagram ilustrujący przetwarzanie irps w sterownikach warstwowych.

  1. Menedżer I/O wywołuje sterownik systemu plików (FSD) z IRP przydzielonym dla żądania odczytu/zapisu podsystemu. FsD uzyskuje dostęp do lokalizacji stosu we/wy w IRP, aby określić, jaką operację należy wykonać.

  2. FsD może przerwać oryginalne żądanie na mniejsze żądania (prawdopodobnie dla więcej niż jednego sterownika urządzenia) przez wywołanie procedury wsparcia we/wy (IoAllocateIrp) jeden lub więcej razy w celu przydzielenia dodatkowych pakietów IRP. Dodatkowe żądania IRP są zwracane do FSD z lokalizacjami stosu wejścia/wyjścia wypełnionymi zerami dla sterowników niższego poziomu. Według własnego uznania fsD może ponownie użyć oryginalnego IRP, zamiast przydzielać dodatkowe irps, jak pokazano na poprzedniej ilustracji, konfigurując lokalizację stosu we/wy następnego niższego sterownika w oryginalnym IRP i przekazując je do niższych sterowników.

  3. Dla każdego przypisanego sterownika IRP, FSD na poprzedniej ilustracji wywołuje procedurę pomocy technicznej we/wy w celu zarejestrowania procedury ukończenia dostarczone fsD; w procedurze uzupełniania FSD może określić, czy niższe sterowniki spełniają żądanie i mogą zwolnić każdy sterownik przydzielony do sterownika IRP, gdy niższe sterowniki go ukończyły. Menedżer we/wy wywoła dostarczoną przez FSD procedurę ukończenia bez względu na to, czy każdy IRP przydzielony przez sterownik został ukończony pomyślnie, ukończony ze stanem błędu, czy anulowany. Sterownik wyższego poziomu jest odpowiedzialny za zwolnienie wszystkich irps przydzielanych i konfigurowanych we własnym imieniu dla sterowników niższego poziomu. Menedżer wejścia/wyjścia zwalnia IRP-y, które przydziela po tym, jak wszystkie sterowniki je ukończą.

    Następnie FSD wywołuje procedurę wsparcia wejścia/wyjścia (IoGetNextIrpStackLocation), aby uzyskać dostęp do lokalizacji stosu we/wy sterownika niższego poziomu, w celu przygotowania żądania dla tego sterownika. (Na poprzedniej ilustracji następnym najniższym sterownikiem jest sterownik najniższego poziomu). Następnie FSD wywołuje procedurę obsługi we/wy (IoCallDriver), aby przekazać ten IRP do następnego najniższego sterownika.

  4. Gdy jest wywoływany przy użyciu protokołu IRP, sterownik najniższego poziomu sprawdza lokalizację stosu we/wy, aby określić, jaką operację (wskazaną przez kod funkcji IRP_MJ_XXX ) należy wykonać na urządzeniu docelowym. Urządzenie docelowe jest reprezentowane przez obiekt urządzenia w wyznaczonej lokalizacji stosu I/O i jest przekazywane wraz z IRP do sterownika. Sterownik najniższego poziomu może zakładać, że menedżer we/wy skierował IRP do punktu wejścia, który sterownik zdefiniował dla operacji IRP_MJ_XXX (tutaj IRP_MJ_READ lub IRP_MJ_WRITE), oraz że sterownik wyższego poziomu sprawdził ważność innych parametrów dla żądania.

    Jeśli nie było sterownika wyższego poziomu, sterownik najniższego poziomu sprawdzi, czy parametry wejściowe dla operacji IRP_MJ_XXX są prawidłowe. Jeśli tak, sterownik zwykle wywołuje procedury pomocnicze we/wy, aby poinformować menedżera we/wy, że operacja urządzenia jest oczekiwana w kontekście IRP, oraz albo umieścić IRP w kolejce, albo przekazać go do innej procedury dostarczonej przez sterownik, która uzyskuje dostęp do urządzenia docelowego, które jest urządzeniem fizycznym lub logicznym (dyskiem lub partycją na dysku).

  5. Menedżer I/O określa, czy sterownik jest już zajęty przetwarzaniem innego IRP dla urządzenia docelowego, kolejkuje IRP, jeśli tak, i kończy. W przeciwnym razie menedżer we/wy kieruje protokół IRP do procedury dostarczonej przez sterownik, która uruchamia operację we/wy na urządzeniu. (Na tym etapie zarówno sterowniki z poprzedniej ilustracji, jak również menedżer we/wy zwracają kontrolę.)

  6. Gdy urządzenie przerywa działanie, procedura usługi przerwania sterownika (ISR) wykonuje tylko tyle pracy, ile musi zatrzymać urządzenie przed przerwaniem i zapisać niezbędny kontekst dotyczący operacji. ISR wywołuje procedurę obsługi we/wy (IoRequestDpc) z IRP w celu kolejkowania procedury zwanej DPC (odroczone wywołanie procedury) dostarczonej przez sterownik w celu zakończenia żądanej operacji przy użyciu niższego priorytetu sprzętowego niż ISR.

  7. Gdy DPC sterownika przejmuje kontrolę, używa kontekstu (przekazanego w wywołaniu ISR do IoRequestDpc), aby ukończyć operację we/wy. DPC wywołuje procedurę pomocy technicznej, aby usunąć następny protokół IRP (jeśli istnieje) i przekazać ten protokół IRP do procedury dostarczonej przez sterownik, która uruchamia operacje we/wy na urządzeniu (zobacz krok 5). Następnie DPC ustawia stan operacji właśnie ukończonej w bloku stanu we/wy IRP i zwraca go do menedżera we/wy z IoCompleteRequest.

  8. Menedżer we/wy zeruje lokalizację stosu we/wy najniższego poziomu sterownika w IRP i wywołuje zarejestrowaną procedurę zakończenia systemu plików (zobacz krok 3) z przydzielonym przez FSD IRP. Ta procedura uzupełniająca sprawdza blok stanu we/wy, aby określić, czy ponowić żądanie, zaktualizować wewnętrzny stan utrzymywany dla oryginalnego żądania lub zwolnić IRP przydzielony przez sterownik. System plików może zbierać informacje o stanie wszystkich przydzielonych przez sterownik IRP wysyłanych do sterowników niższego poziomu, aby można było ustawić stan we/wy i ukończyć oryginalny IRP. Po zakończeniu oryginalnego IRP przez system plików, menedżer operacji we/wy zwraca wartość NTSTATUS do oryginalnego żądającego (funkcji natywnej podsystemu) operacji we/wy.

Podobnie jak sterownik systemu plików pokazany na rysunku Przetwarzanie żądań IRP w sterownikach warstwowych, każdy nowo dodany sterownik w łańcuchu istniejących sterowników może wykonać wszystkie następujące czynności:

  • Ustawienie własnej procedury zakończenia w IRP. Procedury IoCompletion sprawdzają blok stanu we/wy, aby określić, czy niższe sterowniki zakończyły operację IRP pomyślnie, anulowały protokół IRP i/lub zakończyły go z powodu błędu. Procedura ukończenia może również zaktualizować dowolny stan specyficzny dla IRP, który mógł zostać zapisany przez sterownik, zwolnić wszystkie zasoby związane z operacją, które sterownik mógł przydzielić, i tak dalej, przed ukończeniem IRP. Ponadto procedura uzupełniania może odroczyć ukończenie IRP (informując menedżera we/wy o konieczności większego przetwarzania w IRP) i może wysłać kolejne żądanie do sterownika na niższym poziomie przed ukończeniem IRP.

  • Skonfiguruj lokalizację stosu we/wy następnego niższego poziomu w stosie irps przydziela i wysyła żądania do następnego niższego poziomu sterownika.

  • Przekaż wszystkie przychodzące żądania do niższych sterowników, konfigurując lokalizację stosu we/wy następnego niższego sterownika w każdym IRP i wywołując usługę IoCallDriver. (Należy pamiętać, że w przypadku IRP z głównym kodem funkcji IRP_MJ_POWER, sterowniki muszą używać PoCallDriver.)

Każdy obiekt urządzenia utworzonego przez sterownik reprezentuje urządzenie fizyczne, logiczne lub wirtualne, dla którego określony sterownik wykonuje żądania we/wy. Aby uzyskać szczegółowe informacje na temat tworzenia i konfigurowania obiektu urządzenia, zobacz Device Objects and Device Stacks (Obiekty urządzeń i stosy urządzeń).

Jak pokazuje również rysunek Przetwarzanie IRP w sterownikach warstwowych, większość sterowników przetwarza każdy IRP w etapach za pomocą zestawu standardowych procedur zdefiniowanych przez system, ale sterowniki na różnych poziomach łańcucha koniecznie mają różne standardowe procedury. Na przykład tylko sterowniki najniższego poziomu obsługują przerwania z urządzenia fizycznego, więc tylko sterownik najniższego poziomu będzie miał ISR i DPC, który kończy operacje we/wy sterowane przerwaniami. Z drugiej strony, ponieważ taki sterownik wie, że we/wy jest ukończony po odebraniu przerwania od urządzenia, nie ma potrzeby rutynowego uzupełniania. Tylko sterownik wyższego poziomu miałby co najmniej jedną procedurę uzupełniania, taką jak FSD na tym rysunku.