📄 first.asm
字号:
;****************************************
;文件:First.ASM *
;功能:利用内存映射文件进行 *
; 进程间通讯之程序1 *
;****************************************
IDC_EDITTEXT = 100 ;EDIT控制的ID
.386p
.model flat,stdcall ;平坦内存模式,标准调用约定
include win32.inc ;包含有WIN32部分常量定义的文件
extrn CreateFileA:proc
extrn CreateFileMappingA:proc
extrn OpenFileMappingA:proc
extrn MapViewOfFile:proc
extrn UnmapViewOfFile:proc
extrn CloseHandle:proc
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn GetModuleHandleA:proc
extrn DialogBoxParamA:proc
extrn EndDialog:Proc
extrn SetDlgItemTextA:proc
extrn SetTimer:proc
extrn KillTimer:proc
NULL = 0
MB_OK = 0
INVALID_HANDLE_VALUE = -1
GENERIC_READ = 80000000H
GENERIC_WRITE = 40000000H
FILE_SHARE_READ = 1
FILE_SHARE_WRITE = 2
FILE_SHARE_DELETE = 4
CREATE_ALWAYS = 2
PAGE_READWRITE = 04H
FILE_ATTRIBUTE_NORMAL = 00000080H
READ_CONTROL = 00020000H
STANDARD_RIGHTS_REQUIRED = 000F0000H
SECTION_QUERY = 0001H
SECTION_MAP_WRITE = 0002H
SECTION_MAP_READ = 0004H
SECTION_MAP_EXECUTE = 0008H
SECTION_EXTEND_SIZE = 0010H
SECTION_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED OR SECTION_QUERY OR SECTION_MAP_WRITE OR SECTION_MAP_READ OR SECTION_MAP_EXECUTE OR SECTION_EXTEND_SIZE
FILE_MAP_COPY = SECTION_QUERY
FILE_MAP_WRITE = SECTION_MAP_WRITE
FILE_MAP_READ = SECTION_MAP_READ
FILE_MAP_ALL_ACCESS = SECTION_ALL_ACCESS
COUNT = 200
.data
DialogName db 'MyDialog',0
CaptionFail db '失败!',0
TextFail db 'API:DialogBoxParamA调用失败!',0
TEXT db '河汉清且浅,相去复几许。',0
TextLen = $-TEXT
ErrCaption db '错误',0
ErrText db '发生错误',0
FileName db 'Mapping.dat'
hFile dd ?
hMapping dd ?
pMapView dd ?
MappingName db 'MyMappingName',0
.code
;主过程
Start:
call GetModuleHandleA,0 ;取得模块句柄,返回结果在eax中
;调用DialogBoxParamA显示对话框
call DialogBoxParamA,eax,offset DialogName,0,offset DialogProc,0
cmp eax,0 ;成功否?
jnz Exit ;成功则退出
;显示出错信息
call MessageBoxA,0,offset TextFail,offset CaptionFail,MB_OK
Exit:
call ExitProcess,0 ;退出进程
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
;对话框消息处理过程
DialogProc proc uses ebx edi esi, hWnd:DWORD, wMsg:DWORD, wParam:DWORD, lParam:DWORD
cmp wMsg,WM_INITDIALOG
jz WmInitDialog
cmp wMsg,WM_CLOSE
jz WmClose
cmp wMsg,WM_COMMAND
jz WmCommand
cmp wMsg,WM_TIMER
jz WmTimer
jmp ExitProc
WmInitDialog: ;对话框初始化处理
call DlgInit,hWnd
jmp ExitProc
WmClose: ;用户按下了Alt-F4或单击右上角X按扭
call DlgClose,hWnd
jmp ExitProc
WmTimer:
call SetDlgItemTextA,hWnd,IDC_EDITTEXT,pMapView
jmp ExitProc
WmCommand:
mov ebx,wParam
cmp bx,IDOK ;是按下了“退出”键?
jnz ExitProc
call DlgClose,hWnd
jmp ExitProc
ExitProc: ;退出消息处理
xor eax,eax
ret
DialogProc endp
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
DlgInit proc, hWnd:DWORD
call CreateFileA,offset FileName,GENERIC_WRITE OR GENERIC_READ,FILE_SHARE_READ OR FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
mov [hFile],eax
cmp eax,INVALID_HANDLE_VALUE
jz Error
call CreateFileMappingA,[hFile],NULL,PAGE_READWRITE,0,COUNT,offset MappingName
mov [hMapping],eax
cmp eax,NULL
jz Error
call MapViewOfFile,[hMapping],FILE_MAP_ALL_ACCESS,0,0,COUNT
mov [pMapView],eax
cmp eax,NULL
jz Error
mov edi,eax
mov esi,offset TEXT
mov ecx,TextLen
cld
rep movsb
call SetTimer,hWnd,12345,500,NULL ;设置定时器
ret
Error:
call MessageBoxA,NULL,offset ErrText,offset ErrCaption,MB_OK
call DlgClose
ret
DlgInit endp
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
DlgClose proc, hWnd:DWORD
call KillTimer,hWnd,12345 ;删除定时器
call UnmapViewOfFile,[pMapView]
call CloseHandle,[hMapping]
call CloseHandle,[hFile]
call EndDialog,hWnd,1 ;关闭对话框
ret
DlgClose endp
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
end Start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -