内核态尝试缓存handle(file object)遇到的问题及解决思路
2012-12-20 12:13
344 查看
内核态尝试缓存handle(file object)遇到的问题及解决思路
内核态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信息输出给用户(比如将得到的信息转存成文件)。
内核态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信息输出给用户(比如将得到的信息转存成文件)。
相关文章推荐
- 转载Xcode7编译遇到linking in object file built for OSX, for architecture x86_64问题解决方案
- python遇到AttributeError: 'str' object has no attribute '_getAssertEqualityFunc'问题解决过程
- 缓存List到Cache目录,遇到的问题与解决
- RS485串行总线可靠性的研究 关于RS485工程应用可能遇到的问题及其解决思路
- 解决 libstdc++.so.5: cannot open shared object file: No such file or directory 问题
- spark 使用中会遇到的一些问题及解决思路
- 项目开发中遇到的问题,原因,解决思路
- cannot open shared object file: No such file or directory的尝试解决方法和原理
- 解决URLDownloadToFile缓存问题的两种方法
- android proguard使用心得和遇到的若干问题以及解决思路
- centos7 安装nginx和php5.6.25遇到 无法访问php页面 报错file not found 问题解决
- Android proguard遇到的若干问题以及解决思路
- 关于Android开发导入已有项目遇到Project has no default.properties file! Edit the project properties to set one.问题的解决方法
- 项目中遇到的问题及解决思路
- swift调用object-c项目遇到的问题与解决方法
- ubuntu解决libstdc++.so.6: cannot open shared object file: No such file or directory:问题
- 在安装并使用tensorflow中的Object-detection模块时遇到的一些问题汇总及解决方法
- 尝试安装Chrome OS的新版本 Vanilla & 安装之后U盘遇到的问题解决
- 制作web安装文件时遇到的几个小问题及其解决思路(续一)
- fedora20 执行 arm-linux-gcc 出现 libz.so.1: cannot open shared object file问题解决方案