win32汇编之内存映射文件之间的数据传递

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值