Skip to content

Instantly share code, notes, and snippets.

@alexeygritsenko
Created January 1, 2018 17:57
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexeygritsenko/8ef376d3f588f43582059a435bbb76ce to your computer and use it in GitHub Desktop.
Save alexeygritsenko/8ef376d3f588f43582059a435bbb76ce to your computer and use it in GitHub Desktop.
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;dwStyle: Стили окна. Вы можете
;определить появление окна здесь. Можно передать NULL без проблем, тогда у окна
;не будет кнопок изменения размеров, закрытия и системного меню. Большого прока
;от этого окна нет. Самый общий стиль - это WS_OVERLAPPEDWINDOW. Стиль окна всегда
;лишь битовый флаг, поэтому вы можете комбинировать различные стили окна с помощью
;оператора "or", чтобы получить желаемый результат. Стиль WS_OVERLAPPEDWINDOW в
;действительности комбинация большинства общих стилей с помощью этого метода.
;цикл обработки сообщений
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
@NulAsh
Copy link

NulAsh commented Oct 25, 2018

Мой masm64 говорит, что нету такой инструкции pushaddr.

@alexeygritsenko
Copy link
Author

Мой masm64 говорит, что нету такой инструкции pushaddr.

Только сейчас заметил ваш вопрос. Боюсь все подключения этого семпла находятся в win64a.inc. Попробуйте среду asm visual, там в комплекте все есть для сборки ассемблер программ.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment