FLT_PREOP_CALLBACK_STATUS FLTAPI FilePreSetInformation( IN OUT PFLT_CALLBACK_DATA Data, IN PCFLT_RELATED_OBJECTS FltObjects, OUT PVOID *CompletionContext) { UNREFERENCED_PARAMETER(FltObjects); UNREFERENCED_PARAMETER(CompletionContext); // 本次操作对应的进程 FltGetRequestorProcessId(Data); // 使用FltGetFileNameInformation获取文件信息 // 使用FltParseFileNameInformation转换文件路径 Data; // 文件信息 // 检查本次操作类型是不是删除文件操作 if (Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileDispositionInformation); // 检查本次操作类型是不是重命名文件操作 if (Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileRenameInformation) { // 文件的新父路径,使用ZwQueryInformationFile查询 ((PFILE_RENAME_INFORMATION)(Data->Iopb->Parameters.SetFileInformation.InfoBuffer))->RootDirectory; // 文件的新子路径,WCHAR字符串,不含L'\0'结尾 ((PFILE_RENAME_INFORMATION)(Data->Iopb->Parameters.SetFileInformation.InfoBuffer))->FileName; ((PFILE_RENAME_INFORMATION)(Data->Iopb->Parameters.SetFileInformation.InfoBuffer))->FileNameLength; } // 本层不做处理,继续发给下层过滤器 return FLT_PREOP_SUCCESS_NO_CALLBACK; }
在 IRP_MJ_WRITE 中,我们处理文件内容的写入操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
FLT_PREOP_CALLBACK_STATUS FLTAPI FilePreWrite( IN OUT PFLT_CALLBACK_DATA Data, IN PCFLT_RELATED_OBJECTS FltObjects, OUT PVOID *CompletionContext) { UNREFERENCED_PARAMETER(FltObjects); UNREFERENCED_PARAMETER(CompletionContext); // 本次操作对应的进程 FltGetRequestorProcessId(Data); // 使用FltGetFileNameInformation获取文件信息 // 使用FltParseFileNameInformation转换文件路径 Data; // 文件信息 // 本层不做处理,继续发给下层过滤器 return FLT_PREOP_SUCCESS_NO_CALLBACK; }
通用的 操作之后 函数,不做任何处理。
1 2 3 4 5 6 7 8 9 10 11 12
FLT_POSTOP_CALLBACK_STATUS FilePostOperation( IN OUT PFLT_CALLBACK_DATA Data, IN PCFLT_RELATED_OBJECTS FltObjects, IN PVOID CompletionContext, IN FLT_POST_OPERATION_FLAGS Flags) { UNREFERENCED_PARAMETER(Data); UNREFERENCED_PARAMETER(FltObjects); UNREFERENCED_PARAMETER(CompletionContext); UNREFERENCED_PARAMETER(Flags); return FLT_POSTOP_FINISHED_PROCESSING; }