Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/88: Рейтинг темы: голосов - 88, средняя оценка - 4.75
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759

А что находится внутри функции MessageBox или как еще можно создать MessageBox?

12.04.2012, 13:58. Показов 18254. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помните сказку о лягушке-царевне? Что необходимо было сделать, чтобы убить Кащея-бессмертного? ― нужно было сперва с кучей приключений попасть на некий остров, на острове найти дуб, с дуба снять ларец,
«в ларце ― заяц, в зайце ― утка, в утке ― яйцо, в яйце ― игла, а на кончике иглы ― смерть Кащеева...»
Казалось бы, что может быть проще функции MessageBox? Но кто-нибудь задавал себе вопрос ― «а что находится внутри MessageBox?» Может быть это поможет сделать наши программы еще меньше.

Запускаем программу выводящую MessageBox на экран в дебаггере Ollydbg и в тот момент, когда курсор доходит до строки call MessageBoxA нажимаем не на F8 (Step over), а на клавишу F7 (Step into) и оказываемся внутри функции MessageBoxA ― оказывается здесь происходит перекодировка ASCII-строк заголовка и текста сообщений в UNICODE и вызов функции MessageBoxW, снова жмем на F7 ― оказывается внутри MessageBoxW функция MessageBoxExA, которая имеет на один параметр больше, чем MessageBoxA и MessageBoxW и этот параметр (dwLanguageId) равен 0 (LANG_NEUTRAL), остальные же параметры совпадают полностью. Внутри MessageBoxExA находится функция MessageBoxExW. Внутри MessageBoxExW ― функция MessageBoxTimeoutA, у которой на один параметр больше, чем у MessageBoxExW и этот параметр (Timeout) равен -1. Внутри MessageBoxTimeoutA, как можно было догадаться MessageBoxTimeoutW. Внутри MessageBoxTimeoutW - MessageBoxIndirectA эта функция позволяет поменять иконку у MessageBox и может вызвать Справку, но мы оставляем эти параметры с нулевым значением. Внутри MessageBoxIndirectA находится точно такая же но с UNICODE строками функция MessageBoxIndirectW SoftModalMessageBox. У Indy/Clerk я нашел ссылку на NtRaiseHardError ― вызов MessageBox на уровне ядра.

Традиционный способ определения Unicode-строки:
Code
1
usz dw 'U', 'n', 'i', 'c', 'o', 'd', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', 0
Меня этот способ не устраивал, поэтому, я написал для этой цели макрос du (define unicode string), чтобы без проблем переводить ASCII-строки в UNICODE-строки
Code
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
du  macro string
local bslash
bslash = 0
irpc c,<string>
if bslash eq 0
    if '&c' eq "\";;управляющая последовательность символов
    bslash = 1
    elseif '&c' eq "ё"
    db 51h,4
    elseif '&c' eq "Ё"
    db 1,4
    elseif '&c' gt 127
    db ('&c'- 0B0h),4;;кириллица
    else
    dw '&c'          ;;латиница
    endif
else
bslash = 0
    if '&c' eq "n"    ;;  \n = новая строка
        DW 0Dh,0Ah
        elseif '&c' eq "\";;  \\ = обратная косая черта (\)
        dw '\'
        elseif '&c' eq "r";;  \r = возврат каретки
        dw 0Dh
        elseif '&c' eq "l";;  \l = LF
        dw 0Ah
        elseif '&c' eq "s"
        dw 20h
        elseif '&c' eq "c"
        dw 3Bh
        elseif '&c' eq "t";;  \t = табуляция 
        dw 9
    endif
endif
endm
dw 0
endm
этот макрос превращает ASCII-символы латиницы в UNICODE-символы добавлением после кода символа нуля, а для кириллицы заменяет 0 на 4 и сдвигает код символа на 176, в конце UNICODE-строки ставится ноль, терминирующий строку. Всё, что требуется от пользователя ― после du написать строку в угловых скобках. То есть представить Unicode-строку так:
Code
1
usz: du <Unicode string>
обратите внимание, что после названия строки стоит двоеточие.
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
; masm windows gui #
.686P
.model flat
;include windows.inc
include native.inc
include ntstatus.inc
includelib user32.lib
includelib ntdll.lib
extern _imp__MessageBoxA@16:dword
extern _imp__MessageBoxW@16:dword
extern _imp__MessageBoxExA@20:dword
extern _imp__MessageBoxExW@20:dword
extern _imp__MessageBoxTimeoutA@24:dword
extern _imp__MessageBoxTimeoutW@24:dword
extern _imp__SoftModalMessageBox@4:dword
extern _imp__MessageBoxIndirectA@4:dword
extern _imp__MessageBoxIndirectW@4:dword
extern _imp__NtRaiseHardError@24:dword
;extern _imp__KiFastSystemCall@0:dword
MB_ICONASTERISK     equ 40h 
MB_OK           equ 0
; structures
MSGBOXPARAMSA STRUCT
  cbSize                DWORD      ?
  hwndOwner             DWORD      ?
  hInstance             DWORD      ?
  lpszText              DWORD      ?
  lpszCaption           DWORD      ?
  dwStyle               DWORD      ?
  lpszIcon              DWORD      ?
  dwContextHelpId       DWORD      ?
  lpfnMsgBoxCallback    DWORD      ?
  dwLanguageId          DWORD      ?
MSGBOXPARAMSA ENDS
 
MSGBOXDATA struct       
     params              MSGBOXPARAMSA <>
     pwndOwner           DWORD ?
     wLanguageId         DWORD ?
     pidButton           DWORD ?         ; // Array of button IDs
     ppszButtonText      DWORD ?         ; // Array of button text strings
     cButtons            DWORD ?
     DefButton           DWORD ?
     CancelId            DWORD ?
     Timeout             DWORD ?
MSGBOXDATA ends
; macros
du  macro string
    irpc c,<string>
    db '&c',0
    endm
    dw 0
    endm
.code
start:  xor ebx,ebx
    mov esi,ebx
    push MB_ICONASTERISK or MB_OK
    push offset MsgCaption
    push [Msg+esi*4]
    push ebx
    call _imp__MessageBoxA@16
;---------------------------------------
    inc esi
    push MB_ICONASTERISK or MB_OK
    push offset TitleText
    push [Msg+esi*4]
    push ebx
    call _imp__MessageBoxW@16
;----------------------------------------
    inc esi
    push ebx
    push MB_ICONASTERISK or MB_OK
    push offset MsgCaption
    push [Msg+esi*4]
    push ebx
    call _imp__MessageBoxExA@20
;-----------------------------------------
    inc esi
    push ebx
    push MB_ICONASTERISK or MB_OK
    push offset TitleText
    push [Msg+esi*4]
    push ebx
    call _imp__MessageBoxExW@20
;-----------------------------------------
    inc esi
        push -1
        push ebx
        push MB_ICONASTERISK or MB_OK
        push offset MsgCaption
        push [Msg+esi*4]
        push ebx
        call _imp__MessageBoxTimeoutA@24
;------------------------------------------
    inc esi
        push -1
        push ebx
        push MB_ICONASTERISK or MB_OK
        push offset TitleText
        push [Msg+esi*4]
        push ebx
        call _imp__MessageBoxTimeoutW@24
;------------------------------------------
        sub esp,sizeof(MSGBOXPARAMSA);40
    mov edi,esp
    assume edi:ptr MSGBOXPARAMSA
    mov dword ptr [edi].cbSize,sizeof(MSGBOXPARAMSA)
    mov dword ptr [edi].hwndOwner,ebx
    mov dword ptr [edi].hInstance,400000h
    mov dword ptr [edi].lpszText,offset Msg8
    mov dword ptr [edi].lpszCaption,offset MsgCaption
    mov dword ptr [edi].dwStyle,MB_ICONASTERISK or MB_OK;:= MB_USERICON;
    mov dword ptr [edi].lpszIcon,ebx;:= PCHAR('MYICO');
    mov dword ptr [edi].dwContextHelpId,ebx;:= 0;
    mov dword ptr [edi].lpfnMsgBoxCallback,ebx;:= nil;
    mov dword ptr [edi].dwLanguageId,ebx;:= LANG_NEUTRAL;   
    push edi
        call _imp__MessageBoxIndirectA@4
;--------------------------------------------------------
    mov dword ptr [edi].cbSize,sizeof(MSGBOXPARAMSA)
    mov dword ptr [edi].hwndOwner,ebx
    mov dword ptr [edi].hInstance,400000h
    mov dword ptr [edi].lpszText,offset Msg9
    mov dword ptr [edi].lpszCaption,offset TitleText
    mov dword ptr [edi].dwStyle,MB_ICONASTERISK or MB_OK
    mov dword ptr [edi].lpszIcon,ebx;:= PCHAR('MYICO');
    mov dword ptr [edi].dwContextHelpId,ebx;:= 0;
    mov dword ptr [edi].lpfnMsgBoxCallback,ebx;:= nil;
    mov dword ptr [edi].dwLanguageId,ebx;:= LANG_NEUTRAL;   
    push edi
        call _imp__MessageBoxIndirectW@4
    add esp,sizeof(MSGBOXPARAMSA)
;-------------------------------------------------------------------------
        sub esp,sizeof MSGBOXDATA+8
;  local mbd:MSGBOXDATA
;  local bufid[1]:DWORD
;  local bufstr[1]:DWORD
    lea eax,[esp+4];bufid
    mov dword ptr[eax],1
    mov [esp],offset _OK
        lea edi,[esp+8]
    mov [edi].cbSize,sizeof MSGBOXPARAMSA
    mov [edi].hwndOwner,ebx
    mov [edi].lpszText,offset Msg7
    mov [edi].lpszCaption,offset TitleText
    mov [edi].dwStyle,MB_ICONASTERISK or MB_OK
        assume edi:ptr MSGBOXDATA
    mov [edi].pwndOwner,ebx;0
    mov [edi].wLanguageId,ebx;0
    mov [edi].pidButton,eax
    mov [edi].ppszButtonText,esp;offset bufstr
    mov [edi].cButtons,1
    mov [edi].DefButton,ebx;0
    mov [edi].CancelId,1
    mov [edi].Timeout,-1
    push edi
    call _imp__SoftModalMessageBox@4
    assume edi:nothing
    add esp,sizeof MSGBOXDATA+8
;------------------------------------------------------------------
ShowMessage proc
Local MessageBuffer[38h]:WCHAR;в Num+Num1 в вордах
Local Message[2]:UNICODE_STRING
Local HardErrorPointer[3]:PVOID
;первый параметр
    lea edi,MessageBuffer
    mov Message.Buffer+sizeof(UNICODE_STRING)*0,edi
    mov Message.MaximumLength+sizeof(UNICODE_STRING)*0,Num
    mov Message._Length+sizeof(UNICODE_STRING)*0,Num-2
    lea edx,Message+sizeof(UNICODE_STRING)*0
    mov HardErrorPointer+sizeof(PVOID)*0,edx;pwText
    mov esi,offset MessageText
    mov ecx,Num+Num1
    rep movsb
;второй параметр
    lea edi,MessageBuffer+Num
    mov Message.Buffer+sizeof(UNICODE_STRING)*1,edi
    mov Message.MaximumLength+sizeof(UNICODE_STRING)*1,Num1
    mov Message._Length+sizeof(UNICODE_STRING)*1,Num1-2
    lea edx,Message+sizeof(UNICODE_STRING)*1
    mov HardErrorPointer+sizeof(PVOID)*1,edx;pwCaption
;третий параметр
        mov HardErrorPointer+sizeof(PVOID)*2,MB_ICONASTERISK+MB_OK;uType
        lea edx,HardErrorPointer
    push offset x;куда функция запишет выбранный юзером ответ (если тип, 
;переданный в следующем параметре, предполагает выбор ответа пользователем)
    push ebx;0 варианты ответов
    push edx;указатель на массив параметров
    push 3;общее число параметров
    push 00000011b;маска, еденичные биты которой соответствуют тем 
;параметрам, которые имеют тип PUNICODE_STRING, а нули -- остальным параметрам
    push STATUS_SERVICE_NOTIFICATION;статус ошибки
    call _imp__NtRaiseHardError@24
;--------------------------------------------------
;меняем первый параметр
    lea edi,MessageBuffer
    mov Message.Buffer+sizeof(UNICODE_STRING)*0,edi
    mov Message.MaximumLength+sizeof(UNICODE_STRING)*0,Num3
    mov Message._Length+sizeof(UNICODE_STRING)*0,Num3-2
    lea edx,Message+sizeof(UNICODE_STRING)*0
    mov HardErrorPointer+sizeof(PVOID)*0,edx;pwText
    mov esi,offset MessageText2
    mov ecx,Num3
    rep movsb
        lea edx,HardErrorPointer
    mov eax,0B6h;ID NtRaiseHardError для WinXP
    push offset x
    push ebx
    push edx
    push 3
    push 00000011b
    push STATUS_SERVICE_NOTIFICATION;статус ошибки
    push offset @f
    mov edx,7FFE0300h
    call dword ptr ds:[edx]
@@:
;--------------------------------------------------
;меняем первый параметр
    lea edi,MessageBuffer
    mov Message.Buffer+sizeof(UNICODE_STRING)*0,edi
    mov Message.MaximumLength+sizeof(UNICODE_STRING)*0,Num4
    mov Message._Length+sizeof(UNICODE_STRING)*0,Num4-2
    lea edx,Message+sizeof(UNICODE_STRING)*0
    mov HardErrorPointer+sizeof(PVOID)*0,edx;pwText
    mov esi,offset MessageText3
    mov ecx,Num4
    rep movsb
        lea edx,HardErrorPointer
    mov eax,0B6h;ID NtRaiseHardError для WinXP
    push offset x
    push ebx
    push edx
    push 3
    push 00000011b
    push STATUS_SERVICE_NOTIFICATION;статус ошибки
    push offset @f
    push offset @f
    mov edx,esp
    db 0Fh,34h;sysenter
@@:
;--------------------------------------------------------
    lea edi,MessageBuffer
    mov Message.Buffer+sizeof(UNICODE_STRING)*0,edi
    mov Message.MaximumLength+sizeof(UNICODE_STRING)*0,Num2
    mov Message._Length+sizeof(UNICODE_STRING)*0,Num2-2
    lea edx,Message+sizeof(UNICODE_STRING)*0
    mov HardErrorPointer+sizeof(PVOID)*0,edx;pwText
    mov esi,offset MessageText1
    mov ecx,Num2
    rep movsb
        lea edx,HardErrorPointer
    mov eax,0B6h;ID NtRaiseHardError для WinXP
    push offset x
    push ebx
    push edx
    push 3
    push 00000011b
    push STATUS_SERVICE_NOTIFICATION;статус ошибки
    mov edx,esp
    int 2Eh
    add esp,18h
    leave
    retn
ShowMessage endp
 
MessageText: du <NtRaiseHardError>
Num = $-MessageText
TitleText: du <Iczelion Tutorial #2:MessageBox>
Num1 = $-TitleText
MessageText1: du <int 2Eh>
Num2 equ $-MessageText1
MessageText2: du <KiFastSystemCall>
Num3 equ $-MessageText2
MessageText3: du <sysenter>
Num4 equ $-MessageText3
x dd 0
Msg dd Msg1,Msg2,Msg3,Msg4,Msg5,Msg6,Msg7,Msg8,Msg9
Msg1    db 'MessageBoxA',0
Msg2:   du <MessageBoxW>
Msg3    db 'MessageBoxExA',0
Msg4:   du <MessageBoxExW>
Msg5    db 'MessageBoxTimeoutA',0
Msg6:   du <MessageBoxTimeoutW>
Msg7:   du <SoftModalMessageBox>
Msg8    db 'MessageBoxIndirectA',0
Msg9:   du <MessageBoxIndirectW>
MsgCaption db "Iczelion Tutorial #2:MessageBox",0
_OK:    du <OK>
end start
10
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.04.2012, 13:58
Ответы с готовыми решениями:

MessageBox: Как сделать так, чтобы если окно модальное, при клике на родительское окно MessageBox мигал?
Здравия всем! Никак не найду нужный MB_*, как можно сделать так, чтобы если сделать MessageBox модальным, при клике по родительскому...

Два раза открывается MessageBox.Show после второго вызова MessageBox
Здравствуйте! Подскажите пожалуйста... Мне вот надо было сделать диалоговое окно для ввода данных для бегущей строки. Кроме этого,...

Можно ли с помощью хуков отловить вызовы функций CreateFile или MessageBox
можно ли с помощью хуков отловить допустим функции CreateFile или MessageBox? и какой для этого должен быть параметр idHook?

20
 Аватар для zzzyyyxxx
768 / 312 / 11
Регистрация: 27.05.2011
Сообщений: 703
12.04.2012, 14:11
к сожалению сие творение не получается запустить, из-за отсутствующих:
native.inc
ntstatus.inc

я так понимаю - это разложенная функция MessageBox, а вот интересно, если все внутренние функции разложить, какой же размер будет у этого чуда?
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
12.04.2012, 15:05  [ТС]
zzzyyyxxx, они есть в составе masm32, а размер этого "чуда" 1712 байт

Charles Kludge, а теперь давай ты, как обещел
Цитата Сообщение от Charles Kludge Посмотреть сообщение
можно и через undoc BOP_3RDPARTY - MessageBox() из доси вывести.
Добавлено через 39 минут
Тексты программ на разных диалектах ассемблера выводящие MessageBox
1) FASM
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
format PE GUI
include 'win32ax.inc'
; import data in the same section
 
  invoke    MessageBox,eax,"Win32 Assembly with FASM is Great!",\
   "Iczelion Tutorial #2-2:MessageBox",eax
   retn
data import
 
 library user32,'USER32.DLL'
 import user32,\
    MessageBox,'MessageBoxA'
 
end data
2) GoAsm
Assembler
1
2
3
4
5
6
7
8
9
10
11
; goasm windows gui #
CODE SECTION
;
START:  push eax
    call @1
db 'Iczelion Tutorial 2#:MessageBox',0
@1: call @2
db 'Win32 Assembly with GoAsm is Great!',0
@2: push eax
    call d[MessageBoxA]
    retn
3) NASM
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; nasm windows gui #
%define ONLY_NASM 
%include "nagoa+.inc"
%include "defines.inc"
section .text
start:
    invoke MessageBox,0,Message,wTitle,MB_OK+MB_SYSTEMMODAL
    retn
 
  wTitle   db 'Iczelion Tutorial #2:MessageBox',0
  Message db 'Win32 Assembly with NASM is Great!',0
 
LAST_BEGIN
 
__LIBS_   user32,  'user32.DLL'
 
__IMPORT_ user32,\
          MessageBox,'MessageBoxA',0
 
LAST_END
4) T0A - The 0ok Assembler
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.CPU 686
.BITS 32
.ENTRYPOINT
 
INVOKE MessageBox,BYTE 0,DWORD Text,DWORD Title,BYTE 0
INVOKE ExitProcess,BYTE 0
 
Title: DSTR "Assembler Example\0"
Text: DSTR "Hello World\0"
 
.LIBRARY "kernel32.dll"
IMPORT ExitProcess "ExitProcess"
 
.LIBRARY "user32.dll"
IMPORT MessageBox "MessageBoxA"
5) Watcom Assembler
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; wasm windows gui #
.686P
.model flat
extern __imp__MessageBoxA@16:dword
.code
start:  push eax
    push offset msgBoxCaption
    push offset msgBoxText
    push eax
    call __imp__MessageBoxA@16
    ret
msgBoxText db 'Win32 Assembly with WASM is Great!',0
msgBoxCaption db 'Iczelion Tutorial #2:MessageBox',0
end start
6) RosAsm
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
____________________________________________________________________________________________
 
; MsgBox1.asm  RosAsm            [url]http://betov.free.fr/[/url]
; Affichage d'une boîte a message
; Programmé par AsmGges          [url]http://www.chez.com/asmgges/index.htm[/url]
___________________________________________________________________________________________
 
Main:
    ; affichage d'une boîte à message
    ; -------------------------------
    call 'USER32.MessageBoxA' &NULL Message Titre &MB_OK
 
    ; fin du programme
    ; ----------------
    call 'KERNEL32.ExitProcess' &NULL
___________________________________________________________________________________________
 
; Définitions des datas chaînes / variables initialisées ou non / équates / structures
___________________________________________________________________________________________
 
[Titre:    B$ "AsmGges Win32" 0]
[Message:  B$ "Bonjour ! Comment allez-vous ?" 0]
___________________________________________________________________________________________
 
; Macros définies par l'utilisateur
___________________________________________________________________________________________
 
[push | push #1 | #+1]
[call | push #L>2 | call #1]
___________________________________________________________________________________________
Добавлено через 9 минут
7) LzAsm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; lzasm windows gui #
option ansi;unicode
model flat,stdcall
 
includelib "d:\Ass_new\lib\win32.lib"
procdesc MessageBoxA :dword,:dword,:dword,:dword
 
codeseg
 
    startupcode
    call MessageBoxA,eax,offset msgBoxText,offset msgBoxCaption,eax
    retn;exitcode
msgBoxText  db "Win32 Assembly with LZASM is Great!",0
msgBoxCaption   db "Iczelion Tutorial #2:MessageBox",0
8) TASM
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; tasm windows gui #
.386
.model flat
includelib import32.lib
include windows32.inc
extern MessageBoxA:PROC
.code
start:
    push MB_OK + MB_SYSTEMMODAL
    push offset wTitle   
    push offset Message
    push eax
    call MessageBoxA
    ret             ;выход из программы
wTitle  db 'Iczelion Tutorial #2:MessageBox',0
Message db 'Win32 Assembly with tasm is Great!',0
ends
end start
Добавлено через 1 минуту
9) MASM
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; masm windows gui #
.686P
.model flat
include windows.inc
includelib user32.lib
extern _imp__MessageBoxA@16:dword
.code
start:  push eax;MB_OK
    push offset MsgCaption
    push offset MsgBoxText
    push eax
    call _imp__MessageBoxA@16
    ret;    invoke ExitProcess,NULL
MsgCaption      db "Iczelion Tutorial #2:MessageBox",0
MsgBoxText      db "Win32 Assembly with masm is Great!",0
end start
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
12.04.2012, 15:19  [ТС]
специально для zzzyyyxxx во вложении файлы native.inc и ntstatus.inc
Вложения
Тип файла: zip w2k.zip (42.7 Кб, 43 просмотров)
1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
12.04.2012, 15:35
Вызываем MessageBoxA(); из ДОСи через BOP_3RDPARTY какбэ документированый callgate
Кстати, на сёмке может не пойти...
[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
    org 0x100
start:
    mov si, DLL_NAME
    mov di, INIT_PROC
; comment out for no init proc...
    xor di, di
    push    di
    pop es
    mov bx, DISPATCHER
    db  0xc4, 0xc4, 0x58, 0x0   ; register
    jc  error
    mov [DLL_HANDLE], ax
    mov al, 'L'         ; loaded
    int 0x29
 
    mov ax, [DLL_HANDLE]
    mov cx, message_end - message_start
    mov si, message_start
    db  0xc4, 0xc4, 0x58, 0x2   ; invoke dispatcher
    cmp ax, 0x2005      ; check return value...
    jnz no_ret
    mov al, 'R'
    int 0x29
    jmp skip
no_ret:
    mov al, 'N'
    int 0x29
skip:
;...
;...
    mov ax, [DLL_HANDLE]
    db  0xc4, 0xc4, 0x58, 0x1   ; unregister
    ret
error:
    mov al, '!'
    int 0x29
    ret
 
DLL_HANDLE: dw 0
DLL_NAME: db "3rd_party.dll", 0
INIT_PROC: db "InitProc_", 0
DISPATCHER: db "Dispatch_", 0
message_start:
    db  "Hello from DOS!",0
message_end:
DLL'ка пока на Сюшке, поэтому толсто:
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
#include <windows.h>
#include <stdio.h>
 
void __declspec(dllexport) InitProc()
{
}
 
void __declspec(dllexport) Dispatch()
{
    unsigned short ds = 0, si = 0, cx = 0;
    char* s = NULL;
 
    HMODULE h = LoadLibrary("NTVDM.EXE");
    if (h == INVALID_HANDLE_VALUE) {
        return ;
    }
    ds = ((unsigned short (__stdcall *)())GetProcAddress(h, "getDS"))(); // Segment:
    si = ((unsigned short (__stdcall *)())GetProcAddress(h, "getSI"))(); // Offset
    cx = ((unsigned short (__stdcall *)())GetProcAddress(h, "getCX"))(); // String Length
 
    s = ((char* (__stdcall *)(ULONG /*addr*/, ULONG /*size*/, char/*addressing type, seg:off - selector*/))GetProcAddress(h, "MGetVdmPointer"))((ULONG)((ds << 0x10) + si), cx, FALSE);
    MessageBox(NULL, s, "Awaken from DOS HELL", MB_OK);
 
    // Set result...
    ((void (__stdcall *)(unsigned short))GetProcAddress(h, "setAX"))(0x2005);
    FreeLibrary(h);
}
Code
1
wcl386 -6r -bd -l=nt_dll -s -sg -ox %1 %2 %3 %4 %5
В аттаче - мясо длльки.
P.S. Mikl___, змей, я пока не совсем готов.
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
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
/*++ BUILD Version: 0001
 
Copyright (c) 1990  Microsoft Corporation
 
Module Name:
 
    BOP.H
 
Abstract:
 
    This module contains macro support for use of Bops in C code.
 
Author:
 
    Dave Hastings (daveh) 25-Apr-1991
 
Revision History:
 
--*/
 
//
// Assigned Bop Numbers
//
 
#define BOP_DOS              0x50
#define BOP_WOW              0x51
#define BOP_XMS              0x52
#define BOP_DPMI             0x53
#define BOP_CMD              0x54
#define BOP_DEBUGGER         0x56
#define BOP_REDIR            0x57    // used to be 55, now goes to MS_bop_7()
#define BOP_NOSUPPORT        0x59    // host warning dialog box
#define BOP_3RDPARTY         0x58
#define BOP_WAITIFIDLE       0x5A    // idle bop
#define BOP_DBGBREAKPOINT    0x5B    // does a 32 bit DbgBreakPoint
#define BOP_KBD              0x5C    // BUGBUG temporary
#define BOP_VIDEO            0x5D    // BUGBUG temporary
#define BOP_NOTIFICATION     0x5E    // 16bits to 32 bits notification
#define BOP_UNIMPINT         0x5F    // BUGBUG temporary
#define BOP_SWITCHTOREALMODE 0xFD
#define BOP_UNSIMULATE       0xFE    // end execution of code in a vdm
 
#define BOP_SIZE         3       // # of bytes in a bop instruction
//
// Bop Macro
//
 
/* XLATOFF */
 
#define BOP(BopNumber) _asm db 0xC4, 0xC4, BopNumber
 
/* XLATON */
 
/* ASM
BOP macro BopNumber
    db  0C4h, 0C4h, BopNumber
        endm
 
IFNDEF WOW_x86
FBOP macro BopNumber,BopMinorNumber,FastBopEntry
    BOP BopNumber
ifnb <BopMinorNumber>
    db  BopMinorNumber
endif
    endm
ELSE
FBOP macro BopNumber,BopMinorNumber,FastBopEntry
    local fb10,fb20
    test    word ptr [FastBopEntry + 4],0FFFFh
    jz  fb10
.386p
    push    ds
    push    40h
    pop     ds
    test    ds:[FIXED_NTVDMSTATE_REL40],RM_BIT_MASK
    pop     ds
    jnz     short fb10
    call fword ptr [FastBopEntry]
 
    db BopNumber            ; indicates which bop
ifnb <BopMinorNumber>
    db BopMinorNumber
endif
    jmp short fb20
 
.286p
fb10:   BOP BopNumber
ifnb <BopMinorNumber>
    db  BopMinorNumber
endif
fb20:
    endm
endif
 */
Вложения
Тип файла: zip 3rd_party.zip (14.5 Кб, 32 просмотров)
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
12.04.2012, 16:21  [ТС]
10) Создание MessageBox при помощи debug.exe здесь или здесь

11) MessageBox размером 298 байт, работает только под WinXP, для сборки нужен старый линкер, который бы мог бы создавать COM-файлы, строки для сборки
Code
1
2
3
4
5
6
7
@echo off
cls
set filename=%1
if exist %filename%.exe del %filename%.exe
ml /AT /c /Cp /Gz /I\masm32\include %filename%.asm
Link16 /t %filename%.obj ,%filename%.exe;
del %filename%.obj
сам текст программы
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
; masm dos com #
.586p
.model tiny
;for WinXP - 298 bytes
include windows.inc
.code
exebase         equ 400000h
main:
;signatures----------------------------
dosHeader       dd IMAGE_DOS_SIGNATURE;'MZ'
ntHeader        dd IMAGE_NT_SIGNATURE;'PE'
;image_header--------------------------
Machine         dw IMAGE_FILE_MACHINE_I386; (Intel386)
Count_of_section    dw 1
TimeStump       dd 0;
Symbol_table_offset dd 0;
Symbol_table_count  dd 0;
Size_of_optional_header dw section_table-optional_header;
Characteristics     dw IMAGE_FILE_32BIT_MACHINE or \
 IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_EXECUTABLE_IMAGE or \
 IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED
;-------------------------------------
optional_header:
Magic_optional_header   dw IMAGE_NT_OPTIONAL_HDR32_MAGIC
Linker_version_major_and_minor dw 0 
Size_of_code        dd end_import-start;
Size_of_init_data   dd 0;
Size_of_uninit_data dd 0;
entry_point     dd start;
base_of_code        dd start;
base_of_data        dd 0;
image_base      dd exebase;
e_lfanew        dd ntHeader-dosHeader;section alignment
file_alignment      dd 4;
OS_version_major_minor  dd 4;
image_version_major_minor dd 0;
subsystem_version_major_minor dd 4;
reserved1       dd 0;
size_of_image       dd end_import;
size_of_header      dd start;
checksum        dd 0;
subsystem_and_DLL_flag  dd IMAGE_SUBSYSTEM_WINDOWS_GUI
Stack_allocation    dd 100000h;
Stack_commit        dd 1000h;
Heap_allocation     dd 100000h;
Heap_commit     dd 1000h;
loader_flag     dd 0;
number_of_dirs      dd (section_table-export_RVA)/8;
export_RVA          dd 0
export_size         dd 0
import_RVA          dd import
import_size         dd end_import-import
;------------------------------------------------
section_table       dd 'xet.','t';resource_RVA_and_resource_size
virtual_size        dd 0;exeption_RVA
virtual_address     dd start;exeption_size
Physical_size       dd end_import-start;security_RVA
Physical_offset     dd start;security_size
Relocations         dd 0;fixups_RVA
Linenumbers     dd 0;fixups_size
Relocations_and_Linenumbers_count dd 0;debug_RVA
Attributes              dd 00;0E0000020h;debug_size
;---------------------------------------------------------------------
start:  push eax;MB_OK              
    push offset wTitle+exebase  
    push offset Message+exebase 
    push eax                    
    call MessageBox+exebase     
    retn                        
;----------------------------------------------------------------------
wTitle  db 'Iczelion Tutorial #2',0   
Message db 'Win32 Assembly is Great!'  
;----------------------------------------------------------------------
import  dd 0;значение смещения от начала секции import до начала массива 
;с адресами импортируемых функций ArrayAddressImpFunc (первая копия)
        dd 0
        dd 0
    dd user32_dll;значение смещения от начала секции import 
;до начала ACSIIZ-строки с именем dll-библиотеки
    dd MessageBox;значение смещения от начала секции import до начала
;массива с адресами импортируемых функций ArrayAddressImpFunc (вторая копия)
        dd 0
        dd 0             
MessageBox      dd _MessageBoxA
        dw 0          
_MessageBoxA db 0,0,'MessageBoxA',0 ;          
user32_dll  db 'user32'                      
end_import:
end main
12) И на десерт! Во вложении программа для создания MessageBox в 97 байтов, правда работает только под Windows XP
Вложения
Тип файла: zip CreatorMiniMessageBox.zip (1.7 Кб, 58 просмотров)
1
 Аватар для zzzyyyxxx
768 / 312 / 11
Регистрация: 27.05.2011
Сообщений: 703
12.04.2012, 16:34
думаю такой вариант тоже сойдёт... встречается в программах, как дополнительный элемент защиты...
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
    .386
    .model flat, stdcall  ; 32 bit memory model
    option casemap :none  ; case sensitive
      
     include \MASM32\INCLUDE\windows.inc
     include \MASM32\INCLUDE\user32.inc
     include \MASM32\INCLUDE\kernel32.inc
 
     includelib \MASM32\LIB\user32.lib
    includelib \MASM32\LIB\kernel32.lib
.data
    _user32         db 'user32.dll',0
    _MessageBox     db 'MessageBoxA',0
    beg_            dd 0
    address         dd 0
    memory      dd 0
    MyMessage   dd 0
    
.code
start:
    invoke GetFocus 
    invoke GetModuleHandle, addr _user32
    mov beg_,eax    
    invoke GetProcAddress,eax,addr _MessageBox
    mov address,eax
    
    invoke GlobalAlloc,GMEM_FIXED,67FFEh
    mov memory,eax  
    mov edi,eax
    mov esi,beg_
    mov ecx,67FFEh
    rep movsb
        
    mov eax,address
    sub eax,beg_
    add eax,memory
    mov MyMessage,eax
    
    push 0
    push offset _MessageBox
    push offset _user32
    push 0
    call MyMessage
    
    invoke GlobalFree,memory
    invoke ExitProcess,0
    ret
end start
0
 Аватар для HITMAN
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
12.04.2012, 19:40
Возникает резонный вопрос зачем Билли так усложняет?
1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
13.04.2012, 08:37
BTW, AFAIR, кроме MessageBox(); был ещё и SysErrorBox();, сейчас доступен как
Code
1
2
 import ntvdm,'NTVDM.EXE',\
    'WOWSysErrorBox',47
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//
// SysErrorBox stuff -- duplicated in usersrv.h *and* kernel.inc
//
#define  SEB_OK         1  /* Button with "OK".     */
#define  SEB_CANCEL     2  /* Button with "Cancel"  */
#define  SEB_YES        3  /* Button with "&Yes"     */
#define  SEB_NO         4  /* Button with "&No"      */
#define  SEB_RETRY      5  /* Button with "&Retry"   */
#define  SEB_ABORT      6  /* Button with "&Abort"   */
#define  SEB_IGNORE     7  /* Button with "&Ignore"  */
#define  SEB_CLOSE      8  /* Button with "&Close"   */
 
#define  SEB_DEFBUTTON  0x8000  /* Mask to make this button default */
 
ULONG WOWSysErrorBox(
    LPSTR  szTitle,
    LPSTR  szMessage,
    USHORT wBtn1,
    USHORT wBtn2,
    USHORT wBtn3
    );
но ковырять лень.
Цитата Сообщение от IOAN
зачем Билли так усложняет?
Надеюсь, код ниже всё объяснит:
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
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
    /*
    TOP SECRET Microsoft(c) Code
    Project: Chicago(tm)
    Projected release-date: Summer 1998
    */
 
    #include "win31.h"
    #include "win95.h"
    #include "evenmore.h"
    #include "oldstuff.h"
    #include "billrulz.h"
    #define INSTALL = HARD
 
    char make_prog_look_big[1600000];
 
    void main()
    {
    while(!CRASHED)
    {
    display_copyright_message();
    display_bill_rules_message();
    do_nothing_loop();
 
    if (first_time_installation)
    {
    make_50_megabyte_swapfile();
    do_nothing_loop();
    totally_screw_up_HPFS_file_system();
    search_and_destroy_the_rest_of_OS/2();
    hang_system();
    }
 
    write_something(anything);
    display_copyright_message();
    do_nothing_loop();
    do_some_stuff();
 
    if (still_not_crashed)
    {
    display_copyright_message();
    do_nothing_loop();
    basically_run_windows_3.1();
    do_nothing_loop();
    do_nothing_loop();
    }
    }
 
    if (detect_cache())
    disable_cache();
 
    if (fast_cpu())
    {
    set_wait_states(lots);
    set_mouse(speed, very_slow);
    set_mouse(action, jumpy);
    set_mouse(reaction, sometimes);
    }
 
    /* printf("Welcome to Windows 3.11"); */
    /* printf("Welcome to Windows 95"); */
 
    printf("Welcome to Windows 98");
 
    if (system_ok())
    crash(to_dos_prompt);
    else
    system_memory = open("a:\swp0001.swp",
O_CREATE);
 
    while(something)
    {
    sleep(5);
    get_user_input();
    sleep(5);
    act_on_user_input();
    sleep(5);
    }
 
    create_general_protection_fault();
    }
0
 Аватар для HITMAN
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
13.04.2012, 09:35
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Надеюсь, код ниже всё объяснит:
Сколько голову неломал, истины той
Charles Kludge мой мозг непознал
1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
13.04.2012, 11:21
Да вобщем то ответ прост - это бизнес. Всё подпёрто костылями, начиная с незапамятных времён, равно как и у интеля, который до сих пор тащит за собой архитектуру 8080.
Когда выпустили 386, почему было не отказаться от старой системы команд, портов в/в и не запихнуть всё это в софтовый эмулятор, ках это сделала DEC для VAX'ов? Бизнес.
Почему билли-бой до сих пор не выпустил MS-DOS/386 или DOS/VM? Бизнес. Жила себе message-driven виндоболочка дешёвая и никого сильно не интересовала. Потом появилась локальная сеть, но тут внезапно! выяснилось, что не шатко - не валкая обработка сообщений ну никак не подходит для Ethernet'a... Подпёрли. Да и много откровенно цельнотянутого в виндавсе, с довольно кривой реализацией. Регистри - это Novell bindery из неТвари 3.12, AD - это NDS/eDir из той же неТвари, NTFS - тут ноги растут не из HPFS, как принято считать, а из Files-11.
Вобшем, всё, к чему не прикоснётся билли-бой, превращается... в его деньги.
Может, сумбурно рассказываю, просто слишком много ненависти.
До сих пор остаётся загадкой, почему, если Inhell анонсировала i386 в 1985, реально он появился в конце 90-х, а мастдайка, ну хоть как-то использующая этот камень, а не unreal mode, появилась только через 10 лет? И то,я щупал мастдайку-альфу в янв. 1995 - единственное, что она хорошо умела, дык это падать в BSOD и MessageBox("Not implemented yet").

P.S. Чесслово, меня, пришедшего с СМ-ЭВМ(аналоги DEC от LSI/11-03 до VAX/11-780) до сих пор коробит здешняя архитектура и система команд, даже через 20 лет.

И да, на правах оффтопа.
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
13.04.2012, 11:31  [ТС]
Charles Kludge, если не сложно прицепи ехе- и dll-файлы (можно и без исходного текста) для вывода MessageBox под DOS и бинарник с примером вывода WOWSysErrorBox, думаю, что за офтоп нас с этого топика никто не выгонит
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
13.04.2012, 11:46
Mikl___, дык прицеплено же, а SysErrorBox(); некогда ковырять - переложил код DLL'ки с сюшки на 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
format PE GUI 4.0 DLL
entry DllEntryPoint
 
include 'win32a.inc'
section '.data' data writeable readable 
 
_ntvdm  db  'NTVDM.EXE',0
hell    db  'Awaken from DOS HELL',0
;hndl   dd      ?
_s  dd  ?
_ptr    dd  ?
_ds dd  ?
_si dd  ?
_di dd  ?
_cx dd  ?
section '.text' code readable executable 
proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
;       invoke  MessageBox,NULL,hell,hell,MB_ICONERROR+MB_OK
    mov eax,TRUE
    ret
endp
 
proc InitProc 
;       mov     eax,TRUE
;       invoke  MessageBox,NULL,hell,hell,MB_ICONERROR+MB_OK
    ret
endp
 
 
proc Dispatch
  local hndl:DWORD
    invoke  MessageBox,NULL,hell,hell,MB_ICONERROR+MB_OK
    invoke  LoadLibrary, _ntvdm
        cmp    eax, -1
        jnz    @F
        ret
@@:     mov    [hndl], eax
        invoke GetProcAddress, [hndl], 87      ; getDS
        call   eax
        mov    [_ds], eax
        invoke GetProcAddress, [hndl], 109     ; getSI
        call   eax
        mov    [_si], eax
        invoke GetProcAddress, [hndl], 82      ; getCX
        call   eax
        mov    [_cx], eax
        invoke GetProcAddress, [hndl], 14      ; MGetVdmPointer
        mov    [_ptr], eax
        push   0                               ; FALSE
        push   [_cx]
    mov     edx, [_ds]                      ; _ds << 16 + _si
    shl     edx, 10h                        ;
    add     edx, [_si]                      ;
    push    edx                             ;
    call    eax                             ; PBYTE MGetVdmPointer( ULONG Address, ULONG Size, UCHAR ProtectedMode);
    mov     [_s], eax                       ; 
    invoke  MessageBox,NULL,_s,hell,MB_ICONERROR+MB_OK
    invoke  FreeLibrary,[hndl]
        invoke GetProcAddress, [hndl], 122     ; setAX
    push    2005H 
        call   eax
    ret
endp
 
data fixups
end data
 
section '.idata' import data readable writeable
 library kernel32,'KERNEL32.DLL',\
    user32,'user32.dll'
 
 import kernel32,\
    LoadLibrary,'LoadLibrary',\
    FreeLibrary,'FreeLibrary',\
    GetProcAddress,'GetProcAddress'
 
 import user32,\
    MessageBox,'MessageBoxA'
 
section '.edata' export data readable
 
  export '3rd_party.dll',\
    InitProc,'InitProc_',\
    Dispatch,'Dispatch_'
2
4192 / 1839 / 222
Регистрация: 06.10.2010
Сообщений: 4,125
13.04.2012, 14:21
Лучший ответ Сообщение было отмечено как решение

Решение

DLL
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
format PE GUI 4.0 DLL
include 'win32a.inc'
 
entry $
    mov eax,TRUE
ret 16
 
Dispatch:
    call   [getDS]
    mov    [_ds],ax
    call   [getSI]
    mov    [_si],ax
    call   [getCX]
    movzx  eax,ax
    invoke MGetVdmPointer,dword[_si],eax,0
    invoke MessageBoxA,0,eax,hell,MB_ICONERROR+MB_OK
ret
 
hell  db  'Awaken from DOS HELL',0
_si   dw  ?
_ds   dw  ?
 
align 8
data fixups
end data
 
align 8
data import
 library user32,'user32.dll',\
         ntvdm,'NTVDM.EXE'
 
 import user32,\
        MessageBoxA,'MessageBoxA'
 
 import ntvdm,\
        getDS,'getDS',\
        getSI,'getSI',\
        getCX,'getCX',\
        MGetVdmPointer,'MGetVdmPointer'
end data
 
align 8
data export
export '1.dll',\
       Dispatch,'Dispatch_'
end data
COM
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
org 100h
    mov  si, DLL_NAME
    xor  di, di
    push di
    pop  es
    mov  bx, DISPATCHER
    db   0xc4, 0xc4, 0x58, 0x0   ; register
    mov  [DLL_HANDLE],ax
 
    mov cx, message_end - message_start
    mov si, message_start
    db  0xc4, 0xc4, 0x58, 0x2   ; invoke dispatcher
 
    mov ax, [DLL_HANDLE]
    db  0xc4, 0xc4, 0x58, 0x1   ; unregister
    ret
 
DLL_HANDLE: dw 0
DLL_NAME:   db "1.dll", 0
DISPATCHER: db "Dispatch_", 0
message_start:
    db  "Hello from DOS!",0
message_end:
4
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
14.04.2012, 11:10
murderer, TNX, экий я идиото.
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
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
/*++ BUILD Version: 0001
 
Copyright (c) 1990-1999 Microsoft Corporation
 
Module Name:
 
    ISVBOP.H
 
Abstract:
 
    This is the header file supporting third party bops.
    isvbop.inc is the inc file for this h file.
 
Note:
    Following include file uses 'DB' to define assembly macros. Some
    assemblers use 'emit' instead. If you are using such a compiler,
    you will have to change db's to emit's.
 
--*/
 
 
#if _MSC_VER > 1000
#pragma once
#endif
 
#define BOP_3RDPARTY 0x58
#define BOP_UNSIMULATE 0xFE
 
/* XLATOFF */
 
/** RegisterModule - This Bop call is made from the 16 bit module
 *           to register a third party DLL with the bop
 *           manager. This call returns a handle to the
 *           16bit caller which is to be used later to
 *           dispatch a call to the DLL.
 *
 *  INPUT:
 *  Client DS:SI - asciiz string of DLL name.
 *      Client ES:DI - asciiz string of Init Routine in the DLL. (Optional)
 *  Client DS:BX - asciiz string to Dispatch routine in the DLL.
 *
 *  OUTPUT:
 *  SUCCESS:
 *      Client Carry Clear
 *      Client AX = Handle (non Zero)
 *  FAILURE:
 *      Client Carry Set
 *      Client AX = Error Code
 *          AX = 1 - DLL not found
 *          AX = 2 - Dispacth routine not found.
 *          AX = 3 - Init Routine Not Found
 *          AX = 4 - Insufficient Memory
 *
 *  NOTES:
 *  RegisterModule results in loading the DLL (specified in DS:SI).
 *      Its Init routine (specified in ES:DI) is called. Its Dispatch
 *  routine (specified in DS:BX) is stored away and all the calls
 *      made from DispatchCall are dispacthed to this routine.
 *      If ES and DI both are null than the caller did'nt supply the init
 *      routine.
 */
 
#define RegisterModule() _asm _emit 0xC4 _asm _emit 0xC4 _asm _emit BOP_3RDPARTY _asm _emit 0x0
 
/** UnRegisterModule - This Bop call is made from the 16 bit module
 *             to unregister a third party DLL with the bop
 *             manager.
 *
 *  INPUT:
 *  Client AX - Handle returned by RegisterModule Call.
 *
 *  OUTPUT:
 *  None (VDM Is terminated with a debug message if Handle is invalid)
 *
 *  NOTES:
 *  Use it if initialization of 16bit app fails after registering the
 *  Bop.
 */
 
#define UnRegisterModule() _asm _emit 0xC4 _asm _emit 0xC4 _asm _emit BOP_3RDPARTY _asm _emit 0x1
 
/** DispacthCall - This Bop call is made from the 16 bit module
 *         to pass a request to its DLL.
 *
 *  INPUT:
 *  Client AX - Handle returned by RegisterModule Call.
 *
 *  OUTPUT:
 *  None (DLL should set the proper output registers etc.)
 *  (VDM Is terminated with a debug message if Handle is invalid)
 *
 *  NOTES:
 *  Use it to pass a request to 32bit DLL. The request index and the
 *  parameters are passed in different registers. These register settings
 *  are private to the 16bit module and its associated VDD. Bop manager
 *  does'nt know anything about these registers.
 */
#define DispatchCall()   _asm _emit 0xC4 _asm _emit 0xC4 _asm _emit BOP_3RDPARTY _asm _emit 0x2
 
/*** VDDUnSimulate16
 *
 *   This service causes the simulation of intel instructions to stop and
 *   control to return to VDD.
 *
 *   INPUT
 *      None
 *
 *   OUTPUT
 *      None
 *
 *   NOTES
 *      This service is a macro intended for 16bit stub-drivers. At the
 *      end of worker routine stub-driver should use it.
 */
 
#define VDDUnSimulate16() _asm _emit 0xC4 _asm _emit 0xC4 _asm _emit BOP_UNSIMULATE
 
/* XLATON */
 
 
/* ASM
RegisterModule macro
    db  0C4h, 0C4h, BOP_3RDPARTY, 0
        endm
 
UnRegisterModule macro
    db  0C4h, 0C4h, BOP_3RDPARTY, 1
    endm
 
DispatchCall macro
    db  0C4h, 0C4h, BOP_3RDPARTY, 2
    endm
 
VDDUnSimulate16 macro
    db  0C4h, 0C4h, BOP_UNSIMULATE
    endm
 
 */
И причесал bop.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
macro   RegisterModule { dd 0058C4C4h }
macro   UnRegisterModule { dd 0158C4C4h }
macro   DispatchCall { dd 0258C4C4h }
 
    org 100h
start:
    mov si, DLL_NAME
;   mov di, DLL_INIT
; comment out for no init proc...
    xor di, di
    push    di
    pop es
    mov bx, DISPATCHER
    RegisterModule   
    jc  error
    mov [DLL_HNDL], ax
    mov al, 'L'         ; loaded
    int 0x29
 
    mov ax, [DLL_HNDL]
    mov cx, msg_sz
    mov si, msg
    DispatchCall    
    cmp ax, 0x2005      ; check return value...
    jnz no_ret
    mov al, 'R'
    int 0x29
    jmp skip
no_ret:
    mov al, 'N'
    int 0x29
skip:
;...
;...
    mov ax, [DLL_HNDL]
    UnRegisterModule
    ret
;       Client AX = Error Code
;           AX = 1 - DLL not found
;           AX = 2 - Dispacth routine not found.
;           AX = 3 - Init Routine Not Found
;           AX = 4 - Insufficient Memory
 
error:
    or  al,30h      
    int 0x29
    ret
 
DLL_HNDL:   dw 0
DLL_NAME:   db "3rd_party.dll", 0
DLL_INIT:   db "InitProc_", 0
DISPATCHER: db "Dispatch_", 0
msg:        db  "Hello from DOS!",0
msg_sz      = $ - msg
Добавлено через 19 часов 14 минут
И да, найдены сырцы Windows Server 2003 SP1 DDK online в удобном для закачки виде.
Вменяемый конвертер сюшных хидеров в инклюды: h2incX
2
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
16.04.2012, 04:24  [ТС]
Тексты программ на разных диалектах ассемблера выводящие MessageBox
13) Solar Assembler
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
;------------------------------------------------------
; Sol_Asm assembler core
; Copyright (c) 2004-2007, Bogdan Valentin Ontanu.
; All rights reserved.
;------------------------------------------------------
 
;------------------------------------------------------------------
; This file is used to test Sol_ASM
; win32_pe format generation
;------------------------------------------------------------------
 
import_dll  user32.dll
import_func MessageBox alias MessageBoxA
 
 
section "code"      class_code
section "idata"     class_imports
section "data"      class_data
 
 
.data
 
sz_message  db  "First Win32 PE application",0
sz_title    db  "Sol_ASM",0
 
 
.code
 
    invoke  MessageBox, 0, sz_message, sz_title, 3
 
    ret
14) YASM
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
; yasm windows gui #
; yasm -f bin hello.asm -o hello.exe
%define exebase     0x400000
%define MB_OK       0
%macro invoke 1-*  ; macro to call Win32 API functions
    %rep %0 - 1     ; repeat for each argument
        %rotate -1  ; rotate right (last becomes %1)
        push %1     ; push argument
    %endrep
    %rotate -1      ; %1 = function name
    call  [%1]      ; call API function via IAT
%endm
[BITS 32]
org exebase
;for WinXP - 335 bytes
dd 'MZ','PE',1014Ch,0,0,0,10F0080h,10Bh,END_SECTION-start,0,0,start-exebase
dd start-exebase,0,exebase,4,4,4,0,4,0,END_SECTION-exebase,start-exebase,0,2
dd 100000h,1000h,100000h,1000h,0,4,0,0,import-exebase,end_import-import,0,0,0
dd 0,'.text',0,start-exebase,END_SECTION-start,start-exebase,0,0,0,0E0000020h
;---------------------------------------------------------------------
start:  invoke MessageBox,eax,Message,wTitle,eax;MB_OK
        retn
;----------------------------------------------------------------------
wTitle  db 'Iczelion Tutorial #2:MessageBox',0
Message db 'Win32 Assembly with Yasm is Great!'
;----------------------------------------------------------------------
import:
dd 0,0,0,user32_dll-exebase
dd user32_table-exebase
dd 0,0
user32_table:
MessageBox      dd _MessageBoxA-exebase
                dw 0
_MessageBoxA    db 0,0,'MessageBoxA',0      
user32_dll  db 'user32'
end_import:
END_SECTION:
15) Вывод MessageBox (на самом деле SysErrorBox) в DOS-окне под Windows
текст 1.asm из которого будет создана 1.DLL (диалект MASM)
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
; masm windows dll #
.686
.model flat
include windows.inc
include ntvdm.inc
includelib ntvdm.lib
;------------------------------------
NO_BUTTON      equ 0  ; No button
SEB_OK         equ 1  ; Button with "OK".     
SEB_CANCEL     equ 2  ; Button with "Cancel"  
SEB_YES        equ 3  ; Button with "&Yes"     
SEB_NO         equ 4  ; Button with "&No"      
SEB_RETRY      equ 5  ; Button with "&Retry"   
SEB_ABORT      equ 6  ; Button with "&Abort"   
SEB_IGNORE     equ 7  ; Button with "&Ignore"  
SEB_CLOSE      equ 8  ; Button with "&Close"
SEB_DEFBUTTON  equ 8000h  ; Mask to make this button default 
;-------------------------------------
.data
hell  db  'Awaken from DOS HELL',0
message db 'Hello from DOS!',0
 
.code
DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
    mov eax,TRUE
    ret
DllEntry endp
 
Dispatch_ proc
    invoke WOWSysErrorBox,addr message,addr hell,SEB_OK,NO_BUTTON,NO_BUTTON
    ret
Dispatch_ endp
end DllEntry
текст 1.def
Assembler
1
2
3
LIBRARY 1
EXPORTS 
Dispatch_
строки в bat-файле для создания DLL
Code
1
2
3
4
5
6
7
8
9
@echo off
 
\masm32\bin\ml /c /coff /Cp /Gz /I\masm32\include 1.asm
\masm32\bin\Link /SECTION:.bss,S /DLL /DEF:1.def /SUBSYSTEM:WINDOWS /LIBPATH:\masm32\lib 1.obj
del 1.obj
del 1.exp
del 1.lib
 
pause
текст 2.asm для создания 2.com
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
; masm dos com #
.286
.model tiny
.code
BOP_3RDPARTY equ 58h
org 100h
start:
comment * -------------------------------------------------------------
 RegisterModule - This Bop call is made from the 16 bit module
        to register a third party DLL with the bop
        manager. This call returns a handle to the
        16bit caller which is to be used later to
        dispatch a call to the DLL.
 
   INPUT:
   Client DS:SI - asciiz string of DLL name.
       Client ES:DI - asciiz string of Init Routine in the DLL. (Optional)
   Client DS:BX - asciiz string to Dispatch routine in the DLL.
 
   OUTPUT:
   SUCCESS:
       Client Carry Clear
       Client AX = Handle (non Zero)
   FAILURE:
       Client Carry Set
       Client AX = Error Code
       AX = 1 - DLL not found
       AX = 2 - Dispacth routine not found.
       AX = 3 - Init Routine Not Found
       AX = 4 - Insufficient Memory
 
   NOTES:
   RegisterModule results in loading the DLL (specified in DS:SI).
       Its Init routine (specified in ES:DI) is called. Its Dispatch
   routine (specified in DS:BX) is stored away and all the calls
       made from DispatchCall are dispacthed to this routine.
       If ES and DI both are null than the caller did'nt supply the init
       routine.
----------------------------------------------------------------- *
 
    mov si,offset DLL_NAME
    xor di,di
    push di
    pop es
    mov bx,offset DISPATCHER
db 0C4h, 0C4h, BOP_3RDPARTY, 0    ; register
    mov DLL_HANDLE,ax
 
comment *  -----------------------------------------------------------
 DispacthCall - This Bop call is made from the 16 bit module
      to pass a request to its DLL.
 
   INPUT:
   Client AX - Handle returned by RegisterModule Call.
 
   OUTPUT:
   None (DLL should set the proper output registers etc.)
   (VDM Is terminated with a debug message if Handle is invalid)
 
   NOTES:
   Use it to pass a request to 32bit DLL. The request index and the
   parameters are passed in different registers. These register settings
   are private to the 16bit module and its associated VDD. Bop manager
   does'nt know anything about these registers. 
------------------------------------------------------------------- *
 
db 0C4h, 0C4h, BOP_3RDPARTY, 2   ; invoke dispatcher
 
comment * ---------------------------------------------------------
 UnRegisterModule - This Bop call is made from the 16 bit module
          to unregister a third party DLL with the bop
          manager.
 
   INPUT:
   Client AX - Handle returned by RegisterModule Call.
 
   OUTPUT:
   None (VDM Is terminated with a debug message if Handle is invalid)
 
   NOTES:
   Use it if initialization of 16bit app fails after registering the
   Bop. 
------------------------------------------------------------------ *
 
    mov ax,DLL_HANDLE
db 0C4h, 0C4h, BOP_3RDPARTY, 1   ; unregister
    retn
 
DLL_HANDLE dw 0
DLL_NAME   db "1.dll", 0
DISPATCHER db "Dispatch_", 0
end start
строки в bat-файле для создания 2.COM
Code
1
2
3
4
5
@echo off
cls
ml /AT /c /Cp /Gz /I\masm32\include 2.asm
Link16 /t 2.obj ,2.com;
del 2.obj
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
16.04.2012, 04:39  [ТС]
Во вложении исходные тексты, батники, 1.dll, 1.def, 1.asm, 2.asm, 2.com, ntvdm.inc, ntvdm.lib, link16.exe
Вложения
Тип файла: zip MessageBox_from_DOS.zip (363.8 Кб, 33 просмотров)
0
4192 / 1839 / 222
Регистрация: 06.10.2010
Сообщений: 4,125
11.08.2014, 13:11
Mikl___
А не подскажешь, что находится внутри DefWindowProcW?

Дело в том, что такая программа прекрасно работает
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <windows.h>
void main(void)
{
    MSG msg;
    HWND wnd=CreateWindowExW(0,L"STATIC",0,WS_VISIBLE+WS_OVERLAPPEDWINDOW,0,0,200,200,0,0,0,0);
    SetWindowLongPtrW(wnd,GWL_WNDPROC,LONG(&DefWindowProcW));
    while(GetMessageW(&msg,wnd,0,0))
        if ((msg.message==WM_NCLBUTTONDOWN)&&(DefWindowProcW(wnd,WM_NCHITTEST,0,MAKELONG(msg.pt.x,msg.pt.y))==HTCLOSE))
            ExitProcess(0);
        else
            DefWindowProcW(wnd,msg.message,msg.wParam,msg.lParam);
}
Но если закомментировать SetWindowLong, то функция DefWindowProcW перестаёт правильно обрабатывать сообщение WM_NCLBUTTONDOWN и окно становится невозможно перетащить.

Подскажите, где и в какой книге Кастанеда пишет об этом в MSDN написано о таком странном поведении.

P.S.
Это смотрел, но не понял. Хотя возможно в ReactOS функция ведёт себя иначе.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
11.08.2014, 18:39
murderer, можно ещё глянуть в Wine source.
0
4192 / 1839 / 222
Регистрация: 06.10.2010
Сообщений: 4,125
11.08.2014, 18:45
Да хотелось бы прочитать оригинальный мануал от Microsoft... Для меня было неожиданностью, что сообщение WM_CLOSE не приходит через GetMessage, а генерируется где-то в DispatchMessage (в MSDN написано "A window receives this message through its WindowProc function" и всё).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.08.2014, 18:45
Помогаю со студенческими работами здесь

При нажатии в одном messagebox "Нет" всё равно появляется другой messagebox
При удалении записи сделал messagebox с подтверждением Да или Нет. При нажатии Нет всё равно выходит messagebox &quot;Выбранная запись...

Как создать лимит message messagebox?
У меня проблема с окном сообщения вместо одного message box У меня появляется бесконечное message box .

Как создать MessageBox без паузы
когда я вызываю MessageBox, обработка кода останавливается. можно ли как-то вызвать MessageBox, чтобы проц не дожидался закрытия Диалога?

Как создать несколько MessageBox.Show?
Помогите пж! Как создать несколько сообщений messagebox? Мне нужно, чтобы вылазило не одно сообщение, а сразу несколько, как это сделать?

Как создать button для закрытия form (messagebox)?
Подскажите пожалуйста, как прописать button, чтобы при нажатии на него выходило окно &quot;Вы хотите выйти?&quot; - &quot;да&quot; или...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru