Condividi tramite


Scrittura di routine di callback postperation

Un driver minifilter del file system usa una o più routine di callback per filtrare le operazioni di I/O.

Una routine di callback di postperazione può eseguire una delle azioni seguenti:

  • Eseguire il lavoro di completamento direttamente nella routine di postperazione. Tutti i lavori di completamento possono essere eseguiti in IRQL <= DISPATCH_LEVEL.
  • Eseguire il lavoro di completamento in un IRQL sicuro. Restituire FLT_STATUS_MORE_PROCESSING_REQUIRED e accodare un thread di lavoro per consentire l'elaborazione in IRQL sicuro. Al termine dell'elaborazione, il thread di lavoro chiama FltCompletePendedPostOperation per continuare l'elaborazione del posto.
  • Annullare un'operazione CREATE riuscita.

Le routine di callback di postperazione sono simili alle routine di completamento usate nei driver di filtro del file system legacy.

Un driver minifilter registra una routine di callback postoperazione per un particolare tipo di operazione di I/O nello stesso modo in cui registra una routine di callback preoperazione, ovvero archiviando il punto di ingresso della routine di callback nel membro OperationRegistration della struttura FLT_REGISTRATION che il driver minifilter passa come parametro a FltRegisterFilter nella routine DriverEntry .

I driver minifilter ricevono solo questi tipi di operazioni di I/O per cui hanno registrato una routine di callback preoperazione o postoperazione. Un driver minifilter può registrare una routine di callback di preoperazione per un determinato tipo di operazione di I/O senza registrare un callback di postoperazione e viceversa.

Ogni routine di callback di postperazione è definita come segue:

typedef FLT_POSTOP_CALLBACK_STATUS 
(*PFLT_POST_OPERATION_CALLBACK) ( 
    IN OUT PFLT_CALLBACK_DATA Data, 
    IN PCFLT_RELATED_OBJECTS FltObjects, 
    IN PVOID CompletionContext, 
    IN FLT_POST_OPERATION_FLAGS Flags 
    ); 

Come una routine di completamento, una routine di callback postperazione viene chiamata in IRQL <= DISPATCH_LEVEL, in un contesto di thread arbitrario.

Poiché può essere chiamato in IRQL = DISPATCH_LEVEL, una routine di callback postperazione non può chiamare routine in modalità kernel che devono essere chiamate in un IRQL inferiore, ad esempio FltLockUserBuffer o RtlCompareUnicodeString. Per lo stesso motivo, tutte le strutture di dati usate in una routine di callback postperazione devono essere allocate da un pool non di pagine.

Le situazioni seguenti sono diverse eccezioni alla regola precedente:

  • Se una routine di callback di preoperazione del driver minifilter restituisce FLT_PREOP_SYNCHRONIZE per un'operazione di I/O basata su IRP, la routine di callback postoperazione corrispondente viene chiamata a IRQL <= APC_LEVEL, nello stesso contesto del thread della routine di callback di preoperazione.

  • La routine di callback di postperazione per un'operazione di I/O veloce viene chiamata in IRQL = PASSIVE_LEVEL, nello stesso contesto del thread della routine di callback di preoperazione.

  • Le routine di callback post-create vengono chiamate in IRQL = PASSIVE_LEVEL, nel contesto del thread che ha generato l'operazione di IRP_MJ_CREATE.

Quando il gestore filtri chiama una routine di callback postperazione del driver minifilter per un'operazione di I/O specificata, il driver minifilter controlla temporaneamente l'operazione di I/O. Il driver minifilter mantiene questo controllo fino a quando non esegue una delle operazioni seguenti:

  • Restituisce FLT_POSTOP_FINISHED_PROCESSING dalla routine di callback di postperazione.

  • Chiama FltCompletePendedPostOperation da una routine di lavoro che ha elaborato un'operazione di I/O basata su I/O basata su IRP che è stata pennata nella routine di callback postperazione.

Contenuto della sezione

Esecuzione dell'elaborazione del completamento per un'operazione di I/O

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

Errore di un'operazione di I/O in una routine di callback postperation