Condividi tramite


Sincronizzazione dell'annullamento nelle routine del driver che elaborano i runtime di integrazione

Qualsiasi routine del driver che dequeue o viene chiamata con un IRP mantenuto in uno stato annullabile, inclusa la routine StartIo di un driver, deve eseguire le operazioni seguenti:

  1. Chiamare IoAcquireCancelSpinLock.

  2. Verificare che Irp sia uguale a DeviceObject-CurrentIrp>. In caso contrario, chiamare IoReleaseCancelSpinLock e restituire il controllo.

    Se i due elementi non sono uguali, CurrentIrp potrebbe essere stato annullato tra il momento in cui IoStartPacket ha rilasciato il blocco di selezione annulla e questa routine l'ha acquisita.

  3. Chiamare IoSetCancelRoutine con un puntatore Null CancelRoutine per rimuovere l'IRP dallo stato annullabile.

  4. Controllare il campo Irp-Cancel> per determinare se annullare l'IRP o iniziare a elaborare la richiesta di I/O.

    Se Irp-Cancel> è impostato su TRUE, eseguire le operazioni seguenti:

    • Chiamare IoReleaseCancelSpinLock.

    • Impostare Irp-IoStatus.Status> su STATUS_CANCELLED.

    • Impostare Irp-IoStatus.Information> su 0.

    • Chiama IoStartNextPacket (in una routine StartIo ) per avviare il pacchetto successivo.

    • Chiamare IoCompleteRequest con un aumento di priorità di IO_NO_INCREMENT per completare l'IRP.

    Se Irp-Cancel> è impostato su FALSE, chiamare IoReleaseCancelSpinLock e avviare l'elaborazione richiesta della richiesta di I/O o passare l'IRP al driver inferiore successivo, in base alle esigenze.

I driver che gestiscono le proprie code di runtime di integrazione, anziché usare la coda di dispositivi fornita dalla gestione di I/O, non devono acquisire il blocco di selezione annulla quando si chiama IoSetCancelRoutine. Tuttavia, questi driver devono controllare il puntatore di routine Cancel restituito da IoSetCancelRoutine per determinare se la routine di annullamento è già stata avviata.

In qualsiasi driver che gestisce i runtime di integrazione annullabili, ogni routine del driver che elabora un IRP prima che il dispositivo sottostante sia stato programmato per l'operazione di I/O richiesta deve controllare lo stato annullabile di tutti i runtime di integrazione in ingresso. In particolare, un driver di dispositivo di livello più alto con routine StartIo e ControllerControl deve elaborare i runtime di integrazione in ingresso in entrambe le routine del driver come già descritto.