Test PnP (Nozioni fondamentali sui dispositivi)
I test PnP di Device Fundamentals forzano un driver a gestire quasi tutti i irP PnP; Tuttavia, ci sono tre aree sottolineate in particolare: rimozione, ribilanciamento e rimozione di sorprese. Il test PnP fornisce un meccanismo per testare ognuno di questi elementi separatamente o per testarli tutti insieme (ovvero, come test di stress). Questo test PnP viene eseguito usando una combinazione di chiamate API in modalità utente (tramite l'applicazione di test) e chiamate API in modalità kernel (tramite un driver di filtro superiore).
Test PNP
I test Plug and Play (PnP) eseguono vari percorsi di codice correlati a PnP nei componenti driver e modalità utente. I test PnP devono essere eseguiti con Driver Verifier abilitato nel computer di test. Per informazioni sull'abilitazione di Driver Verifier, vedere Proprietà di Driver Verifier per i progetti driver.
Test | Descrizione |
---|---|
Disabilitare il supporto per i test dei dispositivi avanzati (EDT) |
Questo test disinstalla il driver del filtro di test (msdmfilt.sys) come filtro superiore nei dispositivi specificati usando il parametro DQ. Questo filtro di test viene installato come parte dei test in esecuzione in questa categoria di test Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO IOType |
PNP (disabilitare e abilitare) il riavvio con I/O prima e dopo |
Questo test esegue la disabilitazione/abilitazione/abilitazione PnP di base e I/O nei dispositivi con un riavvio del sistema. Test binario: Devfund_PNP_DisableEnable_Reboot_With_IO_BeforeAndAfter.wsc Metodo di test: PNP_DisableEnable_Reboot_With_IO_Before_And_After Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ IOPeriod |
PNP (disabilitare e abilitare) con I/O prima e dopo |
Questo test esegue l'I/O e la disabilitazione/abilitazione PnP di base nei dispositivi. Questo test esegue le operazioni seguenti:
Test binario: Devfund_PNP_DisableEnable_With_IO_BeforeAndAfter.wsc Metodo di test: PNP_DisableEnable_With_IO_Before_And_After Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ IOPeriod |
PNP Cancel Remove Device test |
Questo test usa il driver di filtro EDT per inviare IRP_MN_CANCEL_REMOVE_DEVICE agli stack di dispositivi di destinazione. Per altre informazioni, vedere Informazioni sui test di rimozione dei dispositivi. File binario di test: Devfund_PnPDTest.dll Metodo di test: PNPCancelRemoveDevice Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP Cancel Stop Device test |
Questo test usa il driver di filtro EDT per inviare IRP_MN_CANCEL_STOP_DEVICE agli stack di dispositivi di destinazione. Per altre informazioni, vedere Informazioni sui test di ribilanciamento. File binario di test: Devfund_PnPDTest.dll Metodo di test: PNPCancelStopDevice Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP DIF Remove Device Test |
Questo test usa l'API SetupDi per inviare una richiesta di DIF_REMOVE per i programmi di installazione per rimuovere il dispositivo. File binario di test: Devfund_PnPDTest.dll Metodo di test: PNPDIFRemoveAndRescanParentDevice Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP Disable and Enable Device test |
Questo test disabilita e abilita i dispositivi di destinazione. File binario di test: Devfund_PnPDTest.dll Metodo di test: PNPDisableAndEnableDevice Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO IOType |
PNP Rebalance Fail Restart Device test |
Questo test usa il driver di filtro EDT per provare a inviare IRP_MN_STOP_DEVICE agli stack di dispositivi di destinazione. Il driver di filtro EDT ha quindi esito negativo IRP_MN_START_DEVICE richieste (che seguono IRP_MN_STOP_DEVICE richieste) per attivare la rimozione a sorpresa dei dispositivi di destinazione. Per altre informazioni, vedere Informazioni sui test di ribilanciamento. File binario di test: Devfund_PnPDTest.dll Metodo di test: PNPTryStopDeviceAndFailRestart Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
Test del dispositivo PNP Rebalance Request New Resources |
Questo test usa il driver di filtro EDT per provare a inviare IRP_MN_STOP_DEVICE agli stack di dispositivi di destinazione. Modifica anche i requisiti delle risorse dei dispositivi per ottimizzare le probabilità che le nuove risorse vengano allocate ai dispositivi. Per altre informazioni, vedere Informazioni sui test di bilanciamento. Test binario: Devfund_PnPDTest.dll Metodo di test: PNPTryStopDeviceRequestNewResourcesAndRestartDevice Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP Remove Device Test |
Questo test determina l'invio di IRP_MN_QUERY_REMOVE_DEVICE e IRP_MN_REMOVE_DEVICE agli stack di dispositivi di destinazione. Per altre informazioni, vedere Informazioni sui test di rimozione dei dispositivi. Test binario: Devfund_PnPDTest.dll Metodo di test: PNPRemoveAndRestartDevice Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
Test del dispositivo PNP Stop (Rebalance) |
Questo test usa il driver di filtro EDT per provare a inviare IRP_MN_STOP_DEVICE agli stack di dispositivi di destinazione. Per altre informazioni, vedere Informazioni sui test di bilanciamento. Test binario: Devfund_PnPDTest.dll Metodo di test: PNPTryStopAndRestartDevice Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
PNP Surprise Remove Device test |
Questo test usa il driver di filtro EDT per inviare IRP_MN_SURPRISE_REMOVAL agli stack di dispositivi di destinazione. Per altre informazioni, vedere Informazioni sul test di rimozione delle sorprese. Test binario: Devfund_PnPDTest.dll Metodo di test: PNPSurpriseRemoveAndRestartDevice Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo DQ TestCycles DoSimpleIO IOPeriod DoConcurrentIO |
Informazioni sui test di rimozione dei dispositivi
- PNP Remove Device Test
- PNP Cancel Remove Device test
Il test Di rimozione dei dispositivi include IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_CANCEL_REMOVE_DEVICE e IRP_MN_REMOVE_DEVICE.
Il test tenta di installare il driver di filtro superiore nello stack di dispositivi di destinazione. Questo tentativo comporta una query-remove IRP.
Se questa query-remove IRP ha esito negativo, il test riavvia il computer per ottenere il driver di filtro nello stack di dispositivi. Se la richiesta di rimozione non è veto, lo stack di dispositivi verrà rimosso e riavviato con il driver di filtro nello stack di dispositivi.
Il test, usando le API di installazione, causa l'invio di un'IRP di rimozione di query allo stack di dispositivi. Il driver di filtro ha esito negativo in questa richiesta di rimozione, quindi viene inviato un'istanza di IRP annulla. Il driver di filtro asserisce che la rimozione annulla è riuscita.
Successivamente, l'applicazione di test chiama il programma di installazione della classe appropriato e tutti i co-installer registrati per disabilitare o abilitare o rimuovere o rinumerare il dispositivo (questo verifica la gestione della classe e dei co-installer di DIF_PROPERTYCHANGE con DICS_DISABLE, DICS_ENABLE e DICS_PROPCHANGE). Quando si riceve IRP_MN_REMOVE_DEVICE, il driver di filtro afferma che i driver inferiori sono stati completati correttamente.
Ognuno di questi passaggi implica una richiesta di rimozione preliminare. Se tale richiesta viene veto, il dispositivo non verrà rimosso. È possibile scegliere di rimuovere una richiesta quando appropriato, ad esempio durante lo streaming di video in una fotocamera USB o se il dispositivo di destinazione si trova nel percorso di avvio o paging. Tenere presente che in genere tutte le richieste di rimozione non sono valide. L'esito negativo di tutte le richieste di rimozione non garantisce che il driver non riceva mai una rimozione perché un'IRP rimossa verrà comunque rilasciata dopo una rimozione a sorpresa o se nessuno nello stack di dispositivi ha esito negativo su un'IRP iniziale.
Informazioni sul test di rimozione delle sorprese
- PNP Surprise Remove Device test
Il test di rimozione delle sorprese include IRP_MN_SURPRISE_REMOVAL seguito da IRP_MN_REMOVE_DEVICE.
Come per i test precedenti, l'applicazione di test tenterà di aggiungere un filtro superiore allo stack di dispositivi di destinazione e quindi riavviare lo stack. Se questo tentativo non ha esito positivo, il test riavvia il computer.
Quando viene attivata dall'applicazione di test, il driver di filtro causerà l'invio di un IRP_MN_SURPRISE_REMOVAL allo stack di dispositivi, seguito da un IRP_MN_REMOVE_DEVICE. Il driver di filtro asserisce che entrambi questi IRP vengono completati correttamente da driver inferiori.
Al termine del test di rimozione delle sorprese, il dispositivo verrà disinstallato e rinumerato, rimuovendo anche il driver di filtro dallo stack.
Informazioni sui test di bilanciamento
- Test del dispositivo PNP Stop (Rebalance)
- Test del dispositivo PNP Rebalance Request New Resources
- Test del dispositivo PNP Rebalance Fail Restart Device
- Test di PNP Cancel Stop Device
Come per il test di rimozione, l'applicazione di test tenta di aggiungere un filtro superiore allo stack di dispositivi di destinazione e quindi riavviare lo stack di dispositivi usando SetupDiCallClassInstaller con DIF_PROPERTYCHANGE. Se questo tentativo non ha esito positivo, ovvero se qualcuno nello stack di dispositivi di destinazione ha avuto esito negativo, il test riavvia il computer per testare il ribilanciamento.
A seconda del test di ribilanciamento scelto, si verificano gli eventi seguenti:
Test del dispositivo PNP Stop (Rebalance) Questo test avvia una procedura di ribilanciamento che comporta l'IRP_MN_QUERY_STOP_DEVICE IRP PnP al driver del dispositivo.
Se qualsiasi driver nello stack ha esito negativo, questa procedura di bilanciamento viene abbandonata. Si noti che in Windows Vista è disponibile il supporto per il ribilanciamento a più livelli. Se viene avviato un ribilanciamento in un nodo dispositivo non foglia, tutti gli stack di dispositivi presenti nell'albero dei dispositivi con quel nodo del dispositivo come radice passano anche attraverso il bilanciamento. E se uno degli stack di dispositivi figlio non riesce, l'intera procedura di ribilanciamento viene abbandonata. Pertanto, i driver non devono riuscire a eseguire query senza un motivo autentico per farlo. In caso di errore, il gestore PnP invia l'arresto annulla (IRP_MN_CANCEL_STOP) a tutti gli stack di dispositivi che erano stati inviati.
Se tutti gli stack di dispositivi coinvolti superano l'arresto della query, il test continua con il ribilanciamento e invia il IRP_MN_QUERY_RESOURCE_REQUIREMENTS e IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRPS per trovare il requisito di risorsa dei dispositivi.
Dopo questo punto, due percorsi diversi sono possibili a seconda che il dispositivo di destinazione consuma qualsiasi risorsa o meno:
Se il dispositivo non usa risorse, il gestore PnP invia un arresto annulla (IRP_MN_CANCEL_STOP_DEVICE) come ottimizzazione.
Se il dispositivo usa effettivamente le risorse, la procedura di bilanciamento viene completata con i IRP_MN_STOP_DEVICE e IRP_MN_START_DEVICE IRP.
Con questa opzione, le risorse del dispositivo non cambiano.
Test di PNP Cancel Stop Device: questo test avvia una procedura di ribilanciamento, ma il driver di filtro non riesce intenzionalmente la query arresta l'IRP. L'ordine dei provider di integrazione sembra IRP_MN_QUERY_STOP_DEVICE (che non è riuscito dal driver di filtro durante l'arrivo, causando un annullamento del ribilanciamento) e IRP_MN_CANCEL_STOP_DEVICE.
Con questa opzione, le risorse del dispositivo non cambiano
Test del dispositivo PNP Rebalance Request New Resources Questo test avvia un ribilanciamento e modifica anche il requisito della risorsa del dispositivo per ottimizzare le probabilità che le nuove risorse vengano allocate al dispositivo. Questa opzione consente anche a un dispositivo senza risorse di passare effettivamente attraverso la procedura completa di ribilanciamento:
Per prima cosa viene avviato il semplice ribilanciamento, causando i seguenti IRP:
- IRP_MN_QUERY_STOP_DEVICE (presupponendo che questa IRP venga passata da tutti i driver. Il test ha già trattato il caso in cui l'IRP non è riuscita.
- IRP_MN_QUERY_RESOURCE_REQUIREMENTS
- IRP_MN_FILTER_RESOURCE_REQUIREMENTS. In risposta a questo IRP, durante l'aumento, il driver di filtro esegue un'azione in base al fatto che il dispositivo utilizza o meno risorse:
- Se il dispositivo non ha requisiti di risorsa, il filtro assegna una risorsa fittizia.
- Se il dispositivo ha un requisito di risorsa, tenta di ristrutturare l'elenco dei requisiti delle risorse in modo da massimizzare la probabilità di modificare l'assegnazione corrente. Ad esempio, se un dispositivo richiede 2 byte di memoria in qualsiasi punto compreso tra 00 e FF e attualmente è assegnato 3A-3B, modificare in modo che il nuovo requisito di risorsa (in ordine di preferenza) sia simile a 00-39 o 3C-FF o 3A-3B. Analogamente, se l'elenco dei requisiti delle risorse del dispositivo presenta requisiti alternativi, cambierà l'ordine in modo che il requisito alternativo venga riportato in precedenza nell'elenco.
Ora il dispositivo dovrebbe completare sempre la procedura di ribilanciamento.
IRP_MN_STOP_DEVICE
IRP_MN_START_DEVICE (nuove risorse allocate. Se sono stati creati requisiti falsi, mascherare le nuove risorse dai driver effettivi.
PNP Rebalance Fail Restart Device Test Questo test avvia un ribilanciamento, ma quando il driver di filtro ottiene l'inizio dopo il ribilanciamento, ha deliberatamente esito negativo, causando la rimozione di sorpresa IRP seguito da IRP di rimozione.
Innanzitutto, avvia la procedura di ribilanciamento e verifica che il driver ottenga un arresto e un avvio generando un requisito di risorsa fittizia per un dispositivo che non utilizza risorse.
- IRP_MN_QUERY_STOP_DEVICE (presupponendo che questo IRP venga passato da tutti i driver. Il test ha già trattato il caso in cui l'IRP non è riuscito.
- IRP_MN_QUERY_RESOURCE_REQUIREMENTS
- IRP_MN_FILTER_RESOURCE_REQUIREMENTS (se il requisito effettivo della risorsa è Null, assegnare un requisito di risorsa fittizia, quindi è presente un arresto e un avvio).
- IRP_MN_STOP_DEVICE
- IRP_MN_START_DEVICE (il filtro non riesce durante l'operazione. Questa azione causa la rimozione della sorpresa IRP.
- IRP_MN_SURPRISE_REMOVAL
- IRP_MN_REMOVE
Al termine del test di ribilanciamento, il dispositivo verrà disinstallato e rinumerato, rimuovendo anche il driver di filtro dallo stack.
Codici di errore del dispositivo
Se il test restituisce un messaggio di errore che indica che lo stato del dispositivo non è OK, è possibile ottenere altre informazioni sullo stato del dispositivo tramite Gestione dispositivi. Per un riepilogo dei vari codici di errore del dispositivo, vedere Gestione dispositivi Messaggi di errore.
Eseguire il debug degli errori di installazione usando i log dell'API di installazione
I log dell'API di installazione (setupapi.app.log e setupapi.dev.log) possono contenere informazioni utili per eseguire il debug degli errori di installazione del driver registrati da questo test. I log dell'API di installazione sono disponibili nella directory %windir%\inf\ nel sistema di test.
Per aumentare la dettaglio e la potenziale utilità di questi log, impostare la chiave del Registro di sistema seguente su 0x2000FFFF prima di eseguire il test reinstalla:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup\LogLevel
Argomenti correlati
Come testare un driver in fase di esecuzione con Visual Studio
Come selezionare e configurare i test dei concetti fondamentali del dispositivo
Test fondamentali del dispositivo
Sono stati forniti plug-in I/O semplici WDTF
Come testare un driver in fase di esecuzione da un prompt dei comandi