⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cutfile.asm

📁 汇编实现文件分割和合并的ASM代码
💻 ASM
字号:
;compile:ml /c /coff /Cp cutfile.asm
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
CutFile proto c:ptr,:dword
.const
 MAXSIZE EQU 256
.data
	AppName  db "Smallwaves'asm studio!",0
	FileName db MAXSIZE dup(0)
	FinalName db ".000",0,0
	ErrorCreate db "Error Create or open file",0
	ErrorMapping db "Error Mapping",0
	ErrorTooSmall db "File size is smaller than Cut size!",0
	TooManyCutFiles db "Too Many cut files created!",0	
	
.data?
	hFile dd ?
	hFileMapping dd ?
	hFileNew dd ?
	StrLength dd ?
.code
_CalNextCutName  proc uses ecx
	mov ecx,StrLength
	xor eax,eax
	mov al,FileName[ecx]
	.if al=='9'
		MOV AL,'0'
		mov FileName[ecx],al
		dec ecx
		mov al,FileName[ecx]
		.if al=='9'
			mov al,'0'
			mov FileName[ecx],al
			dec ecx
			mov al,FileName[ecx]
			.if al=='9'
				invoke MessageBox,NULL,addr TooManyCutFiles,addr AppName,MB_OK or MB_ICONWARNING
				RET
			.else
				inc al
				mov FileName[ecx],al
			.endif
		.else
			inc al
			mov FileName[ecx],al
		.endif
	.else
		inc al
		mov FileName[ecx],al
	.endif
        ret
_CalNextCutName endp

;********************************************************************
CutFile  proc c uses ecx edx ebx, lpFilepath:ptr,CutSize:dword
LOCAL FileSize:dword
local ActualRead:dword
local pMapView:dword
local ReadSize:dword
.if CutSize!=0
	invoke lstrcpy,addr FileName,lpFilepath
	shl CutSize,10
	invoke CreateFile,addr FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN,NULL
	.if eax!=INVALID_HANDLE_VALUE
		MOV hFile,eax
		invoke GetFileSize,eax,NULL
		mov FileSize,eax
		.if eax>=CutSize
		.else
			invoke MessageBox,NULL,addr ErrorTooSmall,addr AppName,MB_OK or MB_ICONWARNING
			mov eax,FALSE
			ret
		.endif
		invoke lstrcat,addr FileName,addr FinalName
		invoke lstrlen,addr FileName
		dec eax
		mov StrLength,eax
		.while FileSize>0
			
			;invoke MessageBox,NULL,addr FileName,addr FileName,MB_OK
			mov eax,FileSize
			.if eax<=CutSize
				mov CutSize,eax
				xor eax,eax
			.else
				sub eax,CutSize
			.endif
			mov FileSize,eax
			invoke CreateFile,addr FileName,GENERIC_READ OR GENERIC_WRITE,FILE_SHARE_READ OR FILE_SHARE_WRITE,NULL,CREATE_ALWAYS, NULL,NULL
			.if eax!=INVALID_HANDLE_VALUE
				mov hFileNew,eax
				invoke CreateFileMapping,hFileNew,NULL,PAGE_READWRITE ,0,CutSize,NULL
				.if eax!=NULL
					mov hFileMapping,eax
					invoke MapViewOfFile,hFileMapping,FILE_MAP_WRITE,0,0,0
					.if EAX!=NULL
						mov pMapView,eax
						invoke ReadFile,hFile,pMapView,CutSize,addr ActualRead,NULL
						invoke UnmapViewOfFile,pMapView
					.else
						INVOKE MessageBox,NULL,addr AppName,addr AppName,MB_OK
					.endif
					invoke CloseHandle,hFileMapping
				.else
					invoke MessageBox,NULL,addr ErrorMapping,addr AppName,MB_OK or MB_ICONWARNING
					ret
				.endif
				invoke CloseHandle,hFileNew
			.else
				invoke MessageBox,NULL,addr ErrorCreate,addr AppName,MB_OK or MB_ICONWARNING
				ret
			.endif
			invoke _CalNextCutName
		.endw
		invoke CloseHandle,hFile
	.else
		invoke MessageBox,NULL,addr ErrorCreate,addr AppName,MB_OK or MB_ICONWARNING
	.endif
.else
	mov ReadSize,0
	invoke lstrlen,lpFilepath
	dec eax
	mov StrLength,eax
	sub eax,2
	invoke lstrcpyn,addr FileName,lpFilepath,eax
 	invoke CreateFile,addr FileName,GENERIC_READ OR GENERIC_WRITE,FILE_SHARE_READ OR FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,NULL
	.if eax!=INVALID_HANDLE_VALUE
		mov hFile,eax
		invoke lstrcpy, addr FileName,lpFilepath
		.while TRUE
			invoke CreateFile,addr FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN,NULL
			mov hFileNew,eax
			.BREAK .IF (eax==INVALID_HANDLE_VALUE )
			invoke GetFileSize,hFileNew,NULL
			add ReadSize,eax
			invoke CloseHandle,hFileNew
			;invoke MessageBox,NULL,addr FileName,addr FileName,MB_OK
			invoke _CalNextCutName
		.endw
		invoke CreateFileMapping,hFile,NULL,PAGE_READWRITE,0,ReadSize,NULL
		.if eax!=NULL
			mov hFileMapping,eax
			invoke MapViewOfFile,hFileMapping,FILE_MAP_WRITE,0,0,0
			.if eax!=NULL
				mov pMapView,eax
				mov ReadSize,eax
				invoke lstrcpy, addr FileName,lpFilepath
				.while TRUE
					invoke CreateFile,addr FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN,NULL
					mov hFileNew,eax
					.BREAK .IF (eax==INVALID_HANDLE_VALUE )
					invoke GetFileSize,hFileNew,NULL
					;add ReadSize,eax
					mov CutSize,eax
					invoke ReadFile,hFileNew,ReadSize,CutSize,addr ActualRead,NULL	
					.if eax==NULL
						invoke MessageBox,NULL,addr AppName,addr FileName,MB_OK
					.else
					.endif
					invoke CloseHandle,hFileNew
					mov eax,CutSize
					add ReadSize,eax
					;invoke MessageBox,NULL,addr FileName,addr FileName,MB_OK
					invoke _CalNextCutName
				.endw
				invoke UnmapViewOfFile,pMapView
			.else
				invoke MessageBox,NULL,addr AppName,addr FileName,MB_OK
			.endif
			invoke CloseHandle,hFileMapping
		.else
			invoke MessageBox,NULL,addr ErrorMapping,addr AppName,MB_OK or MB_ICONWARNING
			ret
			;error mapping file
		.endif
		invoke CloseHandle,hFile
	.else
		invoke MessageBox,NULL,addr ErrorCreate,addr AppName,MB_OK or MB_ICONWARNING
	.endif
.endif
	mov eax,TRUE
        ret
CutFile endp
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -