PnP 管理員會傳送此要求來判斷裝置之間的特定關聯性。 下列類型的驅動程式會處理此要求:
總線驅動程式必須處理其適配卡或控制器的 BusRelations 要求(總線 FDO)。 篩選驅動程式可能會處理 BusRelations 要求。
總線驅動程式必須處理其子裝置的 TargetDeviceRelation 要求(子 PDO)。
函式和篩選驅動程式可能會處理 RemovalRelations 和 PowerRelations 要求。
公交車司機可能會處理其子裝置的 彈射關係 要求(子 PDO)。
價值
0x07
主要程序代碼
傳送時
PnP 管理員會傳送此 IRP 來收集與指定裝置關聯性相關之裝置的相關信息。
PnP 管理員會在列舉裝置時查詢裝置的 BusRelations (子裝置),並在裝置處於使用中狀態時在其他時間查詢,例如當驅動程式呼叫 IoInvalidateDeviceRelations 例程時,表示子裝置已抵達或離開。
PnP 管理員會先查詢裝置的 RemoveRelations ,再移除裝置的驅動程式。 PnP 管理員會先查詢 RemovalRelations 和 EjectionRelations ,再退出裝置。
當驅動程式或使用者模式應用程式在裝置上註冊 EventCategoryTargetDeviceChange 的 PnP 通知時,PnP 管理員會查詢裝置的 TargetDeviceRelation。 PnP 管理員會查詢與特定檔案對象相關聯的裝置。 IRP_MN_QUERY_DEVICE_RELATIONS 是唯一具有有效檔案物件參數的 PnP IRP。 驅動程式可以查詢 TargetDeviceRelation 的裝置堆疊。 驅動程式不需要在傳送 其 TargetDeviceRelation 查詢時提供檔案物件。
當裝置的驅動程式呼叫 IoInvalidateDeviceRelations 時,PnP 管理員會查詢裝置的 PowerRelations,以指出此裝置具有隱含電源管理關聯性的裝置集已變更。 從 Windows 7 開始,支援 PowerRelations 要求。
對於 BusRelations、 RemovalRelations、 EjectionRelations 和 PowerRelations 要求,PnP 管理員會在系統線程的內容中傳送 IRP_MN_QUERY_DEVICE_RELATIONS at IRQL = PASSIVE_LEVEL。
針對 TargetDeviceRelation 要求,PnP 管理員會在任意線程內容中傳送此 IRP at IRQL = PASSIVE_LEVEL。
輸入參數
IO_STACK_LOCATION 結構的Parameters.QueryDeviceRelations.Type成員會指定正在查詢的關聯類型。 可能的值為 BusRelations、 EjectionRelations、 RemovalRelations、 TargetDeviceRelation 和 PowerRelations。
只有當 Parameters.QueryDeviceRelations.Type 為 TargetDeviceRelation 時,目前IO_STACK_LOCATION結構的 FileObject 成員才會指向有效的檔案物件。
輸出參數
在 I/O 狀態區塊中傳回。
I/O 狀態區塊
驅動程式會將 Irp-IoStatus.Status> 設定為STATUS_SUCCESS或失敗狀態,例如STATUS_INSUFFICIENT_RESOURCES。
成功時,驅動程式會將 Irp-IoStatus.Information> 設定為指向所要求關聯資訊的PDEVICE_RELATIONS指標。 DEVICE_RELATIONS 結構的定義如下:
typedef struct _DEVICE_RELATIONS {
ULONG Count;
PDEVICE_OBJECT Objects[1]; // variable length
} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
行動
如果驅動程式傳回關聯以回應此 IRP_MN_QUERY_DEVICE_RELATIONS,驅動程式會從分頁記憶體配置 DEVICE_RELATIONS 結構,其中包含計數和適當的裝置物件指標數目。 當不再需要結構時,PnP 管理員會釋放結構。 如果驅動程式取代另一個驅動程式配置的 DEVICE_RELATIONS 結構,驅動程式必須釋放先前的結構。
驅動程式必須參考它在此 IRP 中報告之任何裝置的 PDO (ObReferenceObject)。 適當時,PnP 管理員會移除參考。
函式或篩選驅動程式應該準備好在裝置 的 AddDevice 例程完成之後,隨時處理裝置的此 IRP。 總線驅動程式應該準備好在列舉裝置之後立即處理 BusRelations 的 查詢。
如需處理 隨插即用次要 IRP 的一般規則,請參閱 即插即用。
下列小節描述處理各種查詢的特定動作。
BusRelations 要求
當 PnP 管理員查詢適配卡或控制器的總線關聯性(子裝置)時,總線驅動程式必須傳回總線上實際存在之任何裝置之 PDO 的指標清單。 總線驅動程式會報告所有裝置,無論裝置是否已啟動。 公共汽車司機可能需要啟動其總線裝置,以判斷哪些子系存在。
警告 在 PnP 管理員為該物件建立裝置節點 (devnode) 之前,無法將裝置對象傳遞至採用 PDO 做為自變數的任何例程。 (如果驅動程式確實通過裝置對象,系統會使用 錯誤檢查檢查0xCA錯誤檢查:PNP_DETECTED_FATAL_ERROR。PnP 管理員會建立 devnode,以回應 IRP_MN_QUERY_DEVICE_RELATIONS 要求。 驅動程式可以安全地假設 PDO 的開發節點在收到 IRP_MN_QUERY_RESOURCE_REQUIREMENTS 要求時已建立。
回應此 IRP 的總線驅動程式是總線適配卡或控制器的功能驅動程式,而不是適配卡或控制器所連接的總線父總線驅動程式。 非總線裝置的函式驅動程式不會處理此查詢。 這類驅動程式只會將 IRP 傳遞至下一個較低的驅動程式。 (請參閱下圖。篩選驅動程式通常不會處理此查詢。
在 Windows Vista 和更新版本的作系統上,我們建議驅動程式一律將 IRP_MN_QUERY_DEVICE_RELATIONS IRP 畫上筆,並在稍後完成其處理。 此順序可讓系統以異步方式處理總線關聯查詢。 (在 Windows Vista 之前的作系統上,驅動程式可以從其分派例程安全地傳回STATUS_PENDING,但 PnP 管理員不會與任何其他作業重疊總線關聯查詢。
下圖顯示驅動程式如何處理總線關係的查詢。
在圖中顯示的範例中,PnP 管理員會將 BusRelations的IRP_MN_QUERY_DEVICE_RELATIONS傳送至 USB 中樞裝置的驅動程式。 PnP 管理員要求中樞裝置的子系列表。
與所有 PnP IRP 一樣,PnP 管理員會將 IRP 傳送至裝置堆疊中的最上層驅動程式。
選擇性篩選驅動程式可能是堆疊中的最上層驅動程式。 篩選驅動程式通常不會處理此 IRP;它會將 IRP 傳遞到堆疊上。 例如,如果驅動程式在總線上公開不可列舉的裝置,篩選驅動程式可能會處理此 IRP。
USB 中樞總線驅動程式會處理 IRP。
USB 中樞總線驅動程式:
為尚未擁有 PDO 的任何子裝置建立 PDO。
針對任何不再出現在總線上的裝置,將 PDO 標示為非使用中。 總線驅動程式不會刪除這類 PDO。如需何時刪除 PDO 的詳細資訊,請參閱 移除裝置。
報告總線上存在的任何子裝置。
針對每個子裝置,總線驅動程式會參考 PDO,並將指標放在 DEVICE_RELATIONS 結構中的 PDO。
此範例中有兩個 PDO:一個用於遊戲桿裝置,另一個用於鍵盤裝置。
總線驅動程式應該檢查另一個驅動程式是否已為此 IRP 建立DEVICE_RELATIONS結構。 如果是,則總線驅動程序必須新增至現有的資訊。
如果總線上沒有子裝置,驅動程式會將DEVICE_RELATIONS結構中的計數設定為零,並傳回成功。
在 I/O 狀態區塊中設定適當的值,並將 IRP 傳遞至下一個較低的驅動程式。 適配卡或控制器的總線驅動程式未完成 IRP。
如果存在,則為選擇性較低的篩選條件,通常不會處理此 IRP。 這類篩選驅動程式會將 IRP 向下傳遞至堆疊。 如果較低篩選驅動程式會處理此 IRP,它可以將 PDO(s) 新增至子裝置清單,但不得刪除其他驅動程式所建立的任何 PDO。
父總線驅動程式不會處理此 IRP,除非它是裝置堆疊中唯一的驅動程式(裝置處於原始模式)。 如同所有 PnP IRP,父總線驅動程式會使用 IoCompleteRequest 完成 IRP。
如果裝置堆疊中有一或多個總線篩選驅動程式,這類驅動程式可能會在前往總線驅動程式的路上處理 IRP,並在 IRP 的路上備份裝置堆疊(如果有 IoCompletion 例程)。 根據 PnP IRP 規則,這類驅動程式可以在往下堆棧上將 PDO 新增至 IRP,並/或修改 IRP 備份堆疊的方式上的關聯清單(在 IoCompletion 例程中)。
退出Relations 要求
驅動程式會傳回任何裝置的 PDO 指標,這些裝置可能會在指定的裝置被退出時從系統實際移除。 請勿報告裝置子系的 PDO;PnP 管理員一律要求在其父裝置之前移除子裝置。
PnP 管理員會將 IRP_MN_EJECT IRP 傳送至正在退出的裝置。 這類裝置的驅動程式也會接收移除 IRP。 裝置的退出關係會收到 IRP_MN_REMOVE_DEVICE IRP(不是 IRP_MN_EJECT IRP)。
只有父總線驅動程式可以回應其其中一個子裝置的 EjectionRelations 查詢。 函式和篩選驅動程式必須將它傳遞給裝置堆疊中的下一個較低驅動程式。 如果總線驅動程式收到此 IRP 做為其適配卡或控制器的函式驅動程式,則總線驅動程式會執行函式驅動程式的工作,而且必須將 IRP 傳遞至下一個較低的驅動程式。
PowerRelations 要求
從 Windows 7 開始, PowerRelations 查詢可讓驅動程式指定父總線之間支援 PnP 列舉和總線上列舉子裝置的傳統關聯性以外的電源管理關聯性。 例如,如果總線驅動程式無法列舉總線上的子裝置,或者如果裝置是多部總線的子系, PowerRelations 查詢可以描述子裝置與總線或公交車的電源關係。
當裝置的驅動程式呼叫 IoInvalidateDeviceRelations 例程,並指定 PowerRelations 的 Type 參數值時,PnP 管理員會發出裝置的 PowerRelations 查詢。
為了回應此查詢,目標裝置的驅動程式(也就是查詢目標裝置)會提供 DEVICE_RELATIONS 結構,其中包含電源管理員在開啟目標裝置之前必須開啟之任何其他裝置之 PDO 的指標。 相反地,只有在目標裝置關閉之後,才能關閉這些其他裝置。 電源管理員會使用查詢中的資訊,以確保這些裝置以正確的順序開啟和關閉。
此排序保證僅適用於全域系統睡眠狀態轉換,包括從 S1、S2、S3(睡眠)、S4(休眠)和 S5(關機)系統電源狀態轉換。 PowerRelations 排序保證不適用於 Dx 裝置電源狀態轉換,而系統維持在 S0 (執行) 系統狀態,但直接運行時間電源管理 (DFx) 轉換的情況除外。
如果目標裝置位於特殊檔案的裝置路徑上(例如分頁檔案、休眠檔案或損毀傾印檔案),則目標裝置的驅動程式必須在處理 InPath為 TRUE的 IRP_MN_DEVICE_USAGE_NOTIFICATION IRP 時執行額外的步驟。 此驅動程式必須確保其 PDO 提供給 PowerRelations 查詢的裝置也可以支援位於特殊檔案的裝置路徑中。 若要確認此支援,目標裝置的驅動程式必須先將 IRP_MN_DEVICE_USAGE_NOTIFICATION IRP 傳送給每個裝置,而且此 IRP 必須指定與目標裝置相同的 UsageNotification.Type 。 只有在收到此 IRP 的所有裝置都完成 IRP 且狀態代碼成功時,目標裝置的驅動程式才能順利完成其 IRP_MN_DEVICE_USAGE_NOTIFICATION IRP。 否則,此驅動程式必須以失敗狀態代碼完成此 IRP。
當這個相同的驅動程序處理 InPath 為 FALSE 的IRP_MN_DEVICE_USAGE_NOTIFICATION IRP 時,驅動程式必須將IRP_MN_DEVICE_USAGE_NOTIFICATION IRP 傳送至與 InPath 為 TRUE 的相同一組相依裝置。 不過,當 InPath 為 FALSE 時,驅動程式絕對不應該完成此 IRP,並出現失敗狀態代碼。
回應 PowerRelations 查詢的驅動程式應該在 PowerRelations 查詢提供 PDO 的所有裝置上註冊目標裝置變更通知。 若要註冊這些通知,驅動程式可以呼叫 IoRegisterPlugPlayNotification 例程,並指定 EventCategoryTargetDeviceChange 的 EventCategory 參數值。
RemovalRelations 要求
驅動程式會在移除指定裝置的驅動程式時,傳回其驅動程式必須移除之任何裝置的 PDO 指標。 請勿報告裝置子系的 PDO;PnP 管理員已在移除裝置之前要求移除子裝置。
拿掉關聯的順序未定義。
裝置堆疊中的任何驅動程式都可以處理這種類型的關聯查詢。 函式或篩選驅動程式會先處理 IRP,再將它傳遞給下一個較低的驅動程式。 公共汽車司機會處理 IRP,然後完成它。
TargetDeviceRelation 要求
TargetDeviceRelation 查詢可讓 PnP 管理員查詢控制硬體之 PnP 裝置堆疊中 PDO 的非 PnP 裝置堆疊。
一般而言,驅動程式會將 IRP_MN_QUERY_DEVICE_RELATIONS IRP 向下轉送至其堆疊,直到 IRP 到達特定裝置堆疊的底部為止。 非 PnP 堆疊底部的驅動程式接著會將 IRP 轉寄或重新發出給相關的 PnP 堆疊。 例如,PnP 管理員可能會將 TargetDeviceRelation 查詢傳送至文件系統堆疊頂端的裝置物件,這是非 PnP 堆疊。 檔系統堆疊中的每個裝置物件都會將查詢傳遞至其下方的裝置物件,直到查詢到達堆棧底部的裝置物件為止。 堆疊中最低的裝置物件會將 TargetDeviceRelation 查詢轉寄或重新發出至 PnP 儲存磁碟區堆疊頂端的裝置對象,然後查詢會向下傳遞至存放磁碟區堆棧底部的 PDO。
下列清單摘要說明您可以在 PnP 裝置堆疊底部安全地取得 PDO 指標的情況:
PnP 中的 Device 物件
當呼叫裝置的 AddDevice 例程時,PnP 裝置堆疊中的裝置物件會瞭解堆疊的 PDO。 如果使用指標與傳入 IRP_MN_REMOVE_DEVICE 訊息正確同步,驅動程式就可以安全地快取 PDO 的指標,方法是使用移除鎖定例程。
非 PnP 堆疊中的裝置物件,不在堆疊底部
對於不在非 PnP 堆疊底部的裝置對象,驅動程式可以傳送 TargetDeviceRelation 查詢,以取得對應 PnP 裝置堆疊底部 PDO 的指標。
裝置的檔案物件
假設裝置的檔案對象,驅動程式可以呼叫 IoGetRelatedDeviceObject 來取得裝置物件,然後遵循上述清單專案中的指示。
裝置物件的句柄
假設裝置物件的句柄,驅動程式可以呼叫 ObReferenceObjectByHandle 來取得裝置的檔案物件,然後遵循上述清單專案中的指示。
父總線驅動程式必須處理其子裝置 的 TargetDeviceRelation 關聯查詢。 總線驅動程式會參考子裝置的 PDO 與 ObReferenceObject ,並傳回 DEVICE_RELATIONS 結構中 PDO 的指標。 這個關聯類型的結構中只有一個 PDO 指標。 當驅動程式或應用程式取消註冊裝置上的通知時,PnP 管理員會移除 PDO 的參考。
只有父總線驅動程式會回應 TargetDeviceRelation 查詢。 函式和篩選驅動程式必須將它傳遞給裝置堆疊中的下一個較低驅動程式。 如果總線驅動程式收到此 IRP 做為其適配卡或控制器的函式驅動程式,則總線驅動程式會執行函式驅動程式的工作,而且必須將 IRP 傳遞至下一個較低的驅動程式。
如果驅動程式不在 PDO 型堆疊中,驅動程式會將新的 target-device-relation 查詢 IRP 傳送至驅動程序執行 I/O 的檔案句柄相關聯的裝置物件。
傳送此 IRP
驅動程式不得傳送 IRP_MN_QUERY_DEVICE_RELATIONS 要求 BusRelations。 驅動程式不會限制傳送此 IRP 以進行 RemovalRelations 或 EjectionRelations,但驅動程式不太可能這麼做。
驅動程式可以查詢 TargetDeviceRelation 的裝置堆疊。 如需傳送 IRP 的相關信息,請參閱 處理 IRP 。 下列步驟特別適用於此 IRP:
設定 IRP 下一個 I/O 堆棧位置中的值:將 MajorFunction 設定為 IRP_MJ_PNP、將 MinorFunction 設定為 IRP_MN_QUERY_DEVICE_RELATIONS、將 Parameters.QueryDeviceRelations.Type 設定為 TargetDeviceRelation,並將 Irp-FileObject> 設定為有效的檔案物件。
將 IoStatus.Status 初始化為 STATUS_NOT_SUPPORTED。
如果驅動程式傳送此 IRP 讓 PDO 回報,以響應驅動程式收到的 TargetDeviceRelationIRP_MN_QUERY_DEVICE_RELATIONS,則驅動程式會報告 PDO,並在 IRP 完成時釋放傳回的關聯結構。 如果驅動程式基於其他原因起始此 IRP,則驅動程式會在 IRP 完成時釋放關聯結構,並在不再需要 PDO 時取值 PDO。
需求
頁首 |
Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h) |
另請參閱
#B0 #A1 新增裝置 #A2 #C3
IoRegisterPlugPlayNotification
IRP_MN_DEVICE_USAGE_NOTIFICATION