IRP_MN_QUERY_ID

總線驅動程式必須處理其子裝置 的 BusQueryDeviceID 要求, (子 PDO) 。 總線驅動程式可以處理其子裝置 的 BusQueryHardwareIDBusQueryCompatibleIDBusQueryInstanceID 的要求。

從 Windows 7 開始,總線驅動程式也必須處理其子 PDO 的 BusQueryContainerID 要求。

如需這些標識碼 (標識碼) 的詳細資訊,請參閱裝置識別碼。

注意 函式驅動程式和篩選驅動程式不會處理此 IRP。

0x13

主要程序代碼

IRP_MJ_PNP

傳送時

當列舉裝置時,PnP 管理員會傳送此 IRP。 驅動程式可能會傳送此 IRP 來擷取其中一個裝置的實例標識碼。

PnP 管理員和驅動程式會在任意線程內容中,於 IRQL PASSIVE_LEVEL傳送此 IRP。

輸入參數

IO_STACK_LOCATION 結構的Parameters.QueryId.IdType成員會指定要求的標識碼類型 () 。 可能的值為 BusQueryDeviceID、BusQueryHardwareIDs、BusQueryCompatibleIDs、BusQueryInstanceID 和 BusQueryContainerID。 下列標識符類型是保留的:BusQueryDeviceSerialNumber。

輸出參數

在 I/O 狀態區塊中傳回。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為STATUS_SUCCESS或適當的錯誤狀態。

成功時,驅動程式會將 Irp-IoStatus.Information> 設定為指向所要求資訊的 WCHAR 指標。 發生錯誤時,驅動程式會將 Irp-IoStatus.Information> 設定為零。

作業

如果驅動程式傳回標識碼 () 以回應此 IRP,它會從分頁集區配置 WCHAR 結構,以包含標識子 (s) 。 當不再需要結構時,PnP 管理員會釋出結構。

驅動程式會傳回下列其中一項:

  • 回應 BusQueryDeviceID、BusQueryInstanceID 或 BusQueryContainerID 要求的REG_SZ字串串。

  • 回應 BusQueryHardwareIDs 或 BusQueryCompatibleIDs 要求的REG_MULTI_SZ字串。

如果驅動程式傳回具有不合法字元的標識碼,系統會檢查錯誤。 具有下列值的字元在此 IRP 的識別碼中不合法:

  • 小於或等於 0x20 (' ')

  • 大於 0x7F

  • 等於 0x2C (',')

驅動程式必須符合下列標識符的長度限制:

  • 驅動程式在此 IRP 中傳回的每個硬體識別碼或相容標識碼必須少於MAX_DEVICE_ID_LEN個字元。 這個常數目前的值是 200,如 sdk\inc\cfgmgr32.h 中所定義。

  • 驅動程式在此 IRP 中傳回的容器識別碼必須格式化為全域唯一標識子 (GUID) ,而且必須MAX_GUID_STRING_LEN字元,其中包含 null 終止符。

  • 如果總線驅動程式在其子裝置 (提供全域唯一的實例標識碼,驅動程式會 設定DEVICE_CAPABILITIES。裝置的 UniqueID) ,則裝置識別碼加上實例識別碼的組合必須小於 (MAX_DEVICE_ID_LEN - 1) 個字元。 操作系統需要路徑分隔符的額外字元。

  • 如果總線驅動程式未為其子裝置提供全域唯一的實例標識碼,則裝置標識元加上實例標識碼的組合必須小於 (MAX_DEVICE_ID_LEN - 28) 。 此方程式的值目前為172。

總線驅動程式應該準備好在列舉裝置之後立即處理子裝置的這個 IRP。

指定 BusQueryDeviceID 和 BusQueryInstanceID

總線驅動程式為 BusQueryDeviceID 和 BusQueryInstanceID 提供的值,可讓操作系統區分裝置與電腦上的其他裝置。 操作系統會使用 在 IRP_MN_QUERY_ID IRP 中傳回的裝置識別碼和實例識別碼,以及 IRP_MN_QUERY_CAPABILITIES IRP 中傳回的唯一標識符字段來尋找裝置的登錄資訊。

對於 BusQueryDeviceID,總線驅動程式會提供裝置的 裝置標識碼。 裝置標識碼應該包含最特定的裝置描述,併入可能的情況下識別製造商、裝置、修訂、封裝器和封裝產品之列舉值和字串的名稱。 例如,PCI 總線驅動程式會以PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx形式的裝置標識碼回應,編碼上述所有五個專案。 不過,裝置標識碼不應包含足夠的資訊,以區分兩個相同的裝置。 此資訊應該在實例標識碼中編碼。

對於 BusQueryInstanceID,總線驅動程式應該提供包含裝置 實例標識符 的字串。 安裝程式和總線驅動程式會使用實例標識碼與其他資訊,區分計算機上的兩個相同裝置。 實例標識碼在整個計算機上是唯一的,或只是在裝置的父總線上是唯一的。

如果實例標識碼只在總線上是唯一的,則總線驅動程式會指定 BusQueryInstanceID 的字串,但也指定 UNIQUEID 值為 FALSE ,以回應裝置 的IRP_MN_QUERY_CAPABILITIES 要求。 如果 UniqueIDFALSE,則 PnP 管理員會藉由新增裝置父系的相關信息來增強實例識別碼,因而讓標識碼在電腦上是唯一的。 在此情況下,總線驅動程式不應採取額外的步驟,使其裝置的實例標識碼成為全域唯一的;只要傳回適當的功能資訊,操作系統就會負責處理。

如果總線驅動程式可以提供每個子裝置的全域唯一標識符,例如序號,總線驅動程式會針對 BusQueryInstanceID 指定這些字串,並指定 TRUE 的 UniqueID值,以 回應每個裝置 的IRP_MN_QUERY_CAPABILITIES 要求。

指定 BusQueryHardwareID 和 BusQueryCompatibleIDs

總線驅動程式為 BusQueryHardwareID 和 BusQueryCompatibleID 提供的值,可讓安裝程式找出總線子裝置的適當驅動程式。

總線驅動程式會以描述裝置的標識碼清單REG_MULTI_SZ回應每個要求。 標識符清單的最大長度,包括終止清單的兩個NULL字元,REGSTR_VAL_MAX_HCID_LEN。

傳回一個以上的 硬體標識碼 和/或多個 相容標識符時,總線驅動程序應該依照最一般最特定的順序列出標識符,以利選擇裝置的最佳驅動程式比對。 硬體標識符清單中的第一個專案是裝置最特定的描述,因此通常與裝置標識符相同。

安裝程式會根據 INF 檔案中列出的標識碼檢查識別碼是否有可能的相符專案。 安裝程式會先掃描硬體識別碼清單,然後掃描相容的標識符清單。 舊版專案會被視為更明確的裝置描述,而較新的專案則視為較一般 (,因此較不理想的) 裝置相符專案。 如果在硬體識別碼清單中找不到相符專案,安裝程式可能會在移至相容的標識符清單之前,提示使用者輸入安裝媒體。

如需處理隨插即用 次要 IRP 的一般規則,請參閱 隨插即用。

指定 BusQueryContainerIDs

從 Windows 7 開始,總線驅動程式應該為 BusQueryContainerID 提供字串,其中包含裝置的 容器標識碼 。 容器標識碼可讓操作系統將所有功能裝置從單一抽取式實體裝置分組。 例如,卸除式多功能裝置的所有功能裝置都有相同的容器標識符。 如需在特殊情況下報告容器標識碼的詳細資訊,例如可跨越多個容器中多個磁碟但不屬於任何容器的磁碟區裝置,請參閱 容器標識元概觀

卸除式實體裝置會定義為總線驅動程式指定 TRUE可移動式功能,以回應IRP_MN_QUERY_CAPABILITIES要求。 如需 卸除式 值的詳細資訊,請參閱 DEVICE_CAPABILITIES

總線驅動程式會根據裝置所提供的總線特定唯一標識符來建立容器標識碼。 如需詳細資訊,請參閱 如何產生容器標識符

如果下列任一項成立,驅動程式必須失敗 IRP 要求,並將 IoStatus.Status 設定為 STATUS_NOT_SUPPORTED:

  • 裝置不支援總線專用的唯一標識符,總線驅動程式可用來產生容器標識碼。

  • 總線驅動程式先前已指定 FALSE卸除式功能,以回應裝置的IRP_MN_QUERY_CAPABILITIES要求。

傳送此 IRP

一般而言,只有 PnP 管理員會傳送此 IRP。

若要取得裝置的硬體標識碼或相容的標識符,請呼叫 IoGetDeviceProperty ,而不是傳送此 IRP。

驅動程式可能會傳送此 IRP 來擷取其中一個裝置的實例標識碼。 例如,請考慮多功能 PnP ISA 裝置,其函式不會獨立運作。 PnP 管理員會將函式列舉為個別裝置,但這類裝置的驅動程式可能需要建立一或多個函式的關聯。 因為 PnP ISA 保證唯一的實例識別碼,所以這類多功能裝置的驅動程式可以使用實例標識碼來找出位於相同裝置上的函式。 這類裝置的驅動程式也必須呼叫 IoGetDeviceProperty來取得裝置的列舉值名稱,以確認裝置是 PnP ISA 裝置。

如需傳送 IRP 的相關信息,請參閱 處理 IRP 。 下列步驟特別適用於此 IRP:

  • 設定 IRP 下一個 I/O 堆棧位置中的值:將 MajorFunction 設定為 IRP_MJ_PNP、將 MinorFunction 設定為 IRP_MN_QUERY_ID,並將 Parameters.QueryId.IdType 設定為 BusQueryInstanceID

  • [IoStatus.Status ] 設定為 [STATUS_NOT_SUPPORTED]。

除了傳送查詢標識碼 IRP 之外,驅動程式還必須呼叫 IoGetDeviceProperty ,以取得裝置的 DevicePropertyEnumeratorName

在 IRP 完成且驅動程式以識別碼完成之後,驅動程式必須釋放驅動程式所傳回的標識元結構, (處理查詢 IRP 的) 。

規格需求

標頭

Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另請參閱

裝置識別字串

IoGetDeviceProperty