Сейчас на форуме: tyns777 (+3 невидимых) |
![]() |
eXeL@B —› Программирование —› Как объявить импортируемую fastcall функцию в MASM'е |
Посл.ответ | Сообщение |
|
Создано: 20 октября 2009 14:28 · Личное сообщение · #1 |
|
Создано: 20 октября 2009 15:36 · Личное сообщение · #2 Внизу информация к размышлению. В процедуре обьявленной уже задается что режим фасткол , если же вызов будет произведен из другого места , то вроде бы неважно как обьявлена фастколом или нет. По крайней мере в кернел инк от масм InterlockedCompareExchange выделяется как Code:
Попробуй так сначала , и посмотри , зайди в процедуру и увидишь как там параметры разбросались ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 20 октября 2009 15:42 · Поправил: OKOB · Личное сообщение · #3 Four-F утверждает, что fastcall не поддерживается MASM и даже предлагает соответствующий макрос для лечения в KmdKit. "В функциях API ядра Windows NT используется три типа соглашений о передаче параметров (calling convention): stdcall, cdecl и fastcall. Последний тип не поддерживается компилятором masm." (цитата) hххp://www.team-x.ru/teamx/12345.htm ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 20 октября 2009 15:51 · Поправил: mak · Личное сообщение · #4 Да верно , об этом многие говорят что не поддерживается , тем не менее я видел реализацию , другую не как макрос. Можно вот так попробовать Code:
макрос внизу примерный приложен. А у Four-F макрос тоже бы глянул =) ПС. Материал с той ссылки Соглашение о передаче параметров В функциях API ядра Windows NT используется три типа соглашений о передаче параметров (calling convention): stdcall, cdecl и fastcall. Последний тип не поддерживается компилятором masm. Такие функции принимают первый аргумент в регистре ecx, второй в edx, остальные, при наличии таковых, помещаются в стек в обратном порядке (справа налево). Стек очищает вызванная функция. Декорированные имена функций fastcall начинаются с символа "@", после имени добавляется символ "@" с десятичным числом, обозначающим суммарный размер аргументов в байтах. Например, функция IofCompleteRequest декорируется следующим образом: @IofCompleteRequest@8 Это значит, что это fastcall-функция, экспортируемое имя IofCompleteRequest, принимает два аргумента размером DWORD каждый. В файле \include\w2k\ntoskrnl.inc она определена следующим образом (на ключевое слово SYSCALL можете не обращать внимание): EXTERNDEF SYSCALL @IofCompleteRequest@8:PROC IofCompleteRequest TEXTEQU <@IofCompleteRequest@8> Для упрощения вызова таких функций я написал макрос fastcall: Code:
Здесь, для экономии места, я привожу упрощенную версию этого макроса. Чтобы не плодить лишние файлы с макросами, мне пришлось поместить этот макрос в \include\w2k\ntddk.inc, где и можно посмотреть полный вариант. В оригинальном ntddk.h такого макроса, естественно, нет. ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 20 октября 2009 19:22 · Личное сообщение · #5 |
|
Создано: 20 октября 2009 20:26 · Личное сообщение · #6 ![]() как выше написал Code:
и Four-F говорит типо определения Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 20 октября 2009 20:49 · Личное сообщение · #7 |
|
Создано: 20 октября 2009 22:06 · Личное сообщение · #8 Clerk пишет: Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A, 3-148. Помоему вопрос "как на асме написать InterlockedCompareExchange" сильно отличается от "Как объявить импортируемую fastcall функцию в MASM'е" ----- Реверсивная инженерия - написание кода идентичного натуральному ![]() |
|
Создано: 20 октября 2009 22:11 · Личное сообщение · #9 |
|
Создано: 21 октября 2009 09:04 · Личное сообщение · #10 |
|
Создано: 21 октября 2009 10:54 · Поправил: Hexxx · Личное сообщение · #11 Clerk пишет: Помоему асм использует ресурсы камня, имя функции длинее чем сама функция, которая заключается в одной инструкции Если не подходит вручную вызывать такого типа функции, то и незачем использовать асм, си юзайте. Как это отвечает на вопрос про fastcall в MASM? ----- Реверсивная инженерия - написание кода идентичного натуральному ![]() |
|
Создано: 21 октября 2009 23:24 · Личное сообщение · #12 Hexxx пишет: mak пишет: а так пробовал ?как выше написал Code: EXTERNDEF SYSCALL @InterlockedCompareExchange@12:PROCInterlockedCompar eExchange EQU <@InterlockedCompareExchange@12> Так работает. Но хочется proto Hexxx сделай для красоты макрос прото ![]() ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 22 октября 2009 12:22 · Личное сообщение · #13 |
|
Создано: 22 октября 2009 15:42 · Личное сообщение · #14 |
|
Создано: 22 октября 2009 17:14 · Личное сообщение · #15 Hexxx а почему бы нет , сделать макрос универсальный для разных методов кола , по идее у прото функции парметры типо таких , Code:
Я пологаю параметр дестинейшн , описывает какой кол сделать , поэтому если его знать то можно накидать макрос Вот примеры например других вызовов , но уних там параметр дэстинейшн указан как STDCALL вроде , чему интересно равен SYSCALL в параметрах масма , я там не нашел описания внутри инков функции прото , видимо она встроена уже. Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
![]() |
eXeL@B —› Программирование —› Как объявить импортируемую fastcall функцию в MASM'е |
Эта тема закрыта. Ответы больше не принимаются. |