首页
社区
课程
招聘
[求助]请大家帮看一下ExFreePool引起蓝屏的问题
发表于: 2009-3-9 11:24 14936

[求助]请大家帮看一下ExFreePool引起蓝屏的问题

2009-3-9 11:24
14936
在驱动中列举进程,把进程名做成链表。但在读取链表数据后释放所申请的内存立即蓝屏。请大家看看代码哪里有问题?
 
NTSTATUS EnumProcess()
{
 int iCount = 1;    //进程计数
 NTSTATUS status;   //返回值
 PVOID pSi = NULL;  //指向SystemInformationClass的指针,此处为SystemProcessesAndThreadsInformation,即我们所要获取的信息
 PSYSTEM_PROCESS_INFORMATION pSpiNext = NULL;  //同上
 ULONG uSize;       //pSi的大小,以BYTE为单位
 ULONG pNeededSize = 0;       //系统返回所需长度,因在WIN2000下不会返回,故不只用,设置为0
 BOOL bOver = FALSE;          //标识是否列举完成
 
 //设定pSi大小uSize初始为32K,并为pSi分配uSize的内存,根据返回值逐步累加uSize,步长为32K
 for (uSize = 0x8000; ((pSi = ExAllocatePoolWithTag(NonPagedPool, uSize, 'tag1')) != NULL); uSize += 0x8000)
 {
  //检索指定的系统信息,这里是有关进程的信息
  status = NtQuerySystemInformation(SystemProcessesAndThreadsInformation,
            pSi,
            uSize,
            &pNeededSize);
  if (STATUS_SUCCESS == status)  //NtQuerySystemInformation返回成功
  {
   pSpiNext = (PSYSTEM_PROCESS_INFORMATION)pSi;  //使用pSpiNext操作,pSi要留到后面释放所分配的内存
   while (TRUE)
   {
    if (pSpiNext->ProcessId == 0)
    {
     pMyData = (PMYPROCESSDATA)ExAllocatePoolWithTag(PagedPool, sizeof(PMYPROCESSDATA), 'tag2');
     RtlInitUnicodeString(&pMyData->usImageName, L"System Idle Process");
     InsertTailList(&ProcessListHead, (PLIST_ENTRY)&pMyData->myListEntry);//插入链表
     
     //DbgPrint("[Aliwy] %d - %wZ(%.8X)\n", pSpiNext->ProcessId, &pMyData->usImageName, pMyData); //进程标识符为0的是System Idle Process,需手动标明
    }
    else
    {
     pMyData = (PMYPROCESSDATA)ExAllocatePoolWithTag(PagedPool, sizeof(PMYPROCESSDATA), 'tag2');
     pMyData->usImageName = pSpiNext->ImageName;
     InsertTailList(&ProcessListHead, (PLIST_ENTRY)&pMyData->myListEntry);//插入链表
     
     //DbgPrint("[Aliwy] %d - %wZ(%.8X)\n", pSpiNext->ProcessId, &pMyData->usImageName, pMyData); //打印出进程标识符和进程名称
    }
    if (pSpiNext->NextEntryOffset == 0) //如果NextEntryOffset为0即表示进程已列举完
    {
     pMyData = (PMYPROCESSDATA)ExAllocatePoolWithTag(PagedPool, sizeof(PMYPROCESSDATA), 'tag2');
     RtlInitUnicodeString(&pMyData->usImageName, L"EnumProcess Over");
     InsertTailList(&ProcessListHead, (PLIST_ENTRY)&pMyData->myListEntry);//插入链表
     
     //DbgPrint("[Aliwy] %wZ, Count is: %d(%.8X)\n", &pMyData->usImageName, iCount, pMyData);
     
     bOver = TRUE; //标识进程列举已完成
     break;  //跳出列举循环(while循环)
    }    
    pSpiNext = (PSYSTEM_PROCESS_INFORMATION)((ULONG)pSpiNext + pSpiNext->NextEntryOffset); //指向下一个进程的信息
    iCount++;   //计数累加
   }
   ExFreePool(pSi);  //释放为sPi分配的内存
   if (bOver)  //进程列举完成
   {
    if (!IsListEmpty(&ProcessListHead))
    {
     while (!IsListEmpty(&ProcessListHead))
     {
      pMyData = CONTAINING_RECORD(RemoveHeadList(&ProcessListHead),
                   MYPROCESSDATA,
                   myListEntry);
      DbgPrint("[Aliwy] %wZ(0x%.8X)\n", &pMyData->usImageName, pMyData);
      [COLOR=red]ExFreePool(pMyData); //这里就蓝[/COLOR]
     }
    }
    break;  //跳出内存分配循环(for循环)
   }
  }
 }
 return STATUS_SUCCESS;
}
//------------------------------

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (16)
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你的pMyData只allocate了一次 也只能能free一次
2009-3-9 12:51
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
你要是分析了dump,就会直接找到原因了。玩驱动,分析dump是必需要会的
2009-3-9 12:57
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
pMyData = (PMYPROCESSDATA)ExAllocatePoolWithTag(PagedPool, sizeof(PMYPROCESSDATA), 'tag2');

sizeof(指针类型) == 4

叹息一下,现在玩驱动的...
2009-3-9 14:13
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
蓝屏原因pool被溢出了,覆盖了pool的结构,但是因为引出构造的不够巧妙最后还是蓝了~
2009-3-9 14:14
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
sizeof(PMYPROCESSDATA) -> sizeof(MYPROCESSDATA)
是这里吧,V大?
我晕啊,真该跳起来给自己一转身后摆腿。
2009-3-9 14:49
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
pMyData的指针已经下移了~~你得用个变量保存原始申请的内存地址
2009-3-9 15:17
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
我太不细心了…
2009-3-9 15:34
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
pMyData = CONTAINING_RECORD(RemoveHeadList(&ProcessListHead),
                            MYPROCESSDATA,
                            myListEntry);
这里就是得到当初申请时的内存指针,在这里直接释放就可以了啊。
2009-3-9 16:03
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
晕看错了
不好意思没认真看
你用NonPagedPool看看
2009-3-9 19:17
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
搞定了,老V一语道破。
初学,粗心,太要不得了。

楼上的朋友就是霏凡的chenhui530兄弟吧?
2009-3-9 23:12
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
我已经很久没去那了,我长期在CSDN,最近才来看雪转转
2009-3-10 09:48
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
修改后,在XP和2003下都正常,
但在2000下,CONTAINING_RECORD来取数据,又蓝屏。
2009-3-10 11:23
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
这个要看dump了~~如果你是弄chk w2k编译后在2000蓝屏,那么试试chk wxp编译~~
如果不是,那么要softice一下,看看蓝的是什么XX
2009-3-14 09:20
0
雪    币: 26
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
好的。
最初虚拟机的Win2000上也安装了卡巴,后来卸载了卡巴,就不蓝了。
我就纳闷了,这么简单的几句代码也蓝屏。
在驱动中使用全局变量是不是有什么要求?
2009-3-14 09:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
与杀毒软件有关?
2009-3-14 10:48
0
雪    币: 12
活跃值: (686)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习了
2022-7-10 23:17
0
游客
登录 | 注册 方可回帖
返回
//