Condividi tramite


Assicurarsi che l'elaborazione del completamento venga eseguita in IrQL sicuro

Come indicato in Scrittura di routine di callback postperation, la routine di callback postperazione per un'operazione di I/O basata su I/O basata su IRP può essere chiamata in IRQL = DISPATCH_LEVEL, a meno che la routine di callback di preoperazione del driver minifiltro sincronizzata l'operazione restituisce FLT_PREOP_SYNCHRONIZE o l'operazione sia un'operazione di creazione, che è intrinsecamente sincrona. Per altre informazioni su questo valore restituito, vedere Restituzione di FLT_PREOP_SYNCHRONIZE.

Tuttavia, per le operazioni di I/O basate su IRP che non sono già sincronizzate, i driver minifilter possono usare per due tecniche per garantire che l'elaborazione del completamento venga eseguita in IRQL <= APC_LEVEL.

La prima tecnica è per la routine di callback postperazione per pennare l'operazione di I/O fino a quando l'elaborazione del completamento può essere eseguita in IRQL <= APC_LEVEL. Questa tecnica è descritta in Sospeso un'operazione di I/O in una routine di callback postperation.

La seconda tecnica è per la routine di callback del driver minifilter per chiamare FltDoCompletionProcessingWhenSafe. FltDoCompletionProcessingWhenSafe esegue l'operazione di I/O solo se l'oggetto IRQL corrente è >= DISPATCH_LEVEL. In caso contrario, questa routine esegue immediatamente la routine safePostCallback del driver minifilter. Questa tecnica è descritta in FltDoCompletionProcessingWhenSafe.