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.
En minifilterdrivrutin för filsystem använder en eller flera postoperationsåteranropsrutiner för att filtrera I/O-åtgärder.
En återanropsrutin efter operationen kan utföra någon av följande åtgärder:
- Utför slutförandearbete direkt i postoperationsrutinen. Allt slutförandearbete kan utföras på IRQL <= DISPATCH_LEVEL.
- Slutför arbetet på en säker IRQL. Återge FLT_STATUS_MORE_PROCESSING_REQUIRED och köa upp en arbetstråd för att möjliggöra bearbetning på en säker IRQL-nivå. När bearbetningen är klar anropar arbetstråden FltCompletePendedPostOperation för att fortsätta bearbetningen efter operationen.
- Avbryt en lyckad CREATE-åtgärd.
Rutiner för återanrop efter operation liknar de slutföranderutiner som används i äldre filterdrivrutiner för filsystem.
En minifilterdrivrutin registrerar en postoperationsåteranropsrutin för en viss typ av I/O-åtgärd på samma sätt som den registrerar en återanropsrutin för föroperation, det vill säga genom att lagra återanropsrutinens startpunkt i OperationRegistration-medlemmen i den FLT_REGISTRATION struktur som minifilterdrivrutinen skickar som en parameter till FltRegisterFilter i sin DriverEntry-rutin .
Minifilterdrivrutiner tar bara emot de typer av I/O-åtgärder som de har registrerat en föroperations- eller återanropsrutin för efteroperation. En minifilterdrivrutin kan registrera en återanropsrutin för föroperation för en viss typ av I/O-åtgärd utan att registrera ett återanrop efter operationen och vice versa.
Varje återanropsrutin efter operationen definieras på följande sätt:
typedef FLT_POSTOP_CALLBACK_STATUS
(*PFLT_POST_OPERATION_CALLBACK) (
IN OUT PFLT_CALLBACK_DATA Data,
IN PCFLT_RELATED_OBJECTS FltObjects,
IN PVOID CompletionContext,
IN FLT_POST_OPERATION_FLAGS Flags
);
Precis som en slutföranderutin anropas en återanropsrutin för postoperation på IRQL <= DISPATCH_LEVEL, i en godtycklig trådkontext.
Eftersom den kan anropas på IRQL = DISPATCH_LEVEL kan en återanropsrutin efter operationen inte anropa kernellägesrutiner som måste anropas vid en lägre IRQL, till exempel FltLockUserBuffer eller RtlCompareUnicodeString. Av samma anledning måste alla datastrukturer som används i en återanropsrutin efter operationen allokeras från en osidindelad pool.
Följande situationer är flera undantag från föregående regel:
Om en minifilterdrivrutins callback-rutin för preoperation returnerar FLT_PREOP_SYNCHRONIZE för en IRP-baserad I/O-åtgärd, anropas motsvarande callback-rutin för postoperation på IRQL <= APC_LEVEL, i samma trådkontext som callback-rutinen för preoperation.
Efteroperationens återanropsrutin för en snabb I/O-åtgärd anropas på IRQL = PASSIVE_LEVEL, i samma trådkontext som återanropsrutinen för föroperation.
Rutiner för återanrop efter skapande anropas på IRQL = PASSIVE_LEVEL, i kontexten för den tråd som ursprungar från IRP_MJ_CREATE operationen.
När filterhanteraren anropar en minifilterdrivrutins återanropsrutin för en viss I/O-åtgärd styr minifilterdrivrutinen tillfälligt I/O-åtgärden. Minifilterdrivrutinen behåller den här kontrollen tills den gör något av följande:
Returnerar FLT_POSTOP_FINISHED_PROCESSING från återanropsrutinen efter operationen.
Anropar FltCompletePendedPostOperation från en arbetsrutin som har hanterat en IRP-baserad I/O-åtgärd som skjutits upp i återanropsrutinen för postoperation.
Det här avsnittet innehåller:
Utföra slutförandebearbetning för en I/O-åtgärd
Väntar på en I/O-åtgärd i en återanropsrutin efter operationen
Misslyckas med att utföra en I/O-operation i en postoperationsåteranropsrutin