C++ 枚举模块无法取消分配分配的空间和重复的模块名称

C++ 枚举模块无法取消分配分配的空间和重复的模块名称,c++,c,windows,winapi,C++,C,Windows,Winapi,我正在枚举进程中的所有DLL模块,但有两个问题: 1重复记录 2 NtFreeVirtualMemory不会释放其分配的全部空间。 在虚拟内存调用之前 在它之后。你可以看到它是如何离开所有这些区域的。 密码 布尔枚举_模 { 存储器基本信息mbi{}; const std::size\u t buffer\u size=512; void*base_地址=0; std::size\u t region\u size=缓冲区大小; NTSTATUS status=NtAllocateVirtual

我正在枚举进程中的所有DLL模块,但有两个问题:

1重复记录 2 NtFreeVirtualMemory不会释放其分配的全部空间。 在虚拟内存调用之前 在它之后。你可以看到它是如何离开所有这些区域的。 密码 布尔枚举_模 { 存储器基本信息mbi{}; const std::size\u t buffer\u size=512; void*base_地址=0; std::size\u t region\u size=缓冲区大小; NTSTATUS status=NtAllocateVirtualMemoryNtCurrentProcess、&base_地址、0、®ion_大小、MEM_提交、MEM_保留、PAGE_执行、READWRITE; 如果!NT_成功状态 返回false; const auto§ion\u name=重新解释castbase\u地址; 系统信息{}; GetSystemInfo&si; auto*min\u address=static\u castsi.lpMinimumApplicationAddress; auto*max\u address=static\u castsi.lpMaximumApplicationAddress; 而最小地址<最大地址 { status=NtQueryVirtualMemoryNtCurrentProcess、min_地址、MemoryBasicInformation和mbi、mbi大小、nullptr; 如果!NT_成功状态 打破 如果mbi.Type==MEM_IMAGE { 状态=NtQueryVirtualMemoryNtCurrentProcess、最小地址、MemoryMappedFileName信息、节名称、缓冲区大小、空PTR; 如果!NT_成功状态 打破 const auto&dll=section_name->SectionFileName.Buffer; printf%S\n,dll; } 最小地址+=mbi.RegionSize; } 区域大小=0; 状态=NtFreeVirtualMemoryNtCurrentProcess、基地址和区域大小、内存发布; 如果!NT_成功状态 返回false; 返回true; }
我正在枚举进程中的所有DLL模块

嗯,你不是。这就是EnumProcessModule所做的。您可以枚举内存区域

至于其余的页面;你没有取消他们


请注意,这些Nt函数是非常低级的,并且假设您确切知道自己在做什么。

好吧,这应该是一个AC,并且可能有隐藏的DLL,这使得Nt函数是必需的。我用MEM_DECOMMIT替换了MEM_RELEASE,但还是一样的。@不-不,如果要释放内存,必须在调用NtFreeVirtualMemory时使用MEM_RELEASE。但是为什么在这里使用这个api呢?为什么是512字节??实际上,您在执行过程中有很多错误。正确实施课程工作ok@RbMm,可能有更好的方法,我不知道,我用它来存储名称,例如。\Device\HarddiskVolume2\Windows\System32\wow64cpu。dll@nop-为什么是512码??为什么不是300或1049?为什么要使用NtalocateVirtualMemory而不是LocalLoc或new?正确的执行-@RbMm,谢谢!顺便问一下,MAXUSHORT是从哪个头文件获取的?编辑:Nvm,USHRT\u MAX似乎就是那个。如果mbi.Type==MEM\u IMAGE main条件错误。如果mbi.State==MEM_COMMIT&&mbi.Type==MEM_IMAGE&&mbi.AllocationBase==mbi.BaseAddress而不是min_address+=mbi.RegionSize,则必须为;也错了,尽管正常工作除外。更正确的使用min_address=PBYTEmbi.BaseAddress+mbi.RegionSize;还有很多其他的事情。代码不是最优的
\Device\HarddiskVolume4\AC\Debug\AC.exe
\Device\HarddiskVolume4\AC\Debug\AC.exe
\Device\HarddiskVolume4\AC\Debug\AC.exe
\Device\HarddiskVolume4\AC\Debug\AC.exe
\Device\HarddiskVolume4\AC\Debug\AC.exe
\Device\HarddiskVolume4\AC\Debug\AC.exe
\Device\HarddiskVolume4\AC\Debug\AC.exe
\Device\HarddiskVolume4\AC\Debug\AC.exe
\Device\HarddiskVolume2\Windows\SysWOW64\KernelBase.dll
\Device\HarddiskVolume2\Windows\SysWOW64\KernelBase.dll
\Device\HarddiskVolume2\Windows\SysWOW64\KernelBase.dll
\Device\HarddiskVolume2\Windows\SysWOW64\KernelBase.dll
\Device\HarddiskVolume2\Windows\SysWOW64\KernelBase.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\SysWOW64\kernel32.dll
\Device\HarddiskVolume2\Windows\System32\wow64cpu.dll
\Device\HarddiskVolume2\Windows\System32\wow64cpu.dll
\Device\HarddiskVolume2\Windows\System32\wow64cpu.dll
\Device\HarddiskVolume2\Windows\System32\wow64cpu.dll
\Device\HarddiskVolume2\Windows\System32\wow64cpu.dll
\Device\HarddiskVolume2\Windows\System32\wow64cpu.dll
\Device\HarddiskVolume2\Windows\System32\wow64cpu.dll
\Device\HarddiskVolume2\Windows\SysWOW64\ntdll.dll
\Device\HarddiskVolume2\Windows\SysWOW64\ntdll.dll
\Device\HarddiskVolume2\Windows\SysWOW64\ntdll.dll
\Device\HarddiskVolume2\Windows\SysWOW64\ntdll.dll