Windows驱动_文件系统微小过滤驱动之五MiniFilter例程解析

本文深入探讨了Windows文件系统微过滤驱动的示例,重点讲解了MiniFilter的例程解析,包括上下文分配、操作函数注册和数据结构。通过分析,展示了如何实现用户模式应用程序与驱动程序的交互、文件名分析及文件信息传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                今天,上了下看雪,好久没上去了,现在的看雪,跟之前不一样了,刚毕业的那个时候,上面的大牛真是多,现在屈指可数了,可能这些大牛们,因为年纪的增长,已经不在一线了,或许因为家庭,每时间在论坛上逛了,也许都已经在创业了,现在这个APP泛滥的年代,意念和想法,已经不靠技术了,也没有多少人在研究着技术,目前的中国还是有些浮躁,其实好好想想,现在所有的系统,芯片还是掌握在别人手上,不要谈Android,Windows谁号谁坏,其实中国本就没有发言权,因为再好,或者谁好,都不是自己的,看愈演愈烈的网络监听吧。别人现在是赚钱,如果上升到国家安全,好用是好用,但你摆脱不了的时候,它就可以控制你,监听你。其实现在的中国互联网公司已经有很多钱了,为什么不去扶持一下,中国的操作系统,芯片了。


              我们今天来看下,微软的文件系统微过滤驱动的示例,主要的功能,包括,用户模式的应用程序和微小过滤驱动层程序的交流。微小过滤驱动的文件名的分析。一些相关文件信息的上传到应用程序。借此机会,重新来回顾一下,这些知识点。


                 这里首先分配了一个全局的上下文的空间。
  
  typedef struct _MINISPY_DATA {


  //
  //  The object that identifies this driver.
  //


  PDRIVER_OBJECT DriverObject;


  //
  //  The filter that results from a call to
  //  FltRegisterFilter.
  //


  PFLT_FILTER Filter;


  //
  //  Server port: user mode connects to this port
  //


  PFLT_PORT ServerPort;


  //
  //  Client connection port: only one connection is allowed at a time.,
  //


  PFLT_PORT ClientPort;


  //
  //  List of buffers with data to send to user mode.
  //


  KSPIN_LOCK OutputBufferLock;
  LIST_ENTRY OutputBufferList;


  //
  //  Lookaside list used for allocating buffers.
  //


  NPAGED_LOOKASIDE_LIST FreeBufferList;


  //
  //  Variables used to throttle how many records buffer we can use
  //


  LONG MaxRecordsToAllocate;
  __volatile LONG RecordsAllocated;


  //
  //  static buffer used for sending an "out-of-memory" message
  //  to user mode.
  //


  __volatile LONG StaticBufferInUse;


  //
  //  We need to make sure this buffer aligns on a PVOID boundary because
  //  minispy casts this buffer to a RECORD_LIST structure.
  //  That can cause alignment faults unless the structure starts on the
  //  proper PVOID boundary
  //


  PVOID OutOfMemoryBuffer[RECORD_SIZE/sizeof( PVOID )];


  //
  //  Variable and lock for maintaining LogRecord sequence numbers.
  //


  __volatile LONG LogSequenceNumber;


  //
  //  The name query method to use.  By default, it is set to
  //  FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP, but it can be overridden
  //  by a setting in the registery.
  //


  ULONG NameQueryMethod;


  //
  //  Global debug flags
  //


  ULONG DebugFlags;


#if MINISPY_VISTA


  //
  //  Dynamically imported Filter Mgr APIs
  //


  PFLT_SET_TRANSACTION_CONTEXT PFltSetTransactionContext;


  PFLT_GET_TRANSACTION_CONTEXT PFltGetTransactionContext;


  PFLT_ENLIST_IN_TRANSACTION PFltEnlistInTransaction;


#endif


 } MINISPY_DATA, *PMINISPY_DATA;
 
 注册操作函数的定义:
 
 CONST FLT_REGISTRATION FilterRegistration = {


    sizeof(FLT_REGISTRATION),               //  Size
    FLT_REGISTRATION_VERSION,               //  Version   
#if MINISPY_WIN8 
    FLTFL_REGISTRATION_SUPPORT_NPFS_MSFS,   //  Flags
#else
    0,                                      //  Flags
#endif // MINISPY_WIN8


    Contexts,                               //  Context
    Callbacks,                              //  Operation callbacks


    SpyFilterUnload,                        //  FilterUnload


    NULL,                                   //  InstanceSetup
    SpyQueryTeardown,                       //  InstanceQueryTeardown
    NULL,                                   //  InstanceTeardownStart
    NULL,                                   //  InstanceTeardownComplete


    NULL,                                   //  GenerateFileName
    NULL,                                   //  GenerateDestinationFileName
    NULL                                    //  NormalizeNameComponent


#if MINISPY_VISTA


    
    SpyKtmNotificationCallback              //  KTM notification callback


#endif // MINISPY_VISTA


 };
 
 这里,还有两个内置的数据结构。
 
 const FLT_CONTEXT_REGISTRATION Contexts[] = {


#if MINISPY_VISTA


    { FLT_TRANSACTION_CONTEXT,
      0,
      SpyDeleteTxfContext,
      sizeof(MINISPY_TRANSACTION_CONTEXT),
      'ypsM' },


#endif // MINISPY_VISTA


    { FLT_CONTEXT_END }
};
 
 这个是定义上下文,这里主要是为VISTA以后出现的传输上下文。
 
 再Callbacks操作的定义:
 
 CONST FLT_OPERATION_REGISTRATION Callbacks[] = {
    { IRP_MJ_CREATE,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_CREATE_NAMED_PIPE,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_CLOSE,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_READ,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_WRITE,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_QUERY_INFORMATION,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_SET_INFORMATION,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_QUERY_EA,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_SET_EA,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_FLUSH_BUFFERS,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_QUERY_VOLUME_INFORMATION,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_SET_VOLUME_INFORMATION,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_DIRECTORY_CONTROL,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_FILE_SYSTEM_CONTROL,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_DEVICE_CONTROL,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_INTERNAL_DEVICE_CONTROL,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_SHUTDOWN,
      0,
      SpyPreOperationCallback,
      NULL },                           //post operation callback not supported


    { IRP_MJ_LOCK_CONTROL,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_CLEANUP,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_CREATE_MAILSLOT,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_QUERY_SECURITY,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_MJ_SET_SECURITY,
      0,
      SpyPreOperationCallback,
      SpyPostOperationCallback },


    { IRP_M

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值