|
编译环境VS2010 WDK17600,
//枚举指定进程的模块
VOID EnumModule(PEPROCESS Process)
{
SIZE_T Peb = 0;
SIZE_T Ldr = 0;
PLIST_ENTRY ModListHead = 0;
PLIST_ENTRY Module = 0;
ANSI_STRING AnsiString;
KAPC_STATE ks;
//EPROCESS地址无效则退出
if(!MmIsAddressValid(Process))
return;
//获取PEB地址
Peb = (SIZE_T)PsGetProcessPeb(Process);
//PEB地址无效则退出
if(!Peb)
return;
//依附进程
KeStackAttachProcess(Process,&ks);
__try
{
//获得LDR地址
Ldr = Peb + (SIZE_T)LdrInPebOffset;
//测试是否可读,不可读则抛出异常退出
ProbeForRead((CONST PVOID)Ldr,8,8);
//获得链表头
ModListHead = (PLIST_ENTRY)(*(PULONG64)Ldr+ModListInPebOffset);
//再次测试可读性
ProbeForRead((CONST PVOID)ModListHead,8,8);
//获得第一个模块的信息
Module = ModListHead->Flink;
while(ModListHead !=Module)
{
//打印信息:基址、大小、DLL路径
DbgPrint("[MODULE]Base=%p Size=%ld Path=%wZ\n",(PVOID)(((PLDR_DATA_TABLE_ENTRY)Module)->DllBase),
(ULONG)(((PLDR_DATA_TABLE_ENTRY)Module)->SizeOfImage),
&(((PLDR_DATA_TABLE_ENTRY)Module)->FullDllName));
Module = Module->Flink;
//测试下一个模块信息的可读性
ProbeForRead((CONST PVOID)Module,80,8);
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
DbgPrint("[EnumModule]__except (EXCEPTION_EXECUTE_HANDLER)");
}
//取消依附进程
KeUnstackDetachProcess(&ks);
}
编译的时候 这个函数有出现一个小问题,就是不屏蔽掉KeStackAttachProcess(Process,&ks)和KeUnstackDetachProcess(&ks);
编译出来的驱动,在启动的时候会出现 打开服务失败,错误码是2,提示系统找不到指定文件。如果他这两个函数屏蔽掉,驱动就可以正常的安装和启动。请问一下有没有同学遇到跟我一样的问题,需要怎么解决。。。。。
|
|