ANDLL писал(а):iGrok
Ну если правда, то это баг эмуляции. Хотелось бы увидеть именно код который выполняется без эмулятора MS-DOS
Ок. Не вопрос. =)
Вот fasm'овый исходник. Взят стандартный темплейт Win-приложения, и на окончание обработки MessageLoop перед ExitProcess повешен "смертельный цикл".. XP при закрытии окна выдаёт "недопустимую операцию". А вот Win98 - виснет намертво. В аттаче - скомпиленный под FASMW 1.56 экзешник. Только что проверил на v4.10.1998 и на XPsp2.
Собственно, почему эффект должен был хоть чем-то отличаться от режима DOS, если Win98, как и 95 и все предыдущие (исключая NT-линейку) это фактически надстройка над DOS, а не полноценная самостоятельная система (тут утрирую, согласен)?
- Код: Выделить всё
format PE GUI 4.0
entry start
include 'd:\Program\FASM_1.56\INCLUDE\win32a.inc'
section '.data' data readable writeable
_title db 'Win32 program template',0
_class db 'FASMWIN32',0
mainhwnd dd ?
hinstance dd ?
msg MSG
wc WNDCLASS
section '.code' code readable executable
start:
invoke GetModuleHandle,0
mov [hinstance],eax
invoke LoadIcon,0,IDI_APPLICATION
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
mov [wc.style],0
mov [wc.lpfnWndProc],WindowProc
mov [wc.cbClsExtra],0
mov [wc.cbWndExtra],0
mov eax,[hinstance]
mov [wc.hInstance],eax
mov [wc.hbrBackground],COLOR_BTNFACE+1
mov [wc.lpszMenuName],0
mov [wc.lpszClassName],_class
invoke RegisterClass,wc
invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,192,192,NULL,NULL,[hinstance],NULL
mov [mainhwnd],eax
msg_loop:
invoke GetMessage,msg,NULL,0,0
or eax,eax
jz end_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop
end_loop:
; начало смертельного цикла
cli
jmp end_loop
; конец смертельного цикла
invoke ExitProcess,[msg.wParam]
proc WindowProc, hwnd,wmsg,wparam,lparam
push ebx esi edi
cmp [wmsg],WM_DESTROY
je wmdestroy
defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmdestroy:
invoke PostQuitMessage,0
xor eax,eax
finish:
pop edi esi ebx
return
endp
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'
import kernel,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess'
import user,\
RegisterClass,'RegisterClassA',\
CreateWindowEx,'CreateWindowExA',\
DefWindowProc,'DefWindowProcA',\
GetMessage,'GetMessageA',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
LoadCursor,'LoadCursorA',\
LoadIcon,'LoadIconA',\
PostQuitMessage,'PostQuitMessage'