Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-63953
Studentas
2003-03-03 12:35
2003.03.20
Autoincrenement ?


1-64070
Array
2003-03-08 23:33
2003.03.20
Проблема с динамическим массивом


3-63989
IlyaGer
2003-02-28 10:47
2003.03.20
Как заставить правил. работать скроллинг в DBGrid + ADOQuery.


1-64104
San
2003-03-05 16:50
2003.03.20
Variant && Srtring


14-64321
Донской
2003-03-04 09:48
2003.03.20
Interbase 6





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский