Win32 в машинных кодах


Шаблон оконного приложения - часть 5


10000011 11111000 00000000, или 83 F8 00 (h)

Продолжим:

; EAX = 0? db 83 f8 00 ; да - перескочить 18h байтов вперед db 74 18 ; параметр TranslateMessage - адрес MSG (403020h) db 68 20 30 40 0 ; вызов TranslateMessage (по адресу в IAT(2) 402018h) db ff 15 18 20 40 0 ; параметр DispatchMessageA - адрес MSG (403020h) db 68 20 30 40 0 ; вызов DispatchMessageA (по адресу в IAT(2) 402014h) db ff 15 14 20 40 0 ; возврат на "цикл" (-46 байт) db eb d2

Здесь в стек помещается параметр для функции ExitProcess. Раньше мы использовали в качестве кода выхода 0; но теперь мы завершаем цикл с помощью сообщения WM_QUIT, а оно само заносит в параметр wParam структуры MSG код завершения (тот самый, который был передан функции PostQuitMessage). Нам нужно передать функции ExitProcess именно это значение. Вспомним инструкцию помещения в стек значений, находящихся в памяти; используется байт ModR/M. Мы познакомились с этой командой в статье "Простейшее приложение"; напомним ее формат:

11111111 Mod 110 R/M

Для указания непосредственного адреса памяти используется комбинация Mod = 00 и R/M = 101, затем следуют 4 байта адреса. Структура MSG у нас располагается по адресу 403020h, а ее поле wParam - по адресу 403028h:

; параметр ExitProcess (код завершения = MSG.wParam) db ff 35 28 30 40 0 ; вызов ExitProcess (по адресу в IAT(1) 402004h) db ff 15 4 20 40 0

Дальше начинается главная функция окна. Сначала, как обычно, создаем фрейм стека для обращения к параметрам:

;----------------------- ; Процедура окна ; создать фрейм стека: db 55 db 89 e5

Затем проверяем код сообщения, переданный в качестве параметра. На этот раз мы будем пересылать системной процедуре окна по умолчанию (DefWindowProc) все сообщения, кроме одного с кодом 2. Как уже говорилось в начале, это сообщение посылается системой окну при его разрушении (т.е. когда пользователь закрывает окно). Если это так, вызываем PostQuitMessage с параметром 0 и завершаем функцию. Если нет, нужно перескочить этот участок кода:




Начало  Назад  Вперед



Книжный магазин