Sulaiman Chang Personal Website
Tutorial 13 : Memory Mapped Files

format PE GUI 4.0
entry start

include '%fasminc%\win32a.inc'

; +-----------------------+
; | menu item declaration |
; +-----------------------+
MI_OPEN equ     110
MI_SAVE equ     120
MI_EXIT equ     190

section '.data' data readable writeable
        sTitle          db      'Tutorial 13',0
        sClsName        db      'TUT13',0

        hWindow         dd      ?
        hInstance       dd      ?
        msg             MSG
        wc              WNDCLASS

        dOTitle         db      'Open File',0
        dOFilter        db      'All Files (*.*)',0,'*.*',0,0
        dOBuffer:       times 260 db 0
        dOOfn           OPENFILENAME

        hFileR          dd      ?       ;file read handle
        hFileW          dd      ?       ;file write handle
        hFileM          dd      ?       ;file mapped handle
        pFileM          dd      ?       ;pointer for the starting address of mapped file

        hMenu           dd      ?       ;menu handle

        szFileWritten   dd      ?       ;size number of bytes written

section '.code' code readable executable
        start:
                ; +------------------------------+
                ; | registering the window class |
                ; +------------------------------+
                invoke  GetModuleHandle,NULL
                        mov     [hInstance],eax
                        mov     [wc.hInstance],eax
                        mov     [wc.style],CS_HREDRAW or CS_VREDRAW
                        mov     [wc.lpfnWndProc],window_procedure
                        mov     [wc.lpszClassName],sClsName
                        mov     [wc.lpszMenuName],30
                        mov     [wc.hbrBackground],COLOR_WINDOW+1
                invoke  LoadIcon,NULL,IDI_APPLICATION
                        mov     [wc.hIcon],eax
                invoke  LoadCursor,NULL,IDC_ARROW
                        mov  [wc.hCursor],eax
                invoke  RegisterClass,wc

                ; +--------------------------+
                ; | creating the main window |
                ; +--------------------------+
                invoke  CreateWindowEx,\
                        WS_EX_CLIENTEDGE,\
                        sClsName,\
                        sTitle,\
                        WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
                        CW_USEDEFAULT,\
                        CW_USEDEFAULT,\
                        300,\
                        200,\
                        NULL,\
                        NULL,\
                        [hInstance],\
                        NULL
                        mov     [hWindow],eax

                ; +---------------------------+
                ; | entering the message loop |
                ; +---------------------------+
                window_message_loop_start:
                        invoke  GetMessage,msg,NULL,0,0
                                or      eax,eax
                                je      window_message_loop_end
                        invoke  TranslateMessage,msg
                        invoke  DispatchMessage,msg
                                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_COMMAND
                        je      wmCOMMAND
                        cmp     [uMsg],WM_DESTROY
                        je      wmDESTROY

                        wmDEFAULT:
                                invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
                                        jmp  wmBYE

                        wmCREATE:
                                invoke  GetMenu,[hWnd]
                                        mov     [hMenu],eax
                                        mov     [dOOfn.lStructSize],sizeof.OPENFILENAME
                                        push    hInstance
                                        pop     [dOOfn.hInstance]
                                        mov     [dOOfn.lpstrFilter],dOFilter
                                        mov     [dOOfn.lpstrFile],dOBuffer
                                        mov     [dOOfn.nMaxFile],260
                                        jmp     wmBYE
                        wmCOMMAND:
                                cmp     [wParam],0xFFFF and MI_OPEN
                                je      wmCOMMAND_MI_OPEN
                                cmp     [wParam],0xFFFF and MI_SAVE
                                je      wmCOMMAND_MI_SAVE
                                cmp     [wParam],0xFFFF and MI_EXIT
                                je      wmCOMMAND_MI_EXIT
                                jmp     wmBYE

                                wmCOMMAND_MI_EXIT:
                                        invoke  DestroyWindow,[hWnd]
                                                jmp     wmBYE

                                wmCOMMAND_MI_OPEN:
                                                mov     [dOOfn.Flags],OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or\
                                                        OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
                                        invoke  GetOpenFileName,dOOfn
                                                cmp     eax,TRUE
                                                je      wmCOMMAND_MI_OPEN_TRUE
                                                jmp     wmBYE

                                wmCOMMAND_MI_OPEN_TRUE:
                                        invoke  CreateFile,\
                                                        dOBuffer,\
                                                        GENERIC_READ,\
                                                        0,\
                                                        NULL,\
                                                        OPEN_EXISTING,\
                                                        FILE_ATTRIBUTE_ARCHIVE,\
                                                        NULL
                                                mov     [hFileR],eax
                                        invoke  CreateFileMapping,\
                                                        eax,\
                                                        NULL,\
                                                        PAGE_READONLY,\
                                                        0,0,NULL
                                                mov     [hFileM],eax
                                                mov     eax,dOBuffer
                                                movsx   edx,[dOOfn.nFileOffset]
                                                add     eax,edx
                                        invoke  SetWindowText,[hWnd],eax
                                        invoke  EnableMenuItem,[hMenu],MI_OPEN,MF_GRAYED
                                        invoke  EnableMenuItem,[hMenu],MI_SAVE,MF_ENABLED
                                                jmp     wmBYE

                                wmCOMMAND_MI_SAVE:
                                                mov     [dOOfn.Flags],OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
                                        invoke  GetSaveFileName,dOOfn
                                                cmp     eax,TRUE
                                                je      wmCOMMAND_MI_SAVE_TRUE
                                                jmp     wmBYE

                                wmCOMMAND_MI_SAVE_TRUE:
                                        invoke  CreateFile,\
                                                        dOBuffer,\
                                                        GENERIC_READ or GENERIC_WRITE,\
                                                        FILE_SHARE_READ or FILE_SHARE_WRITE,\
                                                        NULL,\
                                                        CREATE_NEW,\
                                                        FILE_ATTRIBUTE_ARCHIVE,\
                                                        NULL
                                                mov     [hFileW],eax
                                        invoke  MapViewOfFile,[hFileM],FILE_MAP_READ,0,0,0
                                                mov     [pFileM],eax
                                        invoke  GetFileSize,[hFileR],NULL
                                        invoke  WriteFile,[hFileW],[pFileM],eax,szFileWritten,NULL
                                        invoke  UnmapViewOfFile,[pFileM]
                                        invoke  CloseHandle,[hFileM]
                                        invoke  CloseHandle,[hFileR]
                                        invoke  CloseHandle,[hFileW]
                                        invoke  SetWindowText,[hWnd],sTitle
                                        invoke  EnableMenuItem,[hMenu],MI_OPEN,MF_ENABLED
                                        invoke  EnableMenuItem,[hMenu],MI_SAVE,MF_GRAYED
                                                jmp     wmBYE

                        wmDESTROY:
                                invoke  PostQuitMessage,0

                        wmBYE:
                                pop  edi esi ebx
                                return
                endp

section '.idata' import data readable writeable
        library KERNEL32,       'KERNEL32.DLL',\
                        USER32, 'USER32.DLL',\
                        COMDLG32,       'COMDLG32.DLL'

        import  KERNEL32,\
                        GetModuleHandle,        'GetModuleHandleA',\
                        lstrcat,                'lstrcat',\
                        CreateFileMapping,      'CreateFileMappingA',\
                        MapViewOfFile,          'MapViewOfFile',\
                        UnmapViewOfFile,        'UnmapViewOfFile',\
                        GetFileSize,            'GetFileSize',\
                        CreateFile,             'CreateFileA',\
                        WriteFile,              'WriteFile',\
                        CloseHandle,            'CloseHandle',\
                        ExitProcess,            'ExitProcess'

        import  USER32,\
                        RegisterClass,          'RegisterClassA',\
                        CreateWindowEx,         'CreateWindowExA',\
                        DefWindowProc,          'DefWindowProcA',\
                        LoadCursor,             'LoadCursorA',\
                        LoadIcon,               'LoadIconA',\
                        SetWindowText,          'SetWindowTextA',\
                        GetMenu,                'GetMenu',\
                        EnableMenuItem,         'EnableMenuItem',\
                        GetMessage,             'GetMessageA',\
                        DestroyWindow,          'DestroyWindow',\
                        TranslateMessage,       'TranslateMessage',\
                        DispatchMessage,        'DispatchMessageA',\
                        PostQuitMessage,        'PostQuitMessage'

        import  COMDLG32,\
                        GetOpenFileName,        'GetOpenFileNameA',\
                        GetSaveFileName,        'GetSaveFileNameA'

section '.rsrc' resource data readable
        directory       RT_MENU,appMenu

        resource        appMenu,\
                        30,LANG_NEUTRAL,menuMain

        menu    menuMain
                menuitem        '&File',0,MFR_POPUP + MFR_END
                menuitem                'Op&en',MI_OPEN,0
                menuitem                '&Save',MI_SAVE,0,MF_GRAYED
                                        menuseparator
                menuitem                'E&xit',MI_EXIT,MFR_END
Result :
Copyright © 2004 Sulaiman Chang. All Rights Reserved.