Доброго времени суток.
Есть программа-лаунчер игры Warcraft3, используется в модмейкинге для подключения дополнительного MPQ-архива, работает по принципу инжектинга своего кода в процесс Frozen throne.exe. Также при запуске отображается splash-экран, если был найден соответствующий *.sph файл с картинкой.
На данный момент автор программы недосягаем, поэтому я и вынужден обращаться к вам. В 1-м посте вложены и исходники (fasm), и файл проекта RadASM, и скомпилированный ехе-шник.
Проблема в том, что прога писалась, компилировалась и замечательно работала под WinXP. На Висте запускаться не хочет. У меня самого WinXP, но я нашел человека с Вистой и Warcraft'ом, он говорит, что если продебаггить ехе-шник, то вылет происходит здесь
WinEngine:
.for
invoke PeekMessage,hMsg,ebx,ebx,ebx,PM_REMOVE
.exitf eax=FALSE
;сообщения есть, обрабатываем
invoke IsDialogMessage,[hWnd],hMsg
.endf
ret
при выходе их этой функции, вылетает. Возможно нехватает enter в начале.
есть подозрения что ошибка в том, что вызываются Unicode версии WinAPI функций
програ думает что быдут вызываться обычные версии функций (без юникода), а виста берёт и вызывает для юникода
а сама Виста пишет такое:
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: launcher.exe_unknown
Версия приложения: 0.0.0.0
Штамп времени приложения: 44be5963
Имя модуля с ошибкой: StackHash_8d13
Версия модуля с ошибкой: 0.0.0.0
Штамп времени модуля с ошибкой: 00000000
Код исключения: c0000005
Смещение исключения: 0a86150f
Версия ОС: 6.0.6000.2.0.0.256.4
Код языка: 1049
Дополнительные сведения 1: 8d13
Дополнительные сведения 2: cdca9b1d21d12b77d84f02df48e34311
Дополнительные сведения 3: 8d13
Дополнительные сведения 4: cdca9b1d21d12b77d84f02df48e34311
но вряд ли это вам поможет
Сам я 0 в асме, занимаюсь С++. Поэтому к форумчанам большая просьба - исправить исходники скомпилировать, чтобы он работал под Вистой, я его перешлю на тестирование, и если всё будет норм (если пожелаете) я внесу в кредиты своего проекта ваш ник и адрес форума.
Заранее спасибо
Помогите плиз скомпилировать прогу под Vista
Модератор: Andy
- Вложения
-
- launcher.zip
- (13.32 КБ) 27 скачиваний
Здесь есть несколько вариантов:
1. Enter здесь не надо, т.к. выход из программы осуществляется командой ret. Но вот только какой? Дело в том, что в замисимости от call - вызова функции - на стеке находятся разные данные. Это могут быть 16-раз. смещение, 32-раз. смещение, 16-разр. дескриптор + 32 разр. смещение, ну и еще несколько вариантов. Команда ret успешно генерирует нужный вид возврата, если мы находимся в процедуре. Поскольку для процедуры однозначно определен ее тип, либо near, far и т.д. - то выход и вызов будут генерироватся правильно. В нашем случае имеем дело с меткой
1. Enter здесь не надо, т.к. выход из программы осуществляется командой ret. Но вот только какой? Дело в том, что в замисимости от call - вызова функции - на стеке находятся разные данные. Это могут быть 16-раз. смещение, 32-раз. смещение, 16-разр. дескриптор + 32 разр. смещение, ну и еще несколько вариантов. Команда ret успешно генерирует нужный вид возврата, если мы находимся в процедуре. Поскольку для процедуры однозначно определен ее тип, либо near, far и т.д. - то выход и вызов будут генерироватся правильно. В нашем случае имеем дело с меткой
It's a long way to the top if you wanna rock'n'roll
Вот что по этому поводу говорит IDA после дизассемблирования:
Вот это уже похоже на ассемблер, а не на С
Код: Выделить всё
sub_4010A3 proc near
push 1 ; wRemoveMsg
push ebx ; wMsgFilterMax
push ebx ; wMsgFilterMin
push ebx ; hWnd
push offset Msg ; lpMsg
call PeekMessageA
cmp eax, 0
jz short locret_4010CB
push offset Msg
push hWnd
call IsDialogMessage
jmp short sub_4010A3
; ---------------------------------------------------------------------------
locret_4010CB: ; CODE XREF: sub_4010A3+13j
retn
endp
It's a long way to the top if you wanna rock'n'roll
somewhere
спасибо...а дальше мне-то что делать?
спасибо...а дальше мне-то что делать?

Попробуй оформить процедуру как near, т.е. убери метку и сделай там процедуру
WinEngine proc near
....
....
retn
WinEngine endp
WinEngine proc near
....
....
retn
WinEngine endp
It's a long way to the top if you wanna rock'n'roll
somewhere
извините, но я не знаю, что есть процедура в понимании АСМ
у меня даже не получается скомпилить существующие исходники под Хрюшей-RadASM просто не хочет
извините, но я не знаю, что есть процедура в понимании АСМ

у меня даже не получается скомпилить существующие исходники под Хрюшей-RadASM просто не хочет

Могу сказать, что проблема на 80% в том, что на стеке лежит не тот адрес возврата, т.к. прога выпадает на выходе по iret. Т.е. это либо проблема разных call и ret, либо PeekMessage и IsDialogMessage требуют больше или меньше параметров на входе в висте, чем в XP. Если не сложно, закиньте компилятор на somewhere@bk.ru, попробую у себя. А вы можете пока накопать про PeekMessage в WinAPI висты, может там действительно что-то немного отличается.
It's a long way to the top if you wanna rock'n'roll