[/CODE]多谢,sysnap牛,不过应该不是那的问题,因为这样就没问题:
[CODE]pPMCurrent=(MODULE_ENTRY*)((DWORD)DriObject + 0x14);
pcurrentDriObj=(DRIVER_OBJECT *)((DWORD)pPMCurrent - 0x14);
这样的话,DriObject和pcurrentDriObj就一样,就是同一个驱动对象
但是通过我的试验仍然有以下疑问:
1.
pPMFirst=pPMCurrent;
DbgPrint("pmfirst: %x\n", pPMFirst);
DbgPrint("pPMCurrent: %x\n", pPMCurrent);
pPMCurrent = (MODULE_ENTRY*)pPMCurrent->le_mod.Flink;
pPMCurrent = (MODULE_ENTRY*)pPMCurrent->le_mod.Blink;
DbgPrint("pmfirst1: %x\n", pPMFirst);
DbgPrint("pPMCurrent1: %x\n", pPMCurrent);
这里按说先Flink再Blink应该,应该是pPMCurrent不变,但是pPMCurrent变化了,这里不太清楚什么原因?LIST_ENTRY不是双向链表吗?往前走一步再退一步,为何就变了呢?
2.比如我现在知道sysaudio的驱动对象为:SysAudioDriObject
通过
SysAudioPM=(MODULE_ENTRY*)((DWORD)SysAudioDriObject + 0x14);
得到了sysaudio这个驱动对象的SysAudioPM,再通过
pPMCurrent = (MODULE_ENTRY*)SysAudioPM->le_mod.Flink;
DbgPrint("Current Driver File Name is: %ws\n", pPMCurrent->driver_Name.Buffer);
可以显示出sysaudio驱动的驱动文件名为sysaudio.sys
但是下面我采用遍历pPMCurrent时,
for(int i=0;i<200;i++)
{
// This works on Windows XP SP1 and Windows 2003.
if ((pPMCurrent->unk1 != 0x00000000) && (pPMCurrent->driver_Path.Length != 0))
{
UNICODE_STRING sysName;
RtlInitUnicodeString(&sysName,L"sysaudio.sys");
if(RtlCompareUnicodeString(&pPMCurrent->driver_Name,&sysName,TRUE)==0)
{
[COLOR="Red"]此处的pPMFirst和SysAudioPM竟然不一样,驱动对象当然也不对,难道一个驱动对象有两个循环的链?[/COLOR]
DbgPrint("pPMFirst is: %x\n", pPMFirst);
pcurrentDriObj=(DRIVER_OBJECT *)((DWORD)pPMFirst - 0x14);
DbgPrint("Driverobjectname: %x\n", pcurrentDriObj);
}
}
pPMFirst=pPMCurrent;
DbgPrint("pPMFirst is: %x\n", pPMFirst);
pPMCurrent = (MODULE_ENTRY*)pPMCurrent->le_mod.Flink;
}
主要就这两个疑问,而且现在的问题是用windbg调试,看不到这些变量的值,符号文件也对的啊