private bool QueryMemoryBasicInformation(IntPtr handle, IntPtr current_address, ref MemoryBasicInformation memoryBasicInformation) { if (isX64()) { MEMORY_BASIC_INFORMATION_X64 mem_basic_info = new MEMORY_BASIC_INFORMATION_X64(); int mem_info_size = Marshal.SizeOf <MEMORY_BASIC_INFORMATION_X64>(); int size = VirtualQueryEx_X64(handle, current_address, out mem_basic_info, (uint)mem_info_size); if (size != mem_info_size) { Logger.Error($"(X64)Error Code:0x{Marshal.GetLastWin32Error():X8}"); return(false); } memoryBasicInformation.RegionSize = mem_basic_info.RegionSize; memoryBasicInformation.BaseAddress = mem_basic_info.BaseAddress; memoryBasicInformation.AllocationProtect = mem_basic_info.AllocationProtect; memoryBasicInformation.AllocationBase = mem_basic_info.AllocationBase; memoryBasicInformation.Type = mem_basic_info.Type; memoryBasicInformation.State = mem_basic_info.State; memoryBasicInformation.Protect = mem_basic_info.Protect; return(true); } else { MEMORY_BASIC_INFORMATION_X86 mem_basic_info = new MEMORY_BASIC_INFORMATION_X86(); int mem_info_size = Marshal.SizeOf <MEMORY_BASIC_INFORMATION_X86>(); int size = VirtualQueryEx_X86(handle, current_address, out mem_basic_info, (uint)mem_info_size); if (size != mem_info_size) { Logger.Error($"(X86)Error Code:0x{Marshal.GetLastWin32Error():X8}"); return(false); } memoryBasicInformation.RegionSize = mem_basic_info.RegionSize; memoryBasicInformation.BaseAddress = mem_basic_info.BaseAddress; memoryBasicInformation.AllocationProtect = mem_basic_info.AllocationProtect; memoryBasicInformation.AllocationBase = mem_basic_info.AllocationBase; memoryBasicInformation.Type = mem_basic_info.Type; memoryBasicInformation.State = mem_basic_info.State; memoryBasicInformation.Protect = mem_basic_info.Protect; return(true); } }
private static extern int VirtualQueryEx_X86(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION_X86 lpBuffer, uint dwLength);