Win32 API. Урок 17. Динамические библиотекиТекст tut_17a Код (ASM): format PE GUI 4.0 DLL entry DllMain include '%fasminc%\win32a.inc' section '.data' data readable writeable DllErrBoxTitle db 'DllMsgBox - Error',0 section '.code' code readable executable proc DllMain, hinstDll, fdwReason, lpvReserved mov eax,TRUE return endp proc DllErrBox, hWnd, errMsg invoke MessageBox,[hWnd],[errMsg],DllErrBoxTitle,MB_OK + MB_ICONERROR return endp section '.idata' import data readable library USER32, 'USER32.DLL' import USER32,\ MessageBox, 'MessageBoxA' section '.edata' export data readable export 'TUT_17.DLL',\ DllErrBox, 'DllErrBox' section '.reloc' fixups data discardable Текст tut_17b.asm Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable msg1 db '[code]',13,10 db ' Invoke DllErrBox,HWND_DESKTOP,msg1',13,10,13,10 db ' import TUT_17A,\',13,10 db ' DllErrBox, ''DllErrBox''',13,10 db '[/codе]',0 section '.code' code readable executable start: invoke DllErrBox,HWND_DESKTOP,msg1 invoke ExitProcess,0 section '.idata' import data readable library KERNEL32,'KERNEL32.DLL',\ TUT_17A, 'TUT_17A.DLL' import KERNEL32,\ ExitProcess, 'ExitProcess' import TUT_17A,\ DllErrBox, 'DllErrBox' Текст tut_17c.asm Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable dllName db 'TUT_17A.DLL',0 ;dll name that to be loaded funcName db 'DllErrBox',0 ;function / proc name that wish to be called funcAddr dd ? ;store function address msgBoxTitle db 'Error',0 msgBoxDll db 'The Requested DLL not found!',0 msgBoxProc db 'The Requested Procedure not found!',0 msg1 db '[code]',13,10 db ' invoke LoadLibrary,dllName',13,10 db ' invoke GetProcAddress,eax,funcName',13,10 db ' invoke funcAddr,HWND_DESKTOP,msg1',13,10 db '[/codе]',0 section '.code' code readable executable start: invoke LoadLibrary,dllName cmp eax,NULL ;the dll not found je dll_not_found invoke GetProcAddress,eax,funcName cmp eax,NULL ;requested function not found je proc_not_found mov [funcAddr],eax invoke funcAddr,HWND_DESKTOP,msg1 jmp exit dll_not_found: invoke MessageBox,HWND_DESKTOP,msgBoxDll,msgBoxTitle,MB_OK + MB_ICONERROR jmp exit proc_not_found: invoke MessageBox,HWND_DESKTOP,msgBoxProc,msgBoxTitle,MB_OK + MB_ICONERROR jmp exit exit: invoke ExitProcess,0 section '.idata' import data readable library KERNEL32,'KERNEL32.DLL',\ USER32, 'USER32.DLL' import KERNEL32,\ GetProcAddress, 'GetProcAddress',\ LoadLibrary, 'LoadLibraryA',\ ExitProcess, 'ExitProcess' import USER32,\ MessageBox, 'MessageBoxA' Результат tut_17b.asm tut_17c.asm
Win32 API. Урок 18. Простые управляющие элементыисходный текст и ехе-файл здесь Код (ASM): format PE GUI include 'win32ax.inc' pb1 equ 1 sb1 equ 2 tm1 equ 3 btn1 equ 4 PBS_SMOOTH equ 1 PBS_VERTICAL equ 4 start: xor ebx,ebx mov edi,wTitle mov esi,400000h ; +------------------------------+ ; | registering the window class | ; +------------------------------+ invoke RegisterClass,esp,ebx,window_procedure,ebx,\ ebx,esi,ebx,10005h,COLOR_BTNFACE+1,ebx,edi push ebx push esi shl esi,9 invoke CreateWindowEx,ebx,edi,edi,\ WS_OVERLAPPEDWINDOW+WS_VISIBLE- WS_MAXIMIZEBOX - WS_SIZEBOX,\ esi,esi,394,240,ebx,ebx pop esi mov edi,eax invoke CreateWindowEx,WS_EX_DLGMODALFRAME,progressclass,ebx,WS_CHILD + WS_VISIBLE,\ 10,10,367,22,eax,pb1,esi,ebx mov [pb1H],eax invoke SendMessage,eax,PBM_SETSTEP,2,ebx invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_STATICEDGE,progressclass,ebx,WS_CHILD + WS_VISIBLE + PBS_SMOOTH,\ 10,40,367,22,edi,pb1,esi,ebx mov [pb2H],eax invoke SendMessage,eax,PBM_SETSTEP,2,ebx invoke CreateWindowEx,ebx,progressclass,ebx,WS_CHILD + WS_VISIBLE + PBS_VERTICAL,\ 305,80,25,100,edi,pb1,esi,ebx mov [pb3H],eax invoke SendMessage,eax,PBM_SETSTEP,2,ebx invoke CreateWindowEx,ebx,progressclass,ebx,WS_CHILD + WS_VISIBLE + PBS_SMOOTH + PBS_VERTICAL,\ 350,80,25,100,edi,pb1,esi,ebx mov [pb4H],eax invoke SendMessage,eax,PBM_SETSTEP,2,ebx invoke CreateStatusWindow,WS_CHILD + WS_VISIBLE,ebx,edi,sb1 mov [sb1H],eax invoke CreateWindowEx,ebx,"BUTTON","Click To Start",\ WS_CHILD + WS_VISIBLE + BS_PUSHBUTTON,\ 10,90,100,30,edi,btn1,esi,ebx mov [btn1H],eax invoke CreateSolidBrush,0FF0000h mov [blueBrush],eax mov ebp,esp ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ window_message_loop_start: invoke GetMessage,ebp,ebx,ebx,ebx invoke DispatchMessage,ebp jmp window_message_loop_start ;+----------------------+ ;| the window procedure | ;+----------------------+ proc window_procedure hWnd, uMsg, wParam, lParam local ps:PAINTSTRUCT local buffer[20]:BYTE local oldBrush:DWORD xor ebx,ebx mov eax,[uMsg] mov edi,[hWnd] dec eax;cmp [uMsg],WM_DESTROY=2 dec eax je .wmDESTROY sub eax,WM_PAINT-WM_DESTROY;cmp [uMsg],WM_PAINT=0Fh je .wmPAINT sub eax,WM_COMMAND-WM_PAINT;cmp [uMsg],WM_COMMAND=111h je .wmCOMMAND dec eax;cmp [uMsg],WM_TIMER=113h dec eax je .wmTIMER .wmDefault: leave jmp [DefWindowProc] .wmDESTROY: invoke ExitProcess,ebx .wmPAINT: invoke BeginPaint,edi,esp invoke SelectObject,dword[ps],[blueBrush] mov [oldBrush],eax finit fld [angle] fsincos push 80.0 push 80.0 fmul dword[esp] fistp dword[esp] fmul dword[esp+4] fchs fist dword[esp+4] add dword[esp+4],130 add dword[esp],190 invoke Pie,dword[ps],110,80,270,180,190,80 invoke SelectObject,dword[ps],[oldBrush] invoke EndPaint,edi,esp jmp .wmBYE .wmCOMMAND: cmp [wParam],BN_CLICKED shl 16 or 4 jne .wmBYE .wmCOMMAND_btn1: invoke SetTimer,edi,tm1,100,ebx invoke EnableWindow,[btn1H],ebx jmp .wmBYE .wmTIMER: lea esi,[SendMessage] mov edi,3 @@: push ebx ebx PBM_STEPIT [pb1H+edi*4] call dword[esi];invoke SendMessage,[pb1H],PBM_STEPIT,ebx,ebx push ebx ebx PBM_GETPOS [pb1H+edi*4] call dword[esi];invoke SendMessage,[pb1H],PBM_GETPOS,ebx,ebx dec edi jns @b lea edi,[buffer] cinvoke wsprintf,edi,template,eax push edi ebx SB_SETTEXT [sb1H] call dword[esi];invoke SendMessage,[sb1H],SB_SETTEXT,ebx,ebp invoke InvalidateRect,[hWnd],ebx,ebx finit fld [delta] fadd [angle] fst [angle] sub [pb1StepCurrent],2 jne .wmBYE invoke KillTimer,[hWnd],tm1 push aText1 edi SB_SETTEXT [sb1H] call dword[esi];invoke SendMessage,[sb1H],SB_SETTEXT,ebx," 100% Completed" invoke MessageBox,[hWnd],aText2,aCaption,MB_OK + MB_ICONWARNING .wmBYE: ret endp ;------------------------------------------------------------ template db " Process : %i %%",0 aCaption db 'Virus Detected - Norton Antivirus',0 aText1 db ' 100% Completed',0 aText2 db 'Norton Antivirus detected "tut_18.exe" contained virus.',13,10 db 'Please remove this application!',0 wTitle db 'Iczelion Tutorial #18: Common Controls',0 pb1H rd 1 pb2H rd 1 pb3H rd 1 pb4H rd 1 pb1StepCurrent dd 100 ;current step value sb1H rd 1 btn1H rd 1 angle dd 1.5795229730548682671159401454822;90.5*pi/180 delta dd 0.12548917321839229658081336625433;7.19*pi/180 progressclass db 'msctls_progress32',0 blueBrush rd 1 ;------------------------------------------------------------- data import library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ gdi32, 'gdi32.dll',\ COMCTL32, 'COMCTL32.DLL' import KERNEL32,\ ExitProcess, 'ExitProcess' import gdi32,\ Pie, 'Pie',\ SelectObject, 'SelectObject',\ CreateSolidBrush, 'CreateSolidBrush' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ SetTimer, 'SetTimer',\ KillTimer, 'KillTimer',\ wsprintf, 'wsprintfA',\ MessageBox, 'MessageBoxA',\ EnableWindow, 'EnableWindow',\ DestroyWindow, 'DestroyWindow',\ DispatchMessage, 'DispatchMessageA',\ BeginPaint, 'BeginPaint',\ EndPaint, 'EndPaint',\ InvalidateRect, 'InvalidateRect',\ PostQuitMessage, 'PostQuitMessage' import COMCTL32,\ CreateStatusWindow, 'CreateStatusWindow' end data Результат
Win32 API. Урок 19. Tree View Controlисходный текст и ехе-файл здесь Код (ASM): format PE GUI include 'win32ax.inc' ;------------------------------------------------ start: xor ebx,ebx mov edi,wTitle mov esi,400000h ; +------------------------------+ ; | registering the window class | ; +------------------------------+ invoke RegisterClass,esp,ebx,window_procedure,ebx,\ ebx,esi,ebx,10005h,COLOR_BTNFACE+1,ebx,edi ; +--------------------------+ ; | creating the main window | ; +--------------------------+ push ebx esi ebx ebx 400 200 shl esi,9 invoke CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,\ esi,esi mov ebp,esp ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ @@: invoke GetMessage,ebp,ebx,ebx,ebx invoke DispatchMessage,ebp jmp @r ;+----------------------+ ;| the window procedure | ;+----------------------+ proc window_procedure hWnd, uMsg, wParam, lParam mov esi,[tv1H] cmp [uMsg],WM_CREATE je wmCREATE cmp [uMsg],WM_DESTROY je wmDESTROY cmp [uMsg],WM_NOTIFY je wmNOTIFY cmp [uMsg],WM_MOUSEMOVE je wmMOUSEMOVE cmp [uMsg],WM_LBUTTONUP je wmLBUTTONUP wmDEFAULT: leave jmp [DefWindowProc] wmMOUSEMOVE: cmp [imgl1Drag],0 je wmDEFAULT movzx eax,word[lParam] movzx ecx,word[lParam+2] lea edi,[tv1HitInfo] mov [edi+TV_HITTESTINFO.pt.x],eax mov [edi+TV_HITTESTINFO.pt.y],ecx invoke ImageList_DragMove,eax,ecx invoke ImageList_DragShowNolock,0 invoke SendMessage,esi,TVM_HITTEST,0,edi or eax,eax jz @f invoke SendMessage,esi,TVM_SELECTITEM,TVGN_DROPHILITE,eax @@: invoke ImageList_DragShowNolock,TRUE jmp wmBYE wmNOTIFY: mov edi,[lParam] cmp [edi + NM_TREEVIEW.hdr.code],TVN_BEGINDRAG jne wmBYE invoke SendMessage,esi,TVM_CREATEDRAGIMAGE,0,[edi + NM_TREEVIEW.itemNew.hItem] mov [imgl1DragH],eax invoke ImageList_BeginDrag,eax,0,0,0 invoke ImageList_DragEnter,esi,[edi + NM_TREEVIEW.ptDrag.x],[edi + NM_TREEVIEW.ptDrag.y] invoke SetCapture,[hWnd];eax or [imgl1Drag],TRUE jmp wmBYE wmLBUTTONUP: cmp [imgl1Drag],0 jz wmBYE invoke ImageList_DragLeave,esi invoke ImageList_EndDrag invoke ImageList_Destroy,[imgl1DragH] invoke SendMessage,esi,TVM_GETNEXTITEM,TVGN_DROPHILITE,0 invoke SendMessage,esi,TVM_SELECTITEM,TVGN_CARET,eax invoke SendMessage,esi,TVM_SELECTITEM,TVGN_DROPHILITE,0 invoke ReleaseCapture and [imgl1Drag],0 jmp wmBYE wmCREATE: invoke CreateWindowEx,0,ctlClsNameTv,0,\ WS_VISIBLE + WS_CHILD + WS_BORDER + TVS_HASBUTTONS + TVS_LINESATROOT + TVS_HASLINES,\ 0,0,200,400,[hWnd],0,400000h,0 mov [tv1H],eax mov esi,eax invoke ImageList_Create,16,16,ILC_COLOR16,2,10 ;with mask mov edi,eax invoke LoadBitmap,400000h,31 invoke ImageList_Add,edi,eax,0,eax ;with mask invoke DeleteObject invoke SendMessage,esi,TVM_SETIMAGELIST,0,edi lea edi,[tv1Insert] mov [edi+TV_INSERTSTRUCT.item.mask],TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE mov [edi+TV_INSERTSTRUCT.item.pszText],tv1Txt1 mov [edi+TV_INSERTSTRUCT.item.iImage],0 or [edi+TV_INSERTSTRUCT.item.iSelectedImage],1 invoke SendMessage,[tv1H],TVM_INSERTITEM,0,edi mov [edi+TV_INSERTSTRUCT.hParent],eax mov [edi+TV_INSERTSTRUCT.hInsertAfter],TVI_LAST mov [edi+TV_INSERTSTRUCT.item.pszText],tv1Txt2 invoke SendMessage,esi,TVM_INSERTITEM,0,edi mov [edi+TV_INSERTSTRUCT.item.pszText],tv1Txt3 invoke SendMessage,esi,TVM_INSERTITEM,0,edi and [imgl1Drag],0 wmBYE: xor eax,eax ret wmDESTROY: invoke ExitProcess,0 endp ;-------------------------------------------------------------------- wTitle db 'Iczelion Tutorial #19:Tree View Control in FASM',0 ctlClsNameTv db 'SysTreeView32',0 tv1H rd 1 tv1Txt1 db 'Node - Parent',0 tv1Txt2 db 'Node - Child 1',0 tv1Txt3 db 'Node - Child 2',0 imgl1Drag dd FALSE tv1Insert TV_INSERTSTRUCT 0,TVI_ROOT tv1HitInfo TV_HITTESTINFO imgl1DragH rd 1 ;--------------------------------------------------------------------- data import library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ GDI32, 'GDI32.DLL',\ COMCTL32, 'COMCTL32.DLL' import KERNEL32,\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ LoadBitmap, 'LoadBitmapA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ MessageBox, 'MessageBoxA',\ SetCapture, 'SetCapture',\ ReleaseCapture, 'ReleaseCapture',\ GetParent, 'GetParent',\ DestroyWindow, 'DestroyWindow',\ DispatchMessage, 'DispatchMessageA' import GDI32,\ DeleteObject, 'DeleteObject' import COMCTL32,\ ImageList_Create, 'ImageList_Create',\ ImageList_Add, 'ImageList_Add',\ ImageList_AddMasked, 'ImageList_AddMasked',\ ImageList_GetImageCount,'ImageList_GetImageCount',\ ImageList_BeginDrag, 'ImageList_BeginDrag',\ ImageList_EndDrag, 'ImageList_EndDrag',\ ImageList_DragEnter, 'ImageList_DragEnter',\ ImageList_DragMove, 'ImageList_DragMove',\ ImageList_DragLeave, 'ImageList_DragLeave',\ ImageList_DragShowNolock,'ImageList_DragShowNolock',\ ImageList_Destroy, 'ImageList_Destroy' end data ;--------------------------------------- section '.rsrc' resource data readable directory RT_BITMAP, appBmp resource appBmp,\ 31,LANG_NEUTRAL,bmpA bitmap bmpA, 'Images\list.bmp' list.bmp Результат
Win32 API. Урок 20. Сабклассинг окна Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable wndH dd ? insH dd ? wndClsName db 'TUT_20',0 wndTitle db 'Tutorial 20',0 wndProcAddr dd ? wndCls WNDCLASS wndMsg MSG ctlClsNameEdit db 'EDIT',0 edit1H dd ? edit1Txt1 db 'A simple HEX edit control!',0 section '.code' code readable executable start: invoke GetModuleHandle,0 mov [insH],eax mov [wndCls.hInstance],eax mov [wndCls.style],CS_HREDRAW or CS_VREDRAW mov [wndCls.lpfnWndProc],window_procedure mov [wndCls.lpszClassName],wndClsName mov [wndCls.hbrBackground],COLOR_BTNFACE+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wndCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wndCls.hCursor],eax invoke RegisterClass,wndCls invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ wndClsName,wndTitle,\ WS_OVERLAPPEDWINDOW + WS_VISIBLE,\ CW_USEDEFAULT,CW_USEDEFAULT,\ 400,240,\ NULL,NULL,[insH],NULL mov [wndH],eax ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ window_message_loop_start: invoke GetMessage,wndMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wndMsg invoke DispatchMessage,wndMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ;+----------------------+ ;| the window procedure | ;+----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_CREATE je wmCREATE cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmCREATE: invoke CreateWindowEx,WS_EX_CLIENTEDGE,ctlClsNameEdit,NULL,\ WS_CHILD + WS_VISIBLE + WS_BORDER,\ 20,20,300,24,\ [hWnd],NULL,[insH],NULL mov [edit1H],eax invoke SetFocus,eax invoke SetWindowLong,[edit1H],GWL_WNDPROC,edit1_procedure mov [wndProcAddr],eax jmp wmBYE wmDESTROY: invoke PostQuitMessage,0 wmBYE: pop edi esi ebx return endp proc edit1_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_CHAR je edit1_wmCHAR cmp [uMsg],WM_KEYDOWN je edit1_wmKEYDOWN jmp @f edit1_wmCHAR: mov eax,[wParam] cmp al,VK_BACK ;compare with virtual key BACKSPACE je @f cmp al,0x30 ;compare with ascii 0 jb edit1_wmBYE cmp al,0x39 ;compare with ascii 9 jbe @f cmp al,0x41 ;compare with ascii A jb edit1_wmBYE cmp al,0x46 ;compare with ascii F jbe @f cmp al,0x61 ;compare with ascii a jb edit1_wmBYE cmp al,0x66 ;compare with ascii f jbe wmCHAR_add jmp edit1_wmBYE ;something else wmCHAR_add: sub [wParam],0x20 ;so our AL become big letter jmp @f @@: invoke CallWindowProc,[wndProcAddr],[hWnd],[uMsg],[wParam],[lParam] jmp edit1_wmBYE edit1_wmKEYDOWN: mov eax,[wParam] cmp al,VK_RETURN ;compare with virtual key RETURN jne @b invoke MessageBox,[hWnd],edit1Txt1,wndTitle,MB_OK invoke SetFocus,[hWnd] edit1_wmBYE: pop edi esi ebx return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ MessageBox, 'MessageBoxA',\ SetFocus, 'SetFocus',\ SetWindowLong, 'SetWindowLongA',\ CallWindowProc, 'CallWindowProcA',\ DestroyWindow, 'DestroyWindow',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' Результат
Win32 API. Урок 21. Пайп Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' struct SECURITY_ATTRIBUTES .nLength dd ? .lpSecurityDescriptor dd ? .bInheritHandle dd ? ends MI_CSCRIPT equ 100 section '.data' data readable writeable wndH dd ? insH dd ? wndClsName db 'TUT_21',0 wndTitle db 'Tutorial 21',0 wndCls WNDCLASS wndMsg MSG pipeSecAttr SECURITY_ATTRIBUTES pipeReadH dd ? pipeWriteH dd ? pipeRead dd ? pipeBuffer rb 0x400 pro1StartInfo STARTUPINFO pro1Info PROCESS_INFORMATION pro1CmdLine db 'cscript',0 ctlClsNameEdit db 'EDIT',0 edit1H dd ? errStr1 db 'Error - Pipe Creation Failed!',0 errStr2 db 'Error - Process Creation Failed!',0 section '.code' code readable executable start: invoke GetModuleHandle,0 mov [insH],eax mov [wndCls.hInstance],eax mov [wndCls.style],CS_HREDRAW or CS_VREDRAW mov [wndCls.lpfnWndProc],window_procedure mov [wndCls.lpszClassName],wndClsName mov [wndCls.lpszMenuName],30 mov [wndCls.hbrBackground],COLOR_APPWORKSPACE invoke LoadIcon,NULL,IDI_APPLICATION mov [wndCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wndCls.hCursor],eax invoke RegisterClass,wndCls invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ wndClsName,wndTitle,\ WS_OVERLAPPEDWINDOW + WS_VISIBLE,\ CW_USEDEFAULT,CW_USEDEFAULT,\ 600,350,\ NULL,NULL,[insH],NULL mov [wndH],eax ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ window_message_loop_start: invoke GetMessage,wndMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wndMsg invoke DispatchMessage,wndMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ;+----------------------+ ;| the window procedure | ;+----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_CREATE je wmCREATE cmp [uMsg],WM_SIZE je wmSIZE cmp [uMsg],WM_COMMAND je wmCOMMAND cmp [uMsg],WM_CTLCOLOREDIT je wmCTLCOLOREDIT cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmCTLCOLOREDIT: invoke SetTextColor,[wParam],0x00C9B5AF invoke SetBkColor,[wParam],0x00000000 invoke GetStockObject,BLACK_BRUSH jmp wmBYE wmCOMMAND: cmp [wParam],0xFFFF and MI_CSCRIPT je wmCOMMAND_MI_CSCRIPT jmp wmBYE wmCOMMAND_MI_CSCRIPT: mov [pipeSecAttr.nLength], sizeof.SECURITY_ATTRIBUTES mov [pipeSecAttr.lpSecurityDescriptor],NULL mov [pipeSecAttr.bInheritHandle],TRUE invoke CreatePipe,pipeReadH,pipeWriteH,pipeSecAttr,NULL cmp eax,NULL je MI_CSCRIPT_error_pipe mov [pro1StartInfo.cb],sizeof.STARTUPINFO invoke GetStartupInfo,pro1StartInfo mov eax,[pipeWriteH] mov [pro1StartInfo.hStdOutput],eax mov [pro1StartInfo.hStdError],eax mov [pro1StartInfo.dwFlags],STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES mov [pro1StartInfo.wShowWindow],SW_HIDE ;+----------------+ ;| create process | ;+----------------+ invoke CreateProcess,NULL,pro1CmdLine,NULL,NULL,TRUE,NULL,NULL,NULL,pro1StartInfo,pro1Info cmp eax,NULL je MI_CSCRIPT_error_process @@: invoke CloseHandle,[pipeWriteH] cmp eax,TRUE jne @b invoke RtlZeroMemory,pipeBuffer,0x400 invoke ReadFile,[pipeReadH],pipeBuffer,1023,pipeRead,NULL cmp eax,NULL je @f invoke SendMessage,[edit1H],EM_SETSEL,-1,0 invoke SendMessage,[edit1H],EM_REPLACESEL,FALSE,pipeBuffer ;invoke SendMessage,[edit1H],WM_SETTEXT,0,pipeBuffer ;edit control only contain pipeBuffer jmp @f MI_CSCRIPT_error_pipe: invoke MessageBox,[hWnd],errStr1,wndTitle,MB_OK jmp wmBYE MI_CSCRIPT_error_process: invoke MessageBox,[hWnd],errStr2,wndTitle,MB_OK @@: invoke CloseHandle,[pipeReadH] invoke CloseHandle,[pro1Info.hProcess] invoke CloseHandle,[pro1Info.hThread] jmp wmBYE wmSIZE: mov edx,[lParam] mov ecx,edx shr ecx,16 ;height - high order and edx,0xFFFF ;width - low order invoke MoveWindow,[edit1H],0,0,edx,ecx,TRUE jmp wmBYE wmCREATE: invoke CreateWindowEx,NULL,ctlClsNameEdit,NULL,\ WS_CHILD + WS_VISIBLE + WS_HSCROLL + WS_VSCROLL + ES_MULTILINE + ES_AUTOHSCROLL + ES_AUTOVSCROLL,\ 0,0,0,0,\ [hWnd],NULL,[insH],NULL mov [edit1H],eax jmp wmBYE wmDESTROY: invoke PostQuitMessage,0 wmBYE: pop edi esi ebx return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ GDI32, 'GDI32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ CreatePipe, 'CreatePipe',\ CloseHandle, 'CloseHandle',\ CreateProcess, 'CreateProcessA',\ GetStartupInfo, 'GetStartupInfoA',\ RtlZeroMemory, 'RtlZeroMemory',\ ReadFile, 'ReadFile',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ MessageBox, 'MessageBoxA',\ MoveWindow, 'MoveWindow',\ DestroyWindow, 'DestroyWindow',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' import GDI32,\ SetTextColor, 'SetTextColor',\ SetBkColor, 'SetBkColor',\ GetStockObject, 'GetStockObject' section '.rsrc' resource data readable directory RT_MENU,appMenu resource appMenu,\ 30,LANG_NEUTRAL,menuMain menu menuMain menuitem '&Action',0,MFR_POPUP + MFR_END menuitem '&Cscript',MI_CSCRIPT,MFR_END[FONT=Georgia] Результат[/FONT]
Win32 API. Урок 22. Суперклассинг Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable wndH dd ? insH dd ? wndClsName db 'TUT_22',0 wndTitle db 'Tutorial 22',0 wndProcAddr dd ? wndCls WNDCLASS wndMsg MSG ctlClsNameEdit db 'EDIT',0 ctlClsNameEditHex db 'EDIT_HEX',0 editH: times 6 dd ? editHBuffer dw 16 ;2 bytes here rb 14 ;14 + 2 = 16 bytes required, 15 for text, 1 for null terminated byte section '.code' code readable executable start: invoke GetModuleHandle,0 mov [insH],eax mov [wndCls.hInstance],eax mov [wndCls.style],CS_HREDRAW or CS_VREDRAW mov [wndCls.lpfnWndProc],window_procedure mov [wndCls.lpszClassName],wndClsName mov [wndCls.hbrBackground],COLOR_BTNFACE+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wndCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wndCls.hCursor],eax invoke RegisterClass,wndCls invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ wndClsName,wndTitle,\ WS_OVERLAPPEDWINDOW + WS_VISIBLE,\ CW_USEDEFAULT,CW_USEDEFAULT,\ 400,240,\ NULL,NULL,[insH],NULL mov [wndH],eax ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ window_message_loop_start: invoke GetMessage,wndMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wndMsg invoke DispatchMessage,wndMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ;+----------------------+ ;| the window procedure | ;+----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam editCls WNDCLASSEX counter dd 0 enter push ebx esi edi cmp [uMsg],WM_CREATE je wmCREATE cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmCREATE: mov [editCls.cbSize],sizeof.WNDCLASSEX lea ebx,[editCls] invoke GetClassInfoEx,NULL,ctlClsNameEdit,ebx push [editCls.lpfnWndProc] pop [wndProcAddr] mov [editCls.lpfnWndProc],edit_hex_procedure push [insH] pop [editCls.hInstance] mov [editCls.lpszClassName],ctlClsNameEditHex invoke RegisterClassEx,ebx xor ebx,ebx mov edi,20 @@: cmp ebx,3 je @f invoke CreateWindowEx,WS_EX_CLIENTEDGE,ctlClsNameEditHex,NULL,\ WS_CHILD + WS_VISIBLE + WS_BORDER,\ 20,edi,300,24,\ [hWnd],NULL,[insH],NULL mov [editH + 4 * ebx],eax invoke SendMessage,eax,EM_LIMITTEXT,15,0 ;limit to 15 chars inc ebx add edi,30 jmp @b @@: invoke SetFocus,[editH] jmp wmBYE wmDESTROY: invoke PostQuitMessage,0 wmBYE: pop edi esi ebx return endp proc edit_hex_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_CHAR je edit_hex_wmCHAR cmp [uMsg],WM_KEYDOWN je edit_hex_wmKEYDOWN jmp @f edit_hex_wmCHAR: mov eax,[wParam] cmp al,VK_BACK ;compare with virtual key BACKSPACE je @f cmp al,0x30 ;compare with ascii 0 jb edit_hex_wmBYE cmp al,0x39 ;compare with ascii 9 jbe @f cmp al,0x41 ;compare with ascii A jb edit_hex_wmBYE cmp al,0x46 ;compare with ascii F jbe @f cmp al,0x61 ;compare with ascii a jb edit_hex_wmBYE cmp al,0x66 ;compare with ascii f jbe wmCHAR_add jmp edit_hex_wmBYE ;something else wmCHAR_add: sub [wParam],0x20 ;so our AL become big letter jmp @f @@: invoke CallWindowProc,[wndProcAddr],[hWnd],[uMsg],[wParam],[lParam] jmp edit_hex_wmBYE edit_hex_wmKEYDOWN: mov eax,[wParam] cmp al,VK_RETURN ;compare with virtual key RETURN je wmKEYDOWN_VK_RETURN cmp al,VK_TAB je wmKEYDOWN_VK_TAB jne @b wmKEYDOWN_VK_TAB: invoke GetKeyState,VK_SHIFT test eax,0x80000000 je VK_TAB_NEXT jmp VK_TAB_PREV VK_TAB_NEXT: invoke GetWindow,[hWnd],GW_HWNDNEXT cmp eax,NULL jne VK_TAB_BYE invoke GetWindow,[hWnd],GW_HWNDFIRST jmp VK_TAB_BYE VK_TAB_PREV: invoke GetWindow,[hWnd],GW_HWNDPREV cmp eax,NULL jne VK_TAB_BYE invoke GetWindow,[hWnd],GW_HWNDLAST jmp VK_TAB_BYE VK_TAB_BYE: invoke SetFocus,eax xor eax,eax jmp edit_hex_wmBYE wmKEYDOWN_VK_RETURN: invoke SendMessage,[hWnd],EM_GETLINE,0,editHBuffer invoke MessageBox,[hWnd],editHBuffer,wndTitle,MB_OK invoke SetFocus,[hWnd] jmp edit_hex_wmBYE edit_hex_wmBYE: pop edi esi ebx return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ RegisterClassEx, 'RegisterClassExA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ MessageBox, 'MessageBoxA',\ GetClassInfoEx, 'GetClassInfoExA',\ GetKeyState, 'GetKeyState',\ GetWindow, 'GetWindow',\ SetFocus, 'SetFocus',\ SetWindowLong, 'SetWindowLongA',\ CallWindowProc, 'CallWindowProcA',\ DestroyWindow, 'DestroyWindow',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage'[FONT=Georgia] Результат [/FONT]
Win32 API. Урок 23. Иконка в system tray Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' WUM_SHELLNOTIFY equ WM_USER + 5 MI_RESTORE equ 1000 MI_EXIT equ 1001 SBI_TRAY equ 0 section '.data' data readable writeable wndH dd ? insH dd ? wndClsName db 'TUT_23',0 wndTitle db 'Tutorial 23',0 wndCls WNDCLASS wndMsg MSG menuH dd ? menuPt POINT menuRect RECT miRESTORE db '&Restore',0 miEXIT db '&Exit',0 statBarData NOTIFYICONDATA section '.code' code readable executable start: invoke GetModuleHandle,0 mov [insH],eax mov [wndCls.hInstance],eax mov [wndCls.style],CS_HREDRAW or CS_VREDRAW mov [wndCls.lpfnWndProc],window_procedure mov [wndCls.lpszClassName],wndClsName mov [wndCls.hbrBackground],COLOR_BTNFACE+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wndCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wndCls.hCursor],eax invoke RegisterClass,wndCls invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ wndClsName,wndTitle,\ WS_OVERLAPPEDWINDOW + WS_VISIBLE,\ CW_USEDEFAULT,CW_USEDEFAULT,\ 400,240,\ NULL,NULL,[insH],NULL mov [wndH],eax ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ window_message_loop_start: invoke GetMessage,wndMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wndMsg invoke DispatchMessage,wndMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ;+----------------------+ ;| the window procedure | ;+----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WUM_SHELLNOTIFY je wumSHELLNOTIFY cmp [uMsg],WM_COMMAND je wmCOMMAND cmp [uMsg],WM_SIZE je wmSIZE cmp [uMsg],WM_CREATE je wmCREATE cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wumSHELLNOTIFY: cmp [wParam],SBI_TRAY jne wmBYE cmp [lParam],WM_RBUTTONDOWN je wumSHELLNOTIFY_WM_RBUTTONDOWN cmp [lParam],WM_LBUTTONDBLCLK je wumSHELLNOTIFY_WM_LBUTTONDBLCLK jmp wmBYE wumSHELLNOTIFY_WM_LBUTTONDBLCLK: invoke SendMessage,[hWnd],WM_COMMAND,MI_RESTORE,0 jmp wmBYE wumSHELLNOTIFY_WM_RBUTTONDOWN: invoke GetCursorPos,menuPt invoke SetForegroundWindow,[hWnd] invoke TrackPopupMenu,[menuH],TPM_RIGHTALIGN + TPM_RIGHTBUTTON,\ [menuPt.x],[menuPt.y],NULL,[hWnd],NULL invoke PostMessage,[hWnd],WM_NULL,0,0 jmp wmBYE wmCOMMAND: cmp [lParam],0 ;message is not from control jne wmBYE invoke Shell_NotifyIcon,NIM_DELETE,statBarData mov eax,[wParam] cmp ax,MI_RESTORE je wmCOMMAND_MI_RESTORE invoke DestroyWindow,[hWnd] jmp wmBYE wmCOMMAND_MI_RESTORE: invoke ShowWindow,[hWnd],SW_RESTORE jmp wmBYE wmSIZE: cmp [wParam],SIZE_MINIMIZED jne wmBYE mov [statBarData.cbSize],sizeof.NOTIFYICONDATA push [hWnd] pop [statBarData.hWnd] mov [statBarData.uID],SBI_TRAY mov [statBarData.uFlags],NIF_ICON + NIF_MESSAGE + NIF_TIP mov [statBarData.uCallbackMessage],WUM_SHELLNOTIFY invoke LoadIcon,NULL,IDI_WINLOGO mov [statBarData.hIcon],eax invoke lstrcpy,statBarData.szTip,wndTitle invoke ShowWindow,[hWnd],SW_HIDE invoke Shell_NotifyIcon,NIM_ADD,statBarData jmp wmBYE wmCREATE: invoke CreatePopupMenu mov [menuH],eax invoke AppendMenu,[menuH],MF_STRING,MI_RESTORE,miRESTORE invoke AppendMenu,[menuH],MF_STRING,MI_EXIT,miEXIT jmp wmBYE wmDESTROY: invoke DestroyMenu,[menuH] invoke PostQuitMessage,0 wmBYE: pop edi esi ebx return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ SHELL32, 'SHELL32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ lstrcpy, 'lstrcpyA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ MessageBox, 'MessageBoxA',\ CreatePopupMenu, 'CreatePopupMenu',\ DestroyMenu, 'DestroyMenu',\ AppendMenu, 'AppendMenuA',\ GetCursorPos, 'GetCursorPos',\ SetForegroundWindow, 'SetForegroundWindow',\ TrackPopupMenu, 'TrackPopupMenu',\ PostMessage, 'PostMessageA',\ ShowWindow, 'ShowWindow',\ DestroyWindow, 'DestroyWindow',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' import SHELL32,\ Shell_NotifyIcon, 'Shell_NotifyIcon' Результат
Win32 API. Урок 24. Windows-хукиТекст tut_24a.asm Код (ASM): format PE GUI 4.0 DLL entry DllMain include '%fasminc%\win32a.inc' struct MOUSEHOOKSTRUCT .pt POINT .hwnd dd ? .wHitTestCode dd ? .dwExtraInfo dd ? ends WMU_MOUSEHOOK equ WM_USER + 6 section '.data' data readable writeable insH dd ? ;handle for instance section '.sdata' readable writeable shareable hookH dd ? wndH dd ? section '.code' code readable executable proc DllMain, hinstDll, fdwReason, lpvReserved push [hinstDll] pop [insH] mov eax,TRUE return endp proc mouse_procedure,nCode,wParam,lParam invoke CallNextHookEx,[hookH],[nCode],[wParam],[lParam] mov edx,[lParam] invoke WindowFromPoint,[edx + MOUSEHOOKSTRUCT.pt.x],[edx + MOUSEHOOKSTRUCT.pt.y] invoke PostMessage,[wndH],WMU_MOUSEHOOK,eax,0 xor eax,eax ;must clear eax here return endp proc mouse_hook_install,wndTempH push [wndTempH] pop [wndH] invoke SetWindowsHookEx,WH_MOUSE,mouse_procedure,[insH],NULL mov [hookH],eax return endp proc mouse_hook_uninstall invoke UnhookWindowsHookEx,[hookH] return endp section '.idata' import data readable library USER32, 'USER32.DLL' import USER32,\ CallNextHookEx, 'CallNextHookEx',\ WindowFromPoint, 'WindowFromPoint',\ PostMessage, 'PostMessageA',\ SetWindowsHookEx, 'SetWindowsHookExA',\ UnhookWindowsHookEx, 'UnhookWindowsHookEx' section '.edata' export data readable export 'TUT_24A.DLL',\ mouse_procedure, 'mouse_procedure',\ mouse_hook_install, 'mouse_hook_install',\ mouse_hook_uninstall, 'mouse_hook_uninstall' section '.reloc' fixups data discardable Текст tut_24b.asm Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' WMU_MOUSEHOOK equ WM_USER + 6 DLG_MAIN equ 101 EDIT_CLSNAME equ 1001 EDIT_HANDLE equ 1002 EDIT_WNDPROC equ 1003 BTN_HOOK equ 1004 BTN_EXIT equ 1005 section '.data' data readable writeable insH dd ? wndClsName db 'TUT_24B',0 wndTitle db 'Tutorial 24B',0 wndCls WNDCLASS wndMsg MSG hookFlag dd FALSE hookH dd ? rect RECT txtUnhook db '&Unhook',0 txtHook db '&Hook',0 buf1 rb 128 buf2 rb 128 f1 db '0x%lX',0 section '.code' code readable executable start: invoke GetModuleHandle,NULL mov [insH],eax invoke DialogBoxParam,eax,DLG_MAIN,NULL,dialog_procedure,NULL invoke ExitProcess,0 proc dialog_procedure,hDlg,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WMU_MOUSEHOOK je wmuMOUSEHOOK cmp [uMsg],WM_CLOSE je wmCLOSE cmp [uMsg],WM_INITDIALOG je wmINITDIALOG cmp [uMsg],WM_COMMAND je wmCOMMAND jmp wmBYE wmCLOSE: cmp [hookFlag],TRUE jne @f invoke mouse_hook_uninstall @@: invoke EndDialog,[hDlg],NULL jmp wmBYE wmuMOUSEHOOK: invoke GetDlgItemText,[hDlg],EDIT_HANDLE,buf2,128 invoke wsprintf,buf1,f1,[wParam] invoke lstrcmpi,buf1,buf2 cmp eax,0 je @f invoke SetDlgItemText,[hDlg],EDIT_HANDLE,buf1 @@: invoke GetDlgItemText,[hDlg],EDIT_CLSNAME,buf2,128 invoke GetClassName,[wParam],buf1,128 invoke lstrcmpi,buf1,buf2 cmp eax,0 je @f invoke SetDlgItemText,[hDlg],EDIT_CLSNAME,buf1 @@: invoke GetDlgItemText,[hDlg],EDIT_WNDPROC,buf2,128 invoke GetClassLong,[wParam],GCL_WNDPROC invoke wsprintf,buf1,f1,eax invoke lstrcmpi,buf1,buf2 cmp eax,0 je @f invoke SetDlgItemText,[hDlg],EDIT_WNDPROC,buf1 @@: jmp wmBYE wmINITDIALOG: invoke GetWindowRect,[hDlg],rect invoke SetWindowPos,[hDlg],HWND_TOPMOST,[rect.left],[rect.top],[rect.right],[rect.bottom],SWP_SHOWWINDOW jmp wmBYE wmCOMMAND: cmp [lParam],0 je wmBYE mov eax,[wParam] mov edx,eax shr edx,16 cmp dx,BN_CLICKED jne wmBYE cmp ax,BTN_EXIT je wmCOMMAND_BTN_EXIT jmp wmCOMMAND_BTN_HOOK wmCOMMAND_BTN_EXIT: invoke SendMessage,[hDlg],WM_CLOSE,0,0 jmp wmBYE wmCOMMAND_BTN_HOOK: cmp [hookFlag],TRUE jne BTN_HOOK_FALSE invoke mouse_hook_uninstall invoke SetDlgItemText,[hDlg],BTN_HOOK,txtHook mov [hookFlag],FALSE invoke SetDlgItemText,[hDlg],EDIT_CLSNAME,NULL invoke SetDlgItemText,[hDlg],EDIT_HANDLE,NULL invoke SetDlgItemText,[hDlg],EDIT_WNDPROC,NULL jmp wmBYE BTN_HOOK_FALSE: invoke mouse_hook_install,[hDlg] cmp eax,NULL je wmBYE mov [hookFlag],TRUE invoke SetDlgItemText,[hDlg],BTN_HOOK,txtUnhook jmp wmBYE wmBYE: pop edi esi ebx return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ TUT_24A, 'TUT_24A.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ lstrcmpi, 'lstrcmpiA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ SendMessage, 'SendMessageA',\ wsprintf, 'wsprintfA',\ DialogBoxParam, 'DialogBoxParamA',\ GetWindowRect, 'GetWindowRect',\ GetClassName, 'GetClassNameA',\ GetClassLong, 'GetClassLongA',\ EndDialog, 'EndDialog',\ GetDlgItemText, 'GetDlgItemTextA',\ SetDlgItemText, 'SetDlgItemTextA',\ SetWindowPos, 'SetWindowPos' import TUT_24A,\ mouse_hook_install, 'mouse_hook_install',\ mouse_hook_uninstall, 'mouse_hook_uninstall' section '.rsrc' resource data readable directory RT_DIALOG,appDialog resource appDialog,\ DLG_MAIN,LANG_NEUTRAL,dlgMain dialog dlgMain,'Mouse Hook Demo',0,0,229,85,\ WS_CAPTION + WS_POPUP + WS_SYSMENU + DS_MODALFRAME dialogitem 'BUTTON','Window Information',-1,7,7,214,67,WS_VISIBLE + BS_GROUPBOX dialogitem 'STATIC','Class Name :',-1,21,22,42,8,SS_LEFT + WS_VISIBLE dialogitem 'EDIT','',EDIT_CLSNAME,69,20,139,12,ES_LEFT + ES_AUTOHSCROLL + ES_READONLY + WS_VISIBLE + WS_BORDER + WS_TABSTOP dialogitem 'STATIC','Handle :',-1,36,37,28,8,SS_LEFT + WS_VISIBLE dialogitem 'EDIT','',EDIT_HANDLE,69,36,76,12,ES_LEFT + ES_AUTOHSCROLL + ES_READONLY + WS_VISIBLE + WS_BORDER + WS_TABSTOP dialogitem 'STATIC','Window Proc :',-1,15,52,48,8,SS_LEFT + WS_VISIBLE dialogitem 'EDIT','',EDIT_WNDPROC,69,52,76,12,ES_LEFT + ES_AUTOHSCROLL + ES_READONLY + WS_VISIBLE + WS_BORDER + WS_TABSTOP dialogitem 'BUTTON','&Hook',BTN_HOOK,159,35,50,14,BS_DEFPUSHBUTTON + WS_VISIBLE + WS_TABSTOP dialogitem 'BUTTON','&Exit',BTN_EXIT,159,51,50,15,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP enddialog Результат
Win32 API. Урок 25. Вывод картинки на экран Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable wndH dd ? ;handle for window insH dd ? ;handle for instance wndClsName db 'TUT_25',0 wndTitle db 'Tutorial 25',0 wndCls WNDCLASS wndMsg MSG bmp1H dd ? ;handle for BMP file bmp1Ps PAINTSTRUCT bmp1Rect RECT dcH dd ? dcMemH dd ? section '.code' code readable executable start: invoke GetModuleHandle,0 mov [insH],eax mov [wndCls.hInstance],eax mov [wndCls.style],CS_HREDRAW + CS_VREDRAW mov [wndCls.lpfnWndProc],window_procedure mov [wndCls.lpszClassName],wndClsName mov [wndCls.hbrBackground],COLOR_WINDOW+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wndCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wndCls.hCursor],eax invoke RegisterClass,wndCls invoke CreateWindowEx,\ WS_EX_CLIENTEDGE,\ wndClsName,\ wndTitle,\ WS_OVERLAPPEDWINDOW + WS_VISIBLE,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ [insH],\ NULL mov [wndH],eax ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ window_message_loop_start: invoke GetMessage,wndMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wndMsg invoke DispatchMessage,wndMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ;+----------------------+ ;| the window procedure | ;+----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_CREATE je wmCREATE cmp [uMsg],WM_PAINT je wmPAINT cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmCREATE: invoke LoadBitmap,[insH],300 mov [bmp1H],eax jmp wmBYE wmPAINT: invoke BeginPaint,[hWnd],bmp1Ps mov [dcH],eax invoke CreateCompatibleDC,[dcH] mov [dcMemH],eax invoke SelectObject,[dcMemH],[bmp1H] invoke GetClientRect,[hWnd],bmp1Rect invoke BitBlt,[dcH],0,0,[bmp1Rect.right],[bmp1Rect.bottom],[dcMemH],0,0,SRCCOPY invoke DeleteDC,[dcMemH] invoke EndPaint,[hWnd],bmp1Ps jmp wmBYE wmDESTROY: invoke DeleteObject,[bmp1H] invoke PostQuitMessage,0 wmBYE: pop edi esi ebx return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ GDI32, 'GDI32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ FindResource, 'FindResourceA',\ LoadResource, 'LoadResource',\ LockResource, 'LockResource',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ LoadBitmap, 'LoadBitmapA',\ LoadMenu, 'LoadMenuA',\ BeginPaint, 'BeginPaint',\ EndPaint, 'EndPaint',\ GetClientRect, 'GetClientRect',\ MessageBox, 'MessageBoxA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ DestroyWindow, 'DestroyWindow',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' import GDI32,\ CreateCompatibleDC, 'CreateCompatibleDC',\ SelectObject, 'SelectObject',\ BitBlt, 'BitBlt',\ DeleteDC, 'DeleteDC',\ DeleteObject, 'DeleteObject' section '.rsrc' resource data readable directory RT_BITMAP, appBmp resource appBmp,\ 300,LANG_NEUTRAL,bmp1 bitmap bmp1, "tweety78.bmp" Результат
Win32 API. Урок 26. Экран-заставка Код (ASM): format PE GUI 4.0 DLL entry DllMain include '%fasminc%\win32a.inc' section '.data' data readable writeable insH dd ? ;handle for instance wndCls WNDCLASS wndClsName db 'TUT_26A',0 wndMsg MSG wndH dd ? bmpH dd ? bmpOldH dd ? bmp BITMAP bmp1Rect RECT ps PAINTSTRUCT dcH dd ? dcMemH dd ? dlgY dd ? dlgX dd ? dlgRect RECT desktopRect RECT timerId dd ? section '.code' code readable executable proc DllMain,hinstDll,fdwReason,lpvReserved cmp [fdwReason],DLL_PROCESS_ATTACH jne @f push [hinstDll] pop [insH] call show_bitmap @@: mov eax,TRUE return endp proc show_bitmap push [insH] pop [wndCls.hInstance] mov [wndCls.style],CS_HREDRAW + CS_VREDRAW mov [wndCls.lpfnWndProc],splash_procedure mov [wndCls.lpszClassName],wndClsName mov [wndCls.hbrBackground],COLOR_WINDOW + 1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wndCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wndCls.hCursor],eax invoke RegisterClass,wndCls invoke CreateWindowEx,NULL,wndClsName,NULL,\ WS_POPUP + WS_VISIBLE,\ CW_USEDEFAULT,CW_USEDEFAULT,600,371,\ NULL,NULL,[insH],NULL mov [wndH],eax ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ window_message_loop_start: invoke GetMessage,wndMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wndMsg invoke DispatchMessage,wndMsg jmp window_message_loop_start window_message_loop_end: return endp proc splash_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_CREATE je wmCREATE cmp [uMsg],WM_LBUTTONDOWN je wmLBUTTONDOWN cmp [uMsg],WM_PAINT je wmPAINT cmp [uMsg],WM_TIMER je wmTIMER cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmCREATE: invoke GetWindowRect,[hWnd],dlgRect invoke GetDesktopWindow invoke GetWindowRect,eax,desktopRect push FALSE ;MoveWindow :: no repaint mov eax,[dlgRect.bottom] sub eax,[dlgRect.top] mov [dlgY],eax push eax ;MoveWindow :: new height for window mov eax,[dlgRect.right] sub eax,[dlgRect.left] mov [dlgX],eax push eax ;MoveWindow :: new width for window mov eax,[desktopRect.bottom] sub eax,[dlgY] shr eax,1 push eax ;MoveWindow :: new position of the top of the window mov eax,[desktopRect.right] sub eax,[dlgX] shr eax,1 push eax ;MoveWindow :: new position of the left side of the window push [hWnd] ;MoveWindow :: handle for window call [MoveWindow] invoke LoadBitmap,[insH],300 mov [bmpH],eax invoke SetTimer,[hWnd],1,2000,NULL mov [timerId],eax jmp wmBYE wmPAINT: invoke BeginPaint,[hWnd],ps mov [dcH],eax invoke CreateCompatibleDC,eax mov [dcMemH],eax invoke SelectObject,eax,[bmpH] mov [bmpOldH],eax invoke GetObject,[bmpH],sizeof.BITMAP,bmp ;invoke BitBlt,[dcH],0,0,[bmp.bmWidth],[bmp.bmHeight],[dcMemH],0,0,SRCCOPY ;the usage of StretchBlt is here ;------------------------------- invoke StretchBlt,[dcH],0,0,600,371,\ [dcMemH],0,0,[bmp.bmWidth],[bmp.bmHeight],SRCCOPY invoke SelectObject,[dcMemH],[bmpOldH] invoke DeleteObject,[dcMemH] invoke EndPaint,[hWnd],ps jmp wmBYE wmLBUTTONDOWN: invoke DestroyWindow,[hWnd] jmp wmBYE wmTIMER: invoke SendMessage,[hWnd],WM_LBUTTONDOWN,NULL,NULL invoke KillTimer,[hWnd],[timerId] jmp wmBYE wmDESTROY: cmp [bmpH],NULL je @f invoke DeleteObject,[bmpH] @@: invoke PostQuitMessage,NULL jmp wmBYE wmBYE: pop edi esi ebx return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ GDI32, 'GDI32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ RegisterClassEx, 'RegisterClassExA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ LoadBitmap, 'LoadBitmapA',\ LoadMenu, 'LoadMenuA',\ BeginPaint, 'BeginPaint',\ EndPaint, 'EndPaint',\ GetWindowRect, 'GetWindowRect',\ GetDesktopWindow, 'GetDesktopWindow',\ MoveWindow, 'MoveWindow',\ SetTimer, 'SetTimer',\ KillTimer, 'KillTimer',\ ShowWindow, 'ShowWindow',\ MessageBox, 'MessageBoxA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ DestroyWindow, 'DestroyWindow',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' import GDI32,\ CreateCompatibleDC, 'CreateCompatibleDC',\ SelectObject, 'SelectObject',\ GetObject, 'GetObjectA',\ GetCurrentObject, 'GetCurrentObject',\ StretchBlt, 'StretchBlt',\ BitBlt, 'BitBlt',\ DeleteDC, 'DeleteDC',\ DeleteObject, 'DeleteObject' section '.edata' export data readable export 'TUT_24A.DLL',\ show_bitmap, 'show_bitmap',\ splash_procedure, 'splash_procedure' section '.reloc' fixups data discardable section '.rsrc' resource data readable directory RT_BITMAP, appBmp resource appBmp,\ 300,LANG_NEUTRAL,bmp1 bitmap bmp1, "splash.bmp" code for tut_26b.asm format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable wndH dd ? insH dd ? wndClsName db 'TUT_26B',0 wndTitle db 'Tutorial 26B',0 wndCls WNDCLASS wndMsg MSG libName db 'TUT_26A.DLL',0 section '.code' code readable executable start: invoke LoadLibrary,libName cmp eax,NULL je @f invoke FreeLibrary,eax @@: invoke GetModuleHandle,0 mov [insH],eax mov [wndCls.hInstance],eax mov [wndCls.style],CS_HREDRAW or CS_VREDRAW mov [wndCls.lpfnWndProc],window_procedure mov [wndCls.lpszClassName],wndClsName mov [wndCls.hbrBackground],COLOR_BTNFACE+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wndCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wndCls.hCursor],eax invoke RegisterClass,wndCls invoke CreateWindowEx,0,\ wndClsName,wndTitle,\ WS_OVERLAPPEDWINDOW + WS_VISIBLE,\ CW_USEDEFAULT,CW_USEDEFAULT,400,240,\ NULL,NULL,[insH],NULL mov [wndH],eax invoke ShowWindow,eax,SW_MAXIMIZE Продолжение ниже
Код (ASM): ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ window_message_loop_start: invoke GetMessage,wndMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wndMsg invoke DispatchMessage,wndMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ;+----------------------+ ;| the window procedure | ;+----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmDESTROY: invoke PostQuitMessage,0 wmBYE: pop edi esi ebx return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ LoadLibrary, 'LoadLibraryA',\ FreeLibrary, 'FreeLibrary',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ MessageBox, 'MessageBoxA',\ ShowWindow, 'ShowWindow',\ DestroyWindow, 'DestroyWindow',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' Результат
Win32 API. Урок 27. Тултип-контрол Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable wndH dd ? insH dd ? wndClsName db 'TUT_27',0 wndTitle db 'Tutorial 27',0 wndCls WNDCLASS wndMsg MSG tipsH dd ? ctlClsNameTips db 'Tooltips_class32',0 tipsTxt1 db 'This is the upper left area of the dialog',0 tipsTxt2 db 'This is the upper right area of the dialog',0 tipsTxt3 db 'This is the lower left area of the dialog',0 tipsTxt4 db 'This is the lower right area of the dialog',0 ti TOOLINFO id dd ? rect RECT buffer rb 0xFF section '.code' code readable executable start: invoke GetModuleHandle,0 mov [insH],eax invoke DialogBoxParam,eax,101,NULL,dialog_procedure,NULL invoke ExitProcess,0 proc dialog_procedure,hDlg,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_INITDIALOG je wmINITDIALOG cmp [uMsg],WM_CLOSE je wmCLOSE pop edi esi ebx mov eax,FALSE return wmCLOSE: invoke EndDialog,[hDlg],NULL jmp wmBYE wmINITDIALOG: invoke InitCommonControls invoke CreateWindowEx,NULL,ctlClsNameTips,NULL,\ TTS_ALWAYSTIP,\ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\ NULL,NULL,[insH],NULL mov [tipsH],eax mov [id],0 mov [ti.cbSize],sizeof.TOOLINFO mov [ti.uFlags],TTF_SUBCLASS push [hDlg] pop [ti.hwnd] invoke GetWindowRect,[hDlg],rect stdcall SetDlgToolArea,[hDlg],ti,tipsTxt1,[id],rect inc [id] stdcall SetDlgToolArea,[hDlg],ti,tipsTxt2,[id],rect inc [id] stdcall SetDlgToolArea,[hDlg],ti,tipsTxt3,[id],rect inc [id] stdcall SetDlgToolArea,[hDlg],ti,tipsTxt4,[id],rect invoke EnumChildWindows,[hDlg],EnumChild,ti jmp wmBYE wmBYE: pop edi esi ebx mov eax,TRUE return endp proc EnumChild,hwnd,lParam push edi mov edi,[lParam] push [hwnd] pop [edi + TOOLINFO.uId] or [edi + TOOLINFO.uFlags],TTF_IDISHWND invoke GetWindowText,[hwnd],buffer,0xFF mov [edi + TOOLINFO.lpszText],buffer invoke SendMessage,[tipsH],TTM_ADDTOOL,NULL,edi pop edi return endp proc SetDlgToolArea,hDlg,lpti,lpText,id,lprect push edi esi mov edi,[lpti] mov esi,[lprect] cmp [id],0 je id_0 cmp [id],1 je id_1 cmp [id],2 je id_2 cmp [id],3 je id_3 jmp id_exit id_0: mov [edi + TOOLINFO.rect.left],0 mov [edi + TOOLINFO.rect.top],0 mov eax,[esi + RECT.right] sub eax,[esi + RECT.left] shr eax,1 mov [edi + TOOLINFO.rect.right],eax mov eax,[esi + RECT.bottom] sub eax,[esi + RECT.top] shr eax,1 mov [edi + TOOLINFO.rect.bottom],eax jmp id_exit id_1: mov eax,[esi + RECT.right] sub eax,[esi + RECT.left] shr eax,1 inc eax mov [edi + TOOLINFO.rect.left],eax mov [edi + TOOLINFO.rect.top],0 mov eax,[esi + RECT.right] sub eax,[esi + RECT.left] mov [edi + TOOLINFO.rect.right],eax mov eax,[esi + RECT.bottom] sub eax,[esi + RECT.top] mov [edi + TOOLINFO.rect.bottom],eax jmp id_exit id_2: mov [edi + TOOLINFO.rect.left],0 mov eax,[esi + RECT.bottom] sub eax,[esi + RECT.top] shr eax,1 inc eax mov [edi + TOOLINFO.rect.top],eax mov eax,[esi + RECT.right] sub eax,[esi + RECT.left] shr eax,1 mov [edi + TOOLINFO.rect.right],eax mov eax,[esi + RECT.bottom] sub eax,[esi + RECT.top] mov [edi + TOOLINFO.rect.bottom],eax jmp id_exit id_3: mov eax,[esi + RECT.right] sub eax,[esi + RECT.left] shr eax,1 inc eax mov [edi + TOOLINFO.rect.left],eax mov eax,[esi + RECT.bottom] sub eax,[esi + RECT.top] shr eax,1 inc eax mov [edi + TOOLINFO.rect.top],eax mov eax,[esi + RECT.right] sub eax,[esi + RECT.left] mov [edi + TOOLINFO.rect.right],eax mov eax,[esi + RECT.bottom] sub eax,[esi + RECT.top] mov [edi + TOOLINFO.rect.bottom],eax jmp id_exit id_exit: push [lpText] pop [edi + TOOLINFO.lpszText] invoke SendMessage,[tipsH],TTM_ADDTOOL,NULL,[lpti] pop esi edi return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ COMCTL32, 'COMCTL32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DialogBoxParam, 'DialogBoxParamA',\ EndDialog, 'EndDialog',\ GetWindowRect, 'GetWindowRect',\ EnumChildWindows, 'EnumChildWindows',\ GetWindowText, 'GetWindowTextA',\ SendMessage, 'SendMessageA' import COMCTL32,\ InitCommonControls, 'InitCommonControls' section '.rsrc' resource data readable directory RT_DIALOG,appDialog resource appDialog,\ 101,LANG_NEUTRAL,dlgMain dialog dlgMain,'Tooltip Example',0,0,229,96,\ WS_CAPTION + WS_POPUP + WS_SYSMENU + DS_MODALFRAME dialogitem 'BUTTON','&Ok',1000,55,68,50,14,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP dialogitem 'BUTTON','&Exit',1001,123,68,50,14,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP enddialog Результат
Win32 API. Урок 28. Debug API часть первая Код (ASM): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' struct EXCEPTION_RECORD .ExceptionCode dd ? .ExceptionFlags dd ? .ExceptionRecord dd ? .ExceptionAddress dd ? .NumberParameters dd ? .ExceptionInformation rd 15 ends struct EXCEPTION_DEBUG_INFO .ExceptionRecord EXCEPTION_RECORD .dwFirstChance dd ? ends struct CREATE_PROCESS_DEBUG_INFO .hFile dd ? .hProcess dd ? .hThread dd ? .lpBaseOfImage dd ? .dwDebugInfoFileOffset dd ? .nDebugInfoSize dd ? .lpThreadLocalBase dd ? .lpStartAddress dd ? .lpImageName dd ? .fUnicode dw ? ends struct EXIT_PROCESS_DEBUG_INFO .dwExitCode dd ? ends struct DEBUG_EVENT .dwDebugEventCode dd ? .dwProcessId dd ? .dwThreadId dd ? .u rd 22 ends INFINITE = 0xFFFFFFFF DBG_EXCEPTION_NOT_HANDLED = 0x80010001 DBG_CONTINUE = 0x00010002 DBG_TERMINATE_THREAD = 0x40010003 DBG_TERMINATE_PROCESS = 0x40010004 EXIT_PROCESS_DEBUG_EVENT = 0x00000005 CREATE_PROCESS_DEBUG_EVENT = 0x00000003 EXCEPTION_DEBUG_EVENT = 0x00000001 CREATE_THREAD_DEBUG_EVENT = 0x00000002 EXIT_THREAD_DEBUG_EVENT = 0x00000004 EXCEPTION_BREAKPOINT = 0x80000003 WMU_DBGSTART = WM_USER + 20 WMU_DBGEND = WM_USER + 22 section '.data' data readable writeable insH dd ? ofn OPENFILENAME ofnTxtFilter db 'Executable Files',0,'*.exe',0 db 'All Files',0,'*.*',0,0 ofnBuffer rb 512 proStartInfo STARTUPINFO proInfo PROCESS_INFORMATION proExitCode dd ? dbgEvent DEBUG_EVENT dbgId dd ? dbgThreadH dd ? dbgThreadStatus dd ? fBuffer rb 0xFF f1 db '0x%lX',0 f2 db '%s',0 timerId dd ? dbgMsg1 db 'EXCEPTION_DEBUG_EVENT',0 dbgMsg2 db 'CREATE_THREAD_DEBUG_EVENT',0 dbgMsg3 db 'CREATE_PROCESS_DEBUG_EVENT',0 dbgMsg4 db 'EXIT_THREAD_DEBUG_EVENT',0 dbgMsg5 db 'EXIT_PROCESS_DEBUG_EVENT',0 dbgMsg6 db 'LOAD_DLL_DEBUG_EVENT',0 dbgMsg7 db 'UNLOAD_DLL_DEBUG_EVENT',0 dbgMsg8 db 'OUTPUT_DEBUG_STRING_EVENT',0 dbgMsg9 db 'RIP_EVENT',0 dbgMsgError db 'ERROR : INVALID DEBUG EVENT',0 dbgMsgExit db 'BYE BYE',0 dbgMsgBreak db 'EXCEPTION_BREAKPOINT',0 section '.code' code readable executable start: invoke GetModuleHandle,0 mov [insH],0 invoke DialogBoxParam,eax,100,NULL,dialog_procedure,NULL invoke ExitProcess,0 proc dialog_procedure,hDlg,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_COMMAND je wmCOMMAND cmp [uMsg],WM_CLOSE je wmCLOSE cmp [uMsg],WM_TIMER je wmTIMER cmp [uMsg],WM_INITDIALOG je wmINITDIALOG cmp [uMsg],WMU_DBGSTART je wmuDBGSTART cmp [uMsg],WMU_DBGEND je wmuDBGEND pop edi esi ebx mov eax,FALSE return wmCLOSE: invoke EndDialog,[hDlg],NULL jmp wmBYE wmTIMER: invoke KillTimer,[hDlg],[timerId] invoke ResumeThread,[dbgThreadH] jmp wmBYE wmuDBGSTART: invoke CreateThread,NULL,0,debug_thread_procedure,[hDlg],NORMAL_PRIORITY_CLASS,dbgId mov [dbgThreadH],eax jmp wmBYE wmuDBGEND: invoke CloseHandle,[dbgThreadH] jmp wmBYE wmCOMMAND: cmp [wParam],0xFFFF and 300 ;Button :: Browse je wmCOMMAND_300 jmp wmBYE wmCOMMAND_300: invoke GetOpenFileName,ofn cmp eax,TRUE jne wmBYE invoke GetDlgItem,[hDlg],100 invoke SetWindowText,eax,ofnBuffer invoke SendMessage,[hDlg],WMU_DBGSTART,NULL,NULL jmp wmBYE wmINITDIALOG: mov [ofn.lStructSize],sizeof.OPENFILENAME mov [ofn.lpstrFilter],ofnTxtFilter mov [ofn.lpstrFile],ofnBuffer mov [ofn.nMaxFile],512 mov [ofn.Flags],OFN_FILEMUSTEXIST + OFN_PATHMUSTEXIST + OFN_LONGNAMES +\ OFN_EXPLORER + OFN_HIDEREADONLY jmp wmBYE wmBYE: pop edi esi ebx mov eax,TRUE return endp proc debug_thread_procedure,hDlg invoke GetStartupInfo,proStartInfo invoke CreateProcess,ofnBuffer,NULL,NULL,NULL,FALSE,\ NORMAL_PRIORITY_CLASS + DEBUG_PROCESS + DEBUG_ONLY_THIS_PROCESS,NULL,NULL,proStartInfo,proInfo _300_debug_loop: invoke WaitForDebugEvent,dbgEvent,INFINITE mov edx,[dbgEvent.dwDebugEventCode] mov eax,dbgMsg1 ;EXCEPTION_DEBUG_EVENT cmp edx,1 je loop_continue mov eax,dbgMsg2 ;CREATE_THREAD_DEBUG_EVENT cmp edx,2 je loop_continue mov eax,dbgMsg3 ;CREATE_PROCESS_DEBUG_EVENT cmp edx,3 je loop_continue mov eax,dbgMsg4 ;EXIT_THREAD_DEBUG_EVENT cmp edx,4 je loop_continue mov eax,dbgMsg5 ;EXIT_PROCESS_DEBUG_EVENT cmp edx,5 je loop_continue mov eax,dbgMsg6 ;LOAD_DLL_DEBUG_EVENT cmp edx,6 je loop_continue mov eax,dbgMsg7 ;UNLOAD_DLL_DEBUG_EVENT cmp edx,7 je loop_continue mov eax,dbgMsg8 ;OUTPUT_DEBUG_STRING_EVENT cmp edx,8 je loop_continue mov eax,dbgMsg9 ;RIP_EVENT cmp edx,9 je loop_continue mov eax,dbgMsgError Продолжение следует
Код (ASM): loop_continue: stdcall debug_set_window_message,[hDlg],eax invoke SetTimer,[hDlg],1,2000,NULL mov [timerId],eax invoke SuspendThread,[dbgThreadH] ;EXIT_PROCESS_DEBUG_EVENT cmp [dbgEvent.dwDebugEventCode],EXIT_PROCESS_DEBUG_EVENT je _300_debug_exit ;EXCEPTION_DEBUG_EVENT cmp [dbgEvent.dwDebugEventCode],EXCEPTION_DEBUG_EVENT jne @f ;EXCEPTION_BREAKPOINT cmp [dbgEvent.u + EXCEPTION_DEBUG_INFO.ExceptionRecord.ExceptionCode],EXCEPTION_BREAKPOINT jne @f stdcall debug_set_window_message,[hDlg],dbgMsgBreak invoke SetTimer,[hDlg],1,2000,NULL mov [timerId],eax invoke SuspendThread,[dbgThreadH] invoke ContinueDebugEvent,[dbgEvent.dwProcessId],[dbgEvent.dwThreadId],DBG_CONTINUE jmp _300_debug_loop @@: ;CREATE_PROCESS_DEBUG_EVENT cmp [dbgEvent.dwDebugEventCode],CREATE_PROCESS_DEBUG_EVENT jne @f stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.hFile],101 stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.hProcess],102 stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.hThread],103 stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.lpBaseOfImage],104 stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.lpStartAddress],105 jmp _300_debug_continue @@: _300_debug_continue: invoke ContinueDebugEvent,[dbgEvent.dwProcessId],[dbgEvent.dwThreadId],DBG_EXCEPTION_NOT_HANDLED jmp _300_debug_loop _300_debug_exit: stdcall debug_set_window_message,[hDlg],dbgMsgExit invoke ContinueDebugEvent,[dbgEvent.dwProcessId],[dbgEvent.dwThreadId],DBG_TERMINATE_THREAD invoke ContinueDebugEvent,[dbgEvent.dwProcessId],[dbgEvent.dwThreadId],DBG_TERMINATE_PROCESS invoke CloseHandle,[proInfo.hProcess] invoke CloseHandle,[proInfo.hThread] invoke SendMessage,[hDlg],WMU_DBGEND,NULL,NULL return endp proc debug_set_window_info,hDlg,debugInfo,dlgItemNum invoke wsprintf,fBuffer,f1,[debugInfo] invoke GetDlgItem,[hDlg],[dlgItemNum] invoke SetWindowText,eax,fBuffer return endp proc debug_set_window_message,hDlg,dbgMsg invoke wsprintf,fBuffer,f2,[dbgMsg] invoke GetDlgItem,[hDlg],106 invoke SetWindowText,eax,fBuffer return endp section '.idata' import data readable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL',\ COMDLG32, 'COMDLG32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ GetStartupInfo, 'GetStartupInfoA',\ CreateProcess, 'CreateProcessA',\ CloseHandle, 'CloseHandle',\ ContinueDebugEvent, 'ContinueDebugEvent',\ WaitForDebugEvent, 'WaitForDebugEvent',\ GetExitCodeProcess, 'GetExitCodeProcess',\ TerminateProcess, 'TerminateProcess',\ TerminateThread, 'TerminateThread',\ CreateThread, 'CreateThread',\ GetExitCodeThread, 'GetExitCodeThread',\ SuspendThread, 'SuspendThread',\ ResumeThread, 'ResumeThread',\ ExitThread, 'ExitThread',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ SendMessage, 'SendMessageA',\ GetMessage, 'GetMessageA',\ MessageBox, 'MessageBoxA',\ DialogBoxParam, 'DialogBoxParamA',\ SetWindowText, 'SetWindowTextA',\ wsprintf, 'wsprintfA',\ GetDlgItem , 'GetDlgItem',\ SetTimer, 'SetTimer',\ KillTimer, 'KillTimer',\ EndDialog, 'EndDialog' import COMDLG32,\ GetOpenFileName, 'GetOpenFileNameA' section '.rsrc' resource data readable directory RT_DIALOG,appDialog resource appDialog,\ 100,LANG_NEUTRAL,dlgMain dialog dlgMain,'Simple Debugger',0,0,300,100,\ DS_MODALFRAME + WS_POPUP + WS_CAPTION + WS_SYSMENU,\ ,,'Tahoma',8 dialogitem 'STATIC','File :',-1,8,8,17,10,SS_LEFT + WS_VISIBLE dialogitem 'BUTTON','Browse',300,242,5,50,15,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP dialogitem 'STATIC','',100,27,7,206,11,SS_RIGHT + SS_SUNKEN + SS_PATHELLIPSIS + WS_VISIBLE dialogitem 'BUTTON',' Handle Information ',-1,8,23,120,58,BS_GROUPBOX + WS_VISIBLE dialogitem 'STATIC','',101,72,37,51,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE + WS_GROUP dialogitem 'STATIC','',102,72,51,51,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE + WS_GROUP dialogitem 'STATIC','',103,72,65,51,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE + WS_GROUP dialogitem 'STATIC','File Handle :',-1,15,38,41,7,SS_LEFT + WS_VISIBLE + WS_GROUP dialogitem 'STATIC','Process Handle :',-1,15,52,54,7,SS_LEFT + WS_VISIBLE + WS_GROUP dialogitem 'STATIC','Thread Handle :',-1,15,66,51,7,SS_LEFT + WS_VISIBLE + WS_GROUP dialogitem 'STATIC','Image Base :',-1,133,29,42,8,SS_LEFT + WS_VISIBLE + WS_GROUP dialogitem 'STATIC','Start Address :',-1,133,44,49,7,SS_LEFT + WS_VISIBLE + WS_GROUP dialogitem 'STATIC','',104,188,28,103,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE dialogitem 'STATIC','',105,188,43,103,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE dialogitem 'STATIC','Debugger Message :',-1,8,87,66,8,SS_LEFT + WS_VISIBLE dialogitem 'STATIC','',106,79,86,215,11,SS_LEFT + SS_SUNKEN + WS_VISIBLE enddialog Результат
Win32 API. Урок 31. Контрол ListviewТекст tut_31a.asm Код (ASM): format PE GUI 4.0 entry start M_MAIN = 10000 MI_ICON = 0x0000 MI_SMALLICON = 0x0002 MI_LIST = 0x0003 MI_REPORT = 0x0001 include '%fasminc%\win32a.inc' macro RGB cR, cG, cB { xor eax,eax ;clear the eax mov ah,cB shl eax,8 mov ah,cG mov al,cR } section '.data' data readable writeable wndH dd ? insH dd ? wndClsName db 'TUT_31',0 wndTitle db 'Tutorial 31',0 wndCls WNDCLASS wndMsg MSG ctlClsNameLv db 'SysListView32',0 lvH dd ? lvTxt1 db 'File Name',0 lvTxt2 db 'Size',0 lvTxt3 db '%lu',0 lvSortSize dd 0 lvSortFile dd 0 menuH dd ? lvI1a db 'Durian',0 lvI1b db '34',0 lvI2a db 'Banana',0 lvI2b db '54',0 lvI3a db 'Watermelon',0 lvI3b db '44',0 lvI4a db 'Apple',0 lvI4b db '55',0 lvI5a db 'Papaya',0 lvI5b db '1',0 section '.code' code readable executable start: invoke GetModuleHandle,0 mov [insH],eax mov [wndCls.hInstance],eax mov [wndCls.style],CS_HREDRAW or CS_VREDRAW mov [wndCls.lpfnWndProc],window_procedure mov [wndCls.lpszClassName],wndClsName mov [wndCls.lpszMenuName],10000 mov [wndCls.hbrBackground],COLOR_BTNFACE+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wndCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wndCls.hCursor],eax invoke RegisterClass,wndCls invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ wndClsName,wndTitle,\ WS_OVERLAPPEDWINDOW + WS_VISIBLE,\ CW_USEDEFAULT,CW_USEDEFAULT,400,240,\ NULL,NULL,[insH],NULL mov [wndH],eax invoke InitCommonControls ;+---------------------------+ ;| entering the message loop | ;+---------------------------+ window_message_loop_start: invoke GetMessage,wndMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wndMsg invoke DispatchMessage,wndMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ;+----------------------+ ;| the window procedure | ;+----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi cmp [uMsg],WM_NOTIFY je wmNOTIFY cmp [uMsg],WM_CREATE je wmCREATE