Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-72689
Dark Man
2003-12-25 06:44
2004.01.23
Борьба с временными файлами


3-72626
CraKer
2003-12-27 00:27
2004.01.23
FILTERING


3-72640
Denis
2003-12-26 13:26
2004.01.23
Нужна помощь с SumList


1-72834
den74
2004-01-08 15:01
2004.01.23
MessageDlg


14-72902
Игорь Шевченко
2004-01-01 00:36
2004.01.23
Наталия, с днем рождения!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский