![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выполнение функции [D7, Win2k]
Zorrow © (2003-11-20 09:55:00)
Всем здрасти.
Вопрос к знатокам ASM-а в дельфи и не только:
Чтобы понятен был вопрос сразу объясню на примере:
можно легко вызвать ф-ю MessageBoxA(hwnd, Title, Cption, mb_OK)вот таким образом:
function MyMesageBox(hwnd, Title, Cption, mb_OK):Integer;
begin
result:=MessageBoxA(hwnd, Title, Cption, mb_OK);
end;
а как это сделать в общем случае, зная общий размер передаваемых параметров, что-то типа:
function MyMesageBox(hwnd, Title, Cption, mb_OK):Integer;
begin
asm
...
call MessageBoxA;
...
end;
end;
Конечно, мой вопрос может показаться странным и, возможно, неуместным, но на другие форумы не так часто заглядывают мастера, как здесь.
Digitman (2003-11-20 13:17:00) [1]
Удалено модератором
Примечание: Offtopic
Zorrow (2003-11-20 13:13:00) [2]
Удалено модератором
Примечание: Offtopic
Digitman (2003-11-20 13:03:00) [3]
Удалено модератором
Примечание: Offtopic
Digitman (2003-11-20 12:59:00) [4]
> Zorrow
> Слишком долго объяснять
ну-ну) ... видать, великий секрет)
> для того и существуют мозги, чтобы искать лучшие методы
> и решения - в данном случае в программном коде
ситуация как в том анекдоте про мужика, ищущего ключи под фонарным столбом, когда потерял их в другом месте
> Критерии, к твоему сведению есть - хотя бы анализ состояния
> регистров.
в ран-тайм - бесцельное и бесполезное занятие
этим занимаются , когда есть листинг дизассемблирования конкретного кода и стоит задача вызова КОНКРЕТНОЙ ф-ции, а не произвольной, и прототипа интересующей ф-ции нет. Т.е. целью анализа является воссоздание прототипа.
кр.того, причем здесь регистры, если речь ты ведешь искл-но об stdcall ?
это - раз.
второе.
коль речь идет об stdcall, то единственное видимое решение - найти в теле (?) вызываемой ф-ции маш.код, соотв-щий инструкции RET N, но это чрезвычайно сложно и далеко не всегда даст ожидаемый рез-т
Zorrow (2003-11-20 12:26:00) [5]
>Digitman
а зачем полез тогда в эти дебри ? чем это обосновано ?
Слишком долго объяснять
при вызове некоей ф-ции ты обязан знать, какие и сколько параметров она ожидает
для того и существуют мозги, чтобы искать лучшие методы и решения - в данном случае в программном коде
никаких иных критериев определения этого нет и быть не может
Критерии, к твоему сведению есть - хотя бы анализ состояния регистров.
Digitman (2003-11-20 12:16:00) [6]
исключением является только частный случай вызова методов интерфейса OLE-сервера автоматизации, но это - крайне непростой механизм и отдельный разговор, имеющий лишь общее сходство с вызовом статических ф-ций
Digitman (2003-11-20 12:11:00) [7]
> просто в асме я полный профан
а зачем полез тогда в эти дебри ? чем это обосновано ?
> а необходимо
при вызове некоей ф-ции ты обязан знать, какие и сколько параметров она ожидает
никаких иных критериев определения этого нет и быть не может
Zorrow (2003-11-20 11:54:00) [8]
а возможно ли изнутри процедуры узнать ощий размер и количество передаваемых переменных?
пока что делаю так
function MyProc(P1:dword; P2:char):DWORD; stdcall;
begin
ShowMessage("Hello Params: "+Inttostr(P1)+" "+P2);
result:=123;
end;
function Proc(P1:dword; P2:char):DWORD; stdcall;
begin
asm
push P2
push P1
call myproc
end
end;
а необходимо
function Proc(P1:dword; P2:char):DWORD; stdcall;
var
Sz:DWORD;
begin
Sz:=GetProcStackSize;//<<========
asm
[в цикле 1 ..Sz] do
Push ?//<=====
call myproc
end
end;
возможно ли это сделать, просто в асме я полный профан
Zorrow (2003-11-20 10:24:00) [9]
Ага спасиб
MBo (2003-11-20 10:04:00) [10]
Нужно вначале положить в стек параметры в порядке, определенном соглашением о вызове (в данном случае stdcall)
пример вызова GetNearestPaletteIndex есть в
http://www.delphimaster.ru/articles/pixels/index.html