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.
Sterownik konfiguruje obiekt kolejki urządzenia przez wywołanie metody KeInitializeDeviceQueue podczas inicjowania sterownika lub urządzenia. Po uruchomieniu urządzeń sterownik wstawia IRP do tej kolejki, wywołując KeInsertDeviceQueue lub KeInsertByKeyDeviceQueue. Na poniższej ilustracji przedstawiono te wywołania.
Jak pokazano na tej ilustracji, sterownik musi zapewnić przestrzeń dla obiektu kolejki urządzenia, który musi być na stałe załadowany w pamięci. Sterowniki, które konfigurują obiekt kolejki urządzenia, zwykle zapewniają niezbędny magazyn w rozszerzeniu urządzenia utworzonego przez sterownik obiektu urządzenia, ale magazyn może znajdować się w rozszerzeniu kontrolera, jeśli sterownik używa obiektu kontrolera lub w puli niestronicowanej przydzielonej przez sterownik.
Jeśli sterownik udostępnia magazyn dla obiektu kolejki urządzenia w rozszerzeniu urządzenia, wywołuje KeInitializeDeviceQueue po utworzeniu obiektu urządzenia i przed uruchomieniem urządzenia. Innymi słowy, sterownik może zainicjować kolejkę z procedury AddDevice lub gdy obsługuje żądanie pnP IRP_MN_START_DEVICE . W wywołaniu KeInitializeDeviceQueue sterownik przekazuje wskaźnik do przechowywanej pamięci przeznaczonej dla obiektu kolejki urządzeń.
Po uruchomieniu urządzeń sterownik może wstawić IRP do kolejki urządzenia, wywołując metodę KeInsertDeviceQueue, która umieszcza IRP na końcu kolejki, lub KeInsertByKeyDeviceQueue, co umieszcza IRP w kolejce zgodnie z wartością SortKey określoną przez sterownik, jak pokazano na poprzedniej ilustracji.
Każda z tych procedur obsługi zwraca wartość logiczną wskazującą, czy pakiet IRP został wstawiony do kolejki. Każde z tych wywołań ustawia również stan obiektu kolejki urządzenia na Zajęty, jeśli kolejka jest obecnie pusta (Not-Busy). Jeśli jednak kolejka jest pusta (Not-Busy), żadna z procedur KeInsertXxxDeviceQueue nie wstawia IRP do kolejki. Zamiast tego ustawia stan obiektu kolejki urządzenia na Zajęty i zwraca FALSE. Ponieważ IRP nie został dodany do kolejki, sterownik musi przekazać go do innej procedury sterownika w celu dalszego przetwarzania.
Podczas konfigurowania dodatkowych kolejek urządzeń postępuj zgodnie z następującymi wytycznymi implementacji:
Gdy wywołanie KeInsertXxxDeviceQueue zwraca FALSE, obiekt wywołujący musi przekazać IRP, który próbowano zakolejkować, do dalszego przetwarzania przez inną procedurę sterownika. Jednak wywołanie metody KeInsertXxxDeviceQueue zmienia stan obiektu kolejki urządzenia na Zajęty, więc następny IRP, który ma pojawić się w kolejce, zostanie wstawiony do kolejki, chyba że sterownik najpierw wywoła KeRemoveXxxDeviceQueue.
Gdy stan obiektu kolejki urządzenia jest ustawiony na Zajęty, sterownik może pobrać IRP do dalszego przetwarzania lub zresetować stan, aby ustawić na Not-Busy, wywołując jedną z następujących procedur wsparcia:
KeRemoveDeviceQueue w celu usunięcia pakietu IRP z początku kolejki
KeRemoveByKeyDeviceQueue, aby usunąć IRP wybrany zgodnie z wartością SortKey określoną przez sterownik.
KeRemoveEntryDeviceQueue , aby usunąć określony protokół IRP w kolejce lub określić, czy określony protokół IRP znajduje się w kolejce
Funkcja KeRemoveEntryDeviceQueue zwraca wartość logiczną wskazującą, czy IRP znajdował się w kolejce urządzenia.
Wywołanie dowolnej z tych procedur w celu usunięcia wpisu z kolejki urządzenia, która jest pusta, ale zajęta zmienia stan kolejki na Not-Busy.
Każdy obiekt kolejki urządzenia jest chroniony za pomocą wbudowanej blokady typu executive spin (nie pokazano na rysunku Korzystanie z obiektu kolejki urządzenia). W związku z tym sterownik może wstawić IRPs do kolejki i usunąć je w sposób bezpieczny dla wieloprocesorów z dowolnej procedury sterownika działającej na poziomie IRQL mniejszym lub równym DISPATCH_LEVEL. Ze względu na to ograniczenie IRQL sterownik nie może wywołać żadnej procedury KeXxxDeviceQueue z procedur ISR lub SynchCritSection , które działają w DIRQL.
Aby uzyskać więcej informacji, zobacz Zarządzanie priorytetami sprzętu i blokadami spin . Aby zapoznać się z wymaganiami środowiska IRQL dotyczącymi określonej procedury pomocy technicznej, zobacz stronę referencyjną procedury.