• XSS.stack #1 – первый литературный журнал от юзеров форума

wsprintf не совместим с Outputdebugstring?

Quake3

TPU unit
Забанен
Регистрация
03.11.2010
Сообщения
4 529
Решения
4
Реакции
5 305
Депозит
0.046
Пожалуйста, обратите внимание, что пользователь заблокирован
Или у меня уже глюки, или как всегда, какая-то особенность винапи. Есть код
Код:
.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,user32

.data
systime SYSTEMTIME <?>
buf db 64 dup (0)
buf2 db "some debug log",0

.code
start:
invoke GetSystemTime,addr systime
invoke wsprintf,addr buf,chr$("year is %hd"),systime.wYear
invoke OutputDebugString,offset buf2
exit;
end start
OutputDebugString падает неясно почему. Если закоментировать wsprintf, или хотя бы передавать туда не systime.wYear, а число вида 2000, то все гуд. В чем может быть проблема?

upd. Разобрался. Проблема как всегда была весьма тупая. SYSTEMTIME .wYear это WORD, т.е. занимает два байта, а масм после wsprintf выравнивает стек на 12 (3 параметра по DWORD), в итоге два байта лишние и все рушится. Если сделать так
Код:
movzx ebx,systime.wYear
invoke wsprintf,addr buf,chr$("year is %d"),ebx
То все норм. Тему не удаляю, мб еще кому пригодится (или решение не окончательное).
 
int __cdecl wsprintf(
masm автоматом чтоли стек ровняет? неверится :)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ragnar
при іnvoke - всегда автоматом, видимо берет количество аргументов, умножает на 4 (дворды) и уравнивает.

В коде этого нет, добавил сам компилятор.
Если вызывать через call, тогда уравнивания не будет (касается только функций вида printf, т.е. VARARG, если есть нормальный прототип с фиксированным количеством параметров, то уравняет по любому - заменит ret на retn12 например).

прикрепил скрин, но чето не грузится, можете глянуть в отладчике.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх