Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дамп памяти процесса


Страницы:   1 2

Form ©   (2004-07-22 10:03:00) 

Вопрос: Есть некоторый процесс (например стандартный "калькулятор"), необходимо сделать дамп памяти этого процесса! Под Вынь98 все работает, но под ХП и 2000 не работает, проблема с правами! Как мне взять своему приложению права, чтобы можно было читать память чужего процесса ("Калькулятора")???

Итак текст процедуры (вроде так):

function GetWMPath:string;
var
 memarr:array of char;       // динамический массив для памяти!
 hProc : THandle;
 MBI : MEMORY_BASIC_INFORMATION;
 counter,i,j  : cardinal;
 ln : Integer;
 MaxAddy,temp : Cardinal;
 dwSize, dwAddress: cardinal;
 hwnd, proc_id: dword;

 f: file;
begin
 enabledebug;        // вызов процедуры получения прав, смотри ниже!!!

 counter :=0;
 SetLength(memarr, 0);

 dwAddress := $400000;
 MaxAddy := $80000000;

 hwnd:=FindWindow (pchar('SciCalc'), nil);      // получаем хэндл по классу окна

 GetWindowThreadProcessId (hwnd,@proc_id);
 hProc := OpenProcess(PROCESS_QUERY_INFORMATION, False, Proc_ID);

 While (VirtualQueryEx(hProc, Pointer(dwAddress), MBI, SizeOf(MEMORY_BASIC_INFORMATION)) > 0) and (cardinal(MBI.BaseAddress) + MBI.RegionSize < MaxAddy) do
 begin
   If (MBI.Protect = PAGE_READWRITE) and (MBI.Type_9 = MEM_PRIVATE) and ((MBI.State = MEM_COMMIT) or (MBI.State = MEM_RESERVE)) Then
   begin
     dwSize := MBI.RegionSize;
     dwAddress := cardinal(MBI.BaseAddress) + (MBI.RegionSize - dwSize);

     SetLength(memarr, counter + dwSize);
     ReadProcessMemory(hproc,
                       pointer(dwAddress),
                       @memarr[counter],
                       dwSize,
                       temp);
     counter := counter + dwSize;
   end;
   Inc(dwAddress, MBI.RegionSize);
 end;
 CloseHandle(hProc);

 assignfile(f, 'test.txt');                  // debug - сохранение дампа
 rewrite(f,1);                                // оставил на всякий случай!
 i:=0;
 repeat
   blockwrite(f, memarr[i], 50);
   i:=i+50;
 until i >= counter;
 closefile(f);

 Finalize(memarr);
 FreeMem(memarr);
end;

---

А вот так я пытаюсь взять себе нужные права(НЕ РАБОТАЕТ!!!):

procedure enabledebug;
var TokenHandle: THandle; dwNull: DWORD;
 TokenPrivilege, Tmp: TTokenPrivileges;
begin
 try
   OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle);
   LookupPrivilegeValue(nil, 'SeDebugPrivilege', TokenPrivilege.Privileges[0].Luid);

   with TokenPrivilege do begin
     PrivilegeCount := 1;
     Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   end;

   dwNull := 0;

   AdjustTokenPrivileges(TokenHandle, False,
     TokenPrivilege, SizeOf(TTokenPrivileges), Tmp, dwNull);

 except
   ShowMessage('debug error!');
 end;
end;


Digitman   (2004-07-22 10:29:00) [21]


> Form


>      SetLength(memarr, counter + dwSize);


тебе на кой ляд весь дамп в памяти хранить-то ? а если потребуется целый гигабайт ? или более ? виртуальное адресное пространство тек.процесса не резиновое ! да и еще перераспределяешь память при каждой итерации, ничтоже сумняшеся "ворочая" огромные блоки памяти туда-сюда.. нет бы сразу в файл писать !


Form_1   (2004-07-22 10:25:00) [22]

К сожалению писал это всё не я первая функция работает под виндоус 98(я проверил) а в 2000 винде действительно нехватает привилерий (1 мессадж скопирован с другого форума. там вразумительного ответа автору получить не удалось у меня сейчас таже проблема)


Digitman   (2004-07-22 10:22:00) [23]


> НЕ РАБОТАЕТ


тебя кто научил так вызывать функцииWinAPI ?
почему вызываешь их как процедуры ? почему не анализируешь результат их выполнения ?


>  except
>    ShowMessage('debug error!');
>  end;


с какого перепугу ты решил, что любое исключение следует интерпретировать как ошибка отладки ? где анализ класса исключения, если оно возникает ?

WinAPI-функции вообще не возбуждают никаких исключений ! они всегда возвращают результат !


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо