Condividi tramite


Gestione di una richiesta di IRP_MN_QUERY_REMOVE_DEVICE

Il gestore PnP invia questo IRP per informare i driver che un dispositivo sta per essere rimosso dal computer e di chiedere se il dispositivo può essere rimosso senza interrompere il computer. Invia anche questo IRP quando un utente richiede di aggiornare i driver per il dispositivo.

Il gestore PnP invia l'IRP in IRQL PASSIVE_LEVEL nel contesto di un thread di sistema.

Prima di inviare questo IRP ai driver per un dispositivo, eseguire le operazioni seguenti:

  • Notifica a tutte le applicazioni in modalità utente registrate per la notifica nel dispositivo (o un dispositivo correlato).

    Sono incluse le applicazioni registrate per la notifica nel dispositivo, su uno dei discendenti del dispositivo (dispositivo figlio, figlio di figlio e così via) o su una delle relazioni di rimozione del dispositivo. Un'applicazione viene registrata per tale notifica chiamando RegisterDeviceNotification.

    In risposta a questa notifica, un'applicazione prepara la rimozione del dispositivo (chiude handle al dispositivo) o non riesce la query.

  • Notifica a tutti i driver in modalità kernel registrati per la notifica nel dispositivo (o un dispositivo correlato).

    Sono inclusi i driver registrati per la notifica nel dispositivo, in uno dei discendenti del dispositivo o in una delle relazioni di rimozione del dispositivo. Un driver registra per questa notifica chiamando IoRegisterPlugPlayNotification con una categoria di eventi di EventCategoryTargetDeviceChange.

    In risposta a questa notifica, un driver prepara la rimozione del dispositivo (chiude handle al dispositivo) o non riesce la query.

  • Invia IRP_MN_QUERY_REMOVE_DEVICE IRP ai driver per i discendenti del dispositivo.

  • (Sistemi Windows 2000 e versioni successive) Se un file system viene montato nel dispositivo, il gestore PnP invia una richiesta di rimozione query al file system e a qualsiasi filtro del file system. Se nel dispositivo sono presenti handle aperti, il file system non riesce in genere la richiesta di rimozione delle query. In caso contrario, il file system blocca in genere il volume per impedire che i futuri creino correttamente. Se un file system montato non supporta una richiesta di rimozione query, la gestione PnP ha esito negativo sulla richiesta di rimozione delle query per il dispositivo.

Se tutti i passaggi precedenti hanno esito positivo, il gestore PnP invia il IRP_MN_QUERY_REMOVE_DEVICE ai driver per il dispositivo.

Una richiesta di IRP_MN_QUERY_REMOVE_DEVICE viene gestita prima dal driver superiore nello stack di dispositivi e quindi da ogni driver inferiore successivo. Un driver gestisce la rimozione di IRP nella routine DispatchPnP .

In risposta a un IRP_MN_QUERY_REMOVE_DEVICE, un driver deve eseguire le operazioni seguenti:

  1. Determinare se il dispositivo può essere rimosso dal computer senza interrompere l'operazione.

    Un driver deve avere esito negativo su un'IRP di query se uno dei seguenti è true:

    • Se la rimozione del dispositivo potrebbe comportare la perdita di dati.

    • Se un componente ha un handle aperto al dispositivo. Questo è un problema solo in Windows 98/Me. Windows 2000 e versioni successive di Handle aperti di Windows tracciano e non riescono la query se sono presenti handle aperti dopo il completamento della IRP_MN_QUERY_REMOVE_DEVICE .

    • Se un driver riceve una notifica (tramite un IRP_MN_DEVICE_USAGE_NOTIFICATION IRP) che il dispositivo si trova nel percorso di un paging, un dump di arresto anomalo o un file di ibernazione.

    • Se il driver ha un riferimento di interfaccia in sospeso sul dispositivo. Ovvero, il driver ha fornito un'interfaccia in risposta a una richiesta di IRP_MN_QUERY_INTERFACE e l'interfaccia non è stata rinviata.

  2. Se il dispositivo non può essere rimosso, non è possibile rimuovere la query.

    Impostare Irp-IoStatus.Status> su uno stato di errore appropriato (in genere STATUS_UNSUCCESSFUL), chiamare IoCompleteRequest con IO_NO_INCREMENT e tornare dalla routine DispatchPnP del driver. Non passare l'IRP al driver inferiore successivo.

  3. Se il driver ha inviato in precedenza una richiesta di IRP_MN_WAIT_WAKE per abilitare il dispositivo per la riattivazione , annullare l'IRP di attesa.

  4. Registrare lo stato PnP precedente del dispositivo.

    Un driver deve registrare lo stato PnP in cui il dispositivo si trovava quando il driver ha ricevuto la richiesta di IRP_MN_QUERY_REMOVE_DEVICE perché il driver deve restituire il dispositivo a tale stato se la query viene annullata (IRP_MN_CANCEL_REMOVE_DEVICE). Lo stato precedente è in genere "avviato", ovvero lo stato immesso dal dispositivo quando il driver completa correttamente una richiesta di IRP_MN_START_DEVICE .

    Tuttavia, altri stati precedenti sono possibili. Ad esempio, l'utente potrebbe aver disabilitato il dispositivo tramite Gestione dispositivi. In alternativa, in risposta a una richiesta di IRP_MN_QUERY_CAPABILITIES , il driver del bus padre (o un driver di filtro sul driver del bus) potrebbe aver segnalato che l'hardware del dispositivo è disabilitato. In entrambi i casi, il driver per il dispositivo disabilitato può ricevere una richiesta di IRP_MN_QUERY_REMOVE_DEVICE prima di ricevere una richiesta di IRP_MN_START_DEVICE .

  5. Completare l'IRP:

    In una funzione o un driver di filtro:

    • Impostare Irp-IoStatus.Status> su STATUS_SUCCESS.

    • Configurare la posizione successiva dello stack con IoSkipCurrentIrpStackLocation e passare l'IRP al driver inferiore successivo con IoCallDriver.

    • Propagare lo stato da IoCallDriver come stato restituito dalla routine DispatchPnP .

    • Non completare l'IRP.

    In un conducente del bus:

    • Impostare Irp-IoStatus.Status> su STATUS_SUCCESS.

    • Completare l'IRP (IoCompleteRequest) con IO_NO_INCREMENT.

    • Tornare dalla routine DispatchPnP .

Se qualsiasi driver nello stack di dispositivi ha esito negativo, il gestore PnP invia un IRP_MN_QUERY_REMOVE_DEVICE IRP_MN_CANCEL_REMOVE_DEVICE allo stack di dispositivi. Ciò impedisce ai driver di richiedere una routine IoCompletion per un'IRP di rimozione di query per rilevare se un driver inferiore ha avuto esito negativo.

Una volta che un driver ha esito positivo, un IRP_MN_QUERY_REMOVE_DEVICE e considera che il dispositivo sia nello stato di rimozione in sospeso, il driver deve avere esito negativo in qualsiasi richiesta di creazione successiva per il dispositivo. Il driver elabora tutti gli altri IRP come di consueto, finché il driver riceve un IRP_MN_CANCEL_REMOVE_DEVICE o un IRP_MN_REMOVE_DEVICE.