Форум: "WinAPI";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
ВнизВыполнение функции Найти похожие ветки
← →
Zorrow (2003-11-20 09:55) [0]Всем здрасти.
Вопрос к знатокам 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;
Конечно, мой вопрос может показаться странным и, возможно, неуместным, но на другие форумы не так часто заглядывают мастера, как здесь.
← →
MBo (2003-11-20 10:04) [1]Нужно вначале положить в стек параметры в порядке, определенном соглашением о вызове (в данном случае stdcall)
пример вызова GetNearestPaletteIndex есть в
http://www.delphimaster.ru/articles/pixels/index.html
← →
Zorrow (2003-11-20 10:24) [2]Ага спасиб
← →
Zorrow (2003-11-20 11:54) [3]а возможно ли изнутри процедуры узнать ощий размер и количество передаваемых переменных?
пока что делаю так
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;
возможно ли это сделать, просто в асме я полный профан
← →
Digitman (2003-11-20 12:11) [4]
> просто в асме я полный профан
а зачем полез тогда в эти дебри ? чем это обосновано ?
> а необходимо
при вызове некоей ф-ции ты обязан знать, какие и сколько параметров она ожидает
никаких иных критериев определения этого нет и быть не может
← →
Digitman (2003-11-20 12:16) [5]исключением является только частный случай вызова методов интерфейса OLE-сервера автоматизации, но это - крайне непростой механизм и отдельный разговор, имеющий лишь общее сходство с вызовом статических ф-ций
← →
Zorrow (2003-11-20 12:26) [6]>Digitman
а зачем полез тогда в эти дебри ? чем это обосновано ?
Слишком долго объяснять
при вызове некоей ф-ции ты обязан знать, какие и сколько параметров она ожидает
для того и существуют мозги, чтобы искать лучшие методы и решения - в данном случае в программном коде
никаких иных критериев определения этого нет и быть не может
Критерии, к твоему сведению есть - хотя бы анализ состояния регистров.
← →
Digitman (2003-11-20 12:59) [7]
> Zorrow
> Слишком долго объяснять
ну-ну) ... видать, великий секрет)
> для того и существуют мозги, чтобы искать лучшие методы
> и решения - в данном случае в программном коде
ситуация как в том анекдоте про мужика, ищущего ключи под фонарным столбом, когда потерял их в другом месте
> Критерии, к твоему сведению есть - хотя бы анализ состояния
> регистров.
в ран-тайм - бесцельное и бесполезное занятие
этим занимаются , когда есть листинг дизассемблирования конкретного кода и стоит задача вызова КОНКРЕТНОЙ ф-ции, а не произвольной, и прототипа интересующей ф-ции нет. Т.е. целью анализа является воссоздание прототипа.
кр.того, причем здесь регистры, если речь ты ведешь искл-но об stdcall ?
это - раз.
второе.
коль речь идет об stdcall, то единственное видимое решение - найти в теле (?) вызываемой ф-ции маш.код, соотв-щий инструкции RET N, но это чрезвычайно сложно и далеко не всегда даст ожидаемый рез-т
← →
Digitman (2003-11-20 13:03) [8]Удалено модератором
Примечание: Offtopic
← →
Zorrow (2003-11-20 13:13) [9]Удалено модератором
Примечание: Offtopic
← →
Digitman (2003-11-20 13:17) [10]Удалено модератором
Примечание: Offtopic
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c