win32 masm 02

 .386
.model flat, stdcall
option casemap:none

WinMain proto :DWORD, :DWORD, :DWORD, :DWORD

include    ../../include/windows.inc
include    ../../include/user32.inc
include    ../../include/kernel32.inc
include    ../../include/comdlg32.inc
includelib ../../lib/user32.lib
includelib ../../lib/kernel32.lib
includelib ../../lib/comdlg32.lib

.const
IDM_OPEN equ 3000
IDM_SAVE equ 3001
IDM_EXIT equ 3002
MAXSIZE  equ 260
MEMSIZE  equ 65535
EditID   equ 5000

.data
ClassName db "Win32ASMEditClass", 0
AppName   db "Win32 ASM Edit"   , 0
EditClass db "edit"             , 0
MenuName  db "FirstMenu"        , 0
ofn OPENFILENAME <>
FilterString db "All Files(*.*)"   , 0, "*.*"  , 0
             db "Text Files(*.txt)", 0, "*.txt", 0
buffer db MAXSIZE dup(0)

.data?
hInstance     HINSTANCE ?
CommandLine   LPSTR     ?
hwndEdit      HWND      ?
hFile         HANDLE    ?
hMemory       HANDLE    ?
pMemory       DWORD     ?
SizeReadWrite DWORD     ?

.code
start:
    invoke GetModuleHandle, NULL
    mov hInstance, eax
    invoke GetCommandLine
    mov CommandLine, eax
    invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess, eax
   
    WinMain proc hInst: HINSTANCE, hPrevInstance: HINSTANCE, CmdLine: LPSTR, CmdShow: DWORD
        LOCAL wc  : WNDCLASSEX
        LOCAL msg : MSG
        LOCAL hwnd: HWND
       
        mov wc.cbSize, SIZEOF WNDCLASSEX
        mov wc.style, CS_HREDRAW or CS_VREDRAW
        mov wc.lpfnWndProc, OFFSET WndProc
        mov wc.cbClsExtra, NULL
        mov wc.cbWndExtra, NULL
        push hInst
        pop wc.hInstance
        mov wc.hbrBackground, COLOR_WINDOW + 1
        mov wc.lpszMenuName, OFFSET MenuName
        mov wc.lpszClassName, OFFSET ClassName
        invoke LoadIcon, NULL, IDI_APPLICATION
        mov wc.hIcon, eax
        mov wc.hIconSm, eax
        invoke LoadCursor, NULL, IDC_ARROW
        mov wc.hCursor, eax
        invoke RegisterClassEx, addr wc
        invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr ClassName, addr AppName, WS_OVERLAPPEDWINDOW, /
                               CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, hInst, NULL
        mov hwnd, eax
        invoke ShowWindow, hwnd, SW_SHOWNORMAL
        invoke UpdateWindow, hwnd
        .WHILE TRUE
            invoke GetMessage, addr msg, NULL, 0, 0
            .BREAK .IF (!eax)
            invoke TranslateMessage, addr msg
            invoke DispatchMessage, addr msg
        .ENDW
        mov eax, msg.wParam
        ret
    WinMain endp
   
    WndProc proc uses ebx hWnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM
        .IF uMsg == WM_CREATE
            invoke CreateWindowEx, NULL, addr EditClass, NULL, /
                                   WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLL, /
                                   0, 0, 0, 0, hWnd, EditID, hInstance, NULL
            mov hwndEdit, eax
            invoke SetFocus, hwndEdit
            ;======================================================================================
            ;      Initialize the members of OPENFILENAME structure
            ;======================================================================================
            mov ofn.lStructSize, SIZEOF ofn
            push hWnd
            pop ofn.hWndOwner
            push hInstance
            pop ofn.hInstance
            mov ofn.lpstrFilter, OFFSET FilterString
            mov ofn.lpstrFile, OFFSET buffer
            mov ofn.nMaxFile, MAXSIZE
        .ELSEIF uMsg == WM_SIZE
            mov eax, lParam
            mov edx, eax
            shr edx, 16
            and eax, 0FFFFh
            invoke MoveWindow, hwndEdit, 0, 0, eax, edx, TRUE
        .ELSEIF uMsg == WM_DESTROY
            invoke PostQuitMessage, NULL
        .ELSEIF uMsg == WM_COMMAND
            mov eax, wParam
            .IF lParam == 0
                .IF ax == IDM_OPEN
                    mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
                    invoke GetOpenFileName, addr ofn
                    .IF eax == TRUE
                        invoke CreateFile, addr buffer, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, /
                                           NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL
                        mov hFile, eax
                        invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE
                        mov hMemory, eax
                        invoke GlobalLock, hMemory
                        mov pMemory, eax
                        invoke ReadFile, hFile, pMemory, MEMSIZE - 1, addr SizeReadWrite, NULL
                        invoke SendMessage, hwndEdit, WM_SETTEXT, NULL, pMemory
                        invoke CloseHandle, hFile
                        invoke GlobalUnlock, pMemory
                        invoke GlobalFree, hMemory
                    .ENDIF
                    invoke SetFocus, hwndEdit
                .ELSEIF ax == IDM_SAVE
                    mov ofn.Flags, OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
                    invoke GetSaveFileName, addr ofn
                    .IF eax == TRUE
                        invoke CreateFile, addr buffer, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, /
                                           NULL, CREATE_NEW, FILE_ATTRIBUTE_ARCHIVE, NULL
                        mov hFile, eax
                        invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE
                        mov hMemory, eax
                        invoke GlobalLock, hMemory
                        mov pMemory, eax
                        invoke SendMessage, hwndEdit, WM_GETTEXT, MEMSIZE - 1, pMemory
                        invoke WriteFile, hFile, pMemory, eax, addr SizeReadWrite, NULL
                        invoke GlobalHandle, hFile
                        invoke GlobalUnlock, pMemory
                        invoke GlobalFree, hMemory
                    .ENDIF
                    invoke SetFocus, hwndEdit
                .ELSE
                    invoke DestroyWindow, hWnd
                .ENDIF
            .ENDIF
        .ELSE
            invoke DefWindowProc, hWnd, uMsg, wParam, lParam
            ret
        .ENDIF
        xor eax, eax
        ret
    WndProc endp
end start

發佈了29 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章