Condividi tramite


Restituzione di FLT_PREOP_SYNCHRONIZE

Nota

Un driver minifilter non deve usare FLT_PREOP_SYNCHRONIZE per contenere una risorsa tra chiamate pre-e post-operazione (come non deve contenere una risorsa in una chiamata di I/O). A tale scopo, non è sicuro perché può causare deadlock.

Se una routine di callback pre-operazione di un driver minifilter sincronizza un'operazione di I/O restituendo FLT_PREOP_SYNCHRONIZE, Filter Manager chiama la routine di callback post-operazione del filtro durante il completamento di I/O:

  • Se il filtro non è inattivo, Filter Manager chiama la routine di callback post-operazione del filtro nello stesso contesto del thread del callback pre-operazione, in IRQL <= APC_LEVEL. Si noti che questo contesto del thread non è necessariamente il contesto del thread di origine.
  • Se il filtro è inattiva, Filter Manager non viene sincronizzato con il thread originale.

Nota

Se la routine di callback pre-operazione di un filtro restituisce FLT_PREOP_SYNCHRONIZE, deve implementare una routine di callback post-operazione per l'operazione.

Se la routine di callback di pre-operazione del filtro restituisce FLT_PREOP_SYNCHRONIZE, può restituire un valore non NULL nel parametro di output CompletionContext . Questo parametro è un puntatore di contesto facoltativo passato alla routine di callback post-operazione corrispondente. La routine di callback post-operazione riceve questo puntatore nel parametro di input CompletionContext .

Una routine di callback pre-operazione del driver minifilter deve restituire FLT_PREOP_SYNCHRONIZE solo per le operazioni di I/O basate su IRP. Tuttavia, questo valore di stato può essere restituito per altri tipi di operazione. Se viene restituito per un'operazione di I/O che non è un'operazione di I/O basata su IRP, Filter Manager considera questo valore restituito come se fosse FLT_PREOP_SUCCESS_WITH_CALLBACK. Per determinare se un'operazione è un'operazione di I/O basata su IRP, usare la macro FLT_IS_IRP_OPERATION .

I filtri non devono restituire FLT_PREOP_SYNCHRONIZE per le operazioni di creazione, perché queste operazioni sono già sincronizzate da Filter Manager. Se un driver minifilter ha registrato routine di pre-operazione e post-operazione per operazioni di IRP_MJ_CREATE, la routine di callback post-create viene chiamata in IRQL = PASSIVE_LEVEL, nello stesso contesto del thread della routine di callback pre-create.

I driver minifilter non devono mai restituire FLT_PREOP_SYNCHRONIZE per operazioni di lettura o scrittura asincrone. In questo modo, sia il driver minifilter che le prestazioni del sistema possono danneggiare gravemente e possono anche causare deadlock se, ad esempio, il thread del writer di pagine modificato è bloccato. Prima di restituire FLT_PREOP_SYNCHRONIZE per un'operazione di lettura o scrittura basata su IRP, un driver minifilter deve verificare che l'operazione sia sincrona chiamando FltIsOperationSynchronous.

Non è possibile sincronizzare i tipi seguenti di operazioni di I/O:

FLT_PREOP_SYNCHRONIZE non può essere restituito per una di queste operazioni.