PnP 測試 (裝置基本概念)
裝置基本原理 PnP 測試會強制驅動程式處理幾乎所有的 PnP IRP;不過,有三個特別強調的領域:移除、重新平衡和意外移除。 PnP 測試提供一種機制來分別測試每一項,或一起測試它們(也就是作為壓力測試)。 此 PnP 測試是使用使用者模式 API 呼叫(透過測試應用程式)和內核模式 API 呼叫的組合來完成(透過高篩選驅動程式)。
PNP 測試
即插即用 (PnP) 測試會在驅動程式和使用者模式元件中執行各種 PnP 相關程式代碼路徑。 PnP 測試應該在測試電腦上啟用 驅動程式驗證器 執行。 如需啟用驅動程式驗證器的相關信息,請參閱 的驅動程式專案驅動程式驗證器屬性。
測試 | 描述 |
---|---|
停用增強型裝置測試 (EDT) 支援 |
此測試會將測試篩選驅動程式(msdmfilt.sys)從使用 DQ 參數指定的裝置中卸載為上層篩選器。 此測試篩選器會作為此測試類別測試運行過程中的一部分安裝。 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO IOType |
PNP (停用和啟用) 在 IO 前後重新啟動 |
此測試會在系統重新啟動的裝置上執行基本的 PnP 停用/啟用和 I/O。 測試二進位檔: Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc 測試方法: PNP_DisableEnable_Reboot_With_IO_Before_And_After 參數: - 請參閱 裝置基本概念測試參數 DQ IOPeriod |
PNP (停用和啟用)與 I/O 之前和之後 |
此測試會在裝置上執行 I/O 和基本 PnP 停用/啟用。 此測試會執行下列動作:
測試二進位檔: Devfund_PNP_DisableEnable_With_IO_BeforeAndAfter.wsc 測試方法: PNP_DisableEnable_With_IO_Before_And_After 參數: - 請參閱 裝置基本概念測試參數 DQ IOPeriod |
PNP 取消移除裝置測試 |
此測試會使用 EDT 篩選驅動程式將IRP_MN_CANCEL_REMOVE_DEVICE傳送至目標裝置堆疊。 如需詳細資訊,請參閱 關於裝置移除測試。 測試二進位檔: Devfund_PnPDTest.dll 測試方法: PNPCancelRemoveDevice 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP 取消停止裝置測試 |
此測試會使用 EDT 篩選驅動程式將IRP_MN_CANCEL_STOP_DEVICE傳送至目標裝置堆疊。 如需詳細資訊,請參閱 關於重新平衡測試。 測試二進位檔: Devfund_PnPDTest.dll 測試方法: PNPCancelStopDevice 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP DIF 移除裝置測試 |
此測試會使用 SetupDi API 來傳送 DIF_REMOVE 要求,讓安裝程式移除裝置。 測試二進位檔: Devfund_PnPDTest.dll 測試方法: PNPDIFRemoveAndRescanParentDevice 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP 停用和啟用裝置測試 |
此測試會停用並啟用目標裝置。 測試二進位檔: Devfund_PnPDTest.dll Test 方法: PNPDisableAndEnableDevice 參數: - 請參閱 裝置基本概念測試參數 DQ 測試週期 DoSimpleIO IOPeriod DoConcurrentIO IOType |
PNP 重新平衡失敗,重新啟動裝置測試 |
此測試會使用 EDT 篩選驅動程式嘗試將IRP_MN_STOP_DEVICE傳送至目標裝置堆疊。 EDT 篩選驅動程式會拒絕後續的 IRP_MN_START_DEVICE 要求(接續 IRP_MN_STOP_DEVICE 要求),以致意外移除目標裝置。 如需詳細資訊,請參閱 關於重新平衡測試。 測試二進位檔: Devfund_PnPDTest.dll Test 方法: PNPTryStopDeviceAndFailRestart 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP 調整資源分配請求,新資源裝置測試 |
此測試會使用 EDT 篩選驅動程式嘗試將IRP_MN_STOP_DEVICE傳送至目標裝置堆疊。 它也會調整裝置的資源需求,以最大化新資源被配置到裝置的機會。 如需詳細資訊,請參閱 關於重新平衡測試。 測試二進位檔: Devfund_PnPDTest.dll 測試方法: PNPTryStopDeviceRequestNewResourcesAndRestartDevice 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP 移除裝置測試 |
這個測試將導致 IRP_MN_QUERY_REMOVE_DEVICE 和 IRP_MN_REMOVE_DEVICE 被傳送到目標設備堆疊。 如需詳細資訊,請參閱 關於裝置移除測試。 測試二進位檔: Devfund_PnPDTest.dll Test 方法: PNPRemoveAndRestartDevice 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP 停止 (重新平衡) 裝置測試 |
此測試會使用 EDT 篩選驅動程式嘗試將IRP_MN_STOP_DEVICE傳送至目標裝置堆疊。 如需詳細資訊,請參閱 關於重新平衡測試。 測試二進位檔: Devfund_PnPDTest.dll Test 方法: PNPTryStopAndRestartDevice 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP 意外移除裝置測試 |
此測試會使用 EDT 篩選驅動程式將IRP_MN_SURPRISE_REMOVAL傳送至目標裝置堆疊。 如需詳細資訊,請參閱 關於意外移除測試。 測試二進位檔: Devfund_PnPDTest.dll 測試方法: PNPSurpriseRemoveAndRestartDevice 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
關於裝置移除測試
- PNP 移除裝置測試
- PNP 取消裝置移除測試
裝置移除測試包含IRP_MN_QUERY_REMOVE_DEVICE、IRP_MN_CANCEL_REMOVE_DEVICE和IRP_MN_REMOVE_DEVICE。
測試會嘗試在目標裝置堆疊上安裝其上層篩選器驅動程式。 此嘗試會導致查詢移除 IRP。
如果此查詢移除 IRP 失敗,測試會重新啟動電腦,讓篩選驅動程式進入裝置堆疊。 如果未否決移除要求,將會移除裝置堆疊,並在裝置堆疊上使用篩選驅動程式重新啟動。
測試通過使用設定介面,將查詢移除的 IRP 傳送至裝置堆疊。 篩選驅動程式未通過此移除要求,因此會傳送取消移除 IRP。 篩選驅動程式會判斷取消移除成功。
接下來,測試應用程式會呼叫適當的類別安裝程式和任何已註冊的共同安裝程式來停用、啟用、移除或重新列舉裝置(這會測試類別和共同安裝程式如何處理DIF_PROPERTYCHANGE與DICS_DISABLE、DICS_ENABLE和DICS_PROPCHANGE)。 收到IRP_MN_REMOVE_DEVICE時,篩選驅動程式會確認下層驅動程式已順利完成。
這些步驟都包含初步移除要求。 如果已否決該要求,將不會移除裝置。 您可以選擇在適當時否決移除要求,例如在USB相機上串流視訊,或目標裝置位於開機或分頁路徑。 請記住,拒絕所有的移除請求一般來說不是好做法。 如果拒絕所有移除要求,則不保證驅動程式永遠不會收到移除,因為在意外移除後仍然會發出移除 IRP,或者如果裝置堆疊中的任何一項啟動 IRP 失敗。
關於意外移除測試
- PNP 意外移除裝置測試
此「意外移除」測試包括執行IRP_MN_SURPRISE_REMOVAL,然後是IRP_MN_REMOVE_DEVICE。
如同先前的測試,測試應用程式會嘗試將上層篩選新增至目標裝置堆疊,然後重新啟動堆疊。 如果此嘗試未成功,測試會重新啟動計算機。
由測試應用程式觸發時,篩選驅動程式會導致系統先將IRP_MN_SURPRISE_REMOVAL傳送至設備堆疊,然後傳送IRP_MN_REMOVE_DEVICE。 篩選驅動程式會判斷這兩個 IRP 都已由較低的驅動程序順利完成。
在意外移除測試完成後,裝置將會卸載並重新枚舉,並從堆疊中移除篩選驅動程式。
關於重新平衡測試
- PNP 停止 (重新平衡) 裝置測試
- PNP 重新平衡請求新資源的裝置測試
- PNP 重新平衡失敗,裝置重啟測試
- PNP 取消停止裝置測試
如同移除測試,測試應用程式會嘗試將上層篩選新增至目標裝置堆疊,然後使用 SetupDiCallClassInstaller 搭配 DIF_PROPERTYCHANGE 重新啟動裝置堆疊。 如果此嘗試未成功(也就是說,如果目標裝置堆疊中的某個元件未能完成查詢移除 IRP),測試會重新啟動計算機以進行重新平衡測試。
根據您選擇的重新平衡測試而定,會發生下列事件:
PNP 停止(再平衡)裝置測試 此測試會啟動一個重新平衡程序,這會觸發 IRP_MN_QUERY_STOP_DEVICE 的 PnP IRP 發送至裝置驅動程式。
如果堆疊中的任何驅動程序失敗,此 IRP 會放棄重新平衡程式。 請注意,在 Windows Vista 中,支援多層級重新平衡。 如果在非葉裝置節點上啟動重新平衡,則在裝置樹中以該裝置節點為根的所有裝置堆疊也會進行重新平衡。 如果任何子裝置堆疊在查詢停止階段失敗,則會放棄整個重新平衡程序。 因此,驅動程式不能失敗查詢停止,而沒有真正的理由這樣做。 如果發生此失敗,PnP 管理員會將取消停止 (IRP_MN_CANCEL_STOP) 傳送至已傳送查詢停止的所有裝置堆疊。
如果所有涉及的裝置堆疊都通過了「查詢停止」,測試將繼續進行重新平衡,並傳送 IRP_MN_QUERY_RESOURCE_REQUIREMENTS 和 IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP,以確定裝置的資源需求。
在這一點之後,視目標裝置是否取用任何資源而定,可能會有兩個不同的路徑:
如果裝置未耗用任何資源,則 PnP 管理員會自動將取消停止裝置(IRP_MN_CANCEL_STOP_DEVICE)作為一種優化措施發送。
如果裝置實際耗用資源,則會使用IRP_MN_STOP_DEVICE和IRP_MN_START_DEVICE IRP 完成重新平衡程式。
使用此選項時,裝置的資源不會變更。
PNP 取消停止裝置測試:此測試會啟動重新配置程序,但篩選驅動程式故意讓查詢停止 IRP 失敗。 IRP 的順序看起來就像 IRP_MN_QUERY_STOP_DEVICE(篩選驅動程式在啟動時失敗,導致重新平衡取消)和 IRP_MN_CANCEL_STOP_DEVICE。
使用此選項時,裝置的資源不會變更
PNP 重新平衡要求新資源裝置測試 此測試會啟動重新平衡,並調整裝置的資源需求,以最大化實際有新資源配置給裝置的可能性。 這個選項也可協助沒有資源的裝置實際完成完整重新平衡程式:
首先會啟動簡單的重新平衡,導致下列 IRP:
- IRP_MN_QUERY_STOP_DEVICE (假設此 IRP 是由所有驅動程序傳遞。測試已經涵蓋此 IRP 失敗的情況。
- IRP_MN_QUERY_RESOURCE_REQUIREMENTS
- IRP_MN_FILTER_RESOURCE_REQUIREMENTS。 為了回應此 IRP,當啟動時,篩選驅動程式會根據裝置是否耗用任何資源採取動作:
- 如果裝置沒有資源需求,篩選會指派假資源。
- 如果裝置有資源需求,它會嘗試以將變更目前指派的機率最大化的方式重新建構資源需求清單。 例如,如果裝置在 00 到 FF 之間需要 2 個字節的記憶體,且目前指派 3A-3B,請修改,讓新的資源需求(依喜好設定順序)看起來像 00-39 或 3C-FF 或 3A-3B。 同樣地,如果裝置資源需求清單有任何替代需求,它會變更其順序,因此替代需求會稍早出現在清單中。
現在裝置應該總是完成重新平衡程序。
IRP_MN_STOP_DEVICE
IRP_MN_START_DEVICE(新分配的資源。如果已創建假需求,請將這些新資源從實際的驅動程式中隱藏起來。)
PNP 重新平衡失敗導致重新啟動裝置測試 此測試會發起重新平衡,但當篩選驅動程式在完成重新平衡後開始運作時,它故意讓操作失敗,這會導致出現意外移除 IRP,接下來會觸發移除 IRP。
首先,它會啟動重新平衡程序,並透過為不消耗任何資源的裝置產生假資源需求,以確保驅動程式完成停止與啟動操作。
- IRP_MN_QUERY_STOP_DEVICE (假設此 IRP 是由所有驅動程序傳遞。測試已經涵蓋此 IRP 失敗的情況。
- IRP_MN_QUERY_RESOURCE_REQUIREMENTS (查詢資源需求)
- IRP_MN_FILTER_RESOURCE_REQUIREMENTS (如果實際的資源需求為 null,則過濾器會分配假資源需求,導致停止和啟動的過程。)
- IRP_MN_STOP_DEVICE
- IRP_MN_START_DEVICE (篩選器在向上傳遞時未能處理此 IRP。此操作將導致非預期移除 IRP。
- IRP_MN_SURPRISE_REMOVAL
- IRP_MN_REMOVE
重新平衡測試完成之後,裝置將會被卸載並重新列舉,也會從堆疊中移除篩選驅動程式。
裝置錯誤碼
如果測試提供錯誤訊息,指出裝置狀態不正常,您可以透過設備管理器深入瞭解裝置狀態。 如需各種裝置錯誤碼的摘要,請參閱 設備管理員錯誤訊息。
使用安裝 API 記錄對安裝失敗進行偵錯
安裝程式 API 記錄檔 (setupapi.app.log 和 setupapi.dev.log) 可能包含有用的資訊,以偵錯此測試所記錄的驅動程式安裝失敗。 您可以在測試系統上的 %windir%\inf\ 目錄中找到安裝程式 API 記錄。
若要增加這些記錄的詳細資訊和潛在效用,請在執行重新安裝測試之前,將下列登錄機碼設定為0x2000FFFF:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup\LogLevel
相關主題
如何使用 Visual Studio 在運行時間測試驅動程式