Condividi tramite


Gestione degli IRP in ingresso quando un dispositivo è messo in pausa

I driver per un dispositivo devono sospendere il dispositivo quando le relative risorse vengono ribilanciate. Durante il ribilanciamento delle risorse, alcuni driver sospendono il dispositivo in risposta a una richiesta di IRP_MN_QUERY_STOP_DEVICE e altri driver ritardano la sospensione del dispositivo fino a quando non ricevono la richiesta di IRP_MN_STOP_DEVICE . In entrambi i casi, il dispositivo deve essere sospeso quando l'IRP_MN_STOP_DEVICE ha esito positivo.

I driver devono completare tutti i runtime di integrazione in corso nel dispositivo e non avviare nuovi runtime di integrazione che richiedono l'accesso al dispositivo.

Per trattenere gli IRP mentre un dispositivo è sospeso, un driver implementa una procedura simile alla seguente:

  1. Nella routine AddDevice definire un flag nell'estensione del dispositivo con un nome come HOLD_NEW_REQUESTS. Cancellare il flag.

  2. Creare una coda FIFO per contenere i pacchetti di richiesta di I/O (IRP).

    Se il driver già accoda i pacchetti di richiesta di I/O, può riutilizzare la stessa coda perché il driver deve completare le richieste in sospeso prima di sospendere il dispositivo.

    Se il driver non ha già una coda IRP, deve crearne una nella routine AddDevice . Il tipo di coda creata dipende dal modo in cui il driver gestisce la coda. Un driver potrebbe usare un elenco doppiamente collegato bloccato e le routine ExInterlockedXxxList.

  3. Nel codice DispatchPnP per IRP_MN_QUERY_STOP_DEVICE (o IRP_MN_STOP_DEVICE) completare le richieste in sospeso e impostare il flag di HOLD_NEW_REQUESTS.

  4. In una routine dispatch che accede al dispositivo, ad esempio DispatchWrite o DispatchRead, controllare se è impostato il flag HOLD_NEW_REQUESTS. In tal caso, il driver deve contrassegnare l'IRP come sospeso e aggiungerlo alla coda.

    La routine DispatchPnP del driver deve continuare a elaborare i runtime di integrazione PnP anziché tenerli in attesa e la routine DispatchPower deve continuare a elaborare i runtime di integrazione di alimentazione.

  5. In DispatchPnP, in risposta a un IRP di avvio o annullamento dell'arresto, deselezionare il flag HOLD_NEW_REQUESTS e avviare gli IRP nella coda di mantenimento IRP.

    Queste azioni sono probabilmente gli ultimi passaggi per l'elaborazione di questi PnP IRP. Ad esempio, in risposta a un IRP di avvio, il driver deve prima eseguire qualsiasi operazione per avviare il dispositivo e quindi può avviare gli IRP nella coda degli IRP.

    Gli errori nell'elaborazione dei runtime di integrazione dalla coda di controllo IRP non influiscono sullo stato restituito per i runtime di integrazione di avvio o di arresto annullato.