Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ovladač nastaví objekt fronty zařízení voláním KeInitializeDeviceQueue při inicializaci ovladače nebo zařízení. Po spuštění zařízení vloží ovladač do této fronty IRP voláním KeInsertDeviceQueue nebo KeInsertByKeyDeviceQueue. Následující obrázek znázorňuje tato volání.
Jak je znázorněno na tomto obrázku, ovladač musí poskytnout úložiště pro objekt fronty zařízení, který musí být trvale dostupný. Ovladače, které nastaví objekt fronty zařízení, obvykle poskytují potřebné úložiště v rozšíření zařízení objektu zařízení vytvořeného ovladačem, ale úložiště může být v rozšíření kontroléru, pokud ovladač používá objekt kontroléru nebo v nestránkovaném fondu paměti přiděleném ovladačem.
Pokud ovladač vyhrazuje úložný prostor pro objekt fronty zařízení v rozšíření ovladače, volá KeInitializeDeviceQueue po vytvoření objektu zařízení a před spuštěním zařízení. Jinými slovy, ovladač může inicializovat frontu buď prostřednictvím rutiny AddDevice, nebo při zpracování požadavku PnP IRP_MN_START_DEVICE. Ve volání KeInitializeDeviceQueueovladač předá ukazatel do úložiště, které poskytuje pro objekt fronty zařízení.
Po spuštění jeho zařízení může ovladač vložit IRP do fronty zařízení voláním funkce KeInsertDeviceQueue, která umístí IRP na konec fronty, nebo voláním KeInsertByKeyDeviceQueue, která umístí IRP do fronty podle hodnoty určené ovladačem SortKey, jak je znázorněno na předchozím obrázku.
Každá z těchto podpůrných rutin vrátí booleovskou hodnotu, která označuje, zda byl IRP vložen do fronty. Každé z těchto volání také nastaví stav objektu fronty zařízení na Zaneprázdněn, pokud je fronta aktuálně prázdná (Not-Busy). Pokud je však fronta prázdná (Not-Busy), rutina KeInsertXxxDeviceQueue nevloží IRP do fronty. Místo toho nastaví stav objektu fronty zařízení na Zaneprázdněn a vrátí FALSE. Vzhledem k tomu, že se IRP nezařadil do fronty, musí ho předat do jiné rutiny ovladače pro další zpracování.
Při nastavování doplňkových front zařízení postupujte podle těchto pokynů k implementaci:
Když volání KeInsertXxxDeviceQueue vrátí FALSE, volající musí předat IRP, který se pokusil zařadit do fronty, k dalšímu zpracování do jiné rutiny ovladače. Volání KeInsertXxxDeviceQueue změní stav objektu fronty zařízení na Zaneprázdněn, takže další příchozí IRP se vloží do fronty, pokud ovladač nejprve nevyvolá KeRemoveXxxDeviceQueue.
Pokud je stav objektu fronty zařízení nastaven na Zaneprázdněn, ovladač může odebrat z fronty IRP pro další zpracování nebo resetovat stav na Not-Busy voláním jedné z následujících podpůrných rutin:
KeRemoveDeviceQueue pro to, aby odebrat IRP z čela fronty.
KeRemoveByKeyDeviceQueue k odstranění IRP zvoleného podle hodnoty SortKey driverem
KeRemoveEntryDeviceQueue odebrat konkrétní IRP ve frontě nebo určit, jestli je konkrétní IRP ve frontě.
KeRemoveEntryDeviceQueue vrátí logickou hodnotu označující, jestli byl IRP ve frontě zařízení.
Volání kterékoliv z těchto rutin pro odebrání položky z fronty zařízení, která je prázdná, ale zaneprázdněná, změní stav fronty na neaktivní.
Každý objekt fronty zařízení je chráněn vestavěným výkonným spinovým zámkem (který není zobrazen na obrázku Použití objektu fronty zařízení). Výsledkem je, že ovladač může vložit IRPs do fronty a odebrat je víceprocesorově bezpečným způsobem z jakékoli rutiny ovladače spuštěné s úrovní IRQL rovnou nebo menší než DISPATCH_LEVEL. Kvůli tomuto omezení IRQL nemůže ovladač volat žádné rutiny KeXxxDeviceQueue ze svého ISR nebo SynchCritSection rutiny, které běží v DIRQL.
Další informace najdete v tématu Správa priorit hardwaru a spinlocky. Požadavky IRQL pro konkrétní rutinu podpory najdete na referenční stránce rutiny.