Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.20;
Скачать: CL | DM;

Вниз

ReadProcessMemory(???,???,???,???,???); Вроде всё компилится...   Найти похожие ветки 

 
3223(jab)   (2003-01-25 01:37) [0]

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 выдаёт левые (непонятные) байты - одним словом не те что находятся по адресу!
Как это можно исправить?


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


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



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

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


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

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

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;
}


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

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

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


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

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

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

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

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

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


 
Anatoly Podgoretsky ©   (2003-01-26 13:14) [6]

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



Страницы: 1 вся ветка

Текущий архив: 2003.03.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
1-64096
Gimer
2003-03-10 16:03
2003.03.20
Буржуйский clipboard (буфер)


14-64365
Novic
2003-03-05 10:06
2003.03.20
Сохранение проекта


4-64428
Zhenka
2003-01-26 12:05
2003.03.20
Помогите С Функ ShAddToNotifyIcon (по моему пишется так)


3-63978
MVVD
2003-02-28 09:09
2003.03.20
Table is full


7-64405
Oleg--
2003-01-22 14:24
2003.03.20
IOCTL_DISK_GET_DRIVE_GEOMETRY - ошибка