本来想发贴吧给更多的人看 但根本发不出来 还是发这里罢 毕竟是自己的地盘。。
程序代码:
;MASMPlus 代码模板 - 以对话框做为主窗口的程序
;*****************************************************************************************************************
;作者:zklhp
;Email:zklhp@
;QQ:493165744
;Last Update:2011.8.6
;版权所有 转载请保持完整
;*****************************************************************************************************************
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
Include shell32.inc
Includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
Includelib shell32.lib
include macro.asm
include rsrc.inc
DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.const
DLG_MAIN equ 100
.data
szAbout db '故弄玄虚众的最爱',0dh,0ah,'Bat转换器 可将任意文件转换为Bat格式并打开',0dh,0ah
db '用法:拖拽想要转换的文件到窗口 按Go就好了',0dh,0ah
db '默认输出到本程序当前目录的output.bat中',0dh,0ah
db '由于受限于debug 被转换的文件不能太大 太大的文件会有失败的提示',0dh,0ah
db 'By zklhp Email:zklhp@',0dh,0ah,'版权所有 转载请保持完整',0
szStart1 db '@echo off & chcp 437>nul&graftabl 936>nul',0dh,0ah
db 'more +2 "%~0"|debug >nul&ren ',0
szStart2 db '&start ',0
szStart3 db '&exit',0dh,0ah,0
szEnd1 db 'r bx',0dh,0ah,0
szEnd2 db 'r cx',0dh,0ah,0
szEnd3 db 'n ',0
szEnd4 db 'w',0dh,0ah,'q',0dh,0ah,0
.data?
hInstance dd ?
szBuf db 264 dup(?)
.CODE
START:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,IDD_DLG1,0,offset DlgProc,0
invoke ExitProcess,0
_ToBat proc uses esi edi ebx _lpPath
local @hSrc:DWORD
local @hDst:DWORD
local @szBuf[8]:BYTE
local @szFileName[32]:BYTE
local @szName[32]:BYTE ;文件名
local @ReadBuf[20]:BYTE
local @WriteBuf[64]:BYTE
local @ReadNum:DWORD
;分离得到原始文件的文件名
mov esi,_lpPath
invoke lstrlen,esi
mov ebx,eax
dec eax
add esi,eax ;结尾
xor edi,edi
;从后往前找第一个\
.while edi < ebx
mov al,BYTE ptr [esi]
.break .if al == '\'
dec esi
inc edi
.endw
inc esi ;指向文件名第一个字符
invoke lstrcpy,addr @szFileName,esi
invoke lstrcpy,addr @szName,addr @szFileName
invoke lstrlen,addr @szName
mov ebx,eax
xor edi,edi
lea esi,@szName
;从后往前找第一个.置为0
.while edi < ebx
mov al,BYTE ptr [esi]
.break .if al == '.'
inc esi
inc edi
.endw
.if al == '.'
xor eax,eax
mov BYTE ptr [esi],al
.endif
invoke lstrcat,addr @szName,CTXT('.bin ') ;在n里面带空格是可以的 省得上面ren要加空格。。
mov ecx,_lpPath
invoke CreateFile,ecx,GENERIC_ALL,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
.if eax != INVALID_HANDLE_VALUE
mov @hSrc,eax
.endif
invoke CreateFile,CTXT('output.bat'),GENERIC_ALL,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
.if eax != INVALID_HANDLE_VALUE
mov @hDst,eax
.endif
;就是构造了这样一个头。。
;@echo off & chcp 437>nul&graftabl 936>nul
;more +2 "%~0"|debug >nul&ren Layer.bin Layer.exe&start Layer.exe&exit
;用的一个技巧是在堆栈中返回实际写入的长度 因为我们不关心这个值
invoke lstrlen,offset szStart1
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,offset szStart1,eax,edx,0
pop ecx
;@echo off & chcp 437>nul&graftabl 936>nul
;more +2 "%~0"|debug >nul&ren
invoke lstrlen,addr @szName
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,addr @szName,eax,edx,0
pop ecx
invoke lstrlen,addr @szFileName
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,addr @szFileName,eax,edx,0
pop ecx
;@echo off & chcp 437>nul&graftabl 936>nul
;more +2 "%~0"|debug >nul&ren Layer.bin Layer.exe
invoke lstrlen,offset szStart2
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,offset szStart2,eax,edx,0
pop ecx
;@echo off & chcp 437>nul&graftabl 936>nul
;more +2 "%~0"|debug >nul&ren Layer.bin Layer.exe&start
invoke lstrlen,addr @szFileName
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,addr @szFileName,eax,edx,0
pop ecx
invoke lstrlen,offset szStart3
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,offset szStart3,eax,edx,0
pop ecx
;到这里开头结束了
;重点在这里
;根据debug要求 要从100H开始 且在一个段内 也就是说 最大长度是0ffffH-100H
mov ebx,0100H
.while TRUE
lea edx,@ReadNum
mov ecx,@hSrc
invoke ReadFile,ecx,addr @ReadBuf,16,edx,0
invoke wsprintf,addr @WriteBuf,CTXT('e %04lx '),ebx
xor esi,esi
lea edi,@ReadBuf
.while esi < 16
xor eax,eax
mov al,BYTE ptr[edi+esi]
invoke wsprintf,addr @szBuf,CTXT('%02lx '),eax
invoke lstrcat,addr @WriteBuf,addr @szBuf
inc esi
.endw
invoke lstrcat,addr @WriteBuf,CTXT(0dh,0ah)
invoke lstrlen,addr @WriteBuf
mov ecx,@hDst
push ecx
mov edx,esp
invoke WriteFile,ecx,addr @WriteBuf,eax,edx,0
pop eax
add ebx,16
.if ebx>0fff0h
invoke MessageBox,0,CTXT('已超过debug允许的最大长度 无法转换诶。。'),CTXT('失败。。。'),0
mov ecx,@hSrc
invoke CloseHandle,ecx
mov ecx,@hDst
invoke CloseHandle,ecx
ret
.endif
mov ecx,@ReadNum
.break .if ecx<16 ;完了
.endw
;获取源文件大小
mov ecx,@hSrc
push ecx
mov edx,esp
invoke GetFileSize,ecx,edx
pop ecx
mov esi,eax ;高16位
mov edi,eax ;低16位
and esi,0FFFF0000H
shr esi,16
and edi,0FFFFH
invoke lstrlen,offset szEnd1
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,offset szEnd1,eax,edx,0
pop ecx
invoke wsprintf,addr @WriteBuf,CTXT('%lx',0dh,0ah),esi
invoke lstrlen,addr @WriteBuf
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,addr @WriteBuf,eax,edx,0
pop ecx
invoke lstrlen,offset szEnd2
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,offset szEnd2,eax,edx,0
pop ecx
invoke wsprintf,addr @WriteBuf,CTXT('%lx',0dh,0ah),edi
invoke lstrlen,addr @WriteBuf
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,addr @WriteBuf,eax,edx,0
pop ecx
invoke lstrlen,offset szEnd3
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,offset szEnd3,eax,edx,0
pop ecx
invoke lstrcat,addr @szName,CTXT(0dh,0ah)
invoke lstrlen,addr @szName
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,addr @szName,eax,edx,0
pop ecx
invoke lstrlen,offset szEnd4
push ecx
mov edx,esp
mov ecx,@hDst
invoke WriteFile,ecx,offset szEnd4,eax,edx,0
pop ecx
mov ecx,@hSrc
invoke CloseHandle,ecx
mov ecx,@hDst
invoke CloseHandle,ecx
ret
_ToBat endp
DlgProc proc hWnd,uMsg,wParam,lParam
.if uMsg==WM_INITDIALOG
invoke DragAcceptFiles,hWnd,TRUE ;支持拖拽
.elseif uMsg==WM_COMMAND
mov eax,wParam
and eax,0ffffh
.if eax==IDC_BTN1
invoke lstrlen,offset szBuf
.if eax != 0
invoke _ToBat,offset szBuf
.endif
.elseif eax==IDC_BTN2
invoke MessageBox,hWnd,offset szAbout,CTXT('About'),0
.endif
.elseif uMsg==WM_DROPFILES
invoke DragQueryFile,wParam,0,offset szBuf,sizeof szBuf
invoke SetDlgItemText,hWnd,IDC_EDT1,offset szBuf
.elseif uMsg==WM_CLOSE
invoke EndDialog,hWnd,wParam
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
END START