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

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

ReadProcessMemory(???,???,???,???,???); Вроде всё компилится... [Win95/98, Win2k]


3223(jab) ©   (2003-01-25 01:37:00) 

procedure TForm1.Button4Click(Sender: TObject);
var
ProcessHandle:THandle;
ProcessID,Address:Integer;
TheWindow:HWND;
buf:byte;
Size:Word;
im:DWORD;
begin
TheWindow:=FindWindow(nil, PChar(Edit1.Text));
GetWindowThreadProcessID(TheWindow,@ProcessID);
ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
Address:=StrToInt("$"+Edit2.Text);
buf:=$00;
Size:=sizeof(buf);
im:=0;
ReadProcessMemory(ProcessHandle,@Address,@buf,size,im);
Edit3.Text:=IntToHex(buf,2);
CloseHandle(ProcessHandle);
end;

Компилится нормально, но не работает.
В 98 винде вообще не работает, в 2000 выдаёт левые (непонятные) байты - одним словом не те что находятся по адресу!
Как это можно исправить?


Anatoly Podgoretsky   (2003-01-26 13:14:00) [1]

А что бы не приводить надо сразу выбрать тип Pointer


Юрий Зотов   (2003-01-26 12:44:00) [2]

> 3223(jab)(25.01.03 22:15)
> Что она значит в данном случае?

То же, что и во всех остальных - это операция взятия адреса.

Адрес, откуда нужно прочитать, Вы поместили в переменную Address. То есть, в ReadProcessMemory нужно передавать ЗНАЧЕНИЕ этой переменной. А Вы передаете @Address - то есть, не ее ЗНАЧЕНИЕ, а ее АДРЕС. В итоге Вы читаетеиз саму эту переменную.

Точнее, Вы читаете один байт этого четырехбайтового поля, а с учетом особенностей платформы (перестановка полуслов и байт) получается некая абракадабра.

Значит, @ убираем, а чтобы не ругался компилятор - приводим тип.


3223(jab)   (2003-01-25 22:15:00) [3]

2 Юрий Зотов
А почему не нужна @ ? Что она значит в данном случае?

2 Novgorodov
Спасибо за кусок кода, но видимо у меня проблема была с синтаксисом, а не с вызыванием АПИ функций... Функции вызывались на ура (проверено SoftIce"ом) а вот что они там записывали и читали х.з. В 98 у меня всегда возвращало 0, а в 2000 когда 1, а когда и ноль... Возможно проблема с тем, что я пытался записать по случайно выбронному адресу (распределение адресного пространства в 98 и 2000 виндах) пытался писать в зарезервированные участки. Мнеб такой рабочий кусочик на Delphi


Novgorodov   (2003-01-25 17:28:00) [4]

вот рабочие функции ... остались от недавних экспериментов... правда на С

int getProcessId(const char* window_caption)
{
HWND hWnd = ::FindWindow( NULL, window_caption );

unsigned long dwProcessIdmn;

if (hWnd == NULL)
return -1;

GetWindowThreadProcessId( hWnd, &dwProcessIdmn );

return dwProcessIdmn;
}

unsigned long getMemoryDump(int process_id, void* pmem, void* buf, int buflen)
{
HANDLE hProcess;
hProcess = OpenProcess (PROCESS_VM_READ,FALSE, process_id);

if (hProcess == NULL)
return 0;

unsigned long dwNumbytesXferred = 0;

BOOL rv = ReadProcessMemory (hProcess,pmem, buf, buflen, &dwNumbytesXferred);
CloseHandle(hProcess);
return dwNumbytesXferred;
}

unsigned long setMemoryDump(int process_id, void* pmem, void* buf, int buflen)
{
HANDLE hProcess;
hProcess = OpenProcess (PROCESS_ALL_ACCESS,FALSE, process_id);

if (hProcess == NULL)
return 0;

unsigned long dwNumbytesXferred = 0;

BOOL rv = WriteProcessMemory (hProcess,pmem, buf, buflen, &dwNumbytesXferred);
CloseHandle(hProcess);
return dwNumbytesXferred;
}


Юрий Зотов   (2003-01-25 11:51:00) [5]

Добавление - а нужно привести тип: Pointer(Address)


Юрий Зотов   (2003-01-25 11:49:00) [6]


ReadProcessMemory(ProcessHandle, Address, @buf, size, im);
здесь @ не нужна----------------^


Наверх

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