Ассемблер для Windows



         

Под процессом будем понимать объект - часть 6


; структура - информация о процессе PROCINF STRUC hProcess DD ? hThread DD ? Idproc DD ? idThr DD ? PROCINF ENDS

; файл proces.asm .386P ; плоская модель .MODEL FLAT, stdcall include proces.inc ; директивы компоновщику для подключения библиотек IFDEF MASM ; директивы MASM includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib ELSE ; директивы TASM includelib c:\tasm32\lib\import32.lib ENDIF

; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' NEWHWND DD 0 MSG MSGSTRUCT <?> STRUP STARTUP <?> INF PROCINF <?> HINST DD 0 ; дескриптор приложения PA DB "DIAL1",0 PMENU DB "MENUP",0 PATH DB "C:\Program Files\Office\WINWORD.EXE",0 _DATA ENDS

; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить дескриптор приложения PUSH 0 CALL GetModuleHandleA@4 MOV [HINST], EAX ; создать модальный диалог PUSH 0 PUSH OFFSET WNDPROC PUSH 0 PUSH OFFSET PA PUSH [HINST] CALL DialogBoxParamA@20 PUSH 0 CALL ExitProcess@4 ;-----------------------------------

; процедура окна ; расположение параметров в стеке ; [EBP+014Н] ; LPARAM ; [EBP+10Н] ; WAPARAM ; [EBP+0CH] ; MES ; [EBP+8] ; HWND WNDPROC PROC PUSH EBP MOV EBP,ESP PUSH EBX PUSH ESI PUSH EDI ; сообщение при закрытии окна CMP DWORD PTR [EBP+0CH],WM_CLOSE JNE L1 ; закрыть диалоговое окно JMP L5 L1: ; сообщение при инициализации окна CMP DWORD PTR [EBP+0CH],WM_INITDIALOG JNE L3 ; загрузить меню PUSH OFFSET PMENU PUSH [HINST] CALL LoadMenuA@8 ; установить меню PUSH EAX PUSH DWORD PTR [EBP+08H] CALL SetMenu@8 JMP FINISH ; проверяем, не случилось ли чего с пунктами ; меню в диалоговом окне L3: CMP DWORD PTR [EBP+0CH],WM_COMMAND JNE FINISH CMP WORD PTR [EBP+10H],3 JE L5 CMP WORD PTR [EBP+10H],2 JE L7 CMP WORD PTR [EBP+10H],1 JE L6 JMP FINISH ; закрыть диалоговое окно L5: PUSH 0 PUSH DWORD PTR [EBP+08H] CALL EndDialog@8 JMP FINISH ; запустить программу WORD L6: ; заполняем структуру для запуска ; окно должно появляться в свернутом виде MOV STRUP.cb,68 MOV STRUP.lpReserved,0 MOV STRUP.lpDesktop,0 MOV STRUP.lpTitle,0 MOV STRUP.dwFlags, STARTF_USESHOWWINDOW MOV STRUP.cbReserved2,0 MOV STRUP.lpReserved2,0 MOV STRUP.wShowWindow,SW_SHOWMINIMIZED ; запуск приложения Winword PUSH OFFSET INF PUSH OFFSET STRUP PUSH 0 PUSH 0 PUSH 0 PUSH 0 PUSH 0 PUSH 0 PUSH OFFSET PATH PUSH 0 CALL CreateProcessA@40 JMP FINISH ; удалить из памяти процесс L7: PUSH 0 ; код выхода PUSH INF.hProcess CALL TerminateProcess@8 FINISH: MOV EAX,0 POP EDI POP ESI POP EBX POP EBP RET 16 WNDPROC ENDP _TEXT ENDS END START




Содержание  Назад  Вперед