Files
SHA256/main64.asm
T

85 lines
6.5 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
include includes\win64a.inc
.code
WinMain proc
local msg:MSG
xor ebx,ebx ;rbx = 0
mov esi,IMAGE_BASE ; дескриптор нашей программы
mov eax,10027h ; дескриптор иконки
mov edi,offset ClassName; Имя нашего класса окна
; заполнение структуры wc и регистрация класса
push rax ;hIconSm дескриптор малой иконки
push rdi ;lpszClassName Имя класса окна
push rbx ;lpszMenuName меню
push COLOR_WINDOW;hbrBackground Цвет фона
push 10003h ;hCursor дескриптор курсора
push rax ;hIcon дескриптор иконки
push rsi ;hInstance дескриптор модуля
push rbx ;cbClsExtra & cbWndExtra
pushaddr WndProc ;lpfnWndProc
;Адрес процедуры окна, ответственной за окна, создаваемых на основе этого класса
push sizeof WNDCLASSEX;cbSize & style
;Стиль окон, создаваемых из этого класса. Вы можете
;комбинировать несколько стилей вместе, используя оператор "or".
invoke RegisterClassEx,esp ;rsp = addr WNDCLASSEX
;регистрация нашего класса окна
;После регистрации класса окна, мы должны вызвать CreateWindowEx,
;чтобы создать наше окно, основанное на этом классе
;--------------------------+
; creating the main window |
;--------------------------+
push rbx ;lрParam: Опциональный указатель на структуру данных,
;передаваемых окну. Это используется окнами MDI, чтобы передать структуру
;CLIENTCREATESTRUCT. Обычно этот параметр установлен в NULL, означая, что
;никаких данных не передается через CreateWindow(). Окно может получать значение
;этого параметра через вызов функции GetWindowsLong.
push rsi ;rsi=400000h hInstance: дескриптор программного модуля, создающего окно
shl esi,9 ;rsi=CW_USEDEFAULT
push rbx ;hMenu: дескриптор меню окна. NULL - если будет использоваться меню,
;определенное в классе окна. Взгляните на код, объясненный ранее, член структуры
;WNDCLASSEX lрszMenuName. Он определяет меню "по умолчанию" для класса окна.
;Каждое окно, созданное из этого класса будет иметь тоже меню по умолчанию, до
;тех пор пока вы не определите специально меню для какого-то окна, используя
;параметр hMenu. Этот параметр - двойного назначения. В случае, если ваше окно
;основано на предопределенном классе окна, оно не может иметь меню. Тогда hMenu
;используется как ID этого контрола. Windows может определить действительно ли
;hMenu - это дескриптор меню или же ID контрола, проверив параметр lрClassName. Если
;это имя предопределенного класса, hMenu - это идентификатор контрола. Если нет,
;это дескриптор меню окна
push rbx ;hWndParent: дескриптор родительского окна (если существует). Этот
;параметр говорит Windows является ли это окно дочерним (подчиненным) другого
;окна, и, если так, кто родитель окна. Заметьте, что это не родительско-дочерние
;отношения в окна MDI (multiрly document interface). Дочерние окна не ограничены
;границами клиентской области родительского окна. Эти отношения нужны для
;внутреннего использования Windows. Если родительское окно уничтожено, все
;дочерние окна уничтожаются автоматически. Это действительно просто. Так как в
;нашем примере всего лишь одно окно, мы устанавливаем этот параметр в NULL
push rsi ;X-координата верхнего левого угла окна.
;Обычно эти значения равны CW_USEDEFAULT, что позволяет Windows решить, куда
;поместить окно. nWidth, nHeight: Ширина и высота окна . Вы можете также использовать
;CW_USEDEFAULT, чтобы позволить Windows выбрать соответствующую ширину и высоту
;для вас
push rsi ;Y-координата верхнего левого угла окна
push rsi ;ширина окна в пикселях
push rsi ;высота окна в пикселях
sub esp,20h
invoke CreateWindowEx,0,\;dwExStyle: Дополнительные стили окна
edi,\;lpClassName: Адрес ASCIIZ строки, содержащей имя класса окна
edi,\;lpWindowName: Адрес ASCIIZ строки, содержащей имя окна
WS_OVERLAPPEDWINDOW or WS_VISIBLE
lea edi,msg
@@: invoke GetMessage,edi,NULL,0,0
invoke DispatchMessage,edi
jmp @b
WinMain endp
;----------------------+
; the window procedure |
;----------------------+
WndProc:cmp edx,WM_DESTROY
je wmDESTROY
jmp DefWindowProc;все сообщения, не обрабатываемые в функции
;WndProc, направляются на обработку по умолчанию
wmDESTROY: invoke ExitProcess,NULL; выходим из программы
.data
ClassName db "Win64 Iczelion's lesson #3a: Simple windows",0
end