Funzione FltRequestOperationStatusCallback (fltkernel.h)
FltRequestOperationStatusCallback restituisce informazioni sullo stato per l'operazione di I/O specificata.
Sintassi
NTSTATUS FLTAPI FltRequestOperationStatusCallback(
[in] PFLT_CALLBACK_DATA Data,
[in] PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine,
[in, optional] PVOID RequesterContext
);
Parametri
[in] Data
Puntatore alla struttura dei dati di callback (FLT_CALLBACK_DATA) per l'operazione di I/O. Questo parametro è obbligatorio e non può essere NULL.
[in] CallbackRoutine
Puntatore a una routine di callback chiamata da Gestione filtri dopo IoCallDriver. Questo parametro è obbligatorio e non può essere NULL.
[in, optional] RequesterContext
Puntatore di contesto da passare all'CallbackRoutine. Questo parametro è facoltativo e può essere NULL.
Valore restituito
FltRequestOperationStatusCallback restituisce STATUS_SUCCESS o un valore NTSTATUS appropriato, ad esempio uno dei seguenti:
Codice restituito | Descrizione |
---|---|
|
L'istanza del driver minifiltro viene distrutta. Si tratta di un codice di errore. |
|
FltRequestOperationStatusCallback rilevato un errore di allocazione del pool. Si tratta di un codice di errore. |
|
FltRequestOperationStatusCallback è stato chiamato da una routine che non era un callback di preoperazione (PFLT_PRE_OPERATION_CALLBACK) oppure l'operazione di I/O era una richiesta IRP_MJ_CLOSE. Si tratta di un codice di errore. |
Osservazioni
Un driver minifilter può chiamare FltRequestOperationStatusCallback per un'operazione di I/O basata su IRP per ottenere il valore di stato che IoCallDriver restituito per l'operazione.
La maggior parte dei driver minifilter non deve mai chiamare FltRequestOperationStatusCallback. In genere, un driver minifiltro chiama questa routine solo per determinare se è stato concesso un oplock richiesto.
FltRequestOperationStatusCallback può essere chiamato solo dalla routine di preoperazione di un driver minifiltro (PFLT_PRE_OPERATION_CALLBACK).
FltRequestOperationStatusCallback può essere chiamato solo per operazioni non basate su IRP IRP_MJ_CLOSE. Per determinare se l'operazione è un'operazione basata su IRP, utilizzare la macro FLT_IS_IRP_OPERATION.
Se l'operazione basata su IRP è una richiesta di IRP_MJ_CLOSE, viene restituito STATUS_INVALID_PARAMETER.
FltRequestOperationStatusCallback copia il contenuto del blocco di parametri di I/O (FLT_IO_PARAMETER_BLOCK) nel membro Iopb dei dati di callback (FLT_CALLBACK_DATA) e si tratta dei dati di callback passati dalla gestione filtri alla routine specificata nel parametro CallbackRoutine. I dati copiati rappresentano uno snapshot del blocco di parametri I/O al momento in cui il callback di preoperazione (PFLT_PRE_OPERATION_CALLBACK) chiama FltRequestOperationStatusCallback. Se la routine di callback di preoperazione modifica il blocco di parametri di I/O dopo aver chiamato FltRequestOperationStatusCallback, il blocco di parametri I/O passato a CallbackRoutine sarà diverso dal blocco di parametri di I/O che il driver filtro passa allo stack di driver quando chiama IoCallDriver.
Il codice di esempio seguente di una routine di callback di preoperazione illustra come ciò può verificarsi:
PFLT_CALLBACK_DATA Data;
PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine;
PVOID RequesterContext;
...
if (iopb->MajorFunction == IRP_MJ_READ) {
FltRequestOperationStatusCallback (Data, CallbackRoutine, RequesterContext);
Data->Iopb->Parameters.Read.ReadBuffer = newBuffer;
...
}
Nell'esempio il buffer di lettura viene modificato dopo la chiamata a FltRequestOperationStatusCallback, quindi quando Gestione filtri chiama CallbackRoutine, passerà un puntatore al buffer precedente anziché al nuovo.
Gestione filtri chiama il CallbackRoutine specificato nel contesto del thread di origine in IRQL <= APC_LEVEL.
Fabbisogno
Requisito | Valore |
---|---|
piattaforma di destinazione | Universale |
intestazione | fltkernel.h (include Fltkernel.h) |
libreria | Fltmgr.lib |
dll | Fltmgr.sys |
IRQL | <= APC_LEVEL |