Zurückgeben von FLT_PREOP_SYNCHRONIZE
Hinweis
Ein Minifiltertreiber sollte FLT_PREOP_SYNCHRONIZE nicht verwenden, um eine Ressource über Prä- und Post-Operation-Aufrufe hinweg zu speichern (genauso wie er eine Ressource nicht über einen E/A-Anruf hinweg speichern sollte). Dies ist unsicher, da dies zu Deadlocks führen kann.
Wenn die Rückrufroutine eines Minifiltertreibers vor dem Vorgang einen E/A-Vorgang synchronisiert, indem FLT_PREOP_SYNCHRONIZE zurückgegeben wird, ruft der Filter-Manager während des E/ A-Abschlusses die Rückrufroutine dieses Filters nach dem Vorgang auf:
- Wenn der Filter nicht entleert, ruft der Filter-Manager die Rückrufroutine nach dem Vorgang im selben Threadkontext wie der Rückruf vor dem Vorgang unter IRQL <= APC_LEVEL auf. (Beachten Sie, dass dieser Threadkontext nicht unbedingt der Kontext des ursprünglichen Threads ist.)
- Wenn der Filter leer wird, wird der Filter-Manager nicht mit dem ursprünglichen Thread synchronisiert.
Hinweis
Wenn die Rückrufroutine eines Filters vor dem Vorgang FLT_PREOP_SYNCHRONIZE zurückgibt, muss eine Rückrufroutine nach dem Vorgang für den Vorgang implementiert werden.
Wenn die Rückrufroutine des Filters vor dem Vorgang FLT_PREOP_SYNCHRONIZE zurückgibt, kann sie im CompletionContext-Ausgabeparameter einen Wert ungleich NULL zurückgeben. Dieser Parameter ist ein optionaler Kontextzeiger, der an die entsprechende Rückrufroutine nach dem Vorgang übergeben wird. Die Rückrufroutine nach dem Vorgang empfängt diesen Zeiger im Eingabeparameter CompletionContext .
Die Rückrufroutine eines Minifiltertreibers vor dem Vorgang sollte FLT_PREOP_SYNCHRONIZE nur für IRP-basierte E/A-Vorgänge zurückgeben. Dieser status Wert kann jedoch für andere Vorgangstypen zurückgegeben werden. Wenn er für einen E/A-Vorgang zurückgegeben wird, bei dem es sich nicht um einen IRP-basierten E/A-Vorgang handelt, behandelt der Filter-Manager diesen Rückgabewert, als wäre er FLT_PREOP_SUCCESS_WITH_CALLBACK. Verwenden Sie das Makro FLT_IS_IRP_OPERATION , um zu bestimmen, ob es sich bei einem Vorgang um einen IRP-basierten E/A-Vorgang handelt.
Filter sollten keine FLT_PREOP_SYNCHRONIZE für Erstellungsvorgänge zurückgeben, da diese Vorgänge bereits vom Filter-Manager synchronisiert werden. Wenn ein Minifiltertreiber vor und nach dem Vorgang Rückrufroutinen für IRP_MJ_CREATE-Vorgänge registriert hat, wird die Rückrufroutine nach der Erstellung unter IRQL = PASSIVE_LEVEL im gleichen Threadkontext wie die Rückrufroutine vor der Erstellung aufgerufen.
Minifiltertreiber dürfen niemals FLT_PREOP_SYNCHRONIZE für asynchrone Lese- oder Schreibvorgänge zurückgeben. Dies kann sowohl die Leistung des Minifiltertreibers als auch des Systems erheblich beeinträchtigen und sogar zu Deadlocks führen, wenn beispielsweise der geänderte Seitenschreiberthread blockiert wird. Bevor FLT_PREOP_SYNCHRONIZE für einen IRP-basierten Lese- oder Schreibvorgang zurückgegeben wird, sollte ein Minifiltertreiber überprüfen, ob der Vorgang synchron ist, indem FltIsOperationSynchronous aufgerufen wird.
Die folgenden E/A-Vorgänge können nicht synchronisiert werden:
Vorgänge zur Oplock-Dateisystemsteuerung (FSCTL) (MajorFunction ist IRP_MJ_FILE_SYSTEM_CONTROL; FsControlCode ist FSCTL_REQUEST_FILTER_OPLOCK, FSCTL_REQUEST_BATCH_OPLOCK, FSCTL_REQUEST_OPLOCK_LEVEL_1 oder FSCTL_REQUEST_OPLOCK_LEVEL_2.)
Änderungsverzeichnisvorgänge benachrichtigen (MajorFunction ist IRP_MJ_DIRECTORY_CONTROL; MinorFunction ist IRP_MN_NOTIFY_CHANGE_DIRECTORY.)
Bytebereichssperranforderungen (MajorFunction ist IRP_MJ_LOCK_CONTROL; MinorFunction ist IRP_MN_LOCK.)
FLT_PREOP_SYNCHRONIZE kann für keine dieser Vorgänge zurückgegeben werden.