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.
Nowe sterowniki powinny używać struktury kolejki IRP bezpiecznej anulacji zamiast metod opisanych w tej sekcji.
Sterowniki z dedykowanymi wątkami urządzeń lub sterowników korzystających z wątków wykonywania zadaniowego, takich jak większość systemowych FSD, są najbardziej prawdopodobnymi typami sterowników do zarządzania własnymi wewnętrznymi kolejkami IRPs w czasie wykonywania w zabezpieczonej kolejce. Wszystkie sterowniki PnP, w tym sterowniki WDM, muszą również kolejkować niektóre IRP wewnętrznie podczas przejść stanów PnP i zasilania.
Zazwyczaj te sterowniki konfigurują podwójnie połączoną zablokowaną kolejkę; każde żądanie IRP zawiera element członkowski typu LIST_ENTRY, którego sterownik może używać do podwójnego łączenia pakietów IRP, które są aktualnie przetrzymywane. Sterownik nie może ponownie kolejkować IRPs dla ponownych prób, jeśli konfiguruje pojedyńczo połączoną, zsynchronizowaną kolejkę.
Sterownik musi skonfigurować swoją kolejkę zablokowaną podczas inicjowania urządzenia. Na poniższej ilustracji przedstawiono podwójnie połączoną połączoną kolejkę, procedury pomocy technicznej, które kierowca musi wywołać, aby skonfigurować taką kolejkę, a zestaw procedur ExInterlockedXxx , które sterownik może wywołać, aby wstawić środowiska IRPs do kolejki i usunąć je z kolejki.
Jak pokazano na poniższej ilustracji, sterownik musi udostępnić pamięć dla samej kolejki oraz dla elementów niezbędnych, aby skonfigurować podwójnie wiązaną przełączaną kolejkę.
Blokada spin executive, którą kierowca musi wywołać KeInitializeSpinLock , aby zainicjować. Zazwyczaj sterownik inicjuje blokadę spinu podczas konfigurowania rozszerzeń urządzenia dla jego obiektów urządzeń w procedurze AddDevice .
Nagłówek listy dla kolejki, który sterownik musi zainicjować przez wywołanie InitializeListHead.
Większość sterowników używających podwójnie połączonych, zablokowanych kolejek zapewnia niezbędne miejsce do przechowywania w rozszerzeniu urządzenia obiektu urządzenia utworzonego przez sterownik. Kolejka i blokada obrotu wykonawczego mogą zamiast tego być umieszczone w module kontrolera (jeśli sterownik używa obiektu kontrolera) lub w puli niestronicowanej przydzielonej przez sterownik.
Chociaż sterownik akceptuje żądania we/wy, może wstawić protokół IRP do kolejki, wywołując jedną z następujących procedur pomocy technicznej, jeśli listHead jest typu LIST_ENTRY, jak pokazano na poprzedniej ilustracji:
ExInterlockedInsertTailList w celu umieszczenia protokołu IRP na końcu kolejki
ExInterlockedInsertHeadList w celu umieszczenia protokołu IRP na początku kolejki. Sterowniki zwykle wywołują tę procedurę tylko wtedy, gdy muszą ponowić próbę wykonania określonego żądania.
Sterownik musi przekazać wskaźniki do IRP (ListEntry), oraz wskaźniki ListHead i wykonawczej blokady spin (Lock), które wcześniej zainicjował, do każdej z tych procedur ExInterlockedInsertXxxList. Do usunięcia IRP przez sterownik za pomocą wywołania funkcji ExInterlockedRemoveHeadList wymagane są tylko wskaźniki do ListHead i Lock. Aby zapobiec zakleszczeniom, kierowca nie może posiadać ExecutiveSpinLock, że przechodzi do żadnej procedury ExInterlockedXxx .
Ponieważ zablokowana kolejka jest chroniona przez blokadę spinlock warstwy zarządzającej, sterownik może wstawić IRP do swojej podwójnie połączonej kolejki i usunąć je w sposób bezpieczny dla wieloprocesorów z dowolnej procedury sterownika działającej na poziomie równym lub niższym niż IRQL = DISPATCH_LEVEL.
Kolejka z typem ListHead typu LIST_ENTRY, jak pokazano na poprzedniej ilustracji, jest podwójnie połączoną listą. Jeden z ListHead typu SLIST_HEADER to sekwencyjna, jednokierunkowa lista. Sterownik inicjuje element ListHead dla sekwencjonowanej kolejki połączonej ze sobą przez wywołanie metody ExInitializeSListHead.
Sterownik, który nigdy nie ponawia prób operacji we/wy, może używać exInterlockedPushEntrySList i ExInterlockedPopEntrySList do zarządzania kolejkowaniem irps wewnętrznie w sekwencjonowanej, singly połączonej międzylokowanej kolejce. Każdy sterownik korzystający z tego typu zakleszczonej kolejki musi również zapewnić magazyn rezydentny dla ListHead typu SLIST_HEADER oraz dla ExecutiveSpinLock, jak pokazano na poprzedniej ilustracji. Musi zainicjować blokadę spinową i skonfigurować kolejkę przed wywołaniem ExInterlockedPushEntrySList, aby wstawić początkowy wpis do swojej kolejki.
Aby uzyskać więcej informacji, zobacz Zarządzanie priorytetami sprzętu i blokady spin. Aby zapoznać się z wymaganiami środowiska IRQL dotyczącymi określonej procedury pomocy technicznej, zobacz stronę referencyjną procedury.