Condividi tramite


Mantenimento di irP in ingresso quando un dispositivo viene sospeso

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 ed evitare di avviare eventuali nuovi IRP che richiedono l'accesso al dispositivo.

Per contenere i runtime di integrazione durante la sospensione di un dispositivo, un driver implementa una procedura come la 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 provider di integrazione.

    Se il driver già accoda i runtime di integrazione, 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 che crea dipende dal modo in cui il driver scarica la coda. Un driver potrebbe usare un elenco collegato interlocked, doubly 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 il flag HOLD_NEW_REQUESTS è impostato. In tal caso, il driver deve contrassegnare l'IRP in sospeso e accodarlo.

    La routine DispatchPnP del driver deve continuare a elaborare i provider di integrazione PnP anziché tenerli 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-arresto, deselezionare il flag di HOLD_NEW_REQUESTS e avviare gli indirizzi DIP nella coda di attesa di 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 tutte le operazioni per avviare il dispositivo e quindi può avviare gli irP nella coda di blocco di IRP.

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