Minifilter第二讲 port的通信 以及实战代码操作.
2022/1/16 23:04:54
本文主要是介绍Minifilter第二讲 port的通信 以及实战代码操作.,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- Minifilter 基于 port的通信 以及实战代码操作.
- 一丶MiniFilter上下文讲解
- 1.1 Context上下文 与instance上下文例子
- 1.2 其它上下文
- 1.3 上下文清理函数简介 以及例子
- 二丶MiniFilter中的文件操作
- 一丶MiniFilter上下文讲解
Minifilter 基于 port的通信 以及实战代码操作.
一丶MiniFilter上下文讲解
1.1 Context上下文 与instance上下文例子
在我们MiniFilter上下文框架中,我们可以指定一个 Context结构体数组. 哪里的上下文就是i这里所说的上下文.
何为上下文?
上下文其实就是附着与某个对象上的一段内存.内存的缓存相关数据. 这块内存是自己定义的. 跟设备扩展一样,本质上也是我们自己定义的. 上下文是附着于目标对象的.所以目标对象是什么那么上下文是什么.
目标对象有很多.
-
文件对象
-
设备对象
-
实例对象
-
卷设备对象
等等.
API如下
FltAllocateContext FltReleaseContext
举例子:
typdef {xxx}INSTANCE_CONTEXT; status = FltAllocateContext( g_pFilter, FLT_INSTANCE_CONTEXT, sizeof(INSTANCE_CONTEXT),//大小是结构体大小 PagedPool, &pcontext); //成功后的传出参数.
例子就是在为Instance实例进行上下文内存申请. 申请后需要设置到实例中.进行绑定.
例子:
FltSetInstanceContext( FltObjects->Instance, FLT_SET_CONTEXT_REPLACE_IF_EXISTS, pContext, NULL);
instance是与卷一一对应的.所以我们申请的上下文可以存储卷的一些信息. 比如扇区大小等等.
获取访问
FltGetInstanceContext(FltObjects->Instance,&pcontext);
总结:
总结来说设置上下文总共四个函数调用. 上下文是我们自定义结构.
FltAllocateContext 申请一个上下文 FltSetInstanceContext 将上下文绑定到一个对象中 FltGetInstanceContext 从绑定的对象中获取一个上下文 FltReleaseContext 释放申请的上下文
1.2 其它上下文
-
流上下文(Stream Context)
所谓流上下文就是我们常用过的FCB块(File Control Block) 文件和FCB是一一对应的关系.
所谓FCB就是在打开文件的时候会为其创建一块缓存.这块缓存就叫做FCB
操作的API如下:
FltGetStreamContext() FltSetStreamContext()
-
流句柄上下文(Stream Handle Context)
文件对象称为 FileObject 一个文件可以有多个FileObject .
操作API
FltGetStreamHandleContext() FltSetStreamHandleContext()
最常用的上下文应该是这个.因为文件对象我们用的很多.
-
实例上下文(instance Context)
参考1.1节例子
-
卷上下文(Volume Context)
卷就是我们常见到C D E F盘.以及网络重定向器. 一般情况下一个卷对应一个过滤器实例对象.
实战操作中经常使用 实例上下文来代替 卷上下文. 因为实例和卷是一一对应的所以使用实例即可.
API
FltGetVolumeContext() FltSetVolumeContext()
-
文件上下文
在Vista之后 MiniFilter还提供了文件上下文.
FltGetFileContext() FltSetFileContext()
如果需要使用查询下WDK帮助文档.
1.3 上下文清理函数简介 以及例子
在WDK中的scanner例子中可以看到上下文是怎么使用的.
如下:
const FLT_CONTEXT_REGISTRATION ContextRegistration[] = { { FLT_STREAMHANDLE_CONTEXT, 0, NULL, sizeof(SCANNER_STREAM_HANDLE_CONTEXT), 'chBS' }, { FLT_CONTEXT_END } }; const FLT_REGISTRATION FilterRegistration = { sizeof( FLT_REGISTRATION ), // Size FLT_REGISTRATION_VERSION, // Version 0, // Flags ContextRegistration, // Context Registration. Callbacks, // Operation callbacks ScannerUnload, // FilterUnload ScannerInstanceSetup, // InstanceSetup ScannerQueryTeardown, // InstanceQueryTeardown NULL, // InstanceTeardownStart NULL, // InstanceTeardownComplete NULL, // GenerateFileName NULL, // GenerateDestinationFileName NULL // NormalizeNameComponent };
还可以在FLT_CONTEXT_REGISTRATION
为每一个上下文提供要给清理函数.
如果前提是我们用到了上下文就可以释放了.
释放: 这里的释放不是要 使用
FltReleaseContext
来释放上下文内存.而是释放我们上下文结构中的资源,比如保存的事件同步的句柄.以及保存的指针指针指向的内存. 而不是直接释放上下文内存.
如下:
const FLT_CONTEXT_REGISTRATION ContextRegistration[] = { { FLT_STREAMHANDLE_CONTEXT, 0, ContextCleanup, CTX_STREAMHANDLE_CONTEXT_SIZE, CTX_STREAMHANDLE_CONTEXT_TAG }, { FLT_INSTANCE_CONTEXT, 0, ContextCleanup, CTX_INSTANCE_CONTEXT_SIZE, CTX_INSTANCE_CONTEXT_TAG }, { FLT_FILE_CONTEXT, 0, ContextCleanup, CTX_FILE_CONTEXT_SIZE, CTX_FILE_CONTEXT_TAG }, { FLT_STREAM_CONTEXT, 0, ContextCleanup, CTX_STREAM_CONTEXT_SIZE, CTX_STREAM_CONTEXT_TAG }, { FLT_CONTEXT_END}
二丶MiniFilter中的文件操作
在MiniFilter中使用的内核文件操作API不再是Zwxxxx了.而是重新定义封装的FltXXXX了.
不使用ZwXXX是防止重入. 比如我们本身就是过滤文件了.你还使用文件API. 那么我们就捕获到API操作了.就会导致重入了.
API如下:
API | 作用 |
---|---|
FltCreateFile | 打开或者创建文件 |
FltReadFile | 读取文件 |
FltWriteFile | 写文件 |
FltClose | 关闭文件句柄 |
FltQueryXxx | 查询文件信息等查询函数 |
FltSetXxx | 设置文件信息等设置函数 |
FltGetXxx | 获取文件一些信息 |
FltPerformXxx | 确认例程通知 |
这些API的操作与Zw操作不同的是前两个参数是新加的,都与MiniFilter相关联.
举例:
ntStatus = FltCreateFile( pFilter, pDstInstance, &hDstFile, GENERIC_WRITE | SYNCHRONIZE, &objDstAttrib, &ioStatus, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_CREATE, CreateOptions, NULL,0,0);
-
参数1 MiniFilter的句柄,在注册的时候得出的.
-
参数2 实例
-
其他参数与Zw参数一样,查询API文档即可.
未完待续
这篇关于Minifilter第二讲 port的通信 以及实战代码操作.的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01后台管理开发学习:新手入门指南
- 2024-11-01后台管理系统开发学习:新手入门教程
- 2024-11-01后台开发学习:从入门到实践的简单教程
- 2024-11-01后台综合解决方案学习:从入门到初级实战教程
- 2024-11-01接口模块封装学习入门教程
- 2024-11-01请求动作封装学习:新手入门教程
- 2024-11-01登录鉴权入门:新手必读指南
- 2024-11-01动态面包屑入门:轻松掌握导航设计技巧
- 2024-11-01动态权限入门:新手必读指南
- 2024-11-01动态主题处理入门:新手必读指南