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

Вниз

Как запустить процедуру знаяя ее адрес?   Найти похожие ветки 

 
alex134 ©   (2002-12-20 22:19) [0]

p:=GetProcAddress(..,..);
Как теперь запустить процедуру, на которую указывает p ?


 
Song ©   (2002-12-20 22:26) [1]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1040202639&n=4


 
alex134 ©   (2002-12-20 22:40) [2]

Tnks!


 
alex134 ©   (2002-12-21 11:37) [3]

А есть другие способы ?


 
PVOzerski ©   (2002-12-21 12:05) [4]

Я не очень понимаю, чем Вас предложенный способ не устраивает...
Ну хорошо, например, так:
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 16:11) [5]

Сделал так

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;



 
Anatoly Podgoretsky ©   (2002-12-21 16:58) [6]

LoadLibrarA имеет параметры и ты должен их загнать в стек иначе проблемы, а результат будет возвращен через EAX
Обрати внимание на процедурный тип


 
alex134 ©   (2002-12-21 18:08) [7]

От простого к сложному ...
1) Как считать результат из EAX в переменную?
mov res, EAX? В книге сказано, что приемник не может быть операндом :(
2) Чем важен процедурный тип ?
3) Со стеком вообще беда. Как узнать, где этот стек ? Чего мне туда написать перед вызовом LoadLibraryA ?


 
brat ©   (2002-12-21 23:24) [8]

мда далеко залез ты
лана показываю на твоей процедуре,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 байтового типа).


 
Anatoly Podgoretsky ©   (2002-12-21 23:37) [9]

Соглащение о вызовах описывает как передаются параметры и кто очищает стек, тема в хелпе calling conventions
Процедурные типы в букварях и хелпе тема procedural types


 
Bosh   (2002-12-21 23:45) [10]

насколько мне известно функции возращают свой результат в регистре 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


вроде так)


 
alex134 ©   (2002-12-22 00:22) [11]

Короче, сделал так:

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 не при делах - пробовал, убирал ее. Где ???????? Нашла коса на камень :(


 
alex134 ©   (2002-12-22 00:31) [12]

Ветка плавно перешла в http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1040215113&n=5, думаю, проблема не в вызове функции а в самой подмене АПИ-функции.
Модератор! Удалите плз эту ветвь/



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
4-15358
kuzia
2002-11-19 13:21
2003.01.06
Hook


1-15018
Woolen
2002-12-24 15:25
2003.01.06
Как скопировать объект?


1-15031
Gamar
2002-12-24 13:07
2003.01.06
Разница между двумя датами в миллисекундах


3-14905
adolf_99
2002-12-13 00:14
2003.01.06
Помогите


8-15162
Неопытный
2002-09-16 19:09
2003.01.06
Функция по выводу картинки без нужного цвета