In sospeso un'operazione di I/O in una routine di callback preoperazione

Una routine di callback di preoperazione del driver minifilter può pennare un'operazione di I/O pubblicando l'operazione in una coda di lavoro del sistema e restituendo FLT_PREOP_PENDING. La restituzione di questo valore di stato indica che il driver minifilter mantiene il controllo dell'operazione di I/O fino a quando chiama FltCompletePendedPreOperation per riprendere l'elaborazione per l'operazione di I/O.

Una routine di preoperazione del driver minifilter esegue un'operazione di I/O eseguendo la procedura seguente:

  1. Pubblicare l'operazione di I/O in una coda di lavoro di sistema chiamando una routine come FltQueueDeferredIoWorkItem.

  2. Restituzione di FLT_PREOP_PENDING.

Un driver minifilter che deve eseguire la penna di tutte le operazioni di I/O in ingresso (o la maggior parte) non deve usare routine come FltQueueDeferredIoWorkItem per le operazioni penna, perché la chiamata a questa routine può causare l'inondazione delle code di lavoro del sistema. Invece, tale driver minifilter deve usare una coda annulla-sicura. Per altre informazioni sull'uso di code cancel-safe, vedere FltCbdqInitialize.

Si noti che la chiamata a FltQueueDeferredIoWorkItem avrà esito negativo se una delle condizioni seguenti è true:

  • L'operazione non è un'operazione di I/O basata su IRP.

  • L'operazione è un'operazione di I/O di paging.

  • Il campo TopLevelIrp del thread corrente non è NULL. Per altre informazioni su come trovare il valore di questo campo, vedere IoGetTopLevelIrp.

  • L'istanza di destinazione per l'operazione di I/O viene distrutta.

Se la routine di callback di preoperazione del driver minifilter restituisce FLT_PREOP_PENDING, deve restituire NULL nel parametro di output CompletionContext .

Un driver minifilter può restituire FLT_PREOP_PENDING solo per le operazioni di I/O basate su IRP. Per determinare se un'operazione è un'operazione di I/O basata su IRP, usare la macro FLT_IS_IRP_OPERATION .

La routine di lavoro che dequeue e elabora l'operazione di I/O deve chiamare FltCompletePendedPreOperation per riprendere l'elaborazione per l'operazione.