Program i obszar pamieci Ram

Odpowiedz Nowy wątek
Pytanie
2010-07-28 18:31
Pytanie
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

Pozostało 580 znaków

2010-07-28 21:57

Rejestracja: 16 lat temu

Ostatnio: 1 minuta temu

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.

Pozostało 580 znaków

Pytanie
2010-07-29 10:21
Pytanie
0

witam znalazlem w sieci cosik takiego :

http://www.programowanie.cal.[...]/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

Pozostało 580 znaków

msm
2010-07-29 11:10
msm
Administrator

Rejestracja: 10 lat temu

Ostatnio: 1 tydzień temu

0

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ć.

Pozostało 580 znaków

Pytanie
2010-07-29 12:27
Pytanie
0

Wysłałem zapytanie na emial ;)

pzdr Andrzej

Pozostało 580 znaków

2010-07-29 15:41

Rejestracja: 10 lat temu

Ostatnio: 8 lat temu

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


--
Pozdrawiam
Marcin

Pozostało 580 znaków

msm
2010-07-29 16:08
msm
Administrator

Rejestracja: 10 lat temu

Ostatnio: 1 tydzień temu

0

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/[...]ce-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.

Pozostało 580 znaków

Pytanie
2010-07-30 12:05
Pytanie
0

dzieki wielkie :)

ruszylo z mala przerobka :

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

pzdr Andrzej

Pozostało 580 znaków

msm
2010-07-30 12:31
msm
Administrator

Rejestracja: 10 lat temu

Ostatnio: 1 tydzień temu

0

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 :)

Pozostało 580 znaków

2010-07-30 13:28

Rejestracja: 10 lat temu

Ostatnio: 8 lat temu

0

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

--
Pozdrawiam
Marcin


--
Pozdrawiam
Marcin

Pozostało 580 znaków

Odpowiedz

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