adobase 发表于 2021-4-13 21:46:47

MDL R0 -> R3 何时释放?

R0
IRP中
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:18

粗略的看了一眼,我觉得问题出在你忘记解除映射了

adobase 发表于 2021-4-14 09:49:34

tangptr@126.com 发表于 2021-4-14 01:15
粗略的看了一眼,我觉得问题出在你忘记解除映射了

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

tangptr@126.com 发表于 2021-4-15 00:50:54

adobase 发表于 2021-4-14 09:49
额是的 发现了。请教一下 这步骤是对的吗?还有更简洁的方法吗?

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

adobase 发表于 2021-4-22 21:04:33

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

嗯   明白了继续改进。
页: [1]
查看完整版本: MDL R0 -> R3 何时释放?