Condividi tramite


Sincronizzazione dell'annullamento nei driver di Higher-Level senza annullamento delle routine

Un driver di livello superiore non può fare ipotesi su se o su come i driver di livello inferiore esistenti gestiscono i irP annullabili. Non appena qualsiasi driver di livello superiore chiama IoCallDriver per un IRP , non è più proprietario di IRP e non può più verificare né controllare l'elaborazione dell'IRP da driver di livello inferiore.

Tuttavia, qualsiasi driver di livello superiore può impostare una routine IoCompletion per un'IRP chiamando IoSetCompletionRoutine prima di chiama IoCallDriver. Il driver di livello superiore può determinare se qualsiasi IRP in sospeso viene annullato in un driver inferiore chiamando IoSetCompletionRoutine con il parametro InvokeOnCancel impostato su TRUE prima di passare l'IRP a driver inferiori. Ciò garantisce che la routine IoCompletion del driver venga chiamata se l'IRP viene annullata o completata.

Un driver di livello superiore può chiamare IoCancelIrp con qualsiasi IRP in sospeso allocato dal driver. Tuttavia, l'esecuzione di questa chiamata non garantisce che l'IRP allocata dal driver venga completato con il blocco di stato I/O impostato su STATUS_CANCELLED; un altro thread potrebbe già completare l'IRP. Per verificare se l'IRP è stato annullato, il driver di livello superiore deve chiamare IoSetCompletionRoutine con il parametro InvokeOnCancel impostato su TRUE prima di passare l'IRP al driver inferiore successivo. Per altre informazioni sulle routine di completamento, vedere Completamento di irP .

Un driver di livello superiore non deve chiamare IoCancelIrp con un'IRP che non ha allocato.