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


Класс окна - часть 3


m 2000 l 200 100 w q

Двойные нули после строк, как и ранее, предназначены для выравнивания по четным адресам. Для удобства выпишем здесь адреса полей IAT, в которых после загрузки приложения на исполнение будут находиться адреса соответствующих функций (это не адреса самих функций - это адреса, по которым будут размещены адреса этих функций!)

  • GetModuleHandle - 402000h ExitProcess - 402004h;
  • CreateWindowExA - 40200Ch GetMessageA - 402010h;
  • DispatchMessageA - 402014h;
  • TranslateMessage - 402018h;
  • DefWindowProcA - 40201Ch;
  • RegisterClassExA - 402020h.

Теперь можем заняться секцией данных. Как и ранее, там будут две строки - имя класса окна и заголовок окна, за ними - место для структуры MSG, а за ней расположим структуру WNDCLASSEX. Обратите внимание, что необязательно располагать данные вплотную друг к другу (в данном случае) - нам просто нужно следить, чтобы они не перекрывали друг друга, и знать их адреса в памяти (в т.ч. и адреса отдельных полей структур). Поэтому может оказаться удобным и здесь использовать "два прохода" в режиме ассемблирования, чтобы нужные смещения были вычислены автоматически. Я приведу уже готовый файл data.txt (нужные адреса указаны в скобках):

n data.bin r cx 200 f 3000 l 200 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 0 0 0 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

m 3000 l 200 100 w q

Не забудьте, что пустые строки должны быть на своих местах - их нельзя удалять. Значения для размера структуры, адреса имени класса, а также фона окна уже указаны в секции данных. Однако, значения для еще двух обязательных полей - описатель экземпляра приложения и адрес главной процедуры окна - будут известны лишь после загрузки программы на исполнение, и мы должны предусмотреть инициализацию соответствующих полей (по адресам в памяти 403048h и 403054h) в секции кода.




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



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