VirtualQueryEx возвращает ноль без GetLastError()
Для одного из моих проектов мне нужно было перечислить все страницы процесса.
Итак, вот код, который я сделал:
private List<MEMORY_BASIC_INFORMATION> GetMemoryInfo()
{
var output = new List<MEMORY_BASIC_INFORMATION>();
var addy = new IntPtr();
while (true)
{
MEMORY_BASIC_INFORMATION memInfo = new MEMORY_BASIC_INFORMATION();
int memDump = VirtualQueryEx(handle, addy, out memInfo, Marshal.SizeOf(memInfo));
if (memDump == 0)
{
var err = Marshal.GetLastWin32Error();
throw new Exception("GetMemoryInfo failed : GetLastError() : " + new Win32Exception(err).Message);
}
if ((memInfo.State & 0x1000) != 0 && (memInfo.Protect & 0x100) == 0)
output.Add(memInfo);
addy = new IntPtr(memInfo.BaseAddress.ToInt32() + memInfo.RegionSize);
}
return output;
}
Проблема на выполнении, VirtualQueryEx возвращает 0. Когда я вызываю GetLastError, он также возвращает ноль. Где проблема в моем коде?
Редактировать: вот объявление MEMORY_BASIC_INFORMATION и VirtualQueryEx():
[StructLayout(LayoutKind.Sequential)]
protected struct MEMORY_BASIC_INFORMATION
{
public IntPtr BaseAddress;
public IntPtr AllocationBase;
public uint AllocationProtect;
public uint RegionSize;
public uint State;
public uint Protect;
public uint Type;
}
[DllImport("kernel32.dll")]
protected static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, int dwLength);