MDL R0 -> R3 何时释放?
R0IRP中
case IOCTL_IO_MDL_FUNCTION:
{
//VirtualAddress = CreateMdl(,&poolAddress);
PVOID ProcessList = ExAllocatePoolWithTag(NonPagedPool, sizeof(PROCESS_LIST) * 100, NULL);
//初始化内存
RtlZeroMemory(ProcessList, sizeof(PROCESS_LIST) * 100);
//进程列表指针申请mdl映射
PMDL mdl = IoAllocateMdl(ProcessList, sizeof(PROCESS_LIST) * 100, FALSE, FALSE, NULL);
if (mdl == NULL)
{
return NULL;
}
ASSERT(mdl);
// 为内存描述符列表建立虚拟内存分页
MmBuildMdlForNonPagedPool(mdl);
__try
{
VirtualAddress = MmMapLockedPagesSpecifyCache(mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
}
__except (ExceptionNestedException)
{
return NULL;
}
return VirtualAddress;
//获取进程列表
getProcessList(VirtualAddress);
//将mdl地址返回到R3中r3接收 *(PVOID*)buffer
*((PVOID *)(pIrp->AssociatedIrp.SystemBuffer)) = VirtualAddress;
writelength = sizeof(VirtualAddress);
break;
}
case IOCTL_IO_MDL_RECOVERY:
{
recv = pIrp->AssociatedIrp.SystemBuffer;
PMDL mdl = *(ULONG64*)recv;
IoFreeMdl(mdl);
DbgPrint("%x", recv);
WCHAR post[] = L"1";
RtlCopyMemory(recv, post, sizeof(post));
writelength = sizeof(post);
break;
}
R3发送消息 接收完后 再把mdl传回去释放,但是释放的时候 到IRP return STATUS_SUCCESS 的时候就蓝屏了0x000000c5
这样写正确吗? 粗略的看了一眼,我觉得问题出在你忘记解除映射了 tangptr@126.com 发表于 2021-4-14 01:15
粗略的看了一眼,我觉得问题出在你忘记解除映射了
额是的 发现了。请教一下 这步骤是对的吗?还有更简洁的方法吗? adobase 发表于 2021-4-14 09:49
额是的 发现了。请教一下 这步骤是对的吗?还有更简洁的方法吗?
我看了一圈你的代码,感觉你这个数组既然是定长的,那不如让调用者分配内存作为输出缓冲区,完全不必在内核里申请一段内存还用MDL映射到进程里。然后这ProcessList你也没释放掉。
此外进程列表这玩意,100个大概不够,比方说我的机器里通常就有200多个进程。 tangptr@126.com 发表于 2021-4-15 00:50
我看了一圈你的代码,感觉你这个数组既然是定长的,那不如让调用者分配内存作为输出缓冲区,完全不必在内 ...
嗯 明白了继续改进。
页:
[1]