總線驅動程式必須處理其子裝置的 BusQueryDeviceID 要求(子 PDO)。 總線驅動程式可以處理其子裝置之 BusQueryHardwareID、BusQueryCompatibleID 和 BusQueryInstanceID 的要求。
從 Windows 7 開始,總線驅動程式也必須處理其子 PDO 的 BusQueryContainerID 要求。
如需這些標識碼的詳細資訊,請參閱 裝置識別字串。
注意: 函式驅動程式和篩選驅動程式不會處理此 IRP。
價值觀
0x13
主要程序代碼
傳送時
列舉裝置時,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> 設定為零。
行動
如果驅動程式傳回 ID(s)以回應此 IRP,它會從分頁集區配置 WCHAR 結構以包含 ID(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,總線驅動程式應該提供包含裝置 實例識別符 的字串。 Windows 和總線驅動程式會搭配其他資訊使用實例標識碼,以區分電腦上的兩個相同裝置。 實例標識碼在整個計算機上是唯一的,或只是在裝置的父總線上是唯一的。
如果實例標識碼在總線上是唯一的,則總線驅動程式會指定 BusQueryInstanceID 的字串,但也指定 FALSE的 UniqueID 值,以回應裝置的IRP_MN_QUERY_CAPABILITIES要求。 如果 UniqueID 為 FALSE,PnP 管理員會藉由新增裝置父系的相關信息來增強實例識別碼,因此在電腦上使標識碼是唯一的。 在此情況下,總線驅動程式不應採取額外的步驟,使其裝置的實例標識符全域是唯一的;只要傳回適當的功能資訊,作系統就會處理它。
如果總線驅動程式可以提供每個子裝置的全域唯一標識符,例如序號,則總線驅動程式會指定 BusQueryInstanceID 的這些字串,並指定 TRUE 的 UniqueID 值,以回應每個裝置的IRP_MN_QUERY_CAPABILITIES要求。
指定 BusQueryHardwareIDs 和 BusQueryCompatibleIDs
總線驅動程式為 BusQueryHardwareID 和 BusQueryCompatibleID 提供的值可讓 Windows 找出總線子裝置的適當驅動程式。
總線驅動程式會以描述裝置的REG_MULTI_SZ標識符清單來回應這些要求。 標識符清單的最大長度,包括終止清單的兩個NULL字元,REGSTR_VAL_MAX_HCID_LEN。
傳回一個以上的 硬體標識碼 和/或一個以上的 相容標識符時,總線驅動程序應該依照最一般最特定的順序列出標識符,以利選擇最適合裝置的驅動程式。 硬體標識符清單中的第一個專案是裝置最特定的描述,因此,它通常與裝置標識元相同。
Windows 會針對 INF 檔案中列出的標識碼檢查標識碼是否有可能的相符專案。 Windows 會先掃描硬體標識碼清單,然後掃描相容的標識碼清單。 較舊的專案會被視為裝置的更具體描述,而較新的專案會視為裝置更一般(因此較不理想的)相符專案。 如果在硬體標識碼清單中找不到相符專案,Windows 可能會提示使用者輸入安裝媒體,然後再移至相容的標識符清單。
如需處理隨插即用次要 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) |