Program i obszar pamieci Ram

0

witam

mam takie male pytanko :)...
otoz uruchamiam jakas aplikacje...... i rezerwuje sobie ona jakas czesc pamieci ram....
domyslam sie ze jest to od adresu XXXXXXXX do adresu YYYYYYY ... :)

i tak dla kazdej aplikacji .....
czy jest mozliwosc sprawdzenia np po Pid jaki obszar pamieci wykorzystuje dana aplikacja ??
od jakiego do jakiego adresu ???

z gory dziekuje za pomoc

pzdr Andrzej

0

Wiedz, że każdy program otrzymuje swoją własną przestrzeń adresową, i taki sam liczbowo adres np. 0xDEADBEEF w dwóch osobnych procesach może wskazywać na zupełnie inną komórkę w pamięci — adresy nie są „przenaszalne” (chyba że się je takimi uczyni) pomiędzy procesami.

0

witam znalazlem w sieci cosik takiego :

http://www.programowanie.cal.pl/forum/viewtopic.php?f=2&t=1011

SYSTEM_INFO    sys_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)
{
    const void* p = sys_info.lpMinimumApplicationAddress;
    MEMORY_BASIC_INFORMATION mem_info;

    while(VirtualQueryEx(hProcess,p,&mem_info,sizeof(MEMORY_BASIC_INFORMATION)) == sizeof(MEMORY_BASIC_INFORMATION))
    {
        /* tylko blok, który jest zmapowany na fizyczną pamięć lub plik */
        if(mem_info.State == MEM_COMMIT)
        {
                cout << p << " size = " << mem_info.RegionSize << '\n';
        }

        p = (char*)mem_info.BaseAddress + mem_info.RegionSize;
        if(p >= sys_info.lpMaximumApplicationAddress)break;
    }

    CloseHandle(hProcess);
}
 

czy bylby ktos mily i przerobil to pod C# :)

dziekuje i pozdrawiam Andrzej

1

Zabawa w takie rzeczy pod C# to nie jest najlepszy pomysł...

Co do przerobienia:
Możesz to zrobić samodzielnie:

Ew. możesz mi zapłacić.

0

Wysłałem zapytanie na emial ;)

pzdr Andrzej

0

A klasa System.Diagnostics.Process nie umożliwia odczytania takich informacji? O ile pamiętam, można w ten sposób uzyskać większość istotnych danych o procesach.

--
Pozdrawiam
Marcin

1

Ok, wróciłem.

Otóż do autora -

Znalazłem taki obrazek który tłumaczy ~~ o co chodzi:
user image

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.

0

dzieki wielkie :)

ruszylo z mala przerobka :

[DllImport("kernel32.dll")]
        private static extern void GetSystemInfo(ref
            SYSTEM_INFO lpSystemInfo);

pzdr Andrzej

1

user image
Mam nauczkę na przyszłość - nie mieszać natywnych wskaźników do C# kiedy nie ma najmniejszej do tego potrzeby...

Cieszę się w każdym razie że działa :)

0

Warto rzucić okiem na ten projekt (kod w C#): http://vmexplorer.codeplex.com/

--
Pozdrawiam
Marcin

1 użytkowników online, w tym zalogowanych: 0, gości: 1