7 PFLT_CALLBACK_DATA Data
10 PFLT_FILE_NAME_INFORMATION fileNameInfo = NULL;
11 NTSTATUS status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_FILESYSTEM_ONLY | FLT_FILE_NAME_DO_NOT_CACHE, &fileNameInfo);
12 if (!NT_SUCCESS(status)) {
13 DbgPrint(
"Error getting file info\n");
16 if (fileNameInfo == NULL) {
17 return Data->Iopb->TargetFileObject->FileName.Buffer;
20 return fileNameInfo->Name.Buffer;
25 PFLT_CALLBACK_DATA Data
29 HANDLE sourceProcessId = PsGetCurrentProcessId();
30 HANDLE sourceThreadId = PsGetThreadId(Data->Thread);
32 switch (Data->IoStatus.Information)
44 PFLT_CALLBACK_DATA Data
48 HANDLE sourceProcessId = PsGetCurrentProcessId();
49 HANDLE sourceThreadId = PsGetThreadId(Data->Thread);
51 switch (Data->IoStatus.Information)
63 PFLT_CALLBACK_DATA Data
67 HANDLE sourceProcessId = PsGetCurrentProcessId();
68 HANDLE sourceThreadId = PsGetThreadId(Data->Thread);
69 ULONG writeLength = Data->Iopb->Parameters.Write.Length;
70 LARGE_INTEGER fileOffset = Data->Iopb->Parameters.Write.ByteOffset;
72 switch (Data->Iopb->MinorFunction)
75 Log_FileWrite(sourceProcessId, sourceThreadId, fileName, fileOffset, writeLength, FALSE);
77 case IRP_MN_COMPRESSED:
78 Log_FileWrite(sourceProcessId, sourceThreadId, fileName, fileOffset, writeLength, TRUE);
84 PFLT_CALLBACK_DATA Data
89 HANDLE sourceProcessId = PsGetCurrentProcessId();
90 HANDLE sourceThreadId = PsGetThreadId(Data->Thread);
91 ULONG readLength = Data->Iopb->Parameters.Read.Length;
92 LARGE_INTEGER fileOffset = Data->Iopb->Parameters.Read.ByteOffset;
94 switch (Data->Iopb->MinorFunction)
97 Log_FileRead(sourceProcessId, sourceThreadId, fileName, fileOffset, readLength, FALSE);
99 case IRP_MN_COMPRESSED:
100 Log_FileRead(sourceProcessId, sourceThreadId, fileName, fileOffset, readLength, TRUE);
106 PFLT_CALLBACK_DATA Data
111 HANDLE sourceProcessId = PsGetCurrentProcessId();
112 HANDLE sourceThreadId = PsGetThreadId(Data->Thread);
117 BOOLEAN completeIfOplocked = (Data->Iopb->Parameters.Create.Options & FILE_COMPLETE_IF_OPLOCKED) != 0;;
119 switch (Data->IoStatus.Information) {
121 Log_FileCreated(sourceProcessId, sourceThreadId, fileName, completeIfOplocked);
124 Log_FileOpen(sourceProcessId, sourceThreadId, fileName, completeIfOplocked);
126 case FILE_OVERWRITTEN:
129 case FILE_SUPERSEDED:
136 PFLT_CALLBACK_DATA Data,
137 PCFLT_RELATED_OBJECTS FltObjects,
138 PVOID CompletionContext,
139 FLT_POST_OPERATION_FLAGS Flags
142 UNREFERENCED_PARAMETER(FltObjects);
143 UNREFERENCED_PARAMETER(CompletionContext);
144 UNREFERENCED_PARAMETER(Flags);
146 switch (Data->Iopb->MajorFunction)
150 DbgPrint(
"IRP_MJ_READ\n");
155 DbgPrint(
"IRP_MJ_CREATE\n");
160 DbgPrint(
"IRP_MJ_WRITE\n");
164 case IRP_MJ_CREATE_NAMED_PIPE:
165 DbgPrint(
"IRP_MJ_CREATE_NAMED_PIPE\n");
169 case IRP_MJ_CREATE_MAILSLOT:
170 DbgPrint(
"IRP_MJ_CREATE_MAILSLOT\n");
174 return FLT_POSTOP_FINISHED_PROCESSING;
179 _In_ FLT_FILTER_UNLOAD_FLAGS Flags
184 if (Flags == FLTFL_FILTER_UNLOAD_MANDATORY) {
186 status = STATUS_SUCCESS;
189 status = STATUS_FLT_DO_NOT_DETACH;
194#pragma region FilterRegistration
214 { IRP_MJ_CREATE_NAMED_PIPE,
220 IRP_MJ_CREATE_MAILSLOT,
225 { IRP_MJ_OPERATION_END}
229 sizeof(FLT_REGISTRATION),
230 FLT_REGISTRATION_VERSION,
246 NTSTATUS status = FltRegisterFilter(
250 if (!NT_SUCCESS(status)) {
251 DbgPrint(
"Failed FltRegisterFilter\n");
254 case STATUS_INSUFFICIENT_RESOURCES:
255 DbgPrint(
"STATUS_INSUFFICIENT_RESOURCES\n");
257 case STATUS_INVALID_PARAMETER:
258 DbgPrint(
"STATUS_INVALID_PARAMETER\n");
260 case STATUS_FLT_NOT_INITIALIZED:
261 DbgPrint(
"STATUS_FLT_NOT_INITIALIZED\n");
263 case STATUS_OBJECT_NAME_NOT_FOUND:
264 DbgPrint(
"STATUS_OBJECT_NAME_NOT_FOUND\n");
267 DbgPrint(
"UNKNOWN\n");
274 if (!NT_SUCCESS(status)) {
275 DbgPrint(
"Failed FltStartFiltering\n");
void FileReadStatus(PFLT_CALLBACK_DATA Data)
PWCH GetFileInfo(PFLT_CALLBACK_DATA Data)
void FileCreationStatus(PFLT_CALLBACK_DATA Data)
const FLT_REGISTRATION FilterRegistration
PFLT_FILTER g_FilterHandle
NTSTATUS PanoptesFilterUnload(_In_ FLT_FILTER_UNLOAD_FLAGS Flags)
void MailSlotStatus(PFLT_CALLBACK_DATA Data)
void NamedPipeStatus(PFLT_CALLBACK_DATA Data)
const FLT_OPERATION_REGISTRATION Callbacks[]
void FileWriteStatus(PFLT_CALLBACK_DATA Data)
FLT_POSTOP_CALLBACK_STATUS PostOperationCallback(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID CompletionContext, FLT_POST_OPERATION_FLAGS Flags)
NTSTATUS FilterInit(PDRIVER_OBJECT *DriverObject)
void Log_FileOpen(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName, BOOLEAN Oplocked)
Log a file open event.
void Log_NamedPipeCreate(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName)
Log a named pipe create event.
void Log_NamedPipeOpen(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName)
Log a named pipe open event.
void Log_FileOverwritten(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName)
Log a file overwrite event.
void Log_FileSuperseded(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName)
Log a file superseded event.
void Log_FileRead(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName, LARGE_INTEGER FileOffset, ULONG ReadLength, BOOLEAN Compressed)
Log a file read event.
void Log_MailSlotOpen(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName)
Log a mail slot open event.
void Log_MailSlotCreate(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName)
Log a mail slot create event.
void Log_FileWrite(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName, LARGE_INTEGER FileOffset, ULONG ReadLength, BOOLEAN Compressed)
Log a file write event.
void Log_FileCreated(HANDLE ProcessId, HANDLE ThreadId, PWCH FileName, BOOLEAN Oplocked)
Log a file create event.