Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Работа с памятью своего процесса


Автор: lollollollol 1.7.2013, 11:32
Здравствуйте. Есть желание поработать с памятью своего процесса.
В приведённом ниже коде я хочу получить блок памяти в переменную array of byte, но получаю run time error

Код

var
  SysInfo:TSystemInfo;
  lpBuffer:TMemoryBasicInformation;
  dwLength:DWORD;
  readResult:boolean;
  Buf:array[0..99999] of byte;
begin
  GetSystemInfo(SysInfo);
  dwLength:=1;
  while (dwLength<>0) do begin
    dwLength:=VirtualQuery(SysInfo.lpMaximumApplicationAddress,lpBuffer,SizeOf(lpBuffer));
    SysInfo.lpMinimumApplicationAddress:=Pointer(longint(SysInfo.lpMinimumApplicationAddress)+lpBuffer.RegionSize);
    if (lpBuffer.State = MEM_COMMIT) and (lpBuffer.Protect = PAGE_READWRITE) then begin
      try
        ZeroMemory(@Buf, sizeof(Buf));
        move(lpBuffer.BaseAddress,Buf,lpBuffer.RegionSize); //Вот тут Run time error
      except
      end;
    end;
  end;
end;


Что я делаю не правильно?

Заранее благодарен

Автор: northener 1.7.2013, 12:47
Цитата(lollollollol @  1.7.2013,  11:32 Найти цитируемый пост)
ZeroMemory(@Buf, sizeof(Buf));

А зачем тут собака порылась?

Автор: lollollollol 1.7.2013, 14:30
Без собаки
[Error].dpr(47): Incompatible types: 'Array' and 'Pointer'

Buf это массив, а функции нужен указательна начало массива, по этому собака

Автор: Чучмек 23.7.2013, 09:35
lollollollol, с ходу,не вдаваясь в "код"
Цитата(lollollollol @  1.7.2013,  11:32 Найти цитируемый пост)
        move(lpBuffer.BaseAddress,Buf,lpBuffer.RegionSize); //Вот тут Run time error

1.RegionSize может быть больше 1МБ
2.move ждет переменную, а не указатель. lpBuffer.BaseAddress^ вместо lpBuffer.BaseAddress

Цитата(lollollollol @  1.7.2013,  11:32 Найти цитируемый пост)
    dwLength:=VirtualQuery(SysInfo.lpMaximumApplicationAddress,lpBuffer,SizeOf(lpBuffer));
    SysInfo.lpMinimumApplicationAddress:=Pointer(longint(SysInfo.lpMinimumApplicationAddress)+lpBuffer.RegionSize);

3. Почему запрашиваешь информацию о последнем доступном адресе?
4. И почему, тогда, после запроса корректируешь pMinimumApplicationAddress? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)