Показать сообщение отдельно
Старый 28.11.2016, 20:20   #1
Новичок
 
Регистрация: 14.11.2016
Сообщений: 8
Сказал Спасибо: 4
Имеет 2 спасибок в 1 сообщении
fastx пока неопределено
По умолчанию va_arg на asm (разбив стека по format)

Некоторые апи функции l2 идут с неопределенным количеством аргументов, в частности sendpacket. Переменные параметры заносятся в стек. Но до них идет указатель на строку с маской(format)(пример "cdddbSqq"). По ней мы бьем стек и получаем те самые параметры.
А как корректно рассчитать смещение по маске:
c - 1 байт, но в стеке занимает 4 байта(можно же было в 2 уложить)
d - 4 байта, в стеке 4 (тут и вопросов нет)
h - 2 байта, а сколько занимает в стеке?
q - 8 байт, а в стеке тоже 8?
Но больше всего не понятно, сколько байт в стеке занимает b и S(S - указатель или сама строка(unicode же?)? за что отвечает b? (байты?))
Те, к примеру, [esp+24] - указатель на строку с маской(форматом). 1 символ маски всегда c => после mov al, [esp+28] в al у нас будет первый байт. Если второй символ d => mov eax, [esp+32] в eax будет 4 байтное число. А как эта цепь продолжится для h, b, S?
В c++ есть va_arg, а здесь чуть сложнее. Хотя я нашел что-то мне подходящее более менее на delphi+asm вот в этом треде, но не уверен, что это верный вариант.
Есть ли более точный способ разбить стек?
fastx вне форума   Ответить с цитированием