{"id":407204,"date":"2024-06-29T19:25:06","date_gmt":"2024-06-29T19:25:06","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=407204"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-29T19:25:06","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=407204","title":{"rendered":"<span>\u041f\u0440\u0438\u043c\u0435\u0440\u044b. WinAPI: \u041e\u043a\u043d\u0430, \u0442\u0438\u043f\u044b (FASM)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0441\u0431\u043e\u0440\u043d\u0438\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0441 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043e WinAPI | FASM. \u041a\u0430\u043a\u0438\u0435 \u043e\u043a\u043d\u0430 \u0431\u044b\u0432\u0430\u044e\u0442 \u0432 Windows.<\/p>\n<p>\u041e\u043a\u043d\u0430 \u0431\u044b\u0432\u0430\u044e\u0442: \u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e, \u043d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e, \u043e\u0431\u044b\u0447\u043d\u043e\u0435 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435) \u043e\u043a\u043d\u043e. (\u044d\u0442\u043e \u0432\u0441\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0437\u043d\u0430\u044e)<\/p>\n<ul>\n<li>\n<p>\u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430, \u043e\u043d\u0430 \u0432\u0435\u0440\u043d\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-enddialog\" rel=\"noopener noreferrer nofollow\">EndDialog<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u0442\u043e\u0436\u0435 \u0447\u0442\u043e \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e, \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e\u0435 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435) \u043e\u043a\u043d\u043e \u0442\u043e\u0436\u0435 \u0447\u0442\u043e \u0438 \u043d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u0441\u0430\u043c\u0438\u043c.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e<\/h2>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-dialogboxparama\" rel=\"noopener noreferrer nofollow\">DialogBoxParam <\/a>&#8212; \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u0438\u0437 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041a\u043e\u0434 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f  <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-enddialog\" rel=\"noopener noreferrer nofollow\">EndDialog<\/a>.<\/p>\n<p><code>invoke DialogBoxParamA hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam<\/code><\/p>\n<p>hInstance &#8212; \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043c\u043e\u0434\u0443\u043b\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/libloaderapi\/nf-libloaderapi-getmodulehandlea\" rel=\"noopener noreferrer nofollow\">GetModuleHandle<\/a>.<\/p>\n<p>lpTemplateName &#8212; \u043d\u043e\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445.<\/p>\n<p>hWndParent &#8212; hWnd \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u0438\u043b\u0438 Null.<\/p>\n<p>lpDialogFunc &#8212; \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443.<\/p>\n<p>dwInitParam &#8212; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 lParam (\u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443).<\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-dialogboxindirectparama\" rel=\"noopener noreferrer nofollow\">DialogBoxIndirectParamA <\/a>&#8212; \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<h4>_\u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430<\/h4>\n<p>\u042d\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c False, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0435 False \u0438 Windows \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430 \u0432\u0430\u0441.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b:<\/p>\n<pre><code>proc DialogProc hwnddlg, msg, wparam, lparam   cmp [msg], WM_CLOSE   jne @f     invoke EndDialog, [hwnddlg], 0 ; \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u0430   @@:   xor eax, eax ; return false   ret endp<\/code><\/pre>\n<h4>__\u0420\u0435\u0441\u0443\u0440\u0441\u044b, \u0448\u0430\u0431\u043b\u043e\u043d\u044b<\/h4>\n<pre><code>section '.rsrc' resource data readable directory RT_DIALOG, dialogs   resource dialogs, 1,\\ ; 1 - \u043d\u043e\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430   LANG_ENGLISH, form1      dialog form1, 'My Window',\\ ; \u0438\u043c\u044f \u043e\u043a\u043d\u0430   100, 100, 100, 50,\\ ; \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u043a\u043d\u0430\\\u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430   WS_VISIBLE+WS_CAPTION+WS_SYSMENU ; \u0441\u0442\u0438\u043b\u0438 \u043e\u043a\u043d\u0430    enddialog<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>format PE GUI 4.0 entry start include 'win32a.inc' section '.code' code readable writeable executable start:   invoke GetModuleHandle, 0   invoke DialogBoxParam, eax, 1, 0, DialogProc, 0   invoke ExitProcess, 0    proc DialogProc hwnddlg, msg, wparam, lparam   cmp [msg], WM_CLOSE   jne @f     invoke EndDialog, [hwnddlg], 0   @@:      cmp [msg], WM_COMMAND   jne .if1     cmp [boolBut], 0     jne @f       invoke SetDlgItemText, [hwnddlg], 2, Button_Text1       inc [boolBut]       jmp .if1     @@:       invoke SetDlgItemText, [hwnddlg], 2, Button_Text2       dec [boolBut]   .if1:      xor eax, eax   ret endp ; DATA Button_Text1 db 'Hello world!',0 Button_Text2 db 'Hello!',0 boolBut db 0  section '.idata' import data readable writeable   library kernel, 'KERNEL32.DLL',\\           user , 'USER32.DLL'              import kernel,\\           GetModuleHandle, 'GetModuleHandleA',\\           ExitProcess, 'ExitProcess'              import user,\\           DialogBoxParam, 'DialogBoxParamA',\\           EndDialog, 'EndDialog',\\           SetDlgItemText, 'SetDlgItemTextA'  section '.rsrc' resource data readable directory RT_DIALOG, dialogs   resource dialogs, 1, LANG_ENGLISH, form1      dialog form1, 'My Window1', 100, 100, 100, 50,\\   WS_VISIBLE+WS_CAPTION+WS_SYSMENU        dialogitem 'Button', 'hi', 2,10,15,70,15,WS_VISIBLE   enddialog<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e<\/h2>\n<p>\u0412\u0441\u0435 \u0442\u043e\u0436\u0435 \u0447\u0442\u043e \u0438 \u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>format PE GUI 4.0 entry start include 'win32a.inc' section '.code' code readable writeable executable start:   invoke GetModuleHandle, 0   invoke CreateDialogParam, eax, 1, 0, DialogProc, 0   mov [hDialog], eax      StartLoop:     invoke GetMessage, msg, NULL, 0, 0     cmp eax, 1     jb Exit       invoke IsDialogMessage, [hDialog], msg   jmp StartLoop   Exit:     invoke ExitProcess, 0  proc DialogProc hwnddlg, msg, wparam, lparam   xor eax, eax   cmp [msg], WM_CLOSE   jne @f     invoke DestroyWindow, [hwnddlg]     invoke PostQuitMessage, 0   @@:   xor eax,eax ret endp  msg MSG hDialog dd 0  section '.idata' import data readable writeable   library kernel, 'KERNEL32.DLL',\\           user, 'USER32.DLL'              import kernel,\\           GetModuleHandle, 'GetModuleHandleA',\\           ExitProcess, 'ExitProcess'              import user,\\           CreateDialogParam, 'CreateDialogParamA',\\           DestroyWindow, 'DestroyWindow',\\           GetMessage, 'GetMessageA',\\           IsDialogMessage, 'IsDialogMessageA',\\           PostQuitMessage, 'PostQuitMessage'            section '.rsrc' resource data readable directory RT_DIALOG, dialogs resource dialogs,1,LANG_ENGLISH, form1   dialog form1, 'New Window', 100, 100, 100, 50,\\   WS_VISIBLE+WS_CAPTION+WS_SYSMENU+DS_CENTER      enddialog<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u043e\u0431\u044b\u0447\u043d\u043e\u0435 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435) \u043e\u043a\u043d\u043e<\/h2>\n<p>\u041e\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430: \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f: <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-createwindowexa\" rel=\"noopener noreferrer nofollow\">CreateWindowExA<\/a><\/p>\n<p>\u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441: <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-registerclassa\" rel=\"noopener noreferrer nofollow\">RegisterClassA<\/a><\/p>\n<p>\u0426\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<pre><code>@@:   invoke GetMessage, msg, [hwnd], 0, 0   test eax, eax   jz @f   invoke TranslateMessage, msg   invoke DispatchMessage, msg   jmp @b @@:<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043a\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>format PE GUI 4.0 entry Start  include 'win32a.inc'  section '.code' code readable writeable executable  proc WinProc, hWnd, msg, wParam, lParam   cmp [msg], WM_CLOSE   jne @f     invoke DestroyWindow, [hWnd]     jmp .Exit   @@:      cmp [msg], WM_DESTROY   jne @f     invoke ExitProcess,0     @@:      .Exit:     invoke DefWindowProc, [hWnd], [msg], [wParam], [lParam] ret endp  Start:          invoke GetModuleHandle, 0     mov [wnd.hInstance], eax          invoke RegisterClass, wnd     test eax, eax     jnz @f       invoke MessageBox, 0, Error.FailRegisterClass, Error.Text, MB_OK+MB_ICONERROR       jmp Exit     @@:          invoke CreateWindowEx, 0, ClassName, WindowName, WS_OVERLAPPEDWINDOW + WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, 0, 0, [wnd.hInstance], 0     test eax, eax     jnz @f       invoke MessageBox, 0, Error.FailCreateWindow, Error.Text, MB_OK+MB_ICONERROR       jmp Exit     @@:          mov [hwnd], eax          @@:       invoke GetMessage, msg, [hwnd], 0, 0       test eax, eax       jz @f       invoke TranslateMessage, msg       invoke DispatchMessage, msg       jmp @b     @@:      Exit:      invoke ExitProcess,0  section '.data' data readable writeable      ClassName db 'WinClass',0     WindowName db 'Window Proj',0          hwnd dd 0          msg MSG     wnd WNDCLASS 0, WinProc, 0, 0, 0, 0, 0, COLOR_WINDOW, 0, ClassName         Error:       .Text db 'Error',0       .FailRegisterClass db 'RegisterClassA - Fail',0       .FailCreateWindow db 'CreateWindowExA - Fail',0  section '.idata' import readable writeable    library kernel, 'kernel32.dll',\\           user, 'user32.dll'      import kernel,\\           ExitProcess, 'ExitProcess',\\           GetModuleHandle, 'GetModuleHandleA'              import user,\\           MessageBox, 'MessageBoxA',\\           RegisterClass, 'RegisterClassA',\\           CreateWindowEx, 'CreateWindowExA',\\           GetMessage, 'GetMessageA',\\           TranslateMessage, 'TranslateMessage',\\           DispatchMessage, 'DispatchMessageA',\\           DestroyWindow, 'DestroyWindow',\\           PostQuitMessage, 'PostQuitMessage',\\           DefWindowProc, 'DefWindowProcA'<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>format PE GUI 4.0 entry Start  include 'win32ax.inc'  section '.code' code readable writeable executable  proc WinProc, hWnd, msg, wParam, lParam   cmp [msg], WM_CLOSE   jne @f     invoke DestroyWindow, [hWnd]     jmp .Exit   @@:      cmp [msg], WM_DESTROY   jne @f     invoke ExitProcess,0     @@:      cmp [msg], WM_COMMAND   jne @f     mov eax, [hwndButton]     cmp [lParam], eax     jne @f       invoke MessageBox, 0, 'Hi', 'Hello', MB_OK     @@:         .Exit:     invoke DefWindowProc, [hWnd], [msg], [wParam], [lParam] ret endp  Start:          invoke GetModuleHandle, 0     mov [wnd.hInstance], eax          invoke RegisterClass, wnd     test eax, eax     jnz @f       invoke MessageBox, 0, Error.FailRegisterClass, Error.Text, MB_OK+MB_ICONERROR       jmp Exit     @@:          invoke CreateWindowEx, 0, ClassName, WindowName, WS_OVERLAPPEDWINDOW + WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, 0, 0, [wnd.hInstance], 0     test eax, eax     jnz @f       invoke MessageBox, 0, Error.FailCreateWindow, Error.Text, MB_OK+MB_ICONERROR       jmp Exit     @@:     mov [hwnd], eax          invoke CreateWindowEx, 0, ClassButton, ButtonName, WS_VISIBLE+WS_CHILD, 10, 10, 50, 30, eax, 0, [wnd.hInstance], 0     mov [hwndButton], eax          @@:       invoke GetMessage, msg, [hwnd], 0, 0       test eax, eax       jz @f       invoke TranslateMessage, msg       invoke DispatchMessage, msg       jmp @b     @@:      Exit:      invoke ExitProcess,0  section '.data' data readable writeable      ClassName db 'WinClass',0     WindowName db 'Window Proj',0     ClassButton db 'BUTTON',0     ButtonName db 'Hello',0          hwnd dd 0     hwndButton dd 0          msg MSG     wnd WNDCLASS 0, WinProc, 0, 0, 0, 0, 0, COLOR_WINDOW, 0, ClassName         Error:       .Text db 'Error',0       .FailRegisterClass db 'RegisterClassA - Fail',0       .FailCreateWindow db 'CreateWindowExA - Fail',0  section '.idata' import readable writeable    library kernel, 'kernel32.dll',\\           user, 'user32.dll'      import kernel,\\           ExitProcess, 'ExitProcess',\\           GetModuleHandle, 'GetModuleHandleA'              import user,\\           MessageBox, 'MessageBoxA',\\           RegisterClass, 'RegisterClassA',\\           CreateWindowEx, 'CreateWindowExA',\\           GetMessage, 'GetMessageA',\\           TranslateMessage, 'TranslateMessage',\\           DispatchMessage, 'DispatchMessageA',\\           DestroyWindow, 'DestroyWindow',\\           PostQuitMessage, 'PostQuitMessage',\\           DefWindowProc, 'DefWindowProcA'<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/577372\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">40% <\/span><span class=\"tm-article-poll__answer-label\">\u0414\u0430<\/span><span class=\"tm-article-poll__answer-votes\">28<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 40%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">60% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0435\u0442<\/span><span class=\"tm-article-poll__answer-votes\">42<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 60%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 70 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 17 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/577372\/\"> https:\/\/habr.com\/ru\/articles\/577372\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0441\u0431\u043e\u0440\u043d\u0438\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0441 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043e WinAPI | FASM. \u041a\u0430\u043a\u0438\u0435 \u043e\u043a\u043d\u0430 \u0431\u044b\u0432\u0430\u044e\u0442 \u0432 Windows.<\/p>\n<p>\u041e\u043a\u043d\u0430 \u0431\u044b\u0432\u0430\u044e\u0442: \u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e, \u043d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e, \u043e\u0431\u044b\u0447\u043d\u043e\u0435 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435) \u043e\u043a\u043d\u043e. (\u044d\u0442\u043e \u0432\u0441\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0437\u043d\u0430\u044e)<\/p>\n<ul>\n<li>\n<p>\u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430, \u043e\u043d\u0430 \u0432\u0435\u0440\u043d\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-enddialog\" rel=\"noopener noreferrer nofollow\">EndDialog<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u0442\u043e\u0436\u0435 \u0447\u0442\u043e \u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e, \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e\u0435 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435) \u043e\u043a\u043d\u043e \u0442\u043e\u0436\u0435 \u0447\u0442\u043e \u0438 \u043d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u0441\u0430\u043c\u0438\u043c.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e<\/h2>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-dialogboxparama\" rel=\"noopener noreferrer nofollow\">DialogBoxParam <\/a>&#8212; \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u0438\u0437 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041a\u043e\u0434 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f  <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-enddialog\" rel=\"noopener noreferrer nofollow\">EndDialog<\/a>.<\/p>\n<p><code>invoke DialogBoxParamA hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam<\/code><\/p>\n<p>hInstance &#8212; \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043c\u043e\u0434\u0443\u043b\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/libloaderapi\/nf-libloaderapi-getmodulehandlea\" rel=\"noopener noreferrer nofollow\">GetModuleHandle<\/a>.<\/p>\n<p>lpTemplateName &#8212; \u043d\u043e\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445.<\/p>\n<p>hWndParent &#8212; hWnd \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u0438\u043b\u0438 Null.<\/p>\n<p>lpDialogFunc &#8212; \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443.<\/p>\n<p>dwInitParam &#8212; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 lParam (\u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443).<\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-dialogboxindirectparama\" rel=\"noopener noreferrer nofollow\">DialogBoxIndirectParamA <\/a>&#8212; \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<h4>_\u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430<\/h4>\n<p>\u042d\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c False, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0435 False \u0438 Windows \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430 \u0432\u0430\u0441.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b:<\/p>\n<pre><code>proc DialogProc hwnddlg, msg, wparam, lparam   cmp [msg], WM_CLOSE   jne @f     invoke EndDialog, [hwnddlg], 0 ; \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u0430   @@:   xor eax, eax ; return false   ret endp<\/code><\/pre>\n<h4>__\u0420\u0435\u0441\u0443\u0440\u0441\u044b, \u0448\u0430\u0431\u043b\u043e\u043d\u044b<\/h4>\n<pre><code>section '.rsrc' resource data readable directory RT_DIALOG, dialogs   resource dialogs, 1,\\ ; 1 - \u043d\u043e\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430   LANG_ENGLISH, form1      dialog form1, 'My Window',\\ ; \u0438\u043c\u044f \u043e\u043a\u043d\u0430   100, 100, 100, 50,\\ ; \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043e\u043a\u043d\u0430\\\u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430   WS_VISIBLE+WS_CAPTION+WS_SYSMENU ; \u0441\u0442\u0438\u043b\u0438 \u043e\u043a\u043d\u0430    enddialog<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>format PE GUI 4.0 entry start include 'win32a.inc' section '.code' code readable writeable executable start:   invoke GetModuleHandle, 0   invoke DialogBoxParam, eax, 1, 0, DialogProc, 0   invoke ExitProcess, 0    proc DialogProc hwnddlg, msg, wparam, lparam   cmp [msg], WM_CLOSE   jne @f     invoke EndDialog, [hwnddlg], 0   @@:      cmp [msg], WM_COMMAND   jne .if1     cmp [boolBut], 0     jne @f       invoke SetDlgItemText, [hwnddlg], 2, Button_Text1       inc [boolBut]       jmp .if1     @@:       invoke SetDlgItemText, [hwnddlg], 2, Button_Text2       dec [boolBut]   .if1:      xor eax, eax   ret endp ; DATA Button_Text1 db 'Hello world!',0 Button_Text2 db 'Hello!',0 boolBut db 0  section '.idata' import data readable writeable   library kernel, 'KERNEL32.DLL',\\           user , 'USER32.DLL'              import kernel,\\           GetModuleHandle, 'GetModuleHandleA',\\           ExitProcess, 'ExitProcess'              import user,\\           DialogBoxParam, 'DialogBoxParamA',\\           EndDialog, 'EndDialog',\\           SetDlgItemText, 'SetDlgItemTextA'  section '.rsrc' resource data readable directory RT_DIALOG, dialogs   resource dialogs, 1, LANG_ENGLISH, form1      dialog form1, 'My Window1', 100, 100, 100, 50,\\   WS_VISIBLE+WS_CAPTION+WS_SYSMENU        dialogitem 'Button', 'hi', 2,10,15,70,15,WS_VISIBLE   enddialog<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e<\/h2>\n<p>\u0412\u0441\u0435 \u0442\u043e\u0436\u0435 \u0447\u0442\u043e \u0438 \u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>format PE GUI 4.0 entry start include 'win32a.inc' section '.code' code readable writeable executable start:   invoke GetModuleHandle, 0   invoke CreateDialogParam, eax, 1, 0, DialogProc, 0   mov [hDialog], eax      StartLoop:     invoke GetMessage, msg, NULL, 0, 0     cmp eax, 1     jb Exit       invoke IsDialogMessage, [hDialog], msg   jmp StartLoop   Exit:     invoke ExitProcess, 0  proc DialogProc hwnddlg, msg, wparam, lparam   xor eax, eax   cmp [msg], WM_CLOSE   jne @f     invoke DestroyWindow, [hwnddlg]     invoke PostQuitMessage, 0   @@:   xor eax,eax ret endp  msg MSG hDialog dd 0  section '.idata' import data readable writeable   library kernel, 'KERNEL32.DLL',\\           user, 'USER32.DLL'              import kernel,\\           GetModuleHandle, 'GetModuleHandleA',\\           ExitProcess, 'ExitProcess'              import user,\\           CreateDialogParam, 'CreateDialogParamA',\\           DestroyWindow, 'DestroyWindow',\\           GetMessage, 'GetMessageA',\\           IsDialogMessage, 'IsDialogMessageA',\\           PostQuitMessage, 'PostQuitMessage'            section '.rsrc' resource data readable directory RT_DIALOG, dialogs resource dialogs,1,LANG_ENGLISH, form1   dialog form1, 'New Window', 100, 100, 100, 50,\\   WS_VISIBLE+WS_CAPTION+WS_SYSMENU+DS_CENTER      enddialog<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u043e\u0431\u044b\u0447\u043d\u043e\u0435 (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435) \u043e\u043a\u043d\u043e<\/h2>\n<p>\u041e\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0435\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430: \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f: <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-createwindowexa\" rel=\"noopener noreferrer nofollow\">CreateWindowExA<\/a><\/p>\n<p>\u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441: <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/api\/winuser\/nf-winuser-registerclassa\" rel=\"noopener noreferrer nofollow\">RegisterClassA<\/a><\/p>\n<p>\u0426\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<pre><code>@@:   invoke GetMessage, msg, [hwnd], 0, 0   test eax, eax   jz @f   invoke TranslateMessage, msg   invoke DispatchMessage, msg   jmp @b @@:<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043a\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>format PE GUI 4.0 entry Start  include 'win32a.inc'  section '.code' code readable writeable executable  proc WinProc, hWnd, msg, wParam, lParam   cmp [msg], WM_CLOSE   jne @f     invoke DestroyWindow, [hWnd]     jmp .Exit   @@:      cmp [msg], WM_DESTROY   jne @f     invoke ExitProcess,0     @@:      .Exit:     invoke DefWindowProc, [hWnd], [msg], [wParam], [lParam] ret endp  Start:          invoke GetModuleHandle, 0     mov [wnd.hInstance], eax          invoke RegisterClass, wnd     test eax, eax     jnz @f       invoke MessageBox, 0, Error.FailRegisterClass, Error.Text, MB_OK+MB_ICONERROR       jmp Exit     @@:          invoke CreateWindowEx, 0, ClassName, WindowName, WS_OVERLAPPEDWINDOW + WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, 0, 0, [wnd.hInstance], 0     test eax, eax     jnz @f       invoke MessageBox, 0, Error.FailCreateWindow, Error.Text, MB_OK+MB_ICONERROR       jmp Exit     @@:          mov [hwnd], eax          @@:       invoke GetMessage, msg, [hwnd], 0, 0       test eax, eax       jz @f       invoke TranslateMessage, msg       invoke DispatchMessage, msg       jmp @b     @@:      Exit:      invoke ExitProcess,0  section '.data' data readable writeable      ClassName db 'WinClass',0     WindowName db 'Window Proj',0          hwnd dd 0          msg MSG     wnd WNDCLASS 0, WinProc, 0, 0, 0, 0, 0, COLOR_WINDOW, 0, ClassName         Error:       .Text db 'Error',0       .FailRegisterClass db 'RegisterClassA - Fail',0       .FailCreateWindow db 'CreateWindowExA - Fail',0  section '.idata' import readable writeable    library kernel, 'kernel32.dll',\\           user, 'user32.dll'      import kernel,\\           ExitProcess, 'ExitProcess',\\           GetModuleHandle, 'GetModuleHandleA'              import user,\\           MessageBox, 'MessageBoxA',\\           RegisterClass, 'RegisterClassA',\\           CreateWindowEx, 'CreateWindowExA',\\           GetMessage, 'GetMessageA',\\           TranslateMessage, 'TranslateMessage',\\           DispatchMessage, 'DispatchMessageA',\\           DestroyWindow, 'DestroyWindow',\\           PostQuitMessage, 'PostQuitMessage',\\           DefWindowProc, 'DefWindowProcA'<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>format PE GUI 4.0 entry Start  include 'win32ax.inc'  section '.code' code readable writeable executable  proc WinProc, hWnd, msg, wParam, lParam   cmp [msg], WM_CLOSE   jne @f     invoke DestroyWindow, [hWnd]     jmp .Exit   @@:      cmp [msg], WM_DESTROY   jne @f     invoke ExitProcess,0     @@:      cmp [msg], WM_COMMAND   jne @f     mov eax, [hwndButton]     cmp [lParam], eax     jne @f       invoke MessageBox, 0, 'Hi', 'Hello', MB_OK     @@:         .Exit:     invoke DefWindowProc, [hWnd], [msg], [wParam], [lParam] ret endp  Start:          invoke GetModuleHandle, 0     mov [wnd.hInstance], eax          invoke RegisterClass, wnd     test eax, eax     jnz @f       invoke MessageBox, 0, Error.FailRegisterClass, Error.Text, MB_OK+MB_ICONERROR       jmp Exit     @@:          invoke CreateWindowEx, 0, ClassName, WindowName, WS_OVERLAPPEDWINDOW + WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, 0, 0, [wnd.hInstance], 0     test eax, eax     jnz @f       invoke MessageBox, 0, Error.FailCreateWindow, Error.Text, MB_OK+MB_ICONERROR       jmp Exit     @@:     mov [hwnd], eax          invoke CreateWindowEx, 0, ClassButton, ButtonName, WS_VISIBLE+WS_CHILD, 10, 10, 50, 30, eax, 0, [wnd.hInstance], 0     mov [hwndButton], eax          @@:       invoke GetMessage, msg, [hwnd], 0, 0       test eax, eax       jz @f       invoke TranslateMessage, msg       invoke DispatchMessage, msg       jmp @b     @@:      Exit:      invoke ExitProcess,0  section '.data' data readable writeable      ClassName db 'WinClass',0     WindowName db 'Window Proj',0     ClassButton db 'BUTTON',0     ButtonName db 'Hello',0          hwnd dd 0     hwndButton dd 0          msg MSG     wnd WNDCLASS 0, WinProc, 0, 0, 0, 0, 0, COLOR_WINDOW, 0, ClassName         Error:       .Text db 'Error',0       .FailRegisterClass db 'RegisterClassA - Fail',0       .FailCreateWindow db 'CreateWindowExA - Fail',0  section '.idata' import readable writeable    library kernel, 'kernel32.dll',\\           user, 'user32.dll'      import kernel,\\           ExitProcess, 'ExitProcess',\\           GetModuleHandle, 'GetModuleHandleA'              import user,\\           MessageBox, 'MessageBoxA',\\           RegisterClass, 'RegisterClassA',\\           CreateWindowEx, 'CreateWindowExA',\\           GetMessage, 'GetMessageA',\\           TranslateMessage, 'TranslateMessage',\\           DispatchMessage, 'DispatchMessageA',\\           DestroyWindow, 'DestroyWindow',\\           PostQuitMessage, 'PostQuitMessage',\\           DefWindowProc, 'DefWindowProcA'<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/577372\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">40% <\/span><span class=\"tm-article-poll__answer-label\">\u0414\u0430<\/span><span class=\"tm-article-poll__answer-votes\">28<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 40%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">60% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0435\u0442<\/span><span class=\"tm-article-poll__answer-votes\">42<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 60%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"><\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-407204","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/407204","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=407204"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/407204\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=407204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=407204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=407204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}