📄 win32汇编.txt
字号:
.elseif eax==WM_NOTIFY
mov eax,wParam
.if ax==1
mov al,[ebp+1]
mov bl,[ebp+3]
mov bl,[ebp+20]
lea eax,lParam
mov ebx,lParam
assume ebx:ptr NMHDR
mov eax,[ebx].hwndFrom
.if eax==hStatus
;invoke _message,wParam
invoke GetClientRect,hStatus,addr @rect
invoke GetCursorPos,addr @pt
mov eax,@rect.left
mov ebx,eax
add eax,40
add ebx,150
.if @pt.x>eax && @pt.x<ebx
invoke _message,wParam
.endif
.endif
assume ebx:nothing
.endif
.elseif eax==WM_HOOK
mov eax,wParam
.if al==0dh
mov ax,0a0dh
.endif
mov dword ptr szAscii,eax
invoke SendMessage,hWndEdit,EM_REPLACESEL,TRUE,addr szAscii
;INVOKE MessageBox,hWnd,addr szAscii,0,MB_OK
.elseif eax==WM_CREATE
invoke CreateEvent,NULL,FALSE,FALSE,NULL
mov hEvent,eax
invoke SetEvent,hEvent
invoke LoadLibrary,offset szDll
.if eax
mov hDll,eax
invoke GetProcAddress,hDll,offset szInstall
mov lpInstall,eax
invoke GetProcAddress,hDll,offset szUninstall
mov lpUninstall,eax
invoke lpInstall,hWnd,WM_HOOK
.endif
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szEdit,NULL,WS_VISIBLE OR WS_CHILD OR ES_MULTILINE OR ES_WANTRETURN OR WS_VSCROLL OR ES_AUTOHSCROLL,0,0,0,0,hWnd,1,hInstance,NULL
mov hWndEdit,eax
CALL _reSize
invoke GlobalAlloc,GMEM_FIXED OR GMEM_ZEROINIT,1000;固定内存块
mov @l1,eax
invoke lstrcpy,@l1,offset szFont
;invoke MessageBox,hWnd,@l1,0,MB_OK
invoke GlobalFree,@l1
invoke GlobalReAlloc,@l1,2000,GMEM_MOVEABLE OR GMEM_ZEROINIT
mov @l1,eax
;invoke lstrcpy,@l1,offset szFont
;invoke MessageBox,hWnd,@l1,0,MB_OK
invoke GlobalAlloc,GMEM_MOVEABLE OR GMEM_ZEROINIT,1000;移动内存块
mov @h1,eax
;invoke GlobalAlloc,GMEM_FIXED OR GMEM_ZEROINIT,1000;这里有了这段,下面的将会是失败的,因为数据将要移动,地址会改变
invoke GlobalReAlloc,@h1,20000,GMEM_MOVEABLE OR GMEM_ZEROINIT
mov @h2,eax
invoke GlobalLock,@h2
mov @l2,eax
;invoke GlobalLock,@h1
;mov @l1,eax
;invoke wsprintf,@l1,offset szColor,@l1
;invoke MessageBox,hWnd,@l1,0,MB_OK
;invoke wsprintf,@l2,offset szColor,@l2
;invoke MessageBox,hWnd,@l2,0,MB_OK
invoke GlobalFree,@h2
invoke GlobalAlloc,GMEM_MOVEABLE OR GMEM_ZEROINIT OR GMEM_DISCARDED,1000;可丢弃内存块,如果内存不足将会被丢弃
invoke GlobalFree,eax
invoke HeapCreate,HEAP_NO_SERIALIZE OR HEAP_GENERATE_EXCEPTIONS,200,1000;创建堆
.if eax && (eax<0c0000000H);因为上面指定了产生失败的原因
mov @h1,eax
.endif
invoke HeapAlloc,@h1,HEAP_ZERO_MEMORY,200
mov @l1,eax
invoke wsprintf,@l1,offset szColor,@l1
;invoke MessageBox,hWnd,@l1,0,MB_OK
invoke HeapAlloc,@h1,HEAP_ZERO_MEMORY,200
mov @l2,eax
invoke HeapReAlloc,@h1,HEAP_ZERO_MEMORY,@l1,500
mov @l1,eax
;invoke wsprintf,@l1,offset szColor,@l1
;invoke MessageBox,hWnd,@l1,0,MB_OK ;移动扩大后的内存数据中的数据是不会变的。
;invoke wsprintf,@l2,offset szColor,@l2
;invoke MessageBox,hWnd,@l2,0,MB_OK
invoke HeapFree,@h1,HEAP_NO_SERIALIZE,@l1
invoke HeapFree,@h1,HEAP_NO_SERIALIZE,@l2
invoke HeapDestroy,@h1
invoke VirtualAlloc,NULL,40960,MEM_RESERVE,PAGE_NOACCESS;保存一块内存块
mov @l1,eax
invoke VirtualAlloc,@l1,4096,MEM_COMMIT,PAGE_READWRITE;提交内存
mov @l2,eax
;invoke wsprintf,@l2,offset szColor,@l2
;invoke MessageBox,hWnd,@l2,0,MB_OK
;invoke VirtualProtect,@l2,4096,PAGE_READONLY,addr dwColor;这里把虚拟内存页改为了只读,下面的读句就会出错
;invoke wsprintf,@l2,offset szColor,@l2
;invoke MessageBox,hWnd,@l2,0,MB_OK
invoke VirtualFree,@l2,4096,MEM_DECOMMIT
invoke VirtualFree,@l1,40960,MEM_RELEASE
invoke CreateFile,addr szText,GENERIC_WRITE OR GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
.if eax!=INVALID_HANDLE_VALUE
mov hFile,eax
.endif
;invoke SetFilePointer,hFile,55,NULL,FILE_END
;invoke SetEndOfFile,hFile
;invoke SetFilePointer,hFile,0,NULL,FILE_CURRENT
;invoke wsprintf,addr szBuf,offset szColor,eax
;invoke MessageBox,hWnd,addr szBuf,0,MB_OK
INVOKE CreateFileMapping,hFile,NULL,PAGE_READWRITE,0,4096,NULL;本身文件自己所拥有的只有2K。所以最好这里指定一下大小,不然写不了大数据
.if eax
mov hMap,eax
.endif
invoke MapViewOfFile,hMap,FILE_MAP_READ OR FILE_MAP_WRITE,0,0,0
.if eax
mov lpView,eax
.endif
mov al,'b'
mov ecx,500
mov edi,lpView
rep stosb
;mov [edi],al
invoke FlushViewOfFile,lpView,NULL
invoke UnmapViewOfFile,lpView
invoke CloseHandle,hMap
invoke CloseHandle,hFile
invoke OpenFileMapping,FILE_MAP_READ OR FILE_MAP_WRITE,0,offset szChar;内存映射实现数据共享,每打开一次就会向这块内存写入新的数据
.if !eax
invoke CreateFileMapping,NULL,NULL,PAGE_READWRITE,0,4096,offset szChar
.endif
mov hMap,eax
invoke MapViewOfFile,hMap,FILE_MAP_READ OR FILE_MAP_WRITE,0,0,0
mov lpView,eax
invoke lstrcat,lpView,offset szChar
;invoke MessageBox,hWnd,lpView,0,MB_OK ;这块的释放工作放在WM_CLOSE里面。如果马上释放后面的文件就打不开映射,又只能创建
invoke GetTempPath,sizeof szBuf,offset szBuf;取临时文件夹路径
;invoke MessageBox,hWnd,offset szBuf,0,MB_OK
invoke GetCurrentDirectory,sizeof szBuf,offset szBuf;对当前文件路径
;invoke MessageBox,hWnd,offset szBuf,0,MB_OK
invoke GetSystemDirectory,offset szBuf,sizeof szBuf;取系统路径
;invoke MessageBox,hWnd,offset szBuf,0,MB_OK
invoke GetWindowsDirectory,offset szBuf,sizeof szBuf;取windows路径
;invoke MessageBox,hWnd,offset szBuf,0,MB_OK
invoke CreateStatusWindow,WS_VISIBLE OR WS_CHILD,addr szFilter,hWnd,1
mov hStatus,eax
INVOKE SendMessage,hStatus,SB_SETPARTS,4,addr szPart
INVOKE SendMessage,hStatus,SB_SETTEXT,1,addr szFilter
mov stFindReplace.lStructSize,sizeof stFindReplace
push hWnd
pop stFindReplace.hwndOwner
mov stFindReplace.Flags,FR_DOWN
mov stFindReplace.lpstrFindWhat,offset szBuf
mov stFindReplace.wFindWhatLen,sizeof szBuf
mov stFindReplace.lpstrReplaceWith,offset szBuf2
mov stFindReplace.wReplaceWithLen,sizeof szBuf2
invoke RegisterWindowMessage,addr szFINDTEXT
mov uvMsg,eax
invoke GetSystemMenu,hWnd,FALSE
mov hSysMenu,eax
invoke AppendMenu,hSysMenu,MF_BYCOMMAND,IDM_C,addr szKey
invoke AppendMenu,hSysMenu,MF_BYCOMMAND,IDM_B,ADDR szTitle
;invoke DeleteMenu,hSysMenu,0,MF_BYPOSITION
;invoke RemoveMenu,hSysMenu,0,MF_BYPOSITION
invoke ModifyMenu,hSysMenu,0,MF_BYPOSITION,IDM_ALTB,addr szTitle
invoke EnableMenuItem,hMenu,IDM_UNABLE,MF_BYCOMMAND OR MF_DISABLED
invoke EnableMenuItem,hMenu,IDM_UNABLE,MF_BYCOMMAND OR MF_DISABLED
invoke EnableMenuItem,hMenu,IDM_ENABLE,MF_BYCOMMAND OR MF_ENABLED
invoke EnableMenuItem,hMenu,IDM_GRAY,MF_BYCOMMAND OR MF_GRAYED
invoke CheckMenuItem,hMenu,IDM_CHECKED,MF_BYCOMMAND OR MF_CHECKED
invoke CheckMenuRadioItem,hMenu,IDM_ICON1,IDM_ICON2,IDM_ICON1,MF_BYCOMMAND
invoke CheckMenuRadioItem,hMenu,IDM_CURSOR1,IDM_CURSOR2,IDM_CURSOR1,MF_BYCOMMAND
;invoke EnableMenuItem,hMenu,IDM_OPEN, MF_DISABLED
.elseif eax==WM_RBUTTONDOWN
invoke GetSubMenu,hMenu,1
mov hSubMenu,eax
invoke GetCursorPos,addr @pt
invoke TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@pt.x,@pt.y,NULL,hWnd,NULL
.elseif eax==WM_SYSCOMMAND
mov eax,wParam
.if ax==IDM_C || AX==IDM_B || AX==IDM_ALTB
invoke _message,wParam
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
.endif
ret
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax;返回码
ret
_wndProc endp
_winMain proc
local @wc:WNDCLASSEX
local @uMsg:MSG
invoke RtlZeroMemory,addr @wc,sizeof @wc
invoke GetModuleHandle,NULL
mov hInstance,eax
mov @wc.hInstance,eax
mov @wc.cbSize,sizeof @wc
mov @wc.cbClsExtra,0
mov @wc.cbWndExtra,0
mov @wc.lpszClassName,offset szClassName
mov @wc.lpszMenuName,0
mov @wc.hbrBackground,COLOR_WINDOW+1
mov @wc.style,CS_VREDRAW OR CS_HREDRAW OR CS_DBLCLKS
mov @wc.lpfnWndProc,offset _wndProc
invoke LoadAccelerators,hInstance,IDR_ACCELERATOR1
mov hAccelerator,eax
invoke LoadMenu,hInstance,IDR_MENU1
mov hMenu,eax
invoke LoadIcon,hInstance,IDI_ICON1
mov hIcon1,eax
mov @wc.hIcon,eax
invoke LoadIcon,hInstance,IDI_ICON2
mov hIcon2,eax
invoke LoadCursor,hInstance,IDC_CURSOR1
.if eax
mov hCur1,eax
mov @wc.hCursor,eax
.endif
invoke LoadCursorFromFile,addr szCur2
mov hCur2,eax
invoke RegisterClassEx,addr @wc
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,addr szClassName,addr szTitle,WS_OVERLAPPEDWINDOW,0,0,600,500,NULL,hMenu,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
.while TRUE
invoke GetMessage,addr @uMsg,NULL,0,0
.break .if !eax
invoke TranslateAccelerator,hWinMain,hAccelerator,addr @uMsg
.if !eax
invoke TranslateMessage,addr @uMsg
invoke DispatchMessage,addr @uMsg
.endif
.endw
ret
_winMain endp
start:
invoke InitCommonControls
call _winMain
invoke ExitProcess,-1
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -