Блог по программированию в среде Delphi

Поиск по блогу

Есть идея по созданию интересной программы?

Опиши тут и я по возможности постараюсь это реализовать специально для тебя! Без $ ))

суббота, 16 октября 2010 г.

Чтение карты памяти

Сессия скоро))
Если мы можем, получит список запущенных процессов, то представляется интересной возможность прочитать содержимое адресного пространства процесса с целью определить, какие регионы зарезервированы в адресном пространстве процесса, каков объем зарезервированных регионов и свободного адресного пространства, как установлен режим доступа к тем или иным регионам и т.д..  Одним словом, надо читать карту адресного пространства процесса.
При создании процесса можно управлять доступом к его адресному пространству, т.е. разрешать или не разрешать чтение адресного пространства процесса.
Естественно, что прочитать вы можете только участок адресного пространства, отведенный в собственность прикладному процессу (т.е. 2 ГБ пользовательского адресного пространства процесса)
При помощи функции GetSystemInfo() получаем границы данного региона, т.е. минимальный и максимальный адреса, доступные приложению. Теперь наша задача - прочитать содержимое адресного пространства, ограниченного данными адресами.
Читаем при помощи функции VirtualQuery()
Чтение карты адресного пространства производим, организуя цикл от минимального доступного адреса до максимального доступного.
Передаем в VirtualQuery() минимальный из доступных адресов при первой итерации цикла. Функция возвратит нам объем региона, зарезервированного по данному адресу, его объем, установленный режим защиты и т.д.
Адрес следующего региона получаем так:
<Текущий адрес региона>+<Объем текущего региона>
Далее продолжаем итерации пока не доберемся до максимального из доступных адресов.

Вроде вот так 
unit unitMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmMain = class(TForm)
    btnInfo: TButton;
    Memo1: TMemo;
    Button1: TButton;
    procedure btnInfoClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnInfoClick(Sender: TObject);
var
  mySystemInfo:TSystemInfo;
  myMinP,myMaxP,mTemp:Pointer;
  myMemBasInfo:TMemoryBasicInformation;
  i:DWORD;
  iFree,iCommit,iReserve,iPageReadWrite,iReadOnly, iNoAccess,iWriteCopy,iExecute,iExecuteRead,iExecuteReadWrite:Integer;
  iExecuteWriteCopy,iGuard,iNoCache:integer;
begin
  Memo1.Lines.Clear;
  GetSystemInfo(mySystemInfo);
  myMinP:=mySystemInfo.lpMinimumApplicationAddress;
  myMaxP:=mySystemInfo.lpMaximumApplicationAddress;
  Memo1.Lines.Add('Начальный адрес: '+IntToStr(DWORD(myMinP)));
  Memo1.Lines.Add('Конечный адрес: '+IntToStr(DWORD(myMaxP)));
  i:=DWORD(myMinP);
  while i<=(DWORD(myMaxP)) do
  begin
    VirtualQuery(Pointer(i),myMemBasInfo,SizeOf(myMemBasInfo));
    case myMemBasInfo.State of
    MEM_FREE:
      inc(iFree,myMemBasInfo.RegionSize);
    MEM_RESERVE:
      inc(iReserve,myMemBasInfo.RegionSize);
    MEM_COMMIT:
      case myMemBasInfo.Type_9 of
      MEM_IMAGE:
        inc(iCommit,myMemBasInfo.RegionSize);
      MEM_MAPPED:
        inc(iCommit,myMemBasInfo.RegionSize);
      MEM_PRIVATE:
        inc(iCommit,myMemBasInfo.RegionSize);
      end;
    end;
    case myMemBasInfo.AllocationProtect of
      PAGE_NOACCESS: inc(iNoAccess,myMemBasInfo.RegionSize);
      PAGE_READONLY: inc(iReadOnly,myMemBasInfo.RegionSize);
      PAGE_READWRITE: inc(iPageReadWrite,myMemBasInfo.RegionSize);
      PAGE_WRITECOPY: inc(iWriteCopy,myMemBasInfo.RegionSize);
      PAGE_EXECUTE: inc(iExecute,myMemBasInfo.RegionSize);
      PAGE_EXECUTE_READ: inc(iExecuteRead,myMemBasInfo.RegionSize);
      PAGE_EXECUTE_READWRITE: inc(iExecuteReadWrite,myMemBasInfo.RegionSize);
      PAGE_EXECUTE_WRITECOPY: inc(iExecuteWriteCopy,myMemBasInfo.RegionSize);
      PAGE_GUARD: inc(iGuard,myMemBasInfo.RegionSize);
      PAGE_NOCACHE: inc(iNoCache,myMemBasInfo.RegionSize);
    end;
    inc(i,myMemBasInfo.RegionSize);
  end;

  Memo1.Lines.Add('');
  Memo1.Lines.Add('Закреплено: '+IntToStr(iCommit));
  Memo1.Lines.Add('Свободно: '+IntToStr(iFree));
  Memo1.Lines.Add('Зарезервированно: '+IntToStr(iReserve));
  Memo1.Lines.Add('');
  Memo1.Lines.Add('PAGE_READONLY: '+IntToStr(iReadOnly));
  Memo1.Lines.Add('PAGE_READWRITE: '+IntToStr(iPageReadWrite));
  Memo1.Lines.Add('PAGE_NOACCESS: '+IntToStr(iNoAccess));
  Memo1.Lines.Add('PAGE_WRITECOPY: '+IntToStr(iWriteCopy));
  Memo1.Lines.Add('PAGE_EXECUTE: '+IntToStr(iExecute));
  Memo1.Lines.Add('PAGE_EXECUTE_READ: '+IntToStr(iExecuteRead));
  Memo1.Lines.Add('PAGE_EXECUTE_READWRITE: '+IntToStr(iExecuteReadWrite));
  Memo1.Lines.Add('PAGE_EXECUTE_WRITECOPY: '+IntToStr(iExecuteWriteCopy));
  Memo1.Lines.Add('PAGE_GUARD: '+IntToStr(iGuard));
  Memo1.Lines.Add('PAGE_NOCACHE: '+IntToStr(iNoCache));
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  GetCurrentProcessId;
end;

end.
 
Скачать исходник можно отсюда Download

Комментариев нет:

Отправить комментарий