Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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:
Oplock-operationer för kontroll av filsystem (FSCTL) (MajorFunction är IRP_MJ_FILE_SYSTEM_CONTROL; FsControlCode är FSCTL_REQUEST_FILTER_OPLOCK, FSCTL_REQUEST_BATCH_OPLOCK, FSCTL_REQUEST_OPLOCK_LEVEL_1 eller FSCTL_REQUEST_OPLOCK_LEVEL_2.)
Meddela åtgärder vid katalogändring (MajorFunction är IRP_MJ_DIRECTORY_CONTROL; MinorFunction är IRP_MN_NOTIFY_CHANGE_DIRECTORY.)
Byte-range lock requests (MajorFunction is IRP_MJ_LOCK_CONTROL; MinorFunction är IRP_MN_LOCK.)
FLT_PREOP_SYNCHRONIZE kan inte returneras för någon av dessa åtgärder.