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.
Menedżer we/wy zapewnia każdemu sterownikowi w łańcuchu warstwowych sterowników lokalizację stosu we/wy dla każdego skonfigurowanego protokołu IRP. Każda lokalizacja stosu we/wy składa się z struktury IO_STACK_LOCATION .
Menedżer we/wy tworzy tablicę lokacji stosu we/wy dla każdego IRP, gdzie każdy element tablicy odpowiada sterownikowi w łańcuchu warstwowych sterowników. Każdy sterownik jest właścicielem jednej z lokalizacji stosu w pakiecie i wywołuje element IoGetCurrentIrpStackLocation w celu uzyskania informacji specyficznych dla sterownika dotyczących operacji we/wy.
Każdy sterownik w takim łańcuchu jest odpowiedzialny za wywołanie metody IoGetNextIrpStackLocation, a następnie skonfigurowanie lokalizacji stosu we/wy następnego niższego sterownika. Każdą lokalizację stosu we/wy sterownika wyższego poziomu można również użyć do przechowywania kontekstu operacji, dzięki czemu procedura IoCompletion sterownika może wykonywać operacje oczyszczania.
Rysunek Przetwarzanie IRPs w sterownikach warstwowych przedstawia dwie lokalizacje stosu I/O w oryginalnym IRP, ponieważ pokazuje dwa sterowniki: sterownik systemu plików i sterownik urządzenia pamięci masowej. Przydzielone przez sterownik IRP-y na rysunku Przetwarzanie IRP-ów w sterownikach warstwowych nie mają lokalizacji stosu dla FSD (sterownika systemu plików), który je utworzył. Każdy sterownik wyższego poziomu, który przydziela IRP dla sterowników niższego poziomu, określa również, ile lokacji stosu we/wy powinny mieć nowe IRP, zgodnie z wartością StackSize obiektu urządzenia niższego w kolejności sterownika.
Na poniższej ilustracji przedstawiono bardziej szczegółowo zawartość protokołu IRP.
Jak pokazano na rysunku, każda sterownikowa lokalizacja stosu I/O w IRP zawiera następujące informacje ogólne:
Główny kod funkcji (IRP_MJ_XXX) wskazujący podstawową operację, jaką sterownik powinien wykonać
W przypadku niektórych głównych kodów funkcji obsługiwanych przez sterowniki FSD, sterowniki SCSI wyższego poziomu i wszystkie sterowniki PnP, kod funkcji pomocniczej (IRP_MN_XXX), wskazujący, które podcasy podstawowej operacji powinien wykonać sterownik.
Zestaw argumentów specyficznych dla operacji, takich jak długość i lokalizacja początkowa buforu, do którego lub z którego sterownik przesyła dane
Wskaźnik do obiektu urządzenia utworzonego przez sterownik, reprezentującego urządzenie docelowe (fizyczne, logiczne lub wirtualne) dla żądanej operacji
Wskaźnik do obiektu pliku reprezentujący otwarty plik, urządzenie, katalog lub wolumin
Sterownik systemu plików uzyskuje dostęp do obiektu pliku za pośrednictwem lokalizacji stosu I/O w IRPs. Inne sterowniki zwykle ignorują obiekt pliku.
Zestaw kodów funkcji głównych i pomocniczych IRP, którymi zarządza określony sterownik, może być specyficzny dla typu urządzenia. Jednak sterowniki najniższego poziomu i sterowniki pośrednie (w tym sterowniki funkcji PnP i filtru) zwykle obsługują następujący zestaw podstawowych żądań:
IRP_MJ_CREATE — otwórz obiekt urządzenia docelowego, wskazując, że jest obecny i dostępny dla operacji we/wy
IRP_MJ_READ — transfer danych z urządzenia
IRP_MJ_WRITE — transfer danych do urządzenia
IRP_MJ_DEVICE_CONTROL — skonfiguruj (lub zresetuj) urządzenie zgodnie ze zdefiniowanym przez system kodem kontrolnym we/wy specyficznym dla typu urządzenia (IOCTL)
IRP_MJ_CLOSE — zamknij obiekt urządzenia docelowego
IRP_MJ_PNP — wykonaj operację Plug and Play na urządzeniu. Żądanie IRP_MJ_PNP jest wysyłane przez menedżera PnP za pośrednictwem menedżera we/wy.
IRP_MJ_POWER — wykonaj operację zasilania na urządzeniu. Żądanie IRP_MJ_POWER jest wysyłane przez menedżera zasilania za pośrednictwem menedżera we/wy.
Aby uzyskać więcej informacji na temat głównych kodów funkcji IRP wymaganych do obsługi sterowników, zobacz Główne kody funkcji IRP.
Ogólnie rzecz biorąc, menedżer we/wy wysyła IRP z co najmniej dwiema lokalizacjami stosu we/wy do sterowników urządzeń pamięci masowej, ponieważ system plików jest warstwowany nad innymi sterownikami dla urządzeń pamięci masowej. Kierownik I/O przesyła IRP z jedną lokalizacją stosu do dowolnego sterownika, który nie ma innego sterownika z innego poziomu warstwowego nad nim.
Jednak menedżer we/wy zapewnia obsługę dodawania nowego sterownika do dowolnego łańcucha istniejących sterowników w systemie. Na przykład pośredni sterownik mira, który tworzy kopię zapasową danych na danej partycji dysku, może zostać wstawiony między parą sterowników, takich jak sterownik systemu plików i sterownik najniższego poziomu pokazany na rysunku Przetwarzanie IRPs w Sterownikach Warstwowych. Gdy ten nowy sterownik dołącza się do stosu urządzeń, menedżer we/wy dostosowuje liczbę lokalizacji stosów we/wy we wszystkich IRP wysyłanych do systemu plików, mirroringu i sterowników najniższego poziomu. Każde żądanie IRP, które system plików w obszarze Przetwarzanie IRPs w sterownikach warstwowych przydzielił, będzie również zawierać inną lokalizację stosu we/wy dla takiego nowego sterownika lustrzanego.
Należy pamiętać, że ta obsługa dodawania nowych sterowników do istniejącego łańcucha oznacza pewne ograniczenia dotyczące dostępu dowolnego określonego sterownika do lokacji stosu wejścia/wyjścia w ramach IRPs.
Sterownik nadrzędnego poziomu w łańcuchu warstwowych sterowników może bezpiecznie uzyskać dostęp tylko do własnych lokalizacji stosu I/O oraz lokalizacji stosu I/O sterownika niższego poziomu w dowolnym IRP. Taki sterownik musi skonfigurować lokalizację stosu we/wy dla sterownika znajdującego się o poziom niżej w IRP. Jednak podczas projektowania takiego sterownika wyższego poziomu nie można przewidzieć, kiedy (lub czy) nowy sterownik zostanie dodany do istniejącego łańcucha tuż poniżej sterownika.
W związku z tym należy założyć, że każdy później dodany sterownik będzie obsługiwał te same kody funkcji głównych IRP (IRP_MJ_XXX), co wyprzedzony sterownik następnego niższego poziomu.
Sterownik najniższego poziomu w łańcuchu sterowników warstwowych może bezpiecznie uzyskiwać dostęp tylko do własnej lokalizacji stosu we/wy w dowolnym IRP. Podczas projektowania takiego sterownika nie można przewidzieć, kiedy (lub czy) nowy sterownik zostanie dodany do istniejącego łańcucha powyżej sterownika urządzenia.
W projektowaniu sterownika najniższego poziomu załóżmy, że sterownik może nadal przetwarzać IRP przy użyciu informacji przekazywanych w jego własnym miejscu w stosie I/O, niezależnie od źródła danego IRP i niezależnie od liczby sterowników warstwowych nad nim.