Sdílet prostřednictvím


IRP_MN_QUERY_ID

Ovladače sběrnice musí zpracovávat požadavky na BusQueryDeviceID pro svá podřízená zařízení (podřízená PDO). Ovladače sběrnice můžou zpracovávat požadavky na BusQueryHardwareIDs, BusQueryCompatibleIDs a BusQueryInstanceID pro jejich podřízená zařízení.

Počínaje Windows 7 musí ovladače sběrnice zpracovávat také požadavky na BusQueryContainerID pro jejich podřízené PDO.

Další informace o těchto identifikátorech (ID) najdete v tématu Identifikační řetězce zařízení.

Poznámka: Ovladače funkcí a ovladače filtru nezpracují tento IRP.

Hodnota

0x13

Hlavní kód

IRP_MJ_PNP

Při odeslání

Správce PnP odešle tento IRP při výčtu zařízení. Ovladač může odeslat tento identifikátor IRP, aby načetl ID instance pro jedno ze svých zařízení.

Správce a ovladače PnP odesílají tento IRP v IRQL PASSIVE_LEVEL v libovolném kontextu vlákna.

Vstupní parametry

Parametr.QueryId.IdType člen struktury IO_STACK_LOCATION určuje typ požadovaných ID. Mezi možné hodnoty patří BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID a BusQueryContainerID. Následující typ ID je vyhrazen: BusQueryDeviceSerialNumber.

Výstupní parametry

Vráceno v bloku stavu vstupně-výstupních operací.

Blok stavu vstupně-výstupních operací

Ovladač nastaví stav Irp-IoStatus.Status> na STATUS_SUCCESS nebo na odpovídající stav chyby.

Při úspěchu ovladač nastaví Irp-IoStatus.Information> ukazatel WCHAR, který odkazuje na požadované informace. Při chybě ovladač nastaví Irp-IoStatus.Information> na nulu .

Operace

Pokud ovladač v reakci na tento IRP vrátí ID, přidělí strukturu WCHAR ze stránkovaného fondu, která bude obsahovat ID. Správce PnP uvolní strukturu, když už ji nepotřebujete.

Ovladač vrátí jednu z následujících možností:

  • Řetězec REG_SZ v reakci na požadavek BusQueryDeviceID, BusQueryInstanceID nebo BusQueryContainerID.

  • Řetězec REG_MULTI_SZ v reakci na požadavek BusQueryHardwareIDs nebo BusQueryCompatibleIDs.

Pokud ovladač vrátí ID s neplatným znakem, systém zkontroluje chybu. Znaky s následujícími hodnotami jsou v ID tohoto protokolu IRP neplatné:

  • Menší než nebo rovno 0x20 (' ')

  • Větší než 0x7F

  • Rovná se 0x2C (',')

Ovladač musí splňovat následující omezení délky id:

  • Každé ID hardwaru nebo kompatibilní ID , které ovladač vrací v tomto protokolu IRP, musí být kratší než MAX_DEVICE_ID_LEN znaků. Tato konstanta má v současné době hodnotu 200 definovanou v sadě sdk\inc\cfgmgr32.h.

  • ID kontejneru, které ovladač vrátí v tomto protokolu IRP, musí být formátován jako globálně jedinečný identifikátor (GUID) a musí být MAX_GUID_STRING_LEN znaky, které zahrnují ukončovací znak null.

  • Pokud ovladač sběrnice poskytuje globálně jedinečné ID instancí pro podřízená zařízení (to znamená, že ovladač nastaví DEVICE_CAPABILITIES. UniqueID pro zařízení), pak kombinace ID zařízení plus ID instance musí být menší než (MAX_DEVICE_ID_LEN - 1) znaků. Operační systém vyžaduje další znak pro oddělovač cesty.

  • Pokud ovladač sběrnice neposkytuje globálně jedinečné ID instancí pro podřízená zařízení, musí být kombinace ID zařízení plus ID instance menší než (MAX_DEVICE_ID_LEN – 28). Hodnota této rovnice je aktuálně 172.

Ovladače sběrnice by měly být připravené na zpracování tohoto protokolu IRP pro podřízené zařízení ihned po vytvoření výčtu zařízení.

Určení BusQueryDeviceID a BusQueryInstanceID

Hodnoty ovladače sběrnice pro BusQueryDeviceID a BusQueryInstanceID umožňují operačnímu systému odlišit zařízení od jiných zařízení v počítači. Operační systém používá ID zařízení a ID instance vrácené v IRP_MN_QUERY_ID IRP a jedinečné pole ID, které se vrátí v IRP_MN_QUERY_CAPABILITIES IRP k vyhledání informací registru pro dané zařízení.

Pro BusQueryDeviceID ovladač sběrnice poskytuje ID zařízení. ID zařízení by mělo obsahovat nejpodrobnější popis možného zařízení, včetně názvu enumerátoru a řetězců identifikujícího výrobce, zařízení, revize, balíček a zabalený produkt, pokud je to možné. Například ovladač sběrnice PCI reaguje ID zařízení ve formuláři PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx a zakóduje všech pět výše uvedených položek. ID zařízení by ale nemělo obsahovat dostatek informací k rozlišení dvou identických zařízení. Tyto informace by měly být kódovány v ID instance.

Pro BusQueryInstanceID by ovladač sběrnice měl zadat řetězec, který obsahuje ID instance zařízení. Ovladače systému Windows a sběrnice používají ID instance s dalšími informacemi k rozlišení dvou identických zařízení v počítači. ID instance je buď jedinečné v celém počítači, nebo pouze jedinečné v nadřazené sběrnici zařízení.

Pokud je ID instance na sběrnici pouze jedinečné, ovladač sběrnice určuje tento řetězec pro BusQueryInstanceID, ale také určuje hodnotu UniqueIDFALSE v reakci na požadavek IRP_MN_QUERY_CAPABILITIES zařízení. Pokud hodnota UniqueID je NEPRAVDA, správce PnP vylepšuje ID instance přidáním informací o nadřazené položce zařízení a tím id v počítači jedinečně. V takovém případě by řidič sběrnice neměl provádět další kroky k tomu, aby ID instancí svých zařízení byla globálně jedinečná; stačí vrátit příslušné informace o schopnostech a operační systém se o ně postará.

Pokud ovladač sběrnice může pro každé podřízené zařízení zadat globálně jedinečné ID, například sériové číslo, ovladač sběrnice určuje tyto řetězce pro BusQueryInstanceID a v reakci na požadavek IRP_MN_QUERY_CAPABILITIES pro každé zařízení určuje hodnotu UniqueID hodnoty TRUE.

Určení identifikátorů BusQueryHardwareIDs a BusQueryCompatibleIDs

Hodnoty, které ovladač sběrnice poskytuje pro BusQueryHardwareIDs a BusQueryCompatibleIDs umožňují systému Windows vyhledat odpovídající ovladače pro podřízené zařízení sběrnice.

Na každý z těchto požadavků reaguje řidič sběrnice s REG_MULTI_SZ seznamem ID, která zařízení popisují. Maximální délka v znacích seznamu ID, včetně dvou znaků NULL, které seznam ukončí, je REGSTR_VAL_MAX_HCID_LEN.

Při vracení více než jednoho ID hardwaru a/nebo více než jednoho kompatibilního ID by ovladač sběrnice měl vypsat ID v pořadí nejobvyklejším pro nejobvyklejší, aby se usnadnil výběr nejlepší shody ovladačů pro dané zařízení. První položka v seznamu ID hardwaru je nejvýraznějším popisem zařízení a proto je obvykle identická s ID zařízení.

Systém Windows zkontroluje ID na ID uvedených v souborech INF, aby se zobrazily možné shody. Systém Windows nejprve prohledá seznam hardwarových ID a pak seznam kompatibilních ID. Starší položky jsou považovány za konkrétnější popisy zařízení a pozdější položky obecnější (a tím méně optimální) shody zařízení. Pokud se v seznamu ID hardwaru nenajde žádná shoda, systém Windows může před přechodem na seznam kompatibilních ID vyzvat uživatele k zadání instalačního média.

Obecná pravidla pro zpracování dílčích přístupových bodů plug-and play najdete v tématu Plug and Play.

Určení identifikátorů BusQueryContainerID

Počínaje Windows 7 by ovladač sběrnice měl zadat řetězec pro BusQueryContainerID, který obsahuje ID kontejneru pro zařízení. ID kontejneru umožňuje operačnímu systému seskupit všechna funkční zařízení z jednoho vyměnitelného fyzického zařízení. Například všechna funkční zařízení z vyměnitelného multifunkčního zařízení mají stejné ID kontejneru. Další informace o vytváření ID kontejnerů ve speciálních případech, například zařízení svazku, které může zahrnovat více disků ve více kontejnerech, ale nepatří do žádného kontejneru, najdete v tématu Přehled ID kontejnerů.

Vyměnitelné fyzické zařízení je definováno jako podřízené zařízení, které ovladač sběrnice určuje vyměnitelné schopnosti TRUE v reakci na požadavek IRP_MN_QUERY_CAPABILITIES . Další informace o vyměnitelné hodnotě najdete v tématu DEVICE_CAPABILITIES.

Ovladač sběrnice vytvoří ID kontejneru na základě jedinečného ID konkrétní sběrnice, které zařízení poskytuje. Další informace najdete v tématu Generování ID kontejnerů.

Ovladač musí selhat požadavek IRP a nastavit IoStatus.Status na STATUS_NOT_SUPPORTED pokud je splněna některá z následujících možností:

  • Zařízení nepodporuje jedinečné ID sběrnice, které může ovladač sběrnice použít k vygenerování ID kontejneru.

  • Ovladač sběrnice dříve v reakci na požadavek IRP_MN_QUERY_CAPABILITIES zařízení určil vyměnitelnou funkci FALSE.

Odesílání tohoto protokolu IRP

Obvykle tento protokol IRP odesílá pouze správce PnP.

Pokud chcete získat ID hardwaru nebo kompatibilní ID zařízení, místo odesílání tohoto protokolu IRP volejte IoGetDeviceProperty .

Ovladač může odeslat tento identifikátor IRP, aby načetl ID instance pro jedno ze svých zařízení. Představte si například multifunkční zařízení ISA PnP, jehož funkce nefungují nezávisle. Správce PnP vyčísluje funkce jako samostatná zařízení, ale ovladač takového zařízení může být nutný k přidružení jedné nebo více funkcí. Vzhledem k tomu, že isa PnP zaručuje jedinečné ID instance, ovladač takového multifunkčního zařízení může pomocí ID instancí vyhledat funkce, které se nacházejí na stejném zařízení. Ovladač pro takové zařízení musí také získat název enumerátoru zařízení voláním IoGetDeviceProperty, aby se potvrdilo, že je zařízení PnP ISA.

Informace o odesílání ip adres IR Najdete v tématu Zpracování ip adres IRP . Následující kroky platí konkrétně pro tento IRP:

  • Nastavte hodnoty v umístění dalšího vstupně-výstupního zásobníku IRP: nastavte hlavní funkci na IRP_MJ_PNP, nastavte MinorFunction na IRP_MN_QUERY_ID a nastavte Parameters.QueryId.IdType na BusQueryInstanceID.

  • Nastavte IoStatus.Status na STATUS_NOT_SUPPORTED.

Kromě odesílání ID dotazu IRP musí ovladač volat IoGetDeviceProperty získat DevicePropertyEnumeratorName pro zařízení.

Po dokončení protokolu IRP a dokončení ovladače s ID musí ovladač uvolnit strukturu ID vrácenou ovladači, které zpracovaly IRP dotazu.

Požadavky

Záhlaví

Wdm.h (včetně Wdm.h, Ntddk.h nebo Ntifs.h)

Viz také

Identifikační řetězce zařízení

IoGetDeviceProperty