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:
Pubblicare l'operazione di I/O in una coda di lavoro di sistema chiamando una routine come FltQueueDeferredIoWorkItem.
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.