Arresto di un dispositivo per ribilanciare le risorse

La figura seguente illustra la sequenza di irP coinvolti nell'arresto e nel riavvio di un dispositivo per ribilanciare le risorse.

Diagramma che illustra l'arresto di un dispositivo per ribilanciare le risorse.

Le note seguenti corrispondono ai numeri cerchiati nella figura precedente:

  1. Il gestore PnP rilascia un IRP_MN_QUERY_STOP_DEVICE per chiedere se i driver per un dispositivo possono arrestare il dispositivo e rilasciare le risorse hardware.

    Se tutti i driver nello stack di dispositivi restituiscono STATUS_SUCCESS, i driver hanno inserito il dispositivo in uno stato (arresto in sospeso) da cui il dispositivo può essere arrestato rapidamente.

    Se uno stack di dispositivi restituisce un valore diverso da STATUS_SUCCESS, non parteciperà al processo di ribilanciamento. Poiché il ribilanciamento delle risorse è un'operazione ottimale, in questo caso il sistema tenta comunque un'operazione di ribilanciamento per soddisfare i requisiti delle risorse dei dispositivi nel sistema. Tuttavia, se i dispositivi non superano l'arresto della query, potrebbe non essere possibile ottenere i risultati desiderati, ad esempio se un nuovo dispositivo viene enumerato e attiva un ribilanciamento, potrebbe non ricevere le risorse necessarie, quindi alla fine non si riesce ad avviare.

    Un dispositivo che non riesce a eseguire un'operazione di arresto della query continua a trovarsi in uno stato operativo, anche se l'arresto della query non è riuscito.

    Il gestore PnP esegue una query su tutti gli stack di dispositivi necessari per ribilanciare le risorse necessarie.

  2. Il gestore PnP rilascia un IRP_MN_STOP_DEVICE per arrestare il dispositivo.

    In Windows 2000 e versioni successive di Windows, gestione PnP invia un IRP di arresto solo se un IRP di arresto query precedente per il dispositivo è stato completato correttamente. In risposta a un'interruzione dell'IRP, i driver rilasciano le risorse hardware del dispositivo (ad esempio le porte di I/O) e contengono tutti gli irP che richiedono l'accesso al dispositivo.

  3. Dopo aver ribilanciato correttamente le risorse, il gestore PnP invia IRP_MN_START_DEVICE richieste di riavviare tutti i dispositivi arrestati durante il ribilanciamento.

  4. In caso contrario, il gestore PnP annulla un IRP di arresto query inviando un IRP_MN_CANCEL_STOP_DEVICE.

    In risposta a un IRP_MN_CANCEL_STOP_DEVICE, i driver per un dispositivo restituiscono il dispositivo allo stato avviato e riprendono l'elaborazione delle richieste di I/O per il dispositivo.

    Il gestore PnP annulla l'arresto della query per uno stack di dispositivi se un driver nello stack ha avuto esito negativo o se l'operazione di ribilanciamento complessivo non è riuscita e annulla tutte le richieste di arresto della query. Quando il gestore PnP annulla l'arresto della query in un solo stack di dispositivi, invia la richiesta di IRP_MN_CANCEL_STOP_DEVICE perché tutti i driver collegati sopra il driver che non ha superato la query hanno il dispositivo nello stato di arresto in sospeso. Quando l'IRP_MN_CANCEL_STOP_DEVICE ha esito positivo, i driver hanno restituito il dispositivo allo stato avviato.

  5. Se un driver non riesce a riavviare il dispositivo dopo il ribilanciamento delle risorse, il gestore PnP invia i runtime di integrazione allo stack di dispositivi (in Windows 2000 e versioni successive di Windows).

    Il gestore PnP invia innanzitutto una richiesta di IRP_MN_SURPRISE_REMOVAL . Invia quindi una richiesta di IRP_MN_REMOVE_DEVICE , ma solo dopo la chiusura di tutti gli handle aperti al dispositivo.

Il ribilanciamento delle risorse hardware di un dispositivo PnP deve essere trasparente per le applicazioni e gli utenti finali. Gli utenti potrebbero riscontrare un ritardo temporaneo nell'operazione, ma i dati non devono essere persi. È necessario prendere in considerazione questo aspetto quando si gestiscono i runtime di integrazione di arresto.