Skriva återanropsrutiner för postoperation

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