![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как запустить процедуру знаяя ее адрес? [Win95/98]
alex134 © (2002-12-20 22:19:00)p:=GetProcAddress(..,..);
Как теперь запустить процедуру, на которую указывает p ?
alex134 (2002-12-22 00:31:00) [1]Ветка плавно перешла в http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1040215113&n=5, думаю, проблема не в вызове функции а в самой подмене АПИ-функции.
Модератор! Удалите плз эту ветвь/
alex134 (2002-12-22 00:22:00) [2]Короче, сделал так:
function h_LoadLibraryA(lpLibFileName: PChar): HMODULE; stdcall; {Ansi}
var
f : function (lpLibFileName1: PChar): HMODULE; stdcall;
begin
@f:=OldAddr;
result:=f(lpLibFileName);
LogStr(lpLibFileName+" called faked! "+"result="+IntToStr(result)+" addr="+inttostr(longword(OldAddr)));
end;
ГДЕЕЕтут ошибка? Какого хрена "программа выполнила недопустимую операцию и будет закрыта"!!! Причем это сообщение возникает 4 раза, каждый раз я нажимаю "закрыть", а в итоге оно запускается и нормально работает. LogStr не при делах - пробовал, убирал ее. Где ???????? Нашла коса на камень :(
Bosh (2002-12-21 23:45:00) [3]насколько мне известно функции возращают свой результат в регистре eax. Пример это простая фунции
function summa(a,b:integer):integer;
begin
result (a+b);
end;
откопилировшись это будет выглядеть так
summa (a,b:inteher)
mov ebx,,[bp+смешение на параметр1]
add ebx,[bp+смешение на параметр2]
// результат в регистре eax;
ret
вроде так)
Anatoly Podgoretsky (2002-12-21 23:37:00) [4]Соглащение о вызовах описывает как передаются параметры и кто очищает стек, тема в хелпе calling conventions
Процедурные типы в букварях и хелпе тема procedural types
brat (2002-12-21 23:24:00) [5]мда далеко залез ты
лана показываю на твоей процедуре,stdcall-это означает что параметры передаются как в языке С - сначала последний потом первый ,а стек очищает вызвавшая процедура(если память мне не изменяет). Параметры передаются в стеке. Для помещения пареметра в стек есть комадна push для выбборки из стека pop.
function h_LoadLibraryA(lpLibFileName: PAnsiChar): HMODULE; stdcall;
var
p : dword;
begin
...
//GlobalData^.P : pointer - содержит "реальный" адрес LoadLibrarA
...
p:=integer(GlobalData^.P);
asm
push paramN;//загоняешь параметры в стек
push param1;
push param0;
call p; //вызвал процедуру, она отработалa и вернула
// управление, и стек очистила
//результат функции вовзвращается зачастую в EAX
end;
Result:=???
end;
это присвивание верно mov res,EAX; если res 32 разрядное целое число если нет то при присваивание нужно делать принудительное привидение типов byte ptr (это если res байтового типа).
alex134 (2002-12-21 18:08:00) [6]От простого к сложному ...
1) Как считать результат из EAX в переменную?
mov res, EAX? В книге сказано, что приемник не может быть операндом :(
2) Чем важен процедурный тип ?
3) Со стеком вообще беда. Как узнать, где этот стек ? Чего мне туда написать перед вызовом LoadLibraryA ?
Anatoly Podgoretsky (2002-12-21 16:58:00) [7]LoadLibrarA имеет параметры и ты должен их загнать в стек иначе проблемы, а результат будет возвращен через EAX
Обрати внимание на процедурный тип
alex134 (2002-12-21 16:11:00) [8]Сделал так
function h_LoadLibraryA(lpLibFileName: PAnsiChar): HMODULE; stdcall;
var
p : dword;
begin
...
//GlobalData^.P : pointer - содержит "реальный" адрес LoadLibrarA
...
p:=integer(GlobalData^.P);
asm
call p;
end;
Result:=???
end;
PVOzerski (2002-12-21 12:05:00) [9]Я не очень понимаю, чем Вас предложенный способ не устраивает...
Ну хорошо, например, так:
var
p:pointer;
f:function(....):... absolute p;
или
var
xxx:record
case integer of
0:(p:pointer);
1:(f:function(....):... );
end;
Присваиваем к p, вызываем f.
alex134 (2002-12-21 11:37:00) [10]А есть другие способы ?
alex134 (2002-12-20 22:40:00) [11]Tnks!
Song (2002-12-20 22:26:00) [12]http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1040202639&n=4