Форум: "WinAPI";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c