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.
Kierowcy magistrali muszą obsługiwać żądania dla identyfikatora BusQueryDeviceID dla urządzeń podrzędnych (podrzędnych obiektów PDO). Sterowniki magistrali mogą obsługiwać żądania dla identyfikatorów BusQueryHardwareID, BusQueryCompatibleID i BusQueryInstanceID dla urządzeń podrzędnych.
Począwszy od systemu Windows 7, sterowniki magistrali muszą również obsługiwać żądania dla busQueryContainerID dla podrzędnych obiektów PDO.
Aby uzyskać więcej informacji na temat tych identyfikatorów ,zobacz Ciągi identyfikacji urządzeń.
Nuta: Sterowniki funkcji i sterowniki filtrów nie obsługują tego protokołu IRP.
Wartość
0x13
Kod główny
Po wysłaniu
Menedżer pnP wysyła ten protokół IRP, gdy urządzenie jest wyliczane. Sterownik może wysłać ten protokół IRP, aby pobrać identyfikator wystąpienia dla jednego z jego urządzeń.
Menedżer i sterowniki pnP wysyłają ten protokół IRP w PASSIVE_LEVEL IRQL w dowolnym kontekście wątku.
Parametry wejściowe
Element członkowski Parameters.QueryId.IdType struktury IO_STACK_LOCATION określa żądany rodzaj identyfikatorów. Możliwe wartości to BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID i BusQueryContainerID. Zarezerwowany jest następujący typ identyfikatora: BusQueryDeviceSerialNumber.
Parametry wyjściowe
Zwrócony w bloku stanu We/Wy.
Blok stanu we/wy
Sterownik ustawia parametr Irp-IoStatus.Status> na STATUS_SUCCESS lub do odpowiedniego stanu błędu.
W przypadku powodzenia sterownik ustawia wskaźnik Irp-IoStatus.Information> na wskaźnik WCHAR wskazujący żądane informacje. Po błędzie sterownik ustawia wartość Irp-IoStatus.Information> na zero.
Operacja
Jeśli sterownik zwraca identyfikatory w odpowiedzi na ten IRP, przydziela strukturę WCHAR ze stronicowanej puli, aby zawierały identyfikatory. Menedżer PnP zwalnia strukturę, gdy nie jest już potrzebna.
Sterownik zwraca jeden z następujących elementów:
Ciąg REG_SZ w odpowiedzi na żądanie BusQueryDeviceID, BusQueryInstanceID lub BusQueryContainerID.
Ciąg REG_MULTI_SZ w odpowiedzi na żądanie BusQueryHardwareIDs lub BusQueryCompatibleIDs.
Jeśli sterownik zwróci identyfikator z niedozwolonym znakiem, system sprawdzi usterkę. Znaki z następującymi wartościami są niedozwolone w identyfikatorze dla tego protokołu IRP:
Mniejsze niż lub równe 0x20 (" ")
Większe niż 0x7F
Równe 0x2C (',')
Sterownik musi być zgodny z następującymi ograniczeniami długości dla identyfikatorów:
Każdy identyfikator sprzętu lub zgodny identyfikator zwracany przez sterownik w tym IRP musi być mniejszy niż MAX_DEVICE_ID_LEN znaków. Ta stała ma obecnie wartość 200 zdefiniowaną w zestawie sdk\inc\cfgmgr32.h.
Identyfikator kontenera zwracany przez sterownik w tym IRP musi być sformatowany jako unikatowy identyfikator globalny (GUID) i musi być MAX_GUID_STRING_LEN znaków, który zawiera terminator o wartości null.
Jeśli kierowca autobusu dostarcza globalnie unikatowe identyfikatory wystąpień dla swoich urządzeń podrzędnych (czyli sterownik ustawia DEVICE_CAPABILITIES. UniqueID dla urządzeń), a następnie kombinacja identyfikatora urządzenia i identyfikatora wystąpienia musi być mniejsza niż (MAX_DEVICE_ID_LEN - 1) znaków. System operacyjny wymaga dodatkowego znaku separatora ścieżki.
Jeśli sterownik magistrali nie dostarcza globalnie unikatowych identyfikatorów wystąpień dla urządzeń podrzędnych, kombinacja identyfikatora urządzenia i identyfikatora wystąpienia musi być mniejsza niż (MAX_DEVICE_ID_LEN – 28). Wartość tego równania wynosi obecnie 172.
Sterowniki magistrali powinny być przygotowane do obsługi tego protokołu IRP dla urządzenia podrzędnego natychmiast po wyliczenie urządzenia.
Określanie identyfikatora BusQueryDeviceID i BusQueryInstanceID
Wartości sterownika magistrali dostarcza dla busQueryDeviceID i BusQueryInstanceID umożliwiają systemowi operacyjnemu odróżnienie urządzenia od innych urządzeń na komputerze. System operacyjny używa identyfikatora urządzenia i identyfikatora wystąpienia zwróconego w IRP_MN_QUERY_ID IRP i unikatowego pola identyfikatora zwróconego w IRP_MN_QUERY_CAPABILITIES IRP w celu zlokalizowania informacji rejestru dla urządzenia.
W przypadku parametru BusQueryDeviceID sterownik magistrali dostarcza identyfikator urządzenia. Identyfikator urządzenia powinien zawierać najbardziej szczegółowy opis możliwego urządzenia, uwzględniając nazwę modułu wyliczającego i ciągi identyfikujące producenta, urządzenie, poprawkę, pakiet i produkt, w miarę możliwości. Na przykład sterownik magistrali PCI odpowiada za pomocą identyfikatorów urządzeń formularza PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx, koduje wszystkie pięć elementów wymienionych powyżej. Jednak identyfikator urządzenia nie powinien zawierać wystarczającej ilości informacji, aby odróżnić dwa identyczne urządzenia. Te informacje powinny być zakodowane w identyfikatorze wystąpienia.
W przypadku identyfikatora BusQueryInstanceID sterownik magistrali powinien podać ciąg zawierający identyfikator wystąpienia urządzenia. Sterowniki systemu Windows i magistrali używają identyfikatora wystąpienia, z innymi informacjami, aby odróżnić dwa identyczne urządzenia na komputerze. Identyfikator wystąpienia jest unikatowy na całym komputerze lub po prostu unikatowy w magistrali nadrzędnej urządzenia.
Jeśli identyfikator wystąpienia jest unikatowy tylko w magistrali, sterownik magistrali określa ten ciąg dla BusQueryInstanceID, ale także określa unikatową wartość FALSE w odpowiedzi na żądanie IRP_MN_QUERY_CAPABILITIES dla urządzenia. Jeśli parametr UniqueID ma wartość FALSE, menedżer PnP zwiększa identyfikator wystąpienia, dodając informacje o obiekcie nadrzędnym urządzenia, co powoduje, że identyfikator jest unikatowy na komputerze. W takim przypadku kierowca autobusu nie powinien podejmować dodatkowych kroków, aby identyfikatory wystąpień urządzeń były globalnie unikatowe; wystarczy zwrócić odpowiednie informacje o możliwościach i system operacyjny zajmie się nim.
Jeśli kierowca magistrali może podać globalnie unikatowy identyfikator dla każdego urządzenia podrzędnego, takiego jak numer seryjny, sterownik magistrali określa te ciągi dla BusQueryInstanceID i określa unikatową wartość TRUE w odpowiedzi na żądanie IRP_MN_QUERY_CAPABILITIES dla każdego urządzenia.
Określanie identyfikatorów BusQueryHardwareID i BusQueryCompatibleID
Wartości sterownika magistrali dostarcza dla BusQueryHardwareIDs i BusQueryCompatibleIDs umożliwiają systemowi Windows zlokalizowanie odpowiednich sterowników dla urządzenia podrzędnego magistrali.
Kierowca autobusu odpowiada na każde z tych żądań przy użyciu REG_MULTI_SZ listy identyfikatorów, które opisują urządzenie. Maksymalna długość, w znakach, listy identyfikatorów, w tym dwa znaki NULL, które kończą listę, jest REGSTR_VAL_MAX_HCID_LEN.
W przypadku zwracania więcej niż jednego identyfikatora sprzętu i/lub więcej niż jednego zgodnego identyfikatora sterownik magistrali powinien wyświetlić listę identyfikatorów w kolejności najbardziej specyficznej dla najbardziej ogólnych, aby ułatwić wybór najlepszego dopasowania sterownika dla urządzenia. Pierwszy wpis na liście identyfikatorów sprzętu jest najbardziej specyficznym opisem urządzenia i, w związku z tym, jest zwykle identyczny z identyfikatorem urządzenia.
System Windows sprawdza identyfikatory względem identyfikatorów wymienionych w plikach INF pod kątem możliwych dopasowań. System Windows najpierw skanuje listę identyfikatorów sprzętu, a następnie listę zgodnych identyfikatorów. Wcześniejsze wpisy są traktowane jako bardziej szczegółowe opisy urządzenia, a późniejsze wpisy są bardziej ogólne (a tym samym mniej optymalne) dopasowania dla urządzenia. Jeśli nie znaleziono dopasowania na liście identyfikatorów sprzętu, system Windows może monitować użytkownika o nośnik instalacyjny przed przejściem do listy zgodnych identyfikatorów.
Zobacz Plug and Play , aby zapoznać się z ogólnymi regułami obsługi pomocniczych irps plug and Play.
Określanie identyfikatorów IDENTYFIKATORów BusQueryContainer
Począwszy od systemu Windows 7, sterownik magistrali powinien podać ciąg dla BusQueryContainerID, który zawiera identyfikator kontenera dla urządzenia. Identyfikator kontenera umożliwia systemowi operacyjnemu grupowanie wszystkich urządzeń funkcjonalnych z jednego wymiennego urządzenia fizycznego. Na przykład wszystkie funkcjonalne urządzenia z wymiennego urządzenia wielofunkcyjnego mają ten sam identyfikator kontenera. Aby uzyskać więcej informacji na temat raportowania identyfikatorów kontenerów w specjalnych przypadkach, takich jak urządzenie woluminu, które może obejmować wiele dysków w wielu kontenerach, ale nie należy do żadnego kontenera, zobacz Omówienie identyfikatorów kontenerów.
Wymienne urządzenie fizyczne jest definiowane jako urządzenie podrzędne, które sterownik magistrali określa możliwość wymiennejwartości TRUE w odpowiedzi na żądanie IRP_MN_QUERY_CAPABILITIES . Aby uzyskać więcej informacji na temat wartości wymiennych , zobacz DEVICE_CAPABILITIES.
Sterownik magistrali tworzy identyfikator kontenera na podstawie unikatowego identyfikatora specyficznego dla magistrali, który udostępnia urządzenie. Aby uzyskać więcej informacji, zobacz Jak są generowane identyfikatory kontenerów.
Sterownik musi zakończyć się niepowodzeniem żądania IRP i ustawić wartość IoStatus.Status na STATUS_NOT_SUPPORTED, jeśli którakolwiek z następujących wartości ma wartość true:
Urządzenie nie obsługuje unikatowego identyfikatora specyficznego dla magistrali, którego kierowca magistrali może użyć do wygenerowania identyfikatora kontenera.
Kierowca autobusu wcześniej określił możliwość wymiennegoFALSE w odpowiedzi na żądanie IRP_MN_QUERY_CAPABILITIES dla urządzenia.
Wysyłanie tego protokołu IRP
Zazwyczaj tylko menedżer PnP wysyła ten protokół IRP.
Aby uzyskać identyfikatory sprzętu lub zgodne identyfikatory dla urządzenia, wywołaj metodę IoGetDeviceProperty zamiast wysyłać ten protokół IRP.
Sterownik może wysłać ten protokół IRP, aby pobrać identyfikator wystąpienia dla jednego z jego urządzeń. Rozważmy na przykład wielofunkcyjne urządzenie PnP ISA, którego funkcje nie działają niezależnie. Menedżer PnP wylicza funkcje jako oddzielne urządzenia, ale sterownik takiego urządzenia może być wymagany do skojarzenia co najmniej jednej funkcji. Ponieważ system PNP ISA gwarantuje unikatowy identyfikator wystąpienia, sterownik takiego urządzenia wielofunkcyjnego może używać identyfikatorów wystąpień do lokalizowania funkcji znajdujących się na tym samym urządzeniu. Sterownik takiego urządzenia musi również uzyskać nazwę modułu wyliczającego urządzenia, wywołując funkcję IoGetDeviceProperty, aby potwierdzić, że urządzenie jest urządzeniem ISA pnp.
Aby uzyskać informacje na temat wysyłania adresów IRPs, zobacz Obsługa adresów IRPs . Następujące kroki dotyczą konkretnie tego protokołu IRP:
Ustaw wartości w następnej lokalizacji stosu we/wy IRP: ustaw wartość MajorFunction na IRP_MJ_PNP, ustaw wartość MinorFunction na wartość IRP_MN_QUERY_ID, a następnie ustaw parametr Parameters.QueryId.IdType na Wartość BusQueryInstanceID.
Ustaw wartość IoStatus.Status na STATUS_NOT_SUPPORTED.
Oprócz wysyłania identyfikatora zapytania IRP sterownik musi wywołać element IoGetDeviceProperty , aby uzyskać nazwę DevicePropertyEnumeratorName dla urządzenia.
Po zakończeniu działania protokołu IRP i zakończeniu działania sterownika o identyfikatorze sterownik musi zwolnić strukturę identyfikatorów zwróconą przez sterowniki obsługujące protokół IRP zapytania.
Wymagania
Nagłówek |
Wdm.h (w tym Wdm.h, Ntddk.h, lub Ntifs.h) |