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 測試方法: PNPDisableAndEnableDevice 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO IOType |
PNP 重新平衡失敗重新開機裝置測試 |
此測試會使用 EDT 篩選驅動程式嘗試將IRP_MN_STOP_DEVICE傳送至目標裝置堆疊。 EDT 篩選驅動程式接著會失敗IRP_MN_START_DEVICE (遵循IRP_MN_STOP_DEVICE要求) ,以觸發意外移除目標裝置的要求。 如需詳細資訊,請參閱 關於重新平衡測試。 測試二進位檔: Devfund_PnPDTest.dll 測試方法: 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 測試方法: PNPRemoveAndRestartDevice 參數: - 請參閱 裝置基本概念測試參數 DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP 停止 (重新平衡) 裝置測試 |
此測試會使用 EDT 篩選驅動程式嘗試將IRP_MN_STOP_DEVICE傳送至目標裝置堆疊。 如需詳細資訊,請參閱 關於重新平衡測試。 測試二進位檔: Devfund_PnPDTest.dll 測試方法: 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 失敗,測試會重新開機電腦,以將篩選驅動程式移至裝置堆疊。 如果未保留移除要求,將會移除裝置堆疊,並使用裝置堆疊上的篩選驅動程式重新開機。
測試會使用設定 API,將查詢移除 IRP 傳送至裝置堆疊。 篩選驅動程式會失敗此移除要求,因此會傳送取消移除 IRP。 篩選驅動程式會判斷取消移除成功。
接下來,測試應用程式會呼叫適當的類別安裝程式和任何已註冊的共同安裝程式,以停用或啟用並移除或繼續裝置, (此測試類別和共同安裝程式處理與DICS_DISABLE、DICS_ENABLE和DICS_PROPCHANGE) DIF_PROPERTYCHANGE。 收到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。
如果堆疊中的任何驅動程式失敗,則會放棄重新平衡程式。 請注意,在 Windows Vista 中,支援多層級重新平衡。 如果在非分葉裝置節點上啟動重新平衡,則裝置樹狀結構中的所有裝置堆疊都會隨著該裝置節點一起重新平衡。 而且,如果任何子裝置堆疊失敗查詢停止,則會放棄整個重新平衡程式。 因此,驅動程式不得失敗查詢停止,而沒有真正的理由可以這麼做。 如果發生此失敗,PnP 管理員會將取消停止 (IRP_MN_CANCEL_STOP) 傳送至已傳送查詢停止的所有裝置堆疊。
如果涉及所有裝置堆疊通過查詢停止,測試會繼續重新平衡,並傳送IRP_MN_QUERY_RESOURCE_REQUIREMENTS和IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRPS 來尋找裝置的資源需求。
此時,視目標裝置是否取用任何資源而定,可能會有兩個不同的路徑:
如果裝置未取用任何資源,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,當啟動時,篩選驅動程式會根據裝置是否取用任何資源來採取動作:
- 如果裝置沒有資源需求,篩選會指派假的資源。
- 如果裝置有資源需求,它會嘗試以將變更目前指派的機率最大化的方式來重新建構資源需求清單。 例如,如果裝置需要 2 個位元組的記憶體,介於 00 到 FF 之間,且目前已指派 3A-3B,請修改,讓新的資源需求 (依喜好設定順序) 看起來像是 00-39 或 3C-FF 或 3A-3B。 同樣地,如果裝置資源需求清單有任何替代需求,它會變更其順序,因此替代需求會稍早出現在清單中。
現在,裝置應該一律完成重新平衡程式。
IRP_MN_STOP_DEVICE
IRP_MN_START_DEVICE (新的已配置資源。如果已建立假的需求,請遮罩實際 drivers.)
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