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


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


; сравнить значение в [EBP+0Ch] и 2 db 83 7d c 2 ; не равны = перескочить 0Ch байтов (на "по умолчанию") db 75 c ; параметр PostQuitMessage (0) db 6a 0 ; вызов PostQuitMessage db ff 15 24 20 40 0 ; "выход" ; удалить фрейм стека db c9 ; возврат из процедуры с очисткой стека db c2 10 0 ; "по умолчанию"

Дальше следует код обработки сообщений по умолчанию. Он сводится к упаковке параметров для DefWindowProc (тех самых, которые были переданы нашей функции окна) и вызову ее. В нашем случае операнд находится в памяти (в стеке), адрес соответствующего фрейма стека находится в регистре EBP; причем дополнительно необходимо использовать смещение. Размер фрейма стека небольшой, поэтому для смещения достаточно использовать 1 байт (при этом Mod будет равен 01). Код R/M для передачи адреса через EBP - 101, откуда получаем результирующую инструкцию:

11111111 01110101 &lt1 байт смещения&gt (FFh 75h &lt...&gt)

Параметры должны передаваться в том же порядке, в котором они были переданы нашей функции. Поэтому первый параметр будет иметь наибольшее смещение относительно текущего значения EBP (14h), затем соответственно следуют 10h, 0Ch и 8:

; параметры DefWindowProc db ff 75 14 db ff 75 10 db ff 75 c db ff 75 8 ; вызов DefWindowProc db ff 15 1c 20 40 0

После этого - выход из нашей функции. Соответствующий код у нас уже имеется; поэтому просто поставим инструкцию безусловного перехода на него:

; на "выход" - назад -24 байта db eb e8

m 1000 l 400 100 w q

Файл кода составлен. Остался файл данных "data.txt". Здесь, помимо размера самого файла, необходимо изменить лишь одну вещь - адрес главной функции окна в соответствующем поле структуры WNDCLASSEX:

n data.bin r cx 400 f 3000 l 400 0 a 3000 ; имя класса окна db "MYCLASS" 0

a 3010 ; заголовок окна db "Моё окно" 0

a 3020 ; структура MSG (28 байт)

a 3040 ; структура WNDCLASSEX: ; размер структуры db 30 0 0 0 ; стили класса окна db 0 0 0 0 ; (403048h) адрес главной функции окна db 89 10 40 0 ; дополнительные байты класса db 0 0 0 0 ; дополнительные байты окна db 0 0 0 0 ; (403054h) описатель экземпляра приложения db 0 0 0 0 ; описатель ресурса значка db 0 0 0 0 ; описатель ресурса курсора db 0 0 0 0 ; фон окна db 6 0 0 0 ; адрес имени меню db 0 0 0 0 ; адрес имени класса окна db 0 30 40 0 ; описатель ресурса мелкого значка db 0 0 0 0




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



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