Returnerar FLT_PREOP_SYNCHRONIZE

Anmärkning

En minifilterdrivrutin bör inte använda FLT_PREOP_SYNCHRONIZE för att lagra en resurs i anrop före och efter åtgärden (samma som den inte bör innehålla en resurs i ett I/O-anrop). Att göra det är osäkert eftersom det kan leda till dödlägen.

Om en minifilterdrivrutins föråtgärdsåteranropsrutin synkroniserar en I/O-åtgärd genom att returnera FLT_PREOP_SYNCHRONIZE anropar FilterHanteraren det filtrets återanropsrutin efter åtgärden när I/O är klart:

  • Om filtret inte töms anropar Filter Manager det filtrets återanropsrutin efter åtgärden i samma trådkontext som återanropet före åtgärden på IRQL <= APC_LEVEL. (Observera att den här trådkontexten inte nödvändigtvis är kontexten för den ursprungliga tråden.)
  • Om filtret töms synkroniseras inte Filterhanteraren tillbaka till den ursprungliga tråden.

Anmärkning

Om ett filters återanropsrutin före operation returnerar FLT_PREOP_SYNCHRONIZE måste den implementera en återanropsrutin efter operationen.

Om filtrets återanropsrutin före åtgärden returnerar FLT_PREOP_SYNCHRONIZE kan det returnera ett värde som inte är NULL i dess CompletionContext-utdataparameter. Den här parametern är en valfri kontextpekare som skickas till motsvarande återanropsrutin efter åtgärden. Återanropsrutinen efter åtgärden tar emot den här pekaren i indataparametern CompletionContext .

En minifilterdrivrutins återanropsrutin före drift bör endast returnera FLT_PREOP_SYNCHRONIZE för IRP-baserade I/O-åtgärder. Det här statusvärdet kan dock returneras för andra åtgärdstyper. Om den returneras för en I/O-åtgärd som inte är en IRP-baserad I/O-åtgärd behandlar Filter Manager det här returvärdet som om det vore FLT_PREOP_SUCCESS_WITH_CALLBACK. Om du vill avgöra om en åtgärd är en IRP-baserad I/O-åtgärd använder du makrot FLT_IS_IRP_OPERATION .

Filter bör inte returnera FLT_PREOP_SYNCHRONIZE för att skapa åtgärder, eftersom dessa åtgärder redan har synkroniserats av Filterhanteraren. Om en minifilterdrivrutin har registrerat för- och efter-operationsåteranropsrutiner för IRP_MJ_CREATE operationer anropas återanropsrutinen efter skapande på IRQL = PASSIVE_LEVEL, i samma trådkontext som för-återanropsrutinen.

Minifilterdrivrutiner får aldrig returnera FLT_PREOP_SYNCHRONIZE för asynkrona läs- eller skrivåtgärder. Detta kan allvarligt försämra både minifilterdrivrutinen och systemets prestanda och kan till och med orsaka dödlägen om till exempel den ändrade sidskrivaretråden blockeras. Innan du returnerar FLT_PREOP_SYNCHRONIZE för en IRP-baserad läs- eller skrivåtgärd bör en minifilterdrivrutin kontrollera att åtgärden är synkron genom att anropa FltIsOperationSynchronous.

Följande typer av I/O-åtgärder kan inte synkroniseras:

FLT_PREOP_SYNCHRONIZE kan inte returneras för någon av dessa åtgärder.