Ok, wróciłem.
Otóż do autora -
Znalazłem taki obrazek który tłumaczy ~~ o co chodzi:
edit: jednak nie do końca tłumaczy: w takim razie zostaje definicja - http://students.mimuw.edu.pl/SR/prace-mgr/blaszczyk/node104.html
VirtualQueryEx który jest używany w twoim kodzie zwraca rozpiętość pamięci wirtualnej która z pamięcią RAM nie ma wiele wspólnego.
Nie wiem czy jest jakiś sensowny sposób (bez uzyskiwania uprawnień jądra/ring0 czy jak to się fachowo nazywa) żeby pobrać zawartość pamięci RAM.
Co do klasy Process - MSDN informuje:
Public property NonpagedSystemMemorySize Obsolete. Gets the nonpaged system memory size allocated to this process.
Public property NonpagedSystemMemorySize64 Gets the amount of nonpaged system memory allocated for the associated process.
Public property PagedMemorySize Obsolete. Gets the paged memory size.
Public property PagedMemorySize64 Gets the amount of paged memory allocated for the associated process.
Public property PagedSystemMemorySize Obsolete. Gets the paged system memory size.
Public property PagedSystemMemorySize64 Gets the amount of pageable system memory allocated for the associated process.
Public property PeakPagedMemorySize Obsolete. Gets the peak paged memory size.
Public property PeakPagedMemorySize64 Gets the maximum amount of memory in the virtual memory paging file used by the associated process.
Public property PeakVirtualMemorySize Obsolete. Gets the peak virtual memory size.
Public property PeakVirtualMemorySize64 Gets the maximum amount of virtual memory used by the associated process.
Public property PrivateMemorySize Obsolete. Gets the private memory size.
Public property PrivateMemorySize64 Gets the amount of private memory allocated for the associated process.
Public property VirtualMemorySize Obsolete. Gets the size of the process's virtual memory.
Public property VirtualMemorySize64 Gets the amount of the virtual memory allocated for the associated process.
Nic co by zwracało zakresy pamięci wirtualnej.
No i jeszcze jedno... Nie wiem czemu nie przepisałeś tego sam, bo to jest naprawdę banalne i nie wymaga nawet znajomości któregokolwiek z tych języków.
Mógłbym w sumie rzeczywiście za to zażądać pieniędzy, tylko że... funkcja u mnie nie działa, a powinna (0x18: ERROR_BAD_LENGTH). Nie chce mi się jej poprawiać (naprawdę powinna działać - nawet jakiś skopiowany przykład z internetu korzystający z VirtualQueryEx zwraca ten sam błąd... Może np. chodzi o coś z referencjami itp.
Tak czy inaczej skoro się i tak nie wzbogacę to równie dobrze mogę tutaj wrzucić a ktoś może poprawi:
using DWORD=System.UInt32;
using WORD = System.UInt16;
using HANDLE=System.IntPtr;
using PVOID = System.UInt32;
using LPVOID=System.UInt32;
using LPCVOID=System.IntPtr;
using SIZE_T = System.UInt32;
using System.Runtime.InteropServices;
using System;
namespace ConsoleApplication1
{
struct SYSTEM_INFO
{
public DWORD dwOemId;
public DWORD dwPageSize;
public LPVOID lpMinimumApplicationAddress;
public LPVOID lpMaximumApplicationAddress;
public DWORD dwActiveProcessorMask;
public DWORD dwNumberOfProcessors;
public DWORD dwProcessorType;
public DWORD dwAllocationGranularity;
public WORD wProcessorLevel;
public WORD wProcessorRevision;
}
struct MEMORY_BASIC_INFORMATION
{
public PVOID BaseAddress;
public PVOID AllocationBase;
public DWORD AllocationProtect;
public SIZE_T RegionSize;
public DWORD State;
public DWORD Protect;
public DWORD Type;
}
unsafe class MemInfo
{
[DllImport("kernel32.dll")]
private static extern HANDLE OpenProcess(DWORD dwDesiredAccess,
bool bInheritHandle,
DWORD dwProcessId);
[DllImport("kernel32.dll")]
private static extern void GetSystemInfo(
SYSTEM_INFO* lpSystemInfo);
[DllImport("kernel32")]
private static extern SIZE_T VirtualQueryEx(
HANDLE hProcess,
uint lpAddress,
out MEMORY_BASIC_INFORMATION lpBuffer,
SIZE_T dwLength);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(
HANDLE hObject);
[DllImport("kernel32.dll")]
private static extern DWORD GetLastError();
private const DWORD PROCESS_VM_READ = 0x0010;
private const DWORD PROCESS_QUERY_INFORMATION = 0x0400;
private const DWORD MEM_COMMIT = 0x1000;
public void MemTest()
{
MEMORY_BASIC_INFORMATION m = new MEMORY_BASIC_INFORMATION();
uint result = VirtualQueryEx(System.Diagnostics.Process.GetCurrentProcess().Handle, 0, out m, (uint)Marshal.SizeOf(m));
Console.WriteLine("poziom błędu: {0}", GetLastError());
}
public void GetMemoryInfo(DWORD procID)
{
SYSTEM_INFO sys_info = new SYSTEM_INFO();
GetSystemInfo(&sys_info);
// DWORD procID; //<--- tu wiadomo, id procesu, który Cię interesuje
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, true, procID);
if (hProcess != IntPtr.Zero)
{
uint p = sys_info.lpMinimumApplicationAddress;
MEMORY_BASIC_INFORMATION mem_info = new MEMORY_BASIC_INFORMATION();
uint x = (uint)Marshal.SizeOf(mem_info);
uint i = VirtualQueryEx(hProcess, p, out mem_info, (uint)Marshal.SizeOf(mem_info));
uint u = GetLastError();
while (VirtualQueryEx(hProcess, p, out mem_info, (uint)Marshal.SizeOf(mem_info)) == Marshal.SizeOf(mem_info))
{
/* tylko blok, który jest zmapowany na fizyczną pamięć lub plik */
if (mem_info.State == MEM_COMMIT)
{
Console.WriteLine("{0} size = {1}", p, mem_info.RegionSize);
}
p = (uint)mem_info.BaseAddress + mem_info.RegionSize;
if ((uint)p >= (uint)sys_info.lpMaximumApplicationAddress) break;
}
CloseHandle(hProcess);
}
}
}
}
U mnie po VirtualQueryEx system zwraca błąd ERROR_BAD_LENGTH - możesz najwyżej sprawdzić u siebie.