zoukankan      html  css  js  c++  java
  • 内核态尝试缓存handle(file object)遇到的问题及解决思路

    内核态尝试缓存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信息输出给用户(比如将得到的信息转存成文件)。

  • 相关阅读:
    Lotus iNotes 用户启用标识符保险库
    Domino NSD日志诊断/分析
    从 Domino 7.x 升级到 Domino 8.0.1 后服务器性能下降
    Domino服务器命令表
    源码:使用LotusScript发送mime格式邮件
    构架Domino CA中心之一
    如何在DNS中增加SPF记录
    构架Domino CA中心之二
    在Ubuntu 8.04上安装Domino R8.02
    内存陷阱 驯服C++中的野指针 沧海
  • 原文地址:https://www.cnblogs.com/bugchecker/p/3041588.html
Copyright © 2011-2022 走看看