Gestione di una richiesta di IRP_MN_CANCEL_STOP_DEVICE (Windows 2000 e versioni successive)

Una richiesta di IRP_MN_CANCEL_STOP_DEVICE deve essere gestita prima dal driver del bus padre per un dispositivo e quindi da ogni driver successivo superiore nello stack di dispositivi. Un driver gestisce i runtime di integrazione di arresto nella routine DispatchPnP .

In risposta a una richiesta di IRP_MN_CANCEL_STOP_DEVICE , un driver deve restituire il dispositivo allo stato avviato e riprendere il normale funzionamento. I driver devono avere esito positivo in un IRP di arresto annullato.

Un driver gestisce una richiesta di IRP_MN_CANCEL_STOP_DEVICE con una procedura simile alla seguente:

  1. Posticipare il riavvio del dispositivo fino a quando i driver inferiori non hanno completato le operazioni di riavvio. Vedere Postponing PnP IRP Processing (Postponing PnP IRP Processing Until Lower Drivers Finish).

  2. Al termine dei driver inferiori, ripristinare lo stato di avvio del dispositivo.

    Le operazioni esatte dipendono dal dispositivo e dal driver.

  3. Avviare i provider di integrazione nella coda di attesa di IRP.

    Se il driver mantiene le richieste mentre il dispositivo si trovava nello stato di arresto in sospeso, deselezionare il flag di HOLD_NEW_REQUESTS e avviare gli indirizzi di integrazione nella coda di blocco di IRP. Per altre informazioni, vedere Contenere i runtime di integrazione in ingresso quando un dispositivo viene sospeso .

  4. Completare l'IRP con IoCompleteRequest.

    • In una funzione o in un driver di filtro:

      La routine IoCompletion del driver ha restituito STATUS_MORE_PROCESSING_REQUIRED, come descritto in Postponing PnP IRP Processing Until Lower Drivers Finish, quindi la routine DispatchPnP del driver deve chiamare IoCompleteRequest per riprendere l'elaborazione del completamento di I/O.

      Il driver imposta Irp-IoStatus.Status> su STATUS_SUCCESS, chiama IoCompleteRequest con un boost di priorità di IO_NO_INCREMENT e restituisce STATUS_SUCCESS dalla routine DispatchPnP.

      I driver non devono avere esito negativo per questa operazione. Se un driver non riesce l'IRP di riavvio, il dispositivo si trova in uno stato incoerente e non funzionerà correttamente.

    • In un driver del bus padre:

      Il driver imposta Irp-IoStatus.Status> su STATUS_SUCCESS e chiama IoCompleteRequest specificando un boost di priorità di IO_NO_INCREMENT. Il conducente dell'autobus restituisce STATUS_SUCCESS dalla routine DispatchPnP .

      Un autista del bus non deve interrompere questa operazione. Se un driver non riesce l'IRP di riavvio, il dispositivo si trova in uno stato incoerente e non funzionerà correttamente.

Un driver potrebbe ricevere una richiesta di annullamento-arresto spurio quando il dispositivo viene avviato e attivo. Ciò può verificarsi, ad esempio, se il driver (o un driver superiore nello stack di dispositivi) ha avuto esito negativo in una richiesta di IRP_MN_QUERY_STOP_DEVICE . Quando un dispositivo viene avviato e attivo, i driver possono eseguire in modo sicuro richieste di annullamento-arresto spurio per il dispositivo.