Форум программистов, компьютерный форум, киберфорум
Assembler: MASM64, х64/long mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/86: Рейтинг темы: голосов - 86, средняя оценка - 4.51
Модератор
Эксперт по компьютерным сетям
1760 / 669 / 141
Регистрация: 10.06.2009
Сообщений: 2,601
1

Masm64 and FASM64, win_API, Examples

22.03.2015, 23:19. Показов 17006. Ответов 41
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Предисловие.
По скорости написания программы: макро ассемблеры, требуют меньше времени чем любой другой язык программирования.


Наша собственная "студия"
Masm64 - Набор макросов
link и ml64 из x86_amd64. v.9.0 или link из amd64
x64dbg Для удобства работы.
и/или
IDA Мне лично нравится консольная версия.
и/или
Hiew - Hacker's view
и/или
FARManager или аналоги
Данный список будет дополняться

И так вы собрали свою начальную лабораторию для работы.

Example 0

main64.asm

make64.bat
Код
@echo off

if not exist rsrc.rc goto empty
rc /v rsrc.rc
cvtres /machine:ix86 rsrc.res
:empty

if exist "%1.obj" del "%1.obj"
if exist "%1.exe" del "%1.exe"

D:\masm\masm64\bin\ml64 /I"D:\masm\masm64\include" /c /Cp "%1.asm"
if errorlevel 1 goto errasm

if not exist rsrc.obj goto nores

D:\masm\masm64\bin\Link /SUBSYSTEM:WINDOWS /OPT:NOREF "%1.obj" rsrc.res
if errorlevel 1 goto errlink

dir "%1.*"
goto TheEnd

:nores
D:\masm\masm64\bin\Link /LIBPATH:"D:\masm\masm64\lib" /ENTRY:WinMain /SUBSYSTEM:WINDOWS /ALIGN:16 /stub:stub.exe "%1.obj"
if errorlevel 1 goto errlink
dir "%1.*"
goto TheEnd

:errlink
echo _
echo Link error
goto TheEnd

:errasm
echo _
echo Assembly Error
goto TheEnd

:TheEnd
call debug.exe "%1.exe"

makecon64.bat
Код
@echo off

if not exist rsrc.rc goto empty
rc /v rsrc.rc
cvtres /machine:ix86 rsrc.res
:empty

if exist "%1.obj" del "%1.obj"
if exist "%1.exe" del "%1.exe"

D:\masm\masm64\bin\ml64 /I"D:\masm\masm64\include" /c /Cp "%1.asm"
if errorlevel 1 goto errasm

if not exist rsrc.obj goto nores

D:\masm\masm64\bin\Link /SUBSYSTEM:CONSOLE /OPT:NOREF "%1.obj" rsrc.res
if errorlevel 1 goto errlink

dir "%1.*"
goto TheEnd

:nores
D:\masm\masm64\bin\Link /LIBPATH:"D:\masm\masm64\lib"  /MERGE:.data=.text  /MERGE:.rdata=.text /ENTRY:WinMain /SUBSYSTEM:CONSOLE /ALIGN:16 /stub:stub.exe "%1.obj"
if errorlevel 1 goto errlink
dir "%1.*"
goto TheEnd

:errlink
echo _
echo Link error
goto TheEnd

:errasm
echo _
echo Assembly Error
goto TheEnd

:TheEnd
call debug.exe "%1.exe"


MERGE:.rdata=.text - Мы помещаем не инициализированные переменные в сегмент .text
MERGE:.data=.text - Мы помещаем инициализированные переменные в сегмент .text
ALIGN:16 - Уменьшаем размер готового бинарника
stub:stub.exe - Заголовок программы

call AllocConsole или invoke AllocConsole Очень важна если компилироваться под WINDOWS. А если компилироваться под CONSOLE можно данный вызов опустить.

Ну вот мы написали своё первое консольное приложение для win64, научились его собирать в готовый бинарник.
Дальше я-бы предложил его доработать в TASM, но это совсем другая история.

p.s.
Думаю к концу данной темы мы получим консольную обёртку для написания собственного приложения.
Прошу ваши предложения для написания 1-го примера приложения.
Самый красивый и лаконичный язык программирования, Машинный Код. (с)
Это мой первый пост на данном форуме, сильно не пинайте.

Добавлено через 4 часа 18 минут
Example 1
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
OPTION DOTNAME
option casemap:none
 
include temphls.inc
include win64.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
 
OPTION PROLOGUE:rbpFramePrologue
OPTION EPILOGUE:rbpFrameEpilogue
 
.data
msgtw    db 'cp1251 Привет из консоли!',13,10
msgtr    db ?
stdout   dd ?
stdin    dd ?
cWritten dd ?
cReaden  dd ?
color    db 0FFh
 
.code
WinMain proc <12> ;parmarea 1*8 bytes
LOCAL msg:MSG
    call  AllocConsole                                     ;New Console?
    invoke SetConsoleCP, 1251                              ;Console chcp1251
    invoke  SetConsoleOutputCP, 1251                       ;Output  chcp1251
 
    invoke  GetStdHandle, STD_INPUT_HANDLE
    mov stdin,  eax
    invoke  GetStdHandle, STD_OUTPUT_HANDLE
    mov stdout, eax
 
    invoke  SetConsoleMode, eax, ENABLE_PROCESSED_OUTPUT
 
;0x00 Black        - Black #000000 - #000000
;0x01 Navy Blue    - Black #000080 - #000000
;0x02 Green        - Black #008000 - #000000
;0x03 Teal         - Black #008080 - #000000
;0x04 Maroon       - Black #800000 - #000000
;0x05 Purple       - Black #800080 - #000000
;0x06 Olive        - Black #808000 - #000000
;0x07 Silver       - Black #c0c0c0 - #000000
;0x08 Gray         - Black #808080 - #000000
;0x09 Blue         - Black #0000ff - #000000
;0x0A Lime         - Black #00ff00 - #000000
;0x0B Cyan         - Black #00ffff - #000000
;0x0C Red          - Black #ff0000 - #000000
;0x0D Magenta      - Black #ff00ff - #000000
;0x0E Yellow       - Black #ffff00 - #000000
;0x0F White        - Black #ffffff - #000000
    xor rax, rax
    mov rax, 0FFh - 16 цветов фона и 16 цветов текста
metka:
    push rax ; в стек
    invoke  SetConsoleTextAttribute, stdout, rax ; rax берём из регистра
    invoke  WriteConsole, stdout, ADDR msgtw, sizeof msgtw, ADDR cWritten, NULL
    pop rax ; из стека
    SUB rax, 1 ; минус -1
    jnz metka ; если не ноль повторим
 
    invoke  FlushConsoleInputBuffer
    invoke  ReadConsole,   stdin, ADDR msgtr, SIZEOF msgtr, ADDR  cReaden, NULL
 
    invoke  FreeConsole
;invoke ExitProcess,0 
;    xor     eax, eax
    call    ExitProcess
ret
WinMain endp
end


пример цикла, я рад увидеть ваши предложения по поводу модификации данного цикла.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2015, 23:19
Ответы с готовыми решениями:

Как в FASM64 вывести число на экран?
Писал только на MASM под DOS решил попробовать FASM format PE64 GUI entry start include...

Bootstrap examples н
Вот только начинаю разбираться с Bootstrap, беру вот этот сэмпл...

Borland/CBuilder6/Examples
Если у кого нибудь есть C++Builder 6, вышлите пожалуйста папочку Examples. Она лежит &quot;Корневой...

The type `Examples.Collections.Generic.Node<T>' does not contain a constructor that takes `0' arguments
Ошибка: в: using System; namespace Examples.Collections.Generic { public class Node2&lt;T&gt; :...

41
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
16.04.2015, 06:40 21
Author24 — интернет-сервис помощи студентам
Win64. Мышь
В отличии от Урока 7 Iczelion'a где обрабатывалось событие по нажатию левой клавиши мыши и выводилась единственная надпись "Our First Window", мы будем обрабатывать нажатие на левую и правую клавиши мыши и будем выводить надписи "Нажата левая клавиша" и "Нажата правая клавиша" и этих надписей будет столько, какое значение мы присвоим константе MAXRECTS. Если количество нажатий превысит число MAXRECTS ― будет раздаваться звуковой сигнал. Координаты кликов запоминаются, чтобы убедиться в этом ― измените размер окна и снова восстановить его...
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
format PE64 GUI 5.0
entry WinMain
include 'win64a.inc'
MAXRECTS = 40;максимальное количество обрабатываемых кликов мыши
 
section '.text' code readable writeable executable
  _class TCHAR 'Iczelion Tutorial #7:Mouse Input in FASM',0 ;name of our window and name of class
text1   db 'Нажата правая кнопка'
text2   db 'Нажата левая кнопка'
PS  dq 0,0,text2-text1, text1, PS-text2, text2
recs    rd MAXRECTS
nextRect dd -1
 
WinMain:
IMAGE_BASE = $-rva $
msg    equ rbp-sizeof.MSG
      enter 90h,0
      ; +------------------------------+
      ; | registering the window class |
      ; +------------------------------+
      add rsp,50h
      xor ebx,ebx
      push 10027h   ;hIconSm
      lea edi,[_class]
      push rdi    ;lpszClassName
      push rbx    ;lpszMenuName
      push COLOR_WINDOW;hbrBackground
      push 10005h     ;hCursor
      push 10027h        ;hIcon
      mov esi,IMAGE_BASE
      push rsi    ;hInstance
      push rbx    ;cbClsExtra & cbWndExtra
      lea eax,[WindowProc]
      push rax    ;lpfnWndProc
      push sizeof.WNDCLASSEX;cbSize & style
      mov rcx,rsp     ;addr WNDCLASSEX
      sub rsp,20h
      call [RegisterClassEx]
      ; +--------------------------+
      ; | creating the main window |
      ; +--------------------------+
      sub rsp,40h
      push rbx
      push rsi    ;rsi=400000h
      shl esi,9   ;rsi=CW_USEDEFAULT
      push rbx
      push rbx
      push rsi
      push rsi
      push rsi
      push rsi
      mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
      mov r8,rdi      ;offset ClassName
      mov edx,edi     ;offset ClassName
      xor ecx,ecx
      sub rsp,20h
      call [CreateWindowEx]
      lea edi,[msg]
      ; +---------------------------+
      ; | entering the message loop |
      ; +---------------------------+
window_message_loop_start:
      mov ecx,edi
      xor edx,edx
      mov r8,rbx
      mov r9,rbx
      call [GetMessage]
      mov ecx,edi
      call [DispatchMessage]
      jmp  window_message_loop_start
;---------------------------------------------
      ; +----------------------+
      ; | the window procedure |
      ; +----------------------+
WindowProc:
hWnd        equ rbp+10h
lParam      equ rbp+28h
 
ps      equ rbp-sizeof.PAINTSTRUCT
        enter sizeof.PAINTSTRUCT+38h,0
 
        mov [lParam],r9
        mov [hWnd],rcx
        xor eax,eax
        cmp edx,WM_LBUTTONDOWN
        je wmLBUTTONDOWN
        cmp edx,WM_RBUTTONDOWN
        je wmRBUTTONDOWN
        cmp edx,WM_PAINT
        je wmPAINT
        cmp edx,WM_DESTROY
        je wmDESTROY
        leave
        jmp [DefWindowProc]
wmDESTROY:  xor ecx,ecx
        call [ExitProcess]
wmLBUTTONDOWN:  ;low order lParam  = x
        ;high order lParam = y
        mov eax,80000000h
wmRBUTTONDOWN:  add eax,[lParam]
        cmp [nextRect],MAXRECTS-1 
        jge @f 
        inc [nextRect] 
        mov ecx,[nextRect]
        mov [ecx*4+recs],eax
        xor edx,edx
        mov rcx,[hWnd]
        mov r8d,TRUE
        call [InvalidateRect]
        jmp wmBYE
@@:     xor ecx,ecx
        call [MessageBeep]
        jmp  wmBYE
wmPAINT:    mov ebx,[nextRect]
        inc ebx;cmp nextRect,-1
        jz wmBYE
        lea edx,[ps]
        call [BeginPaint]
        mov edx,TRANSPARENT
        mov rcx,rax
        call [SetBkMode]
@@:     mov eax,[ebx*4+recs-4]
        mov ecx,1
        shl eax,1
        adc ecx,0
        shr eax,1
        shl ecx,4
        xor edx,edx
        mov dx,ax;nYStart
        shr eax,16
        mov r8d,eax;nXStart
        mov rax,[PS+ecx]
        mov [rsp+20h],rax;cchString
        mov r9,[PS+ecx+8];lpString
        mov rcx,[ps+PAINTSTRUCT.hdc];hdc
        call [TextOut];
        dec  ebx
        jnz @b
wmPAINT_END:    lea edx,[ps]
        mov rcx,[hWnd]
        call [EndPaint]
wmBYE:      leave
        retn
;-------------------------------------------
data import
     library KERNEL32, 'KERNEL32.DLL',\ 
     user32,   'USER32.DLL',\ 
     GDI32,    'GDI32.DLL' 
 import KERNEL32,\ 
           ExitProcess,    'ExitProcess' 
 import user32,\ 
        RegisterClassEx,      'RegisterClassExA',\
        CreateWindowEx,     'CreateWindowExA',\ 
        DefWindowProc,      'DefWindowProcA',\ 
        GetMessage,     'GetMessageA',\ 
        BeginPaint,     'BeginPaint',\ 
        EndPaint,       'EndPaint',\ 
        DispatchMessage,    'DispatchMessageA',\ 
        InvalidateRect,     'InvalidateRect',\ 
        MessageBeep,        'MessageBeep' 
  import    GDI32,\ 
           TextOut,        'TextOutA',\ 
           SetBkMode,      'SetBkMode'
end data
Миниатюры
Masm64 and FASM64, win_API, Examples  
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
16.04.2015, 09:49 22
Win64. Простой битмэп
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
format PE64 GUI 5.0
entry WinMain
include 'win64a.inc'
 
 
section '.text' code readable writeable executable
 
  _class TCHAR 'Images\tweety78.bmp',0
WinMain:
IMAGE_BASE = $-rva $
msg    equ rbp-sizeof.MSG
      enter 90h,0
      ; +------------------------------+ 
      ; | registering the window class | 
      ; +------------------------------+
 
 
      xor ebx,ebx
      lea edi,[_class]
      mov esi,IMAGE_BASE
      mov qword [rbp-68h],LR_LOADFROMFILE;qword [rsp+28h],LR_LOADFROMFILE
      mov [rbp-70h],rbx;[rsp+20h],rbx
      mov r9,rbx
      mov r8,rbx
      mov edx,edi
      mov ecx,esi
      call [LoadImage]
      mov rcx,rax
      call [CreatePatternBrush]
      add rsp,50h
      push 10027h   ;hIconSm
      push rdi    ;lpszClassName
      push rbx    ;lpszMenuName
      push rax    ;hbrBackground
      push 10005h     ;hCursor
      push 10027h     ;hIcon
      push rsi    ;hInstance
      push rbx    ;cbClsExtra & cbWndExtra
      lea eax,[WindowProc]
      push rax    ;lpfnWndProc
      push sizeof.WNDCLASSEX;cbSize & style
      mov rcx,rsp     ;addr WNDCLASSEX
      sub rsp,20h
      call [RegisterClassEx]
      ; +--------------------------+
      ; | creating the main window |
      ; +--------------------------+
      sub rsp,40h
      push rbx
      push rsi    ;rsi=400000h
      shl esi,9   ;rsi=CW_USEDEFAULT
      push rbx
      push rbx
      push 305
      push 286
      push rsi
      push rsi
      mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE-WS_MAXIMIZEBOX-WS_THICKFRAME
      mov r8,rdi      ;offset ClassName
      mov rdx,rdi     ;offset ClassName
      xor ecx,ecx
      sub rsp,20h
      call [CreateWindowEx]
      lea edi,[msg]
      ; +---------------------------+
      ; | entering the message loop |
      ; +---------------------------+
window_message_loop_start:
      mov ecx,edi
      xor edx,edx
      mov r8,rbx
      mov r9,rbx
      call [GetMessage]
      mov ecx,edi
      call [DispatchMessage]
      jmp  window_message_loop_start
;---------------------------------------------
      ; +----------------------+
      ; | the window procedure |
      ; +----------------------+
WindowProc:
          enter 20h,0
 
          cmp  edx,WM_DESTROY
          je   wmDESTROY
          leave
          jmp [DefWindowProc]
wmDESTROY:    xor ecx,ecx
          call [ExitProcess]
;---------------------------------------------------------------
data import
     library   KERNEL32, 'KERNEL32.DLL',\
           USER32,   'USER32.DLL',\
        GDI32,    'GDI32.DLL'
    
    import  KERNEL32,\
        ExitProcess,        'ExitProcess'
 
    import  USER32,\
        RegisterClassEx,    'RegisterClassExA',\
        CreateWindowEx,     'CreateWindowExA',\
        DefWindowProc,      'DefWindowProcA',\
        GetMessage,     'GetMessageA',\
        DispatchMessage,    'DispatchMessageA',\
        LoadImage,      'LoadImageA'
 
    import  GDI32,\
        CreatePatternBrush, 'CreatePatternBrush'
end data
Миниатюры
Masm64 and FASM64, win_API, Examples  
Вложения
Тип файла: zip ftut25.zip (13.2 Кб, 23 просмотров)
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
16.04.2015, 11:46 23
Win64. Иконка и курсор
В качестве курсора и иконки используем иконку из файла Cursor.cur. Убеждаемся, что разницы между курсором и иконкой нет
Создание курсора и иконки из ресурсов в FASM

Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
format PE64 GUI 5.0
entry WinMain
include 'win64a.inc'
ID_CURSOR = 18
section '.text' code readable writeable executable
  _class TCHAR 'Iczelion Tutorial #7-2: Создание курсора и иконки из ресурсов в FASM',0 ;name of our window and name of class
CurName db  "Images\Cursor.cur",0
 
WinMain:
IMAGE_BASE = $-rva $
msg    equ rbp-sizeof.MSG
      enter 90h,0
      ; +------------------------------+
      ; | registering the window class |
      ; +------------------------------+
      mov esi,IMAGE_BASE
      mov edx,ID_CURSOR
      mov ecx,esi
      call [LoadCursor]
      add rsp,50h
      xor ebx,ebx
      push rax   ;hIconSm
      lea edi,[_class]
      push rdi    ;lpszClassName
      push rbx    ;lpszMenuName
      push COLOR_WINDOW;hbrBackground
      push rax     ;hCursor
      push rax    ;hIcon
      push rsi    ;hInstance
      push rbx    ;cbClsExtra & cbWndExtra
      lea eax,[WindowProc]
      push rax    ;lpfnWndProc
      push sizeof.WNDCLASSEX;cbSize & style
      mov rcx,rsp     ;addr WNDCLASSEX
      sub rsp,20h
      call [RegisterClassEx]
      ; +--------------------------+
      ; | creating the main window |
      ; +--------------------------+
      sub rsp,40h
      push rbx
      push rsi    ;rsi=400000h
      shl esi,9   ;rsi=CW_USEDEFAULT
      push rbx
      push rbx
      push rsi
      push rsi
      push rsi
      push rsi
      mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
      mov r8,rdi      ;offset ClassName
      mov edx,edi     ;offset ClassName
      xor ecx,ecx
      sub rsp,20h
      call [CreateWindowEx]
      lea edi,[msg]
      ; +---------------------------+
      ; | entering the message loop |
      ; +---------------------------+
window_message_loop_start:
      mov ecx,edi
      xor edx,edx
      mov r8,rbx
      mov r9,rbx
      call [GetMessage]
      mov ecx,edi
      call [DispatchMessage]
      jmp  window_message_loop_start
;---------------------------------------------
      ; +----------------------+
      ; | the window procedure |
      ; +----------------------+
WindowProc:
        enter 20h,0
 
        cmp edx,WM_DESTROY
        je wmDESTROY
        leave
        jmp [DefWindowProc]
wmDESTROY:  xor ecx,ecx
        call [ExitProcess]
 
;-------------------------------------------
data import
     library   KERNEL32, 'KERNEL32.DLL',\
           USER32,   'USER32.DLL'
 
     import    KERNEL32,\
           ExitProcess,    'ExitProcess'
 
     import    USER32,\
           RegisterClassEx,    'RegisterClassExA',\
           CreateWindowEx,     'CreateWindowExA',\
           DefWindowProc,      'DefWindowProcA',\
           GetMessage,     'GetMessageA',\
           DispatchMessage,    'DispatchMessageA',\
           LoadCursor,     'LoadCursorA'
end data
data resource
     directory RT_CURSOR,cursors,\
        RT_GROUP_CURSOR,group_cursors
 
  resource cursors,\
       2,LANG_NEUTRAL,cursor1_data
 
  resource group_cursors,\
       ID_CURSOR,LANG_NEUTRAL,cursor1
 
  cursor cursor1,cursor1_data,'Images\cursor.cur'
end data

Создание курсора и иконки из файла
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
format PE64 GUI 5.0
entry WinMain
include 'win64a.inc'
 
section '.text' code readable writeable executable
  _class TCHAR 'Iczelion Tutorial #7-1: Создание курсора и иконки из файла в FASM',0 ;name of our window and name of class
CurName db  "Images\Cursor.cur",0
 
WinMain:
IMAGE_BASE = $-rva $
msg    equ rbp-sizeof.MSG
      enter 90h,0
      ; +------------------------------+
      ; | registering the window class |
      ; +------------------------------+
      lea ecx,[CurName]
      call [LoadCursorFromFile]
      add rsp,50h
      xor ebx,ebx
      push rax   ;hIconSm
      lea edi,[_class]
      push rdi    ;lpszClassName
      push rbx    ;lpszMenuName
      push COLOR_WINDOW;hbrBackground
      push rax     ;hCursor
      push rax    ;hIcon
      mov esi,IMAGE_BASE
      push rsi    ;hInstance
      push rbx    ;cbClsExtra & cbWndExtra
      lea eax,[WindowProc]
      push rax    ;lpfnWndProc
      push sizeof.WNDCLASSEX;cbSize & style
      mov rcx,rsp     ;addr WNDCLASSEX
      sub rsp,20h
      call [RegisterClassEx]
      ; +--------------------------+
      ; | creating the main window |
      ; +--------------------------+
      sub rsp,40h
      push rbx
      push rsi    ;rsi=400000h
      shl esi,9   ;rsi=CW_USEDEFAULT
      push rbx
      push rbx
      push rsi
      push rsi
      push rsi
      push rsi
      mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
      mov r8,rdi      ;offset ClassName
      mov edx,edi     ;offset ClassName
      xor ecx,ecx
      sub rsp,20h
      call [CreateWindowEx]
      lea edi,[msg]
      ; +---------------------------+
      ; | entering the message loop |
      ; +---------------------------+
window_message_loop_start:
      mov ecx,edi
      xor edx,edx
      mov r8,rbx
      mov r9,rbx
      call [GetMessage]
      mov ecx,edi
      call [DispatchMessage]
      jmp  window_message_loop_start
;---------------------------------------------
      ; +----------------------+
      ; | the window procedure |
      ; +----------------------+
WindowProc:
        enter 20h,0
 
        cmp edx,WM_DESTROY
        je wmDESTROY
        leave
        jmp [DefWindowProc]
wmDESTROY:  xor ecx,ecx
        call [ExitProcess]
 
;-------------------------------------------
data import
     library   KERNEL32, 'KERNEL32.DLL',\
           USER32,   'USER32.DLL'
 
     import    KERNEL32,\
           ExitProcess,    'ExitProcess'
 
     import    USER32,\
           RegisterClassEx,    'RegisterClassExA',\
           CreateWindowEx,     'CreateWindowExA',\
           DefWindowProc,      'DefWindowProcA',\
           GetMessage,     'GetMessageA',\
           DispatchMessage,    'DispatchMessageA',\
           LoadCursorFromFile, 'LoadCursorFromFileA'
end data

Функцией DrawIcon рисуем пиктограмму в рабочей области окна заданным контекстом устройства.
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
format PE64 GUI 5.0
entry WinMain
include 'win64a.inc'
ICON_SIZE = 744  ;taille de Icon.ico (header=22 Image=744) total=766
 
section '.text' code readable writeable executable
  _class TCHAR 'Iczelion Tutorial #7-3:Icone datas binaire in  FASM',0 ;name of our window and name of class
hIcon      rq 1
ptIcon     FILE 'Images\Cursor.cur':22   ;sauter le header du fichier d'icone
CursorFile db 'Images\cursor.cur',0
 
WinMain:
IMAGE_BASE = $-rva $
msg    equ rbp-sizeof.MSG
      enter 90h,0
      ; +------------------------------+
      ; | registering the window class |
      ; +------------------------------+
      lea ecx,[CursorFile]
      call [LoadCursorFromFile]
      add rsp,50h
      xor ebx,ebx
      push rax   ;hIconSm
      lea edi,[_class]
      push rdi    ;lpszClassName
      push rbx    ;lpszMenuName
      push COLOR_WINDOW;hbrBackground
      push rax     ;hCursor
      push rax    ;hIcon
      mov esi,IMAGE_BASE
      push rsi    ;hInstance
      push rbx    ;cbClsExtra & cbWndExtra
      lea eax,[WindowProc]
      push rax    ;lpfnWndProc
      push sizeof.WNDCLASSEX;cbSize & style
      mov rcx,rsp     ;addr WNDCLASSEX
      sub rsp,20h
      call [RegisterClassEx]
      ; +--------------------------+
      ; | creating the main window |
      ; +--------------------------+
      sub rsp,40h
      push rbx
      push rsi    ;rsi=400000h
      shl esi,9   ;rsi=CW_USEDEFAULT
      push rbx
      push rbx
      push rsi
      push rsi
      push rsi
      push rsi
      mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
      mov r8,rdi      ;offset ClassName
      mov edx,edi     ;offset ClassName
      xor ecx,ecx
      sub rsp,20h
      call [CreateWindowEx]
      mov r9d,030000h
      or r8d,-1
      mov edx,ICON_SIZE
      lea ecx,[ptIcon]
      call [CreateIconFromResource]
      mov [hIcon],rax
      lea edi,[msg]
      ; +---------------------------+
      ; | entering the message loop |
      ; +---------------------------+
window_message_loop_start:
      mov ecx,edi
      xor edx,edx
      mov r8,rbx
      mov r9,rbx
      call [GetMessage]
      mov ecx,edi
      call [DispatchMessage]
      jmp  window_message_loop_start
;---------------------------------------------
      ; +----------------------+
      ; | the window procedure |
      ; +----------------------+
WindowProc:
hWnd    equ rbp+10h
ps  equ rbp-sizeof.PAINTSTRUCT
        enter sizeof.PAINTSTRUCT+20h,0
 
        cmp edx,WM_DESTROY
        je wmDESTROY
        cmp edx,WM_PAINT
        je wmPAINT
        leave
        jmp [DefWindowProc]
wmDESTROY:  xor ecx,ecx
        call [ExitProcess]
wmPAINT:    lea rdx,[ps]
        call [BeginPaint]
        mov r9,[hIcon]
        mov r8d,68
        mov edx,134
        mov rcx,rax
        call [DrawIcon]
        mov rcx,[hWnd]
        lea rdx,[ps]
        call [EndPaint]
exit:       leave
        retn
;-------------------------------------------
data import
     library   KERNEL32, 'KERNEL32.DLL',\
           USER32,   'USER32.DLL'
 
     import    KERNEL32,\
           ExitProcess,    'ExitProcess'
 
     import    USER32,\
           RegisterClassEx,    'RegisterClassExA',\
           CreateWindowEx,     'CreateWindowExA',\
           DefWindowProc,      'DefWindowProcA',\
           GetMessage,     'GetMessageA',\
           DispatchMessage,    'DispatchMessageA',\
           LoadCursorFromFile, 'LoadCursorFromFileA',\
           BeginPaint,     'BeginPaint',\
           EndPaint,       'EndPaint',\
           DrawIcon,       'DrawIcon',\
           CreateIconFromResource, 'CreateIconFromResource'
end data
Миниатюры
Masm64 and FASM64, win_API, Examples  
Вложения
Тип файла: zip ftut_07.zip (7.1 Кб, 9 просмотров)
0
Модератор
Эксперт по компьютерным сетям
1760 / 669 / 141
Регистрация: 10.06.2009
Сообщений: 2,601
22.04.2015, 12:46  [ТС] 24
Я не рекомендую инициализировать глобальные переменные в других разделах кроме .const
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
;##############################################################################
option dotname
option casemap:none
option PROLOGUE:rbpFramePrologue
option EPILOGUE:rbpFrameEpilogue
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
include temphls.inc
include win64.inc
include kernel32.inc
include user32.inc
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
includelib kernel32.lib
includelib user32.lib
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.data
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.data?
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.const
MsgCaption db 'Command Line',0
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.code
;parmarea 12*8 bytes 
WinMain proc <12> hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
local cmd_line_ptr:DWORD         ; хранит указатель на наш массив
    call AllocConsole            ; функция возвращают значение в eax! (VOID)
    call GetCommandLine          ; функция возвращают значение в eax! (VOID)
    mov cmd_line_ptr, eax        ; Помещаем указатель на cmdline
;Функция MessageBox сама считает длину указателя используя lstrlen.
    invoke MessageBox, 0, cmd_line_ptr, &MsgCaption, 0
;Узнаём длину нашей cmd_line.
    invoke lstrlen, cmd_line_ptr ; функция возвращают значение в eax! (int WINAPI)
    mov esi,eax
;Выводим на консоль нашу cmd_line.
    invoke WriteConsole, 7h, cmd_line_ptr, esi,NULL
;Завершаем работу процесса.
    invoke ExitProcess, 0
WinMain endp;-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
end
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
В следующем примере я покажу как доработать наше приложение.
0
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
23.04.2015, 00:59 25
А ничего что у тебя константы в секции неинициализированных данных?

Assembler
1
2
3
4
.data?
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.const
MsgCaption db 'Command Line',0
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
23.04.2015, 05:25 26
Win64. Работа с таблицей акселераторов

Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
format PE64 GUI 5.0
entry WinMain 
include 'win64a.inc' 
ZZZ_TEST equ 0 
ZZZ_OPEN equ 1 
ZZZ_SAVE equ 2 
ZZZ_EXIT equ 3 
IDM_MENU      equ 37
IDM_FILE      equ 100          ;menu 1
IDM_EXIT      equ 200          ;menu 2
IDR_MAINACCEL equ 105
 
section '.text' code readable writeable executable 
  _class TCHAR 'Iczelion Tutorial #8-8: Работа с таблицей акселераторов в FASM',0 ;name of our window
 
     menu_name  db  'ZZZ_Menu',0 
test_msg    db  'You select menu item TEST',0 
open_msg    db  'You select menu item OPEN',0 
save_msg    db  'You select menu item SAVE',0 
menu_handlers   dq test_msg, open_msg, save_msg
ACC rq 1
hwnd    rq 1
WinMain:
IMAGE_BASE = $-rva $
msg    equ rbp-sizeof.MSG
      enter 90h,0
      ; +------------------------------+ 
      ; | registering the window class | 
      ; +------------------------------+
      add rsp,50h
      xor ebx,ebx
      push 10027h   ;hIconSm
      lea edi,[_class]
      push rdi    ;lpszClassName
      push IDM_MENU        ;lpszMenuName
      push COLOR_WINDOW;hbrBackground
      push 10005h     ;hCursor
      push 10027h        ;hIcon
      mov esi,IMAGE_BASE
      push rsi    ;hInstance
      push rbx    ;cbClsExtra & cbWndExtra
      lea eax,[WindowProc]
      push rax    ;lpfnWndProc
      push sizeof.WNDCLASSEX;cbSize & style
      mov rcx,rsp     ;addr WNDCLASSEX
      sub rsp,20h
      call [RegisterClassEx]
      ; +--------------------------+ 
      ; | creating the main window | 
      ; +--------------------------+
      sub rsp,40h
      push rbx
      push rsi    ;rsi=400000h
      shl esi,9   ;rsi=CW_USEDEFAULT
      push rbx
      push rbx
      push rsi
      push rsi
      push rsi
      push rsi
      mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
      mov r8,rdi      ;offset ClassName
      mov rdx,rdi     ;offset ClassName
      xor ecx,ecx
      sub rsp,20h
      call [CreateWindowEx]
      mov [hwnd],rax
      mov ecx,IMAGE_BASE
      mov edx,IDR_MAINACCEL
      call [LoadAccelerators]
      mov [ACC],rax
      lea edi,[msg]
      ; +---------------------------+ 
      ; | entering the message loop | 
      ; +---------------------------+ 
window_message_loop_start:
      mov ecx,edi
      xor edx,edx
      mov r8,rbx
      mov r9,rbx
      call [GetMessage]
      mov ecx,edi
      call [DispatchMessage]
      mov r8d,edi
      mov rdx,[ACC]
      mov rcx,[hwnd]
      call [TranslateAccelerator]
      or rax,rax
      jne window_message_loop_start
      mov ecx,edi
      call [TranslateMessage]
      jmp  window_message_loop_start
;----------------------------------------------------
      ; +----------------------+ 
      ; | the window procedure | 
      ; +----------------------+ 
WindowProc:    enter 20h,0
           cmp  edx,WM_COMMAND
           je   wmCOMMAND 
           cmp  edx,WM_DESTROY
           je   wmDESTROY 
wmDEFAULT:     leave 
           jmp [DefWindowProc] 
wmDESTROY:     xor ecx,ecx
           call [ExitProcess]
wmCOMMAND:     and r8,3
           cmp r8,ZZZ_EXIT
           je   wmDESTROY
show_msg:      mov r9,rbx;r9=MB_OK
           mov rdx,[menu_handlers+r8*8] 
           lea r8,[menu_name] 
           call [MessageBox]
wmBYE:         leave
           retn
;------------------------------------------------
data import
     library   KERNEL32, 'KERNEL32.DLL',\ 
           USER32,   'USER32.DLL' 
 
     import    KERNEL32,\ 
           ExitProcess,    'ExitProcess' 
 
     import    USER32,\ 
           RegisterClassEx,    'RegisterClassExA',\ 
           CreateWindowEx,     'CreateWindowExA',\ 
           DefWindowProc,      'DefWindowProcA',\ 
           GetMessage,      'GetMessageA',\
        DispatchMessage,    'DispatchMessageA',\
        DestroyWindow,      'DestroyWindow',\
        MessageBox,     'MessageBoxA',\
        TranslateAccelerator,'TranslateAcceleratorA',\
        LoadAccelerators,   'LoadAcceleratorsA',\
        TranslateMessage,   'TranslateMessage'
end data
;align 4
data resource
;section '.rsrc' resource data readable
  directory RT_MENU,menus,\
        RT_ACCELERATOR,accelerators
 
  resource menus,\
       IDM_MENU,LANG_ENGLISH+SUBLANG_DEFAULT,main_menu
 
  resource accelerators,\
       IDR_MAINACCEL,LANG_ENGLISH+SUBLANG_DEFAULT,main_keys
 
 _ equ ,09h,               ;tab
 
  menu main_menu
       menuitem '&File',IDM_FILE,MFR_POPUP
        menuitem '&Test' _ 'Ctrl+T',ZZZ_TEST
        menuitem '&Open' _ 'Ctrl+O',ZZZ_OPEN
        menuitem '&Save' _ 'Ctrl+S',ZZZ_SAVE
        menuseparator
        menuitem '&Exit' _ 'Ctrl+X',ZZZ_EXIT,MFR_END
 
       menuitem '&Exit',IDM_EXIT,MFR_POPUP + MFR_END
        menuitem '&Exit',ZZZ_EXIT,MFR_END
 
  accelerator main_keys,\
          FVIRTKEY+FNOINVERT+FCONTROL,'T',ZZZ_TEST,\
          FVIRTKEY+FNOINVERT+FCONTROL,'O',ZZZ_OPEN,\
          FVIRTKEY+FNOINVERT+FCONTROL,'S',ZZZ_SAVE,\
          FVIRTKEY+FNOINVERT+FCONTROL,'X',ZZZ_EXIT
end data
Миниатюры
Masm64 and FASM64, win_API, Examples  
0
Заблокирован
23.04.2015, 05:56 27
Цитата Сообщение от NoNaMe Посмотреть сообщение
Я не рекомендую инициализировать глобальные переменные в других разделах кроме .const
Обоснуйте. Вообще Ваши опусы доставляют. Один этот чего стоит.

Цитата Сообщение от Полный 30h Посмотреть сообщение
А ничего что у тебя константы в секции неинициализированных данных?
.const - это секция данных доступная только для чтения, .rdata.
1
Модератор
Эксперт по компьютерным сетям
1760 / 669 / 141
Регистрация: 10.06.2009
Сообщений: 2,601
23.04.2015, 10:06  [ТС] 28
Цитата Сообщение от Самогон Посмотреть сообщение
.const - это секция данных доступная только для чтения, .rdata.
Так проще себя проверить на ошибки, ещё на стадии компиляции.
При попытке явного изменения значений в секции .const
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Цитата Сообщение от Полный 30h Посмотреть сообщение
А ничего что у тебя константы в секции неинициализированных данных?
Assembler
1
2
3
4
5
6
7
.data
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.data?
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.const
MsgCaption db 'Command Line',0
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Давайте "погадаем". Как примет компилятор данную константу?
Это скорее вопрос к подсветке синтаксиса.

Добавлено через 2 часа 18 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
.const
;40000000h – Секция только для чтения.
;00000040h – Секция содержит инициализированные данные.
;Будет помещена в память.
.data
;40000000h – Секция только для чтения.
;80000000h – Секция может использоваться для записи и чтения. 
;00000040h – Секция содержит инициализированные данные
;Будет помещена в память.
.data?
;00000080h – Секция содержит неинициализированные данные
;80000000h – Секция может использоваться для записи и чтения. 
;Будет зарезервировано место в памяти, под будущую переменную/константу.
0
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
23.04.2015, 10:40 29
Цитата Сообщение от NoNaMe Посмотреть сообщение
Давайте "погадаем". Как примет компилятор данную константу?
Это скорее вопрос к подсветке синтаксиса.
Как то всё думал что ассемблер не из тех дисциплин где принято гадать.
Больше на логику опирался. Вот что мне поведал другой источник.

Секция .data наиболее универсальная мы резервируем память под данные и сразу же инициализируем их, т.е. задаём им начальные значения. Все данные из этой секции включаются в исполнимый файл. Секция .data? менее гибкая, так как данные нельзя инициализировать. Все данные в этой секции не включаются в исполнимый файл, поэтому место только резервируется, но начальные значения не задаются. Данные в обеих секциях имеют полный режим доступа. Секция .const предназначена только чтения. Но ошибок не возникает при попытке изменить эти данные (????). Эта секция самая бесполезная.
Т.е. в данном случае человек при подаче материала подвёл какую то логическую базу. А все эти "рекомендую" и "давайте погадаем" как то всё больше из разряда "мне кажется"

Добавлено через 10 минут
Цитата Сообщение от Самогон Посмотреть сообщение
.const - это секция данных доступная только для чтения, .rdata.
Да, спсибо. Освежил память. Раньше я про неё знал но уже успел благополучно забыть. Потому что
Секция .const предназначена только чтения. Но ошибок не возникает при попытке изменить эти данные
т.е. по большому счёту ни чем не отличается от секции .data
Что до конкретной рекомендации озвученной тут NoNaMe у меня вообще одни недоумения. Очень часто в программах текст требует изменений, за примером далеко ходить не буду, та же функция перевода консольной русификации в виндосовскую. Нахрена мне плодить эти переменные если я могу всё это сделать "саму на себя"
0
Модератор
Эксперт по компьютерным сетям
1760 / 669 / 141
Регистрация: 10.06.2009
Сообщений: 2,601
23.04.2015, 10:56  [ТС] 30
Всё дальше написанное "IMHO"
%FilePath%\%FileName%.asm(Номер строки) : warning A4000:cannot modify READONLY segment
.const применяется во время компиляции, и если в коде явно меняешь константу, то компилятор ругается при сборке.
Ошибок не возникает при попытке изменить эти данные(Но возникает WARNING)
Эта секция, полезная на этапе разработки приложения.
0
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
23.04.2015, 11:11 31
Попробовал сейчас все этот прикол в FASM_64
FASM вообще по барабану как назвать секцию. У меня работало даже с секцией .eprst
Решающее значение имеет приписка за секцией. Если она data readable writeable с данными можно вытворять всё что угодно, даже если секция подписана как .const
Но если оставить только data readable то чёрта лысого оно даст в ней менять.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
format PE64 GUI 5.0
entry Start
 
include 'win64a.inc'
 
section '.text' code readable executable
 
Start:
  sub rsp, 8        ; Make stack dqword aligned
  
;  mov [mess],':'
  invoke MessageBox, NULL, mess, title,MB_OK
 
end_loop:
  invoke ExitProcess,0
 
 
;section '.data' data readable writeable
;  title TCHAR 'Win64', 0
;  mess TCHAR 'FASM_WIN_64', 0
 
section '.eprst' data readable
  title TCHAR 'Win64', 0
  mess TCHAR 'FASM_WIN_64', 0
  
;section '.const' data readable writeable
;  title TCHAR 'Win64', 0
;  mess TCHAR 'FASM_WIN_64', 0  
 
section '.idata' import data readable writeable
 
  library kernel32, 'KERNEL32.DLL', user32, 'USER32.DLL'
  include 'api\kernel32.inc'
  include 'api\user32.inc'
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
23.04.2015, 12:36 32
Win64. Создание динамического меню
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
format PE64 GUI 5.0
entry WinMain
include 'win64a.inc'
STYLBTN equ BS_DEFPUSHBUTTON+WS_VISIBLE+WS_CHILD
 
section '.text' code readable writeable executable
;---------------------------------------------------------
WinMain:
IMAGE_BASE = $-rva $
msg    equ rbp-sizeof.MSG
    enter 90h,0
    add rsp,50h
    xor ebx,ebx
    push 10027h ;hIconSm
    lea edi,[_class]
    push rdi    ;lpszClassName
    push rbx    ;lpszMenuName
    push COLOR_WINDOW;hbrBackground
    push 10005h ;hCursor
    push 10027h ;hIcon
    mov esi,IMAGE_BASE
    push rsi    ;hInstance
    push rbx    ;cbClsExtra & cbWndExtra
    lea eax,[WindowProc]
    push rax    ;lpfnWndProc
    push sizeof.WNDCLASSEX;cbSize & style
    mov rcx,rsp ;addr WNDCLASSEX
    sub rsp,20h
      ; +------------------------------+
      ; | registering the window class |
      ; +------------------------------+
      call [RegisterClassEx]
      ; +--------------------------+
      ; | creating the main window |
      ; +--------------------------+
    add rsp,40h
    push rbx
    push rsi    ;rsi=400000h
    shl esi,9   ;rsi=CW_USEDEFAULT
    push rbx
    push rbx
    push rsi
    push rsi
    push rsi
    push rsi
    mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    mov r8,rdi  ;offset ClassName
    mov edx,edi ;offset ClassName
    xor ecx,ecx
    sub rsp,20h
    call [CreateWindowEx]
    lea edi,[msg]
      ; +---------------------------+
      ; | entering the message loop |
      ; +---------------------------+
window_message_loop_start:
    mov ecx,edi
    xor edx,edx
    mov r8,rbx
    mov r9,rbx
    call [GetMessage]
    mov ecx,edi
    call [DispatchMessage]
    jmp  window_message_loop_start
;-------------------------------------------------
      ; +----------------------+
      ; | the window procedure |
      ; +----------------------+
WindowProc:
hWnd equ rbp+10h
wParam equ rbp+20h
lParam equ rbp+28h
 
MENI   equ rbp-sizeof.MENUITEMINFO
buffer equ MENI-128
 
     enter sizeof.MENUITEMINFO+128+20h,0
     mov [hWnd],rcx
     mov [lParam],r9
     mov [wParam],r8
 
     cmp edx,WM_CREATE
     je wmCREATE
     cmp edx,WM_COMMAND
     je wmCOMMAND
     cmp edx,WM_DESTROY
     je wmDESTROY
     cmp edx,WM_MENUSELECT
     je wmMENUSELECT
wmDEFAULT:leave
     jmp [DefWindowProc]
wmDESTROY:xor ecx,ecx
     call [ExitProcess]
wmCOMMAND:    mov rax,[HWNDBTN];проверить, не нажата ли кнопка
          cmp [lParam],rax
          je YES_BUT
          cmp word [wParam],5;проверить, не выбран ли пункт меню MENUC - выход
          je wmDESTROY
          cmp word [wParam],4;проверить, не выбран ли пункт меню с идентификатором 5
          jne wmBYE
YES_BUT:;обработка нажатия кнопки. сначала стереть текст в заголовке
          lea r9,[SPACE]
          mov r8,rbx
          mov edx,WM_SETTEXT
          call [SendMessage]
          dec [PRIZN]
          jns l5
          add [PRIZN],3;if (PRIZN < 0) PRIZN=2
          jmp l5
wmCREATE:     add rsp,40h
          push rbx
          push IMAGE_BASE
          push rbx
          push rcx;[hWnd]
          push 25
          push 120
          push 10
          push 10
          mov r9,STYLBTN
          lea r8,[CPBUT]
          mov edx,CLSBUTN
          xor ecx,ecx
          sub rsp,20h
          call [CreateWindowEx]
          mov [HWNDBTN],rax;запомнить дескриптор кнопки
l5:       ;загрузить необходимое меню
          mov rdx,[PRIZN]
          mov ecx,IMAGE_BASE
          call [LoadMenu]
          mov rdx,rax
          mov rcx,[hWnd]
          call [SetMenu];установить меню
          jmp wmBYE
wmMENUSELECT:     mov rcx,[lParam]
          jecxz wmBYE;пропускаем первое сообщение при обращении к меню
          xor r8,r8
          test word [wParam+2],MF_POPUP;проверяем, что активизировано - пункт меню или заголовок выпадающего меню
          setne r8b;al
          ;movzx r8,al
;если 0, то в lword wParam идентификатор пункта меню
;если 1, то в lword wParam номер заголовка выпадающего меню
 
;заполнение структуры для вызова функции GetMenuItemInfo
          lea r9,[MENI]
          mov [r9+MENUITEMINFO.cbSize],sizeof.MENUITEMINFO
          mov [r9+MENUITEMINFO.fMask],MIIM_TYPE
          mov [r9+MENUITEMINFO.hSubMenu],rcx;MENI.hSubMenu:=lParam
          lea rax,[buffer]
          mov [r9+MENUITEMINFO.dwTypeData],rax;указатель на буфер, получающий необходимую строку
          mov [r9+MENUITEMINFO.cch],128;sizeof.buffer;длина буфера
          ;получить информацию о выбранном пункте меню
          movzx rdx,word [wParam]
          ;r9=&MENUITEMINFO
          ;r8=1
          ;rdx=wParam
          ;rcx=lParam
          call [GetMenuItemInfo]
;проверить результат выполнения функции
          or rax,rax;cmp eax,0
          jz wmBYE
;вывести название пункта меню как заголовок всего окна
          lea r9,[MENI]
          mov r9,[r9+MENUITEMINFO.dwTypeData]
          mov r8,rbx
          mov edx,WM_SETTEXT
          mov rcx,[hWnd]
          call [SendMessage]
wmBYE:   leave
     retn
;--------------------------------------------------
  _class TCHAR 'Iczelion Tutorial #8:Создание динамического меню в FASM',0 ;name of our window
CPBUT     db 'Change menu',0
CLSBUTN   db 'BUTTON',0
HWNDBTN   rq 1
PRIZN     dq 2
SPACE     db 30 dup(' '),0
;--------------------------------------------------
align 4
data resource
     directory RT_MENU,appMenu
 
     resource  appMenu,\
           2,LANG_ENGLISH+SUBLANG_ENGLISH_US,MENUN,\
           1,LANG_ENGLISH+SUBLANG_ENGLISH_US,MENUP,\
           0,LANG_ENGLISH+SUBLANG_ENGLISH_US,MENUC
     menu MENUP
      menuitem 'First point',10,MFR_POPUP
      menuitem 'First',1,MFT_STRING
      menuitem 'Second',2,MFR_END
      menuitem 'Second point',20,MFR_POPUP+MFR_END
      menuitem 'Third',3,MFT_STRING
      menuitem 'Fourth',4,MFT_STRING
      menuseparator
      menuitem 'Else submenu',30,MFR_POPUP
      menuitem 'Additional point',6,MFT_STRING+MFR_END
      menuitem 'Exit',5,MFR_END
     menu MENUC
      menuitem 'First set',10,MFR_POPUP
      menuitem 'White',101,MFT_STRING
      menuitem 'Grey',102,MFT_STRING
      menuitem 'Black',103,MFR_END
      menuitem 'Second set',30,MFR_POPUP+MFR_END
      menuitem 'Red',104,MFT_STRING
      menuitem 'Blue',105,MFT_STRING
      menuitem 'Green',106,MFR_END
      menu MENUN
      menuitem '',2,MFR_END
end data
data import
     library   KERNEL32, 'KERNEL32.DLL',\
           USER32,   'USER32.DLL'
 
     import    KERNEL32,\
           ExitProcess,    'ExitProcess'
 
     import    USER32,\
           RegisterClassEx,    'RegisterClassExA',\
           CreateWindowEx,     'CreateWindowExA',\
           DefWindowProc,      'DefWindowProcA',\
           GetMessage,     'GetMessageA',\
           DispatchMessage,    'DispatchMessageA',\
           MessageBox,     'MessageBoxA',\
           LoadMenu,       'LoadMenuA',\
           SetMenu,        'SetMenu',\
           SendMessage,     'SendMessageA',\
           GetMenuItemInfo,    'GetMenuItemInfoA'
end data
Миниатюры
Masm64 and FASM64, win_API, Examples  
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
03.06.2015, 08:40 33
Win64 Tutorial #18: Несколько разных прогресс-баров
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
OPTION DOTNAME
include temphls.inc
include win64.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include gdi32.inc
includelib gdi32.lib
include comctl32.inc
includelib comctl32.lib
 
OPTION PROLOGUE:none
OPTION EPILOGUE:none
IMAGE_BASE      equ 400000h
IDC_PROGRESS        equ 1; control IDs
IDC_STATUS      equ 2
IDC_TIMER       equ 3 
btn1            equ 4
 
 
.code
WinMain proc 
local msg:MSG
        push rbp
    mov ebp,esp
    sub esp,sizeof MSG
 
    call InitCommonControls 
    xor ebx,ebx
    mov eax,10029h
    mov edi,offset ClassName
    mov esi,IMAGE_BASE
    push rax    ;hIconSm
    push rdi    ;lpszClassName
    push rbx    ;lpszMenuName
    push COLOR_APPWORKSPACE;hbrBackground
    push 10005h ;hCursor
    push rax        ;hIcon
    push rsi    ;hInstance
    push rbx        ;cbClsExtra & cbWndExtra
    mov eax,offset WndProc
    push rax    ;lpfnWndProc
    push sizeof WNDCLASSEX;cbSize & style
    mov ecx,esp ;addr WNDCLASSEX
    push rbx
    push rbx
    push rbx
    push rbx
        call RegisterClassEx
    
    push rbx
    push rsi    ;rsi=400000h
    shl esi,9   ;rsi=CW_USEDEFAULT
    push rbx
    push rbx
    push 240
    push 400
    push rsi
    push rsi
    mov r9d,WS_OVERLAPPEDWINDOW+WS_VISIBLE
    mov r8,rdi  ;offset ClassName
    mov edx,edi ;offset ClassName
    xor ecx,ecx
    push rbx
    push rbx
    push rbx
    push rbx
        call CreateWindowEx
;--------------------------------------------------
        lea edi,msg
@@:     mov ecx,edi
    xor edx,edx
    mov r8,rbx
    mov r9,rbx
        call GetMessage
    mov ecx,edi
        call DispatchMessage
        jmp @b
 
WinMain endp
;-----------------------------------------
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
 
local oldBrush:QWORD
local ps:PAINTSTRUCT
 
 
        push rbp
    mov ebp,esp
    sub esp,(20h+sizeof PAINTSTRUCT+8+15)and(-16)
 
    mov hWnd,rcx
    mov wParam,r8
    mov lParam,r9
 
        cmp  edx,WM_DESTROY
        je   wmDESTROY
    cmp  edx,WM_PAINT
    je   wmPAINT
        cmp  edx,WM_CREATE
    je   wmCREATE
        cmp  edx,WM_COMMAND
    je   wmCOMMAND
    leave
        jmp DefWindowProc
wmPAINT:lea edx,ps
    call BeginPaint
    mov rdx,blueBrush
    mov rcx,ps.hdc
    call SelectObject
    mov oldBrush,rax
    finit
    fld angle
    fsincos
    fmul const_80
    fistp tempX
    fmul const_80
    fchs
    fist tempY
    mov eax,tempY
    add rax,130
    push rax    ;nYRadial2
    mov eax,tempX
    add rax,190
    push rax    ;nXRadial2
        push 80       ;nYRadial1
    push 190      ;nXRadial1
    push 180      ;nBottomRect
    mov r9d,270   ;nRightRect
    mov r8d,80    ;nTopRect
    mov edx,110   ;nLeftRect
    mov rcx,ps.hdc;hdc
    push rbx
    push rbx
    push rbx
    push rbx
    call Pie
    mov rdx,oldBrush
    mov rcx,ps.hdc
    call SelectObject
    lea edx,ps
    mov rcx,hWnd
    call EndPaint
    jmp wmBYE
wmDESTROY:mov rdx,TimerID
    or edx,edx
    jne  @f
        call KillTimer;,hWnd
@@: xor ecx,ecx
        call ExitProcess
 
wmCREATE:mov edi,3
@@: push rbx        ;lpParam
    push IMAGE_BASE     ;hInstance
    push IDC_PROGRESS
    push hWnd       ;hWndParent
    push nHeight[rdi*8]
    push nWidth[rdi*8]
    push y[rdi*8]
    push x[rdi*8]
    mov r9d,dwStyle[rdi*4]
    mov r8,rbx      ;lpWindowName
    mov edx,offset progressClass;lpClassName
    mov ecx,dwExStyle[rdi*4]
        push rbx
    push rbx
    push rbx
    push rbx
    call CreateWindowEx
    mov pb1H[rdi*8],rax
 
        mov r9,rbx
        mov r8d,2
    mov edx,PBM_SETSTEP
    mov ecx,eax
    call SendMessage
    dec edi
    jns @b
;-------------------------------------------------------
    push rbx;NULL
    push IMAGE_BASE
    push btn1
    push hWnd
    push 30
    push 100
    push 90
    push 10
    mov r9d,WS_CHILD + WS_VISIBLE + BS_PUSHBUTTON
    mov r8d,offset btn1Txt
    mov edx,offset ctlClsNameBtn
    xor ecx,ecx;NULL
 
        push rbx
    push rbx
    push rbx
    push rbx
    call CreateWindowEx
    mov btn1H,rax
;---------------------------------------------------------------
    mov r9d,IDC_STATUS
    mov r8,hWnd
    xor edx,edx;NULL
    mov ecx,WS_CHILD + WS_VISIBLE
    call CreateStatusWindow
    mov hwndStatus,rax
    mov ecx,0FF9933h
        call CreateSolidBrush
    mov blueBrush,rax
    jmp wmBYE
wmCOMMAND:cmp wParam,BN_CLICKED shl 16 or 4
    jne wmBYE
wmCOMMAND_btn1:;create a timer
    mov r9d,offset TimerProc
    mov r8d,100
    mov edx,IDC_TIMER
    mov rcx,hWnd
    call SetTimer
        mov TimerID,rax
 
    xor edx,edx;FALSE
    mov rcx,btn1H
    call EnableWindow
    mov rcx,hWnd
wmBYE:  leave
    retn
WndProc endp
 
TimerProc proc hWnd:HWND
local buffer[16]:BYTE
 
    push rbp
    mov ebp,esp
    sub esp,20h+10h
    mov hWnd,rcx
 
    mov edi,3
@@: mov r9,rbx; step up the progress in
        mov r8,rbx;0
    mov edx,PBM_STEPIT
    mov rcx,pb1H[rdi*8]
    call SendMessage
        mov r9,rbx
    mov r8,rbx
    mov edx,PBM_GETPOS
    mov rcx,pb1H[rdi*8]
    call SendMessage
    dec edi
    jns @b
    lea ecx,buffer
    mov edx,offset format
    mov r8,rax
    call wsprintf
    lea r9,buffer
    mov r8,rbx
    mov edx,SB_SETTEXT
    mov rcx,hwndStatus
    call SendMessage
    mov r8,rbx
    xor edx,edx
    mov rcx,hWnd
        call InvalidateRect
    finit
    fld delta
    fadd angle
    fst angle
    sub CurrentStep,2
    jne wmBYE
    mov rdx,TimerID
    mov rcx,hWnd
    call KillTimer
    mov TimerID,0
    mov r9d,offset Message
    mov r8,rbx;0
    mov edx,SB_SETTEXT
    mov rcx,hwndStatus
    call SendMessage
wmBYE:  leave
    retn
TimerProc endp
;---------------------------------------
ClassName   db 'Win64 Iczelion''s lesson #18: Common Controls',0
progressClass   db 'msctls_progress32',0
TimerID     dq ?
pb1H        dq ?;hwndprogress
pb2H        dq ?
pb3H        dq ?
pb4H        dq ?
sb1H        dq ?
btn1H       dq ?
hwndStatus  dq ?
ctlClsNameBtn   db 'BUTTON',0
btn1Txt     db 'Click To Start',0
CurrentStep dq 100          ;increase step value
blueBrush   dq ?
const_80    dd 80.0
tempX       dd ?
tempY       dd ?
angle       dd 1.57952297305486826711594014548;22;90.5*pi/180
delta       dd 0.12548917321839229658081336625;433;7.19*pi/180
dwStyle     dd WS_CHILD + WS_VISIBLE,WS_CHILD + WS_VISIBLE + PBS_SMOOTH,WS_CHILD + WS_VISIBLE + PBS_VERTICAL,WS_CHILD + WS_VISIBLE + PBS_VERTICAL + PBS_SMOOTH
x               dq 10,10,305,350
y               dq 10,40,80,80
nHeight         dq 22,22,100,100
nWidth          dq 367,367,25,25
dwExStyle       dd WS_EX_DLGMODALFRAME,WS_EX_DLGMODALFRAME + WS_EX_STATICEDGE,0,0
format      db ' Process : %i %%',0
Message     db ' 100% Completed',0
end
Миниатюры
Masm64 and FASM64, win_API, Examples  
Вложения
Тип файла: zip tut18.zip (4.1 Кб, 13 просмотров)
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
03.06.2015, 08:49 34
Win64 Tutorial #13: Memory Mapped File
asm-файл
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
OPTION DOTNAME
option casemap:none
include temphls.inc
include win64.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include comdlg32.inc
includelib comdlg32.lib
OPTION PROLOGUE:none
OPTION EPILOGUE:none
 
IMAGE_BASE  equ 400000h
ZZZ_OPEN   equ  1
ZZZ_SAVE   equ  2
ZZZ_EXIT   equ  3
MAXSIZE         equ 256
MEM_SIZE    equ 65535
EditID      equ 1
IDR_MAINMENU    equ 30
 
.code
WinMain proc 
local msg:MSG
 
        push rbp
    mov ebp,esp
    sub esp,sizeof MSG
 
    xor ebx,ebx
 
    mov edi,offset ClassName
    mov esi,IMAGE_BASE
    mov eax,10029h
    push rax    ;hIconSm
    push rdi    ;lpszClassName
    push IDR_MAINMENU;lpszMenuName
    push COLOR_WINDOW;hbrBackground
    push 10005h ;hCursor
    push rax        ;hIcon
    push rsi    ;hInstance
    push rbx        ;cbClsExtra & cbWndExtra
    mov eax,offset WndProc
    push rax    ;lpfnWndProc
    push sizeof WNDCLASSEX;cbSize & style
    mov rcx,rsp ;addr WNDCLASSEX
    push rbx
    push rbx
    push rbx
    push rbx
        call RegisterClassEx    
    push rbx
    push rsi    ;rsi=400000h
    shl esi,9   ;rsi=CW_USEDEFAULT
    push rbx
    push rbx
    push rsi
    push rsi
    push rsi
    push rsi
    mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    mov r8,rdi  ;offset ClassName
    mov edx,edi ;offset ClassName
    mov ecx,WS_EX_CLIENTEDGE
    push rbx
    push rbx
    push rbx
    push rbx
        call CreateWindowEx
    mov ecx,eax
        call GetMenu
    mov hMenu,rax
        mov rcx,hwndEdit
    call SetFocus
        lea edi,msg
@@:     mov ecx,edi
    xor edx,edx
    mov r8,rbx
    mov r9,rbx
        call GetMessage
    mov ecx,edi
        call TranslateMessage
    mov ecx,edi
        call DispatchMessage
        jmp @b
WinMain endp
 
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
 
local hFile:QWORD   ;handle of file
local szReadWrite:QWORD ;number of bytes actually read or write
 
        push rbp
    mov ebp,esp
    sub esp,(30h+2*8+15)and(-16)
 
        mov edi,offset dlgOpenOfn
    mov hWnd,rcx
        mov wParam,r8
        mov lParam,r9
 
        cmp  edx,WM_DESTROY
        je   wmDESTROY
        cmp  edx,WM_COMMAND
        je   wmCOMMAND
        cmp  edx,WM_CREATE
        je   wmCREATE
        cmp  edx,WM_SIZE
    je   wmSIZE
        leave
        jmp DefWindowProc
 
wmDESTROY:xor ecx,ecx
        call ExitProcess
wmSIZE: push TRUE
        movzx rax,word ptr lParam+2
        push rax
    movzx r9,word ptr lParam
    xor edx,edx
    mov r8,rdx  
    mov rcx,hwndEdit    
    push rbx
    push rbx
    push rbx
    push rbx
        call MoveWindow
        jmp wmBYE
OPEN:   mov  [rdi+OPENFILENAME.Flags],OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or\
    OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
    mov ecx,edi
    call GetOpenFileName
    test eax,eax
    je wmBYE
    push rbx ;<- align stack 16h
        push rbx
        push FILE_ATTRIBUTE_ARCHIVE
    push OPEN_EXISTING
    mov r9,rbx
        mov r8d,FILE_SHARE_READ or FILE_SHARE_WRITE
        mov edx,GENERIC_READ or GENERIC_WRITE
    mov ecx,offset dOpenBuffer
    push rbx
    push rbx
    push rbx
    push rbx
    call CreateFile
    mov hFile,rax;handle to file
        xor edx,edx
    mov ecx,eax
        call GetFileSize
    mov FileSize,rax
        movzx edx,word ptr [rdi+OPENFILENAME.nFileOffset]
    add edx,offset dOpenBuffer
    mov rcx,hWnd
    call SetWindowText
;созддание в памяти объекта "проекция файла"
    mov [rsp+28h],rbx
        mov [rsp+20h],rbx
    mov r9,rbx
    mov r8d,PAGE_READWRITE
    xor edx,edx
    mov rcx,hFile
    call CreateFileMapping
    mov hMapping,rax
;отображение проекции файла на адресное пространство процесса
        mov [rsp+20h],rbx
    mov r9,rbx
        mov r8,rbx
    mov edx,FILE_MAP_WRITE
    mov ecx,eax
    call MapViewOfFile
    mov pMapping,rax
    mov r9,rax
    mov r8,rbx
    mov edx,WM_SETTEXT
    mov rcx,hwndEdit
    call SendMessage
    mov r9,rbx
    mov r8d,MF_GRAYED
    jmp @f
SAVE:   mov [rdi+OPENFILENAME.Flags],OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
    mov ecx,edi;&dOpenOfn
    call GetSaveFileName
    test eax,eax
    je wmBYE
    push rbx ;<- align stack 16h
        push rbx
    push FILE_ATTRIBUTE_ARCHIVE
    push CREATE_NEW
    mov r9,rbx
    mov r8d,FILE_SHARE_READ or FILE_SHARE_WRITE
    mov edx,GENERIC_READ or GENERIC_WRITE
    mov ecx,offset dOpenBuffer
    push rbx
    push rbx
    push rbx
    push rbx
        call CreateFile
    mov hFile,rax
    movzx edx,word ptr [rdi+OPENFILENAME.nFileOffset]
    add edx,offset dOpenBuffer
    mov rcx,hWnd
    call SetWindowText
        push rbx ;<- align stack 16h
    push rbx
    lea r9,szReadWrite
    mov r8,FileSize
    mov rdx,pMapping
    mov rcx,hFile
    push rbx
    push rbx
    push rbx
    push rbx
    call WriteFile
    mov rcx,pMapping
    call UnmapViewOfFile
        mov rcx,pMapping
    call CloseHandle
        mov rcx,hMapping
    call CloseHandle
        mov r9d,MF_GRAYED 
    mov r8,rbx;MF_ENABLED=0
@@: mov edx,edx;IDM_OPEN=0
    mov rcx,hMenu
    call EnableMenuItem
    mov edx,ZZZ_SAVE
    mov rcx,hMenu
    call EnableMenuItem
    mov rcx,hFile
    call CloseHandle
    jmp wmBYE
wmCREATE:mov [rdi+OPENFILENAME.hwndOwner],rcx
    push rbx
    push IMAGE_BASE
    push EditID
    push rcx;hWnd
    push rbx
    push rbx
    push rbx
    push rbx
    mov r9d,WS_VISIBLE or \
      WS_CHILD or ES_LEFT or ES_MULTILINE or WS_VSCROLL or WS_HSCROLL or\
      ES_AUTOHSCROLL or ES_AUTOVSCROLL
    mov r8,rbx
    mov edx,offset EditClass
    xor ecx,ecx
;-------------------------------
    push rbx
    push rbx
    push rbx
    push rbx
        call CreateWindowEx
    mov hwndEdit,rax
        jmp wmBYE
wmCOMMAND:movzx rax,word ptr wParam
        cmp r9,rbx  ;cmp lParam,0
    jnz wmBYE
    cmp rax,ZZZ_EXIT
    ja  wmBYE
    jmp  [menu_handlers+eax*8]
EXIT:   ;mov rcx,hWnd   ;ax=MI_EXIT
        call DestroyWindow
wmBYE:  leave
        retn
menu_handlers   dq wmBYE,OPEN,SAVE,EXIT
WndProc endp
;---------------------------------------
ClassName     db 'Win64 Iczelion''s lesson #13: Memory Mapped File',0
dlgOpenTitle  db    'Open File',0
align 8
dlgOpenOfn    OPENFILENAME <{sizeof OPENFILENAME},,IMAGE_BASE,\
FilterString,,,,dOpenBuffer,{MAXSIZE},,,,,,,,,,,,,,>    
FilterString  db 'All Files (*.*)',0,'*.*',0
          db 'Text Files (*.txt)',0,'*.txt',0,0
dOpenBuffer   db MAXSIZE dup(?)
hwndEdit      dq ? ;handle for edit control
EditClass     db "edit",0
hMapping    dq ? ;file mapped handle
pMapping    dq ?
FileSize    dq ?
hMenu       dq ?
end

rc-файл
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define ZZZ_OPEN 1
#define ZZZ_SAVE 2
#define ZZZ_EXIT 3
#define IDR_MAINMENU 30
 
IDR_MAINMENU MENU 
{
    POPUP "&File"
    {       MENUITEM "&Open",ZZZ_OPEN
                MENUITEM "&Save As",ZZZ_SAVE
        MENUITEM SEPARATOR
        MENUITEM "&Exit",ZZZ_EXIT
    }
    MENUITEM "&Exit",ZZZ_EXIT
}
Вложения
Тип файла: zip tut13.zip (4.4 Кб, 12 просмотров)
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
03.06.2015, 08:57 35
Win64 Tutorial #11: More about Dialog Box

asm-файл
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
OPTION DOTNAME
option casemap:none
include temphls.inc
include win64.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include comdlg32.inc
includelib comdlg32.lib
OPTION PROLOGUE:none
OPTION EPILOGUE:none
 
IMAGE_BASE  equ 400000h
ZZZ_OPEN   equ  0
ZZZ_EXIT   equ  1
MAXSIZE         equ 256
OUTPUTSIZE  equ 512
IDR_MAINMENU    equ 30
 
.code
WinMain proc 
local msg:MSG
 
        push rbp
    mov ebp,esp
    sub esp,sizeof MSG
 
    xor ebx,ebx
 
    mov edi,offset ClassName
    mov esi,IMAGE_BASE
    mov eax,10029h
    push rax    ;hIconSm
    push rdi    ;lpszClassName
    push IDR_MAINMENU;lpszMenuName
    push COLOR_WINDOW;hbrBackground
    push 10005h ;hCursor
    push rax        ;hIcon
 
    push rsi    ;hInstance
    push rbx        ;cbClsExtra & cbWndExtra
    mov eax,offset WndProc
    push rax    ;lpfnWndProc
    push sizeof WNDCLASSEX;cbSize & style
    mov rcx,rsp ;addr WNDCLASSEX
    push rbx
    push rbx
    push rbx
    push rbx
        call RegisterClassEx    
    push rbx
    push rsi    ;rsi=400000h
    shl esi,9   ;rsi=CW_USEDEFAULT
    push rbx
    push rbx
    push rsi
    push rsi
    push rsi
    push rsi
    mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    mov r8,rdi  ;offset ClassName
    mov edx,edi ;offset ClassName
    mov ecx,WS_EX_CLIENTEDGE
    push rbx
    push rbx
    push rbx
    push rbx
        call CreateWindowEx
        lea edi,msg
@@:     mov ecx,edi
    xor edx,edx
    mov r8,rbx
    mov r9,rbx
        call GetMessage
    mov ecx,edi
        call DispatchMessage
        jmp @b
WinMain endp
 
WndProc proc hWnd:HWND, uMsg, wParam, lParam
 
local dlgOpenBuffer [MAXSIZE]:BYTE
strMsgSize     equ  512
local strMsg [strMsgSize]:BYTE
 
        push rbp
    mov ebp,esp
    sub esp,20h+MAXSIZE+strMsgSize
 
        mov esi,offset dlgOpenOfn
    mov hWnd,rcx
 
        cmp  edx,WM_DESTROY
        je   wmDESTROY
        cmp  edx,WM_COMMAND
        je   wmCOMMAND
        cmp  edx,WM_CREATE
        je   wmCREATE
        leave
        jmp DefWindowProc
 
wmDESTROY:call DestroyWindow
    xor ecx,ecx
        call ExitProcess
wmCOMMAND:cmp r8d,ZZZ_OPEN
        jnz wmDESTROY
    mov ecx,esi;offset dlgOpenOfn.lStructSize
    call GetOpenFileName
    or eax,eax
    jz wmBYE
        mov ecx,OUTPUTSIZE
        lea rdi,strMsg
        mov esi,offset FullPathName
        call StringOut1
    mov rsi,dlgOpenOfn.lpstrFile
    call StringOut1
    mov esi,offset FullName
    call StringOut1
    movzx rsi,dlgOpenOfn.nFileOffset
    add rsi,dlgOpenOfn.lpstrFile
    call StringOut1
    mov esi,offset ExtensionName
    call StringOut1
    movzx rsi,dlgOpenOfn.nFileExtension
    add rsi,dlgOpenOfn.lpstrFile
    call StringOut1
    mov [rdi],rbx
    mov rcx,hWnd
    mov r9,rbx;r9=MB_OK
        mov r8d,offset ClassName
    lea rdx,strMsg
        call MessageBox
    jmp wmBYE
wmCREATE:lea eax,dlgOpenBuffer
    mov [rsi+OPENFILENAME.lpstrFile],rax
wmBYE:  leave
        retn
WndProc endp
StringOut1 proc 
@@: movsb
    cmp [rsi],bl
    loopnz @b
    retn
StringOut1 endp
;---------------------------------------
ClassName db 'Win64 Iczelion''s lesson #11: More about Dialog Box',0
dlgOpenTitle db 'Open File',0
dlgOpenOfn     OPENFILENAME <{sizeof OPENFILENAME},,IMAGE_BASE,\
FilterString,,,,,{MAXSIZE},,,,,,,,,,,,,,>
    
FilterString  db 'All Files (*.*)',0,'*.*',0
          db 'Text Files (*.txt)',0,'*.txt',0,0
FullPathName  db 'The Full Filename with Path is : ',0
FullName      db 10,'The Filename is : ',0
ExtensionName db 10,'The Extension is : ',0
end

rc-файл
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#define ZZZ_OPEN 0
#define ZZZ_EXIT 1
#define IDR_MAINMENU 30
 
IDR_MAINMENU MENU 
{
    POPUP "&File"
    {       MENUITEM "&Open",ZZZ_OPEN
        MENUITEM SEPARATOR
        MENUITEM "&Exit",ZZZ_EXIT
    }
    MENUITEM "&Exit",ZZZ_EXIT
}
Миниатюры
Masm64 and FASM64, win_API, Examples  
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
05.06.2015, 10:46 36
Win64 Tutorial #32: Создание MDI-приложения

asm-файл
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
OPTION DOTNAME
include temphls.inc
include win64.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include shell32.inc
includelib shell32.lib
 
OPTION PROLOGUE:none
OPTION EPILOGUE:none
 
IMAGE_BASE      equ 400000h
IDM_MENU        equ 1000
IDM_FILE_EXIT       equ 0
IDM_FILE_NEW        equ 1
IDM_WINDOW_NEXT     equ 2
IDM_WINDOW_PREVIOUS equ 3
MI_CLOSE        equ 4
MI_TILEHOR      equ 5
MI_TILEVER      equ 6
MI_CASCADE      equ 7
IDM_HELP_ABOUT      equ 8
MI_CLOSE_ALL        equ 9
.code
WinMain proc 
local msg:MSG
        push rbp
    mov ebp,esp
    sub esp,sizeof MSG
 
    xor ebx,ebx
    mov edi,offset ClassName
    mov eax,10029h
    mov esi,IMAGE_BASE
    push rax    ;hIconSm    
    push rdi    ;lpszClassName
    push IDM_MENU   ;lpszMenuName
    push COLOR_APPWORKSPACE;hbrBackground
    push 10005h ;hCursor
    push rax        ;hIcon  
    push rsi    ;hInstance
    push DLGWINDOWEXTRA;cbClsExtra & cbWndExtra
    lea rax,WndProc
    push rax    ;lpfnWndProc
    push sizeof WNDCLASSEX;cbSize & style
    mov ecx,esp ;addr WNDCLASSEX
    mov edi,ecx
    sub esp,20h
        call RegisterClassEx
 
    mov eax,offset MdiChildProc
        mov [rdi+WNDCLASSEX.lpfnWndProc],rax
    mov [rdi+WNDCLASSEX.cbWndExtra],ebx
    mov [rdi+WNDCLASSEX.lpszMenuName],rbx
    mov eax,offset MdiChildClassName
    mov [rdi+WNDCLASSEX.lpszClassName],rax
    mov ecx,edi
    call RegisterClassEx
 
    push rbx
    push rsi    ;rsi=400000h
    shl esi,9   ;rsi=CW_USEDEFAULT
    push rbx
    push rbx
    push 600
    push 800
    push rsi
    push rsi
    mov r9d,WS_OVERLAPPEDWINDOW or WS_VISIBLE or WS_CLIPCHILDREN
    mov edx,offset ClassName
    mov r8,rdx  ;offset ClassName
    mov ecx,WS_EX_CLIENTEDGE
    sub esp,20h
        call CreateWindowEx
        mov hWnd,rax
        mov ecx,eax
        call GetMenu
        mov hMenu,rax
        mov edx,1
        mov ecx,eax
        call GetSubMenu
 
        mov cc.hWindowMenu,rax
        mov edi,offset rect
        mov edx,edi
        mov rcx,hWnd
        call GetClientRect
        mov eax,offset cc
        push rax
        push rsi
        push rbx
        push hWnd
        mov eax,[rdi+RECT.bottom]
        push rax
        mov eax,[rdi+RECT.right]
        push rax
        push rbx
        push rbx
        mov r9d,WS_CHILD + WS_VISIBLE + WS_VSCROLL + WS_HSCROLL + WS_CLIPCHILDREN
        mov r8,rbx
        mov edx,offset MdiClientClassName
        mov ecx,WS_EX_CLIENTEDGE
        sub esp,20h
        call CreateWindowEx
        mov hClient,rax
        lea edi,msg
@@:     mov ecx,edi
    xor edx,edx
    mov r8,rbx
    mov r9,rbx
        call GetMessage
        mov edx,edi
        mov rcx,hClient
        call TranslateMDISysAccel
        test eax,eax
        jnz @b
    mov ecx,edi
        call DispatchMessage
        jmp @b
WinMain endp
WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
        push rbp
    mov ebp,esp
    sub esp,20h
 
    mov hWin,rcx
    mov wParam,r8
    mov lParam,r9
    xor ebx,ebx
 
        cmp  edx,WM_DESTROY
        je   wmDESTROY
        cmp  edx,WM_COMMAND
        je   wmCOMMAND
        cmp  edx,WM_SIZE
        je wmSIZE
        leave
        jmp DefWindowProc
wmDESTROY: xor ecx,ecx
        call ExitProcess
wmCOMMAND:mov rax,r8;[wParam]
        cmp eax,MI_CLOSE_ALL;5
        ja wmBYE
        jmp [menu_handlers+rax*8]
New:    mov esi,IMAGE_BASE
        push rbx;NULL
        push rsi;hInstance
        shl esi,9
        push rbx
        push hClient
        push rsi
        push rsi
        push rsi
        push rsi
        mov r9d,MDIS_ALLCHILDSTYLES
        mov edx,offset MdiChildClassName
        mov r8,rdx
        mov ecx,WS_EX_MDICHILD + WS_EX_CLIENTEDGE
        sub esp,20h
        call CreateWindowEx
        jmp wmBYE
Exit:   mov rax,hWin
        jmp a1
Next:   mov r9d,TRUE
        jmp a3
Prev:   mov r9,rbx
a3:     mov r8,rbx
        mov edx,WM_MDINEXT
a4:     mov rcx,hClient
        jmp a2
Horiz:  mov r9,rbx
        mov r8d,MDITILE_HORIZONTAL
a5:     mov edx,WM_MDITILE
        jmp a4
Vert:   mov r9,rbx
        mov r8,rbx
        jmp a5
Cascade:mov r9,rbx
        mov r8d,MDITILE_SKIPDISABLED
        mov edx,WM_MDICASCADE
        jmp a4
Close:  mov r9,rbx
        mov r8,rbx
        mov edx,WM_MDIGETACTIVE
        mov rcx,hClient
        call SendMessage
a1:     mov r9,rbx
        mov r8,rbx
        mov edx,WM_CLOSE
        mov rcx,rax
a2:     call SendMessage
        jmp wmBYE
About:  mov r9,rbx
        mov r8d,offset AboutMsg
        mov edx,offset ClassName
        mov rcx,hWin
        call ShellAbout
        jmp wmBYE
CloseAll:mov r9,rbx
        mov r8,rbx
        mov edx,WM_MDIGETACTIVE
        mov rcx,hClient
        call SendMessage
        test eax,eax
        je wmBYE
        mov r9,rbx
        mov r8,rbx
        mov edx,WM_CLOSE
        mov ecx,eax
        call SendMessage
        jmp CloseAll
wmSIZE: mov edi,offset rect
        mov edx,edi
        mov rcx,hWin
        call GetClientRect
        push TRUE
        mov eax,[rdi+RECT.bottom]
        push rax
        mov r9d,[rdi+RECT.right]
        mov r8,rbx
        xor edx,edx
        mov rcx,hClient
        sub esp,20h
        call MoveWindow
wmBYE:  leave
    retn
menu_handlers dq Exit,New,Next,Prev,Close,Horiz,Vert,Cascade,About,CloseAll
WndProc endp
MdiChildProc proc
 
        push rbp
        mov ebp,esp
        sub esp,20h
 
        cmp edx,WM_MDIACTIVATE
        jz wmMDIACTIVATE
        leave
        jmp DefMDIChildProc
wmMDIACTIVATE: mov rax,r9;[lParam2]
        cmp rax,rcx;[hChild]
        setne bl;MF_ENABLED=0 MF_GRAYED=1
        mov r8,rbx
        mov edx,MI_CLOSE
        mov rcx,hMenu
        call EnableMenuItem
        mov r8,rbx
        mov edx,MI_TILEHOR
        mov rcx,hMenu
        call EnableMenuItem
        mov r8,rbx
        mov edx,MI_TILEVER
        mov rcx,hMenu
        call EnableMenuItem
        mov r8,rbx
        mov edx,MI_CASCADE
        mov rcx,hMenu
        call EnableMenuItem
        mov r8,rbx
        mov edx,IDM_WINDOW_NEXT
        mov rcx,hMenu
        call EnableMenuItem
        mov r8,rbx
        mov edx,IDM_WINDOW_PREVIOUS
        mov rcx,hMenu
        call EnableMenuItem
        mov r8,rbx
        mov edx,MI_CLOSE_ALL
        mov rcx,hMenu
        call EnableMenuItem
        xor ebx,ebx
        leave
    retn
 
MdiChildProc endp
;---------------------------------------
ClassName db 'Win64 Iczelion''s lesson #32: Multiple Document Interface (MDI)',0
MdiChildClassName db 'MDICHILD',0
MdiClientClassName db 'MDICLIENT',0
cc      CLIENTCREATESTRUCT <0,2000>
hWnd        dq ?
hClient     dq ?
hMenu       dq ?
rect      RECT <>
AboutMsg    db 'Mikl__ 2015',0
end

rc-файл
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#define IDM_MENU        1000
#define IDM_FILE_EXIT           0
#define IDM_FILE_NEW        1
#define IDM_WINDOW_NEXT         2
#define IDM_WINDOW_PREVIOUS 3
#define MI_CLOSE        4
#define MI_TILEHOR              5
#define MI_TILEVER              6
#define MI_CASCADE              7
#define IDM_HELP_ABOUT          8
#define MI_CLOSE_ALL            9
 
IDM_MENU MENU DISCARDABLE
BEGIN
    POPUP "&File"
    BEGIN
            MENUITEM "&New", IDM_FILE_NEW
                MENUITEM "&Close\tCtrl+F4",MI_CLOSE,GRAYED
                MENUITEM SEPARATOR
        MENUITEM "&Exit",IDM_FILE_EXIT
    END
        POPUP "&Window"    
        BEGIN
            MENUITEM "Tile Horizontal",MI_TILEHOR,GRAYED
            MENUITEM "Tile Vertical",MI_TILEVER,GRAYED
            MENUITEM "Cascade",MI_CASCADE,GRAYED
            MENUITEM "&Next\tCtrl+F6",IDM_WINDOW_NEXT,GRAYED
        MENUITEM "&Previous\tShift+Ctrl+F6",IDM_WINDOW_PREVIOUS,GRAYED
        MENUITEM "&Close All",MI_CLOSE_ALL,GRAYED
        END
        POPUP "&Help"    
        BEGIN
            MENUITEM "&About",IDM_HELP_ABOUT
        END
END
Миниатюры
Masm64 and FASM64, win_API, Examples  
Вложения
Тип файла: zip tut32.zip (4.4 Кб, 6 просмотров)
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
08.07.2015, 08:11 37
Примеры для "Уроков Iczelion'а на x64"
0
0 / 0 / 0
Регистрация: 06.04.2015
Сообщений: 3
10.10.2015, 19:24 38
[delete]
0
Модератор
Эксперт по компьютерным сетям
1760 / 669 / 141
Регистрация: 10.06.2009
Сообщений: 2,601
09.03.2016, 02:46  [ТС] 39
Касательно выравнивания стека. ml64 из MSVS14 теперь сама не добавляет выделение стека в начале кода.
Новых багов пока не знаю.
0
Модератор
Эксперт по компьютерным сетям
1760 / 669 / 141
Регистрация: 10.06.2009
Сообщений: 2,601
11.03.2016, 04:11  [ТС] 40
Очень полезная утилита для конвертации из Си заголовков в Файлы включений!
Вложения
Тип файла: zip h2incX.zip (99.4 Кб, 8 просмотров)
0
11.03.2016, 04:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2016, 04:11
Помогаю со студенческими работами здесь

Ошибка в Struts: Error: 500 Location: /examples/green/Struts1st.jsp
Есть такая проблема. Вроде делаю всё правильно, т.е. имеем struts-config.xml: &lt;?xml...

Masm64
Пыталась написать программу на masm64, но компилятор то библиотеку не открывает, то команда...

masm64 и winAPI
Здравствуйте. даже не знаю в какую тему писать, с получившейся проблемой. Нужно написать...

Соглашения о вызовах и masm64
Недавно начал создавать dll на масме64 для си++. Почитал на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru