• 1463阅读
  • 1回复

MiniFilter 学习 [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-04




最近学习了一下文件系统微过滤驱动MiniFilter,其入门比起sFilter简单得多,下面是简单的MiniFilter框架实现了记事本文件无法使用的代码:


[cpp] view plain copy
  1. #include "fltKernel.h"  
  2. #include "ntddk.h"  
  3.   
  4. #pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER, "Not valid for kernel mode drivers")  
  5.   
  6. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pReg);  
  7. NTSTATUS NPUnload(FLT_FILTER_UNLOAD_FLAGS Flags);  
  8.   
  9. FLT_PREOP_CALLBACK_STATUS NPPreCreate(      
  10.     __inout PFLT_CALLBACK_DATA Data,  
  11.     __in PCFLT_RELATED_OBJECTS FltObjects,  
  12.     __deref_out_opt PVOID *CompletionContext);  
  13.       
  14. FLT_POSTOP_CALLBACK_STATUS NPPostCreate(  
  15.     __inout PFLT_CALLBACK_DATA Data,  
  16.     __in PCFLT_RELATED_OBJECTS FltObjects,  
  17.     __in_opt PVOID CompletionContext,  
  18.     __in FLT_POST_OPERATION_FLAGS Flags);  
  19.   
  20. #ifdef ALLOC_PRAGMA  
  21.     #pragma alloc_text(INIT,DriverEntry)  
  22.     #pragma alloc_text(PAGE,NPUnload)  
  23.     #pragma alloc_text(PAGE,NPPreCreate)  
  24. #endif  
  25.   
  26.   
  27.   
  28. PFLT_FILTER gFilterHandle;  
  29.   
  30. const FLT_OPERATION_REGISTRATION Callbacks[] =  
  31. {  
  32.     {  
  33.         IRP_MJ_CREATE,  
  34.         0,  
  35.         NPPreCreate,  
  36.         NPPostCreate  
  37.     },  
  38.     {  
  39.         IRP_MJ_OPERATION_END  
  40.     }  
  41. };  
  42.   
  43. const FLT_REGISTRATION FltRegistration =  
  44. {  
  45.     sizeof(FLT_REGISTRATION),  
  46.     FLT_REGISTRATION_VERSION,  
  47.     0,  
  48.     NULL,  
  49.     Callbacks,  
  50.     NPUnload,  
  51.     NULL,  
  52.     NULL,  
  53.     NULL,  
  54.     NULL,  
  55.     NULL,  
  56.     NULL,  
  57.     NULL  
  58. };  
  59.   
  60. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pReg)  
  61. {  
  62.     NTSTATUS st = STATUS_SUCCESS;  
  63.     st = FltRegisterFilter(pDriverObject,&FltRegistration,&gFilterHandle);  
  64.     if(NT_SUCCESS(st))  
  65.     {  
  66.         st = FltStartFiltering(gFilterHandle);  
  67.         if(!NT_SUCCESS(st))  
  68.         {  
  69.             FltUnregisterFilter(gFilterHandle);  
  70.         }  
  71.     }  
  72.     DbgPrint("[MiniFilter Entry]\n");  
  73.     return st;  
  74. }  
  75.   
  76. NTSTATUS NPUnload(FLT_FILTER_UNLOAD_FLAGS Flags)  
  77. {  
  78.     UNREFERENCED_PARAMETER(Flags);  
  79.     PAGED_CODE();  
  80.     DbgPrint("[MiniFilter Unload]\n");  
  81.     FltUnregisterFilter(gFilterHandle);  
  82.     return STATUS_SUCCESS;  
  83. }  
  84.   
  85. FLT_PREOP_CALLBACK_STATUS NPPreCreate(      
  86.     __inout PFLT_CALLBACK_DATA Data,  
  87.     __in PCFLT_RELATED_OBJECTS FltObjects,  
  88.     __deref_out_opt PVOID *CompletionContext)  
  89. {  
  90.     UNREFERENCED_PARAMETER(FltObjects);  
  91.     UNREFERENCED_PARAMETER(CompletionContext);  
  92.     PAGED_CODE();  
  93.     {  
  94.         UCHAR MajorFunction = 0;  
  95.         PFLT_FILE_NAME_INFORMATION nameInfo;  
  96.         MajorFunction = Data->Iopb->MajorFunction;  
  97.         if(IRP_MJ_CREATE == MajorFunction &&  
  98.             NT_SUCCESS(FltGetFileNameInformation(Data,FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT,&nameInfo)))  
  99.         {  
  100.             if(NT_SUCCESS(FltParseFileNameInformation(nameInfo)))  
  101.             {//查找notepad.exe字符串,并阻止  
  102.                 if(NULL!=wcsstr(nameInfo->Name.Buffer,L"notepad.exe"))  
  103.                 {  
  104.                     Data->IoStatus.Status = STATUS_ACCESS_DENIED;  
  105.                     Data->IoStatus.Information = 0;  
  106.                     FltReleaseFileNameInformation(nameInfo);  
  107.                     return FLT_PREOP_COMPLETE;  
  108.                 }  
  109.             }  
  110.             FltReleaseFileNameInformation(nameInfo);  
  111.         }  
  112.         //DbgPrint("ENTER CREATE_CALLBACK\n");  
  113.     }  
  114.     return FLT_PREOP_SUCCESS_WITH_CALLBACK;  
  115. }  
  116.   
  117. FLT_POSTOP_CALLBACK_STATUS NPPostCreate(  
  118.     __inout PFLT_CALLBACK_DATA Data,  
  119.     __in PCFLT_RELATED_OBJECTS FltObjects,  
  120.     __in_opt PVOID CompletionContext,  
  121.     __in FLT_POST_OPERATION_FLAGS Flags)  
  122. {  
  123.     return FLT_POSTOP_FINISHED_PROCESSING;  
  124. }  
  125.       
  126.       




善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个