Come completare un'IRP in una routine di invio

Se è possibile completare immediatamente un'IRP di input, una routine di invio esegue le operazioni seguenti:

  1. Imposta i membri stato e informazioni del blocco di stato I/O dell'I/O di IRP con valori appropriati, in generale:

    • La routine di invio imposta stato su STATUS_SUCCESS o su un errore appropriato (STATUS_XXX), che può essere il valore restituito da una chiamata a una routine di supporto o, per determinate richieste sincrone, da un driver inferiore.

      Se un driver di livello inferiore restituisce STATUS_PENDING, un driver di livello superiore non deve chiamare IoCompleteRequest per l'IRP, con un'eccezione: il driver di livello superiore può usare un evento per sincronizzare tra la routine IoCompletion e la routine di invio, in cui la routine IoCompletion segnala l'evento e restituisce STATUS_MORE_PROCESSING_REQUIRED. La routine di invio attende l'evento e quindi chiama IoCompleteRequest per completare l'IRP .

    • Imposta informazioni sul numero di byte trasferiti correttamente se una richiesta di trasferimento dei dati, ad esempio una richiesta di lettura o scrittura, è stata soddisfatta.

    • Imposta informazioni su un valore che varia in base alla richiesta specifica per altri ip di integrazione completi con STATUS_SUCCESS.

    • Imposta informazioni su un valore che varia in base alla richiesta specifica per gli indirizzi IP completi con un avviso STATUS_XXX. Ad esempio, imposta Informazioni sul numero di byte trasferiti per un avviso come STATUS_BUFFER_OVERFLOW.

    • In genere, imposta Informazioni su zero per le richieste completate con un errore STATUS_XXX.

  2. Chiama IoCompleteRequest con L'IRP e con PriorityBoost = IO_NO_INCREMENT.

  3. Restituisce l'STATUS_XXX appropriato già impostato nel blocco di stato di I/O. Si noti che una chiamata a IoCompleteRequest rende l'IRP specificato inaccessibile dal chiamante, quindi il valore restituito da una routine di invio non può essere impostato dal blocco di stato di I/O di un'IRP già completata.

Seguire questa linea guida di implementazione per chiamare IoCompleteRequest con un'IRP:

Rilasciare sempre tutti i blocchi di rotazione che il driver tiene prima di chiamare IoCompleteRequest.

Richiede un periodo di tempo indeterminato per completare un'IRP, in particolare in una catena di driver a livelli. Inoltre, un deadlock può verificarsi se una routine IoCompletion di livello superiore invia un'IRP indietro a un driver inferiore che mantiene un blocco di rotazione.