驱动牛犊
|
阅读:2409回复:0
Regmon(4)
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); } |
最新喜欢:wingma...
|