内核态尝试缓存handle(file object)遇到的问题及解决思路
来源:互联网 发布:莱昂纳德数据 编辑:程序博客网 时间:2024/05/22 05:32
内核态尝试缓存handle(file object)遇到的问题及解决思路
内核态LOG模块实现中,考虑到频繁打开关闭用户态LOG文件开销较大,考虑缓存handle(或对应的file object)。
解决办法:
log文件的创建/读/写均在系统线程中进行,且一直保持handle不被关闭。用户态需要获得LOG信息时,向驱动发送IOCTL,由系统线程从log file中读取,然后送回到用户态。
内核态LOG模块实现中,考虑到频繁打开关闭用户态LOG文件开销较大,考虑缓存handle(或对应的file object)。
思路:
首次通过ZwCreateFile()获得handle然后利用ObReferenceObjectByHandle()来获得对应的file object,将得到的file object缓存起来,想后续通过它来直接读写文件。
实现中发现这种方法存在问题:
若在获得file object之后关闭handle,则驱动后续无法利用file object来读写文件,错:"STATUS_FILE_CLOSED",多调几次ObReferenceObject()也不行。
若不关闭handle,则用户态无法打开文件,报错:“文件已在另一个进程中被打开“。
原因:
搜索引擎+WDK发现,InitializeObjectAttributes()中若指定OBJ_KERNEL_HANDLE,则得到的handle只能在内核态中被任意线程访问;
若不指定,则只能在创建该文件的进程上下文中被访问。 两者只能取其一,那么之前的思路是行不通的。
解决办法:
log文件的创建/读/写均在系统线程中进行,且一直保持handle不被关闭。用户态需要获得LOG信息时,向驱动发送IOCTL,由系统线程从log file中读取,然后送回到用户态。
这就要求log函数的实际文件创建/读/写均放到系统工作者队列中进行,另外还需要另外用户态程序,这个程序接收用户输入,转换成IOCTL,然后将得到的LOG信息输出给用户(比如将得到的信息转存成文件)。
- 内核态尝试缓存handle(file object)遇到的问题及解决思路
- 项目中遇到的问题及解决思路
- 开发时遇到问题的解决思路
- AX遇到问题的解决思路
- IL思路及遇到的问题、解决方法
- IL遇到的思路及问题
- mysql 短连接压测遇到的问题及查找解决思路[终于找到原因了]
- spark 使用中会遇到的一些问题及解决思路
- spark 使用中会遇到的一些问题及解决思路
- 利用WIN8自带系统还原功能还原系统,遇到的一些问题及解决思路。
- 初涉项目管理时遇到的问题及解决思路
- 利用WIN8自带系统还原功能还原系统,遇到的一些问题及解决思路。
- Spark on Yarn遇到的几个问题及解决思路
- XP硬盘安装Ubuntu双系统遇到的vmlinuz File Not Found问题原因分析及解决
- 内核编译中遇到问题及解决过程
- 解决网页开发过程中遇到的问题以及思路
- web开发遇到的问题与解决思路
- cannot open shared object file 问题的解决
- 一些强大的Shell命令
- Linux环境进程间通信(二):信号
- 后台需要处理的
- 对初入科研生涯的学生的忠告
- Git Color记录
- 内核态尝试缓存handle(file object)遇到的问题及解决思路
- Linux环境进程间通信(三):报文队列
- 人是最坏的动物
- lucene API使用方法与和性能优化
- 数据库分库分表(sharding)系列
- iOS从info.plist 获取项目的名称及版本号
- 【COCOS2DX-游戏开发之二】 模态对话框
- VC中TRACE用法
- VC2010从空项目开始搭建MFC程序时的注意事项