;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; win32汇编 内存映射文件之间的数据传递
; by power_virus 2014.12.17 23:00
; 参考资料:Windows环境下32位汇编语言程序设计
; Windows核心编程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Control.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; ml /c /coff Control.asm
; rc Control.rc
; Link /subsystem:windows Control.obj Control.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include gdi32.inc
includelib gdi32.lib
include Comdlg32.inc
includelib Comdlg32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 4101H
DLG_MAIN equ 4100H
IDC_CZ equ 4000H
IDC_ML equ 4002H
IDC_WRITE equ 4003H
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
szFileName db MAX_PATH dup (?)
hInstance dd ?
hWinMain dd ?
hFile dd ?
hDC dd ?
dwFileSize dd ?
hImageMemory dd ?
pImageMemory dd ?
dwReadedSize dd ?
plStream dd ?
plPicture dd ?
hmWidth dd ?
hmHeight dd ?
hMapFile dd ?
lpMemory dd ?
HWFile dd ?
HWMapFile dd ?
HWMemory dd ?
lpWMemory dd ?
lpMsgBuf dd ?
.const
szFilter db 'Text Files(*.txt)',0,'*.txt',0,'All Files(*.*)',0,'*.*',0,0
szCaption db 'control',0
szWFileName db 'D:\TEST.txt',0
szErro db 'erro',0
szCF db 'CreateFile失败',0
szCMF db 'CreateMappingFile失败',0
szMVOF db 'MapViewOfFile失败',0
szGFS db 'GetFileSize失败',0
szOK db '数据拷贝成功',0
szThreadE db '创建线程失败',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;写文件,线程函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WriteFile proc uses ebx esi edi ecx _lParam
invoke CreateFile,addr szWFileName,GENERIC_WRITE or GENERIC_READ,FILE_SHARE_WRITE,NULL,
CREATE_NEW,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax == INVALID_HANDLE_VALUE
invoke MessageBox,hWinMain,addr szCF,addr szCaption,MB_OK
ret
.endif
mov HWFile,eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;注:此处的PAGE_READWRITE属性和CreateFile函数中的GENERIC_WRITE or GENERIC_READ属性相对应
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke CreateFileMapping,HWFile,NULL,PAGE_READWRITE,0,dwFileSize,NULL
.if eax == NULL
invoke MessageBox,hWinMain,addr szCMF,addr szCaption,MB_OK
jmp CF
.endif
mov HWMapFile,eax
invoke MapViewOfFile,HWMapFile,FILE_MAP_WRITE,0,0,0
.if eax == NULL
invoke MessageBox,hWinMain,addr szMVOF,addr szCaption,MB_OK
jmp CMF
.endif
mov lpWMemory,eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;将映射文件1中的数据复制到映射文件2中
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mov esi,lpMemory
mov edi,lpWMemory
mov ecx,dwFileSize
cld
rep movsb
invoke MessageBox,hWinMain,addr szOK,addr szCaption,MB_OK
; invoke FlushViewOfFile,lpWMemory,dwFileSize;通知CPU立即将数据页中数据写入磁盘文件
invoke UnmapViewOfFile,lpWMemory
invoke UnmapViewOfFile,lpMemory
CMF: invoke CloseHandle,HWMapFile
CF: invoke CloseHandle,HWFile
ret
_WriteFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;打开文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_OpenFile proc
local @stOF:OPENFILENAME
invoke RtlZeroMemory,addr @stOF,sizeof @stOF
mov @stOF.lStructSize,sizeof @stOF
mov @stOF.lpstrFilter,offset szFilter
mov @stOF.lpstrFile,offset szFileName
mov @stOF.nMaxFile,MAX_PATH
mov @stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
invoke GetOpenFileName,addr @stOF
.if !eax
ret
.endif
invoke SetDlgItemText,hWinMain,IDC_ML,addr szFileName
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;创建映射文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke CreateFile,addr szFileName,GENERIC_READ,FILE_SHARE_READ or \
FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax == INVALID_HANDLE_VALUE
invoke MessageBox,hWinMain,addr szCF,addr szCaption,MB_OK
ret
.endif
mov hFile,eax
invoke GetFileSize,eax,NULL
.if eax == 0FFFFFFFFH
invoke MessageBox,hWinMain,addr szGFS,addr szCaption,MB_OK
jmp CF
.endif
mov dwFileSize,eax
invoke CreateFileMapping,hFile,NULL,PAGE_READONLY,0,0,NULL
.if eax == NULL
invoke MessageBox,hWinMain,addr szCMF,addr szCaption,MB_OK
jmp CF
.endif
mov hMapFile,eax
invoke MapViewOfFile,hMapFile,FILE_MAP_COPY,0,0,0
.if eax == NULL
invoke MessageBox,hWinMain,addr szMVOF,addr szCaption,MB_OK
jmp CMF
.endif
mov lpMemory,eax
invoke GetDlgItem,hWinMain,IDC_WRITE
invoke EnableWindow,eax,TRUE
CMF: invoke CloseHandle,hMapFile
CF: invoke CloseHandle,hFile
ret
_OpenFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDCANCEL
invoke EndDialog,hWnd,NULL
.elseif ax == IDC_CZ
invoke _OpenFile
.elseif ax == IDC_WRITE
invoke CreateThread,NULL,0,addr _WriteFile,NULL,NULL,NULL
.if eax == NULL
invoke MessageBox,hWinMain,addr szThreadE,addr szCaption,MB_OK
ret
.endif
.endif
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
invoke GetDlgItem,hWinMain,IDC_WRITE
invoke EnableWindow,eax,FALSE
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
<a target=_blank href="http://download.csdn.net/detail/power_virus/8271883">点击打开链接</a>