找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 2407|回复: 4

MDL R0 -> R3 何时释放?

[复制链接]

3

主题

15

回帖

0

精华

初来乍到

积分
31
发表于 2021-4-13 21:46:47 | 显示全部楼层 |阅读模式
R0
IRP中
  1. case IOCTL_IO_MDL_FUNCTION:
  2.                 {
  3.                         //VirtualAddress = CreateMdl(,&poolAddress);
  4.                         PVOID ProcessList = ExAllocatePoolWithTag(NonPagedPool, sizeof(PROCESS_LIST) * 100, NULL);
  5.                         //初始化内存
  6.                         RtlZeroMemory(ProcessList, sizeof(PROCESS_LIST) * 100);
  7.                         //进程列表指针申请mdl映射
  8.                         PMDL mdl = IoAllocateMdl(ProcessList, sizeof(PROCESS_LIST) * 100, FALSE, FALSE, NULL);
  9.                         if (mdl == NULL)
  10.                         {
  11.                                 return NULL;
  12.                         }
  13.                         ASSERT(mdl);

  14.                         // 为内存描述符列表建立虚拟内存分页
  15.                         MmBuildMdlForNonPagedPool(mdl);
  16.                         __try
  17.                         {
  18.                                 VirtualAddress = MmMapLockedPagesSpecifyCache(mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
  19.                         }
  20.                         __except (ExceptionNestedException)
  21.                         {
  22.                                 return NULL;
  23.                         }
  24.                         return VirtualAddress;
  25.                         //获取进程列表
  26.                         getProcessList(VirtualAddress);
  27.                         //将mdl地址返回到R3中  r3接收 *(PVOID*)buffer
  28.                         *((PVOID *)(pIrp->AssociatedIrp.SystemBuffer)) = VirtualAddress;
  29.                         writelength = sizeof(VirtualAddress);
  30.                         break;
  31.                 }
  32.                 case IOCTL_IO_MDL_RECOVERY:
  33.                 {
  34.                         recv = pIrp->AssociatedIrp.SystemBuffer;

  35.                         PMDL mdl = *(ULONG64*)recv;
  36.                         IoFreeMdl(mdl);
  37.                         DbgPrint("%x", recv);
  38.                         WCHAR post[] = L"1";
  39.                         RtlCopyMemory(recv, post, sizeof(post));
  40.                         writelength = sizeof(post);
  41.                         break;
  42.                 }
复制代码


R3  发送消息   接收完后 再把mdl传回去释放,  但是释放的时候 到IRP return STATUS_SUCCESS 的时候就蓝屏了  0x000000c5
这样写正确吗?

77

主题

192

回帖

9

精华

贵宾会员

积分
15602
发表于 2021-4-14 01:15:18 | 显示全部楼层
粗略的看了一眼,我觉得问题出在你忘记解除映射了

3

主题

15

回帖

0

精华

初来乍到

积分
31
 楼主| 发表于 2021-4-14 09:49:34 | 显示全部楼层
tangptr@126.com 发表于 2021-4-14 01:15
粗略的看了一眼,我觉得问题出在你忘记解除映射了

额  是的 发现了。  请教一下 这步骤是对的吗?  还有更简洁的方法吗?

77

主题

192

回帖

9

精华

贵宾会员

积分
15602
发表于 2021-4-15 00:50:54 | 显示全部楼层
adobase 发表于 2021-4-14 09:49
额  是的 发现了。  请教一下 这步骤是对的吗?  还有更简洁的方法吗?

我看了一圈你的代码,感觉你这个数组既然是定长的,那不如让调用者分配内存作为输出缓冲区,完全不必在内核里申请一段内存还用MDL映射到进程里。然后这ProcessList你也没释放掉。
此外进程列表这玩意,100个大概不够,比方说我的机器里通常就有200多个进程。

3

主题

15

回帖

0

精华

初来乍到

积分
31
 楼主| 发表于 2021-4-22 21:04:33 | 显示全部楼层
tangptr@126.com 发表于 2021-4-15 00:50
我看了一圈你的代码,感觉你这个数组既然是定长的,那不如让调用者分配内存作为输出缓冲区,完全不必在内 ...

嗯   明白了  继续改进。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表