多语言展示
当前在线:380今日阅读:113今日分享:31

Windows下masm32汇编语言开发文件分割合并器

Windows平台下使用masm32汇编语言开发文件分割、合并器解决U盘、邮件附件大小限制等等
工具/原料

masm32汇编语言开发环境

方法/步骤
2

【定义相关变量,常量】;*****************************************************************;;** 文件分割合并;** dy2003310;*****************************************************************; .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\comdlg32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\comdlg32.lib DLG_MAIN equ 1000 Text_Size equ 1004 Button_File_Split equ 1001 Button_File_Combine equ 1003.data szFileExtFmt db '%d',0 szFileComName db '合并成的文件',0 szFileFilter db 'All Files(*.*)',0,'*.*',0,0.data? hInstance dd ? hWinMain dd ? nSize2 dd ? nNumber dd ? nSize dd ? hFile dd ? hFileMap dd ? lpMemory dd ? lpMemory2 dd ? hFileNew dd ? nWritten dd ? szFilePath db MAX_PATH  dup  (?) ; 全路径 szDirectory db MAX_PATH  dup  (?) ; 目录部分 szFileExt db MAX_PATH  dup  (?) ; 扩展名 szFileNew db MAX_PATH  dup  (?) ; 文件 szNumber db MAX_PATH  dup  (?) ; 递增的数字 stOF OPENFILENAME .code

3

【编写文件分割线程】;*****************************************************************;;** 分割文件;*****************************************************************;FileDivision proc _lParam ;*********************************; ;** 获取要分割的文件全路径 invoke RtlZeroMemory,  offset szFilePath, MAX_PATH * 5 + sizeof stOF invoke RtlZeroMemory,  offset stOF, sizeof stOF mov stOF.lStructSize,  sizeof stOF push hWinMain pop stOF.hwndOwner mov stOF.lpstrFilter,  offset szFileFilter mov stOF.lpstrFile,  offset szFilePath mov stOF.nMaxFile,  MAX_PATH mov stOF.Flags,  OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST invoke GetOpenFileName,  offset stOF or eax,  eax jnz @f ret@@: ;*********************************; ;**  将要分割的文件作内存映射 invoke CreateFile,  offset szFilePath, GENERIC_ALL, FILE_SHARE_READ, \ NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL mov hFile,  eax invoke CreateFileMapping,  hFile, NULL, PAGE_EXECUTE_READWRITE, 0, 0, NULL mov hFileMap,  eax invoke MapViewOfFile,  hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0 mov lpMemory,  eax mov lpMemory2,  eax ;*********************************; ;** 取全路径中.前面的部分 mov esi,  offset szFilePath mov edi,  offset szDirectory movzx eax,  stOF.nFileExtension ; 扩展名偏移 dec eax      ; 点 mov ecx,  eax rep movsb ;*********************************; ;**     取.及扩展名 mov ebx,  esi mov edi,  offset szFileExt@@: lodsb or al,   al jz @f stosb jmp @b@@: ;*********************************; ;** 计算分割大小(字节) invoke GetDlgItemInt,  hWinMain, Text_Size, offset nSize2, FALSE mov ebx,  1024 mul ebx mov nSize2,  eax ;*********************************; ;** 计算循环次数 invoke GetFileSize,  hFile, NULL mov ebx,  nSize2 xor edx,  edx div ebx or edx,  edx jz @f inc eax mov nSize,  edx ; 最后一部分大小@@: mov ebx,  eax ;*********************************; ;** 分割文件_DivFileLoop: push ebx inc nNumber invoke RtlZeroMemory,  offset szFileNew, sizeof szFileNew invoke wsprintf,  offset szNumber, offset szFileExtFmt, nNumber invoke lstrcat,  offset szFileNew, offset szDirectory invoke lstrcat,  offset szFileNew, offset szNumber invoke lstrcat,  offset szFileNew, offset szFileExt invoke CreateFile,  offset szFileNew, GENERIC_WRITE, FILE_SHARE_WRITE,\ NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL mov hFileNew,  eax cmp ebx,  1 jz LastPart invoke WriteFile,  hFileNew, lpMemory, nSize2, offset nWritten, 0 invoke CloseHandle,  hFileNew mov eax,  lpMemory add eax,  nSize2 mov lpMemory,  eax pop ebx dec ebx jnz _DivFileLoopLastPart: pop ebx invoke WriteFile,  hFileNew, lpMemory, nSize, offset nWritten, 0 invoke CloseHandle,  hFileNew invoke UnmapViewOfFile,  lpMemory2 invoke CloseHandle,  hFileMap invoke CloseHandle,  hFile mov nNumber,  0 retFileDivision endp

4

【编写文件合并线程】;*****************************************************************;;** 合并文件;*****************************************************************;FileCombination proc _lParam ;*********************************; ;** 获取要合并的文件 invoke RtlZeroMemory,  offset szFilePath, MAX_PATH * 5 + sizeof stOF invoke RtlZeroMemory,  offset stOF, sizeof stOF mov stOF.lStructSize,  sizeof stOF push hWinMain pop stOF.hwndOwner mov stOF.lpstrFilter,  offset szFileFilter mov stOF.lpstrFile,  offset szFilePath mov stOF.nMaxFile,  MAX_PATH mov stOF.Flags,  OFN_ALLOWMULTISELECT or OFN_EXPLORER invoke GetOpenFileName,  offset stOF or eax,  eax jnz @f ret@@: ;*********************************; ;** 取目录 mov esi,  offset szFilePath mov edi,  offset szDirectory@@: lodsb or al,   al jz _ExtName stosb jmp @b ;*********************************; ;** 取扩展名_ExtName: mov al,   '\' stosb xor al,   al mov edi,  esi xor ecx,  ecx dec ecx repnz scasb dec edi mov esi,  edi mov edi,  offset szFileExt std xor ecx,  ecx@@: lodsb inc cl cmp al,   '.' jnz @b cld dec cl inc esi rep movsb ;*********************************; ;** 新的文件名 invoke lstrcat,  offset szFileNew, offset szDirectory invoke lstrcat,  offset szFileNew, offset szFileComName invoke lstrcat,  offset szFileNew, offset szFileExt ;*********************************; ;** 创建新文件 invoke CreateFile,  offset szFileNew, GENERIC_WRITE, FILE_SHARE_WRITE,\ NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL mov hFileNew,  eax invoke RtlZeroMemory,  offset szFileNew, sizeof szFileNew ;*********************************; ;** 循环合并 xor ebx,  ebx dec ebx mov esi,  offset szFilePath movzx eax,  stOF.nFileOffset add esi,  eax .while ebx push esi invoke lstrcat,  offset szFileNew, offset szDirectory invoke lstrcat,  offset szFileNew, esi invoke CreateFile,  offset szFileNew, GENERIC_ALL, FILE_SHARE_READ,NULL, \ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL .if eax  ==  INVALID_HANDLE_VALUE jmp _ret .endif mov hFile,  eax invoke CreateFileMapping, hFile, NULL, PAGE_EXECUTE_READWRITE, 0, 0, NULL mov hFileMap,  eax invoke MapViewOfFile,  hFileMap, FILE_MAP_READ, 0, 0, 0 mov lpMemory,  eax invoke GetFileSize,  hFile, NULL mov nSize,  eax ;*********************************; ;** 写入新文件 invoke WriteFile,  hFileNew, lpMemory, nSize, offset nWritten, NULL invoke UnmapViewOfFile,  lpMemory invoke CloseHandle,  hFileMap invoke CloseHandle,  hFile pop esi mov edi,  esi xor eax,  eax mov ecx,  eax dec ecx repnz scasb mov esi,  edi invoke RtlZeroMemory,  offset szFileNew, sizeof szFileNew .endw_ret: pop esi invoke CloseHandle,  hFileNew retFileCombination endp

5

【编写窗口子程序】;*****************************************************************;;** 窗口过程 ;*****************************************************************;                ProcDlgMain proc hWnd, wMsg, wParam, lParam mov eax,  wMsg .if eax  ==  WM_COMMAND mov eax,  wParam .if ax  ==  Button_File_Split invoke CreateThread,  NULL, 0, offset FileDivision, NULL, NULL, NULL invoke CloseHandle,  eax .elseif ax  ==  Button_File_Combine invoke CreateThread,  NULL, 0, offset FileCombination, NULL, NULL, NULL invoke CloseHandle,  eax .endif .elseif eax  ==  WM_CLOSE invoke EndDialog,  hWnd, NULL .elseif eax  ==  WM_INITDIALOG mov eax,  hWnd mov hWinMain,  eax .else mov eax, FALSE ret .endif mov eax, TRUE ret ProcDlgMain endp

6

【编写主程序】;*****************************************************************;;** 程序入口;*****************************************************************;start: invoke GetModuleHandle,  NULL mov hInstance,  eax invoke DialogBoxParam,  eax, DLG_MAIN, NULL, offset ProcDlgMain, NULL invoke ExitProcess,  0end start

7

//****************************************************************////** 作者: dy2003310//****************************************************************// #include <\masm32\include\resource.h> #define DLG_MAIN 1000 #define Button_File_Split 1001 #define Button_File_Combine 1003 #define Text_Size 1004//****************************************************************////** 窗口//****************************************************************// DLG_MAIN DIALOG 100,100,280,100 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION '文件分割合并器:  1M = 1024Kb  1G = 1024M  dy2003310' FONT 9, '宋体'{ LTEXT '分割大小(Kb)', -1, 8,34,55,18 EDITTEXT Text_Size, 60,30,60,18, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP PUSHBUTTON '分割文件', Button_File_Split, 160,10,60,18 PUSHBUTTON '合并文件', Button_File_Combine, 160,50,60,18}

9

编译、链接:ml /c /coff /nologo 分割合并.asmrc 分割合并.rclink /subsystem:windows /nologo 分割合并.obj 分割合并.res

推荐信息