xuehaipiaoxiang
驱动牛犊
驱动牛犊
  • 注册日期2006-10-11
  • 最后登录2013-02-01
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望273点
  • 贡献值0点
  • 好评度22点
  • 原创分4分
  • 专家分0分
阅读:2335回复:0

Regmon(4)

楼主#
更多 发布于:2007-05-29 06:55
RegmonOldestStore函数
遍历链接表缓冲区,并返回最早的记录
PSTORE_BUF RegmonOldestStore(void)
{
    PSTORE_BUF ptr = Store, prev = NULL;
    while(ptr->Next)
    {
        这里是本函数唯一出彩的地方:巧妙的用一句代码就完成了指针移动。简洁是简洁了,不过这种写法不利于精简指令集CPU的代码优化
        ptr = (prev = ptr)->Next;
    }
    if(prev)
    {
        prev-Next = NULL;
    }
    NumStore --;
    return ptr;
}
没什么好说的,PSTORE_BUF在Regsys.h中定义:
保存输出缓冲区的链接表
typedef struct _store {
    ULONG               Len;
    struct _store *     Next;
    char                Data[ MAX_STORE ];
} STORE_BUF, *PSTORE_BUF;

MAX_STORE在IoCtlCmd.h中定义:
一个分配单元的大小
#define MAX_STORE (PAGE_SIZE * 16 – 8)

RegmonWriteLog – 工作线程方法
把缓冲区写到日志文件。之所以在工作方法里执行操作,是因为在DriverEntry中打开的日志文件句柄只在系统进程中有效, 工作线程执行在系统进程中。这个过程中的代码受Store互斥量保护,因为本过程被NewStore调用,在取得Store互斥量后才调用本过程。

注意:当Regmon被配置成启动激活模式, 它将被标志为尽早激活模式, 也就是说此时日志功能在Windows启动过程中尽可能早激活。因为系统根符号变量还未初始化,直到所有的启动驱动初始化完毕,所以在某些时间点之前,Regmon不能启用日志功能。为了能够捕获所有的注册表活动,Regmon把输出缓冲区存储到一个列表,直到能够使用启动日志。然后Regmon就可以发送所有的累计数据,然后导出缓冲区,就像这些数据刚产生一样。


VOID RegmonWriteBootLog(PVOID Context)
{
    PSTORE_BUF currentStore = Context;
    PSTORE_BUF saveStore;
    PSTORE_BUF curSaveStore;
    NTSTATUS ntStatus;

    如果启动日志选项打开,但日志文件却没有打开,先尝试打开该文件
    if(BootLogging && LogFile == INVALID_HANDLE_VALUE)
    {
        ntStatus = RegmonOpenBootLog();
        if(NT_SUCCESS(ntStatus))
        {
            毫无疑问,处理所有尚未保存的缓冲区
            curSavedStore = BootSavedStoreList;
            while(curSaveStore)
            {
                RegmonWriteBuffer(curSaveStore);
                BootSavedStoreList = curSaveStore->Next;
                ExFreePool(curSaveStore);
                curSavedStore = BootSaveStoreList;
            }
        }
}
将当前缓冲区写到文件或者保存起来稍后写入文件
if(LogFile != INVALID_HANDLE_VALUE)
{
    RegmonWriteBuffer(currentStore);
}
else
{
    将这个缓冲区保存起来,知道能够打开日志文件并写入。
    saveStore = ExAllocatePool(PagePool, sizeof(*saveStore));
    memcpy(saveStore, currentStore, sizeof(*saveStore));
    saveStore->Next = NULL;
    if(BootSavedStoreList)
    {
        BootSavedStoreTail->Next = saveStore;
        BootSavedStoreTail = saveStore;
    }
    else
    {
        BootSavedStoreList = saveStore;
        BootSavedStoreTail = saveStore;
    }
}
事件置信号态
KeSetEvent(&LoggingEvent, 0, FALSE);
}

最新喜欢:

wingmanwingma...
游客

返回顶部