📄 encodetodb.asm
字号:
; ----------------------------------------
;
; (C) Alex Demchenko (coban2k@mail.ru)
; http://www.cobans.net
;
; ----------------------------------------
; #########################################################################
.386
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
include kernel32.inc
include windows.inc
include shlwapi.inc
includelib kernel32.lib
includelib user32.lib
includelib shlwapi.lib
; #########################################################################
.data
szOpenError db "Could not open file for reading: %s",0
szWriteError db "Could not open file for writing: %s",0
szTrimC db '" ', 0
szExt db ".inc",0
szFmt db "db %03Xh",13,10,0
szHeader db ".data",13,10,13,10,"%sLen equ %lu",13,10,"%s ",0
szOutFmt db "Encoding %lu bytes...",0
.data?
lpArgs dd ?
lpStr db 1024 dup(?)
lpBuf db 1024 dup(?)
lpFun db 1024 dup(?)
.code
Write proc uses ebx lpszText: DWORD
LOCAL dwWritten: DWORD
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov ebx, eax
invoke lstrlen, lpszText
mov edx, eax
invoke WriteFile, ebx, lpszText, edx, addr dwWritten, NULL
ret
Write endp
WriteLn proc lpszText: DWORD
LOCAL ln: DWORD
invoke Write, lpszText
mov ln, 0D0Ah
invoke Write, addr ln
ret
WriteLn endp
; Returns ptr to the argument str, else returns NULL
GetArgStr proc uses esi edi ebx
LOCAL IsQuoted: DWORD
mov IsQuoted, FALSE
mov esi, lpArgs
xor ebx, ebx
mov edi, offset lpStr
@ltrim:
cmp byte ptr[esi], 0
jz @quit
.IF byte ptr[esi] == ' '
inc esi
jmp @ltrim
.ELSEIF byte ptr[esi] == '"'
mov IsQuoted, TRUE
inc esi
.ENDIF
@lcpy:
lodsb
stosb
test al, al
jz @ok
.IF IsQuoted
cmp al, '"'
.ELSE
cmp al, ' '
.ENDIF
jz @ok
jmp @lcpy
@ok:
xor eax, eax
stosb
mov ebx, offset lpStr
@quit:
.IF ebx != 0
mov eax, offset szTrimC
.IF !IsQuoted
inc eax
.ENDIF
invoke StrTrim, ebx, eax
.ENDIF
mov lpArgs, esi
mov eax, ebx
ret
GetArgStr endp
FunStuff proc lpFile, dwSize: DWORD
invoke StrRChr, lpFile, NULL, '\'
.IF eax
mov edx, eax
inc edx
.ELSE
mov edx, lpFile
.ENDIF
push edx
invoke wsprintf, offset lpBuf, offset szOutFmt, dwSize
invoke WriteLn, offset lpBuf
pop edx
invoke wsprintf, offset lpBuf, offset szHeader, edx, dwSize, edx
ret
FunStuff endp
ProcessFile proc uses esi ebx lpFile: DWORD
LOCAL hFile, hFile2, bRead, bWritten: DWORD
invoke CreateFile, lpFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0
mov hFile, eax
inc eax
.IF ZERO?
invoke wsprintf, offset lpBuf, offset szOpenError, lpFile
invoke WriteLn, offset lpBuf
ret
.ENDIF
invoke StrRChr, lpFile, NULL, '.'
.IF eax
mov byte ptr[eax], 0
push eax
invoke lstrcpy, offset lpFun, lpFile
pop eax
push dword ptr[szExt]
pop [eax]
mov byte ptr[eax+4], 0
.ELSE
invoke lstrcpy, offset lpFun, lpFile
invoke lstrcat, lpFile, offset szExt
.ENDIF
invoke CreateFile, lpFile, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0
mov hFile2, eax
inc eax
.IF ZERO?
invoke wsprintf, offset lpBuf, offset szWriteError, lpFile
invoke WriteLn, offset lpBuf
jmp @close_r
.ENDIF
; Write header
invoke GetFileSize, hFile, NULL
test eax, eax
jle @close_w
invoke FunStuff, offset lpFun, eax
invoke lstrlen, offset lpBuf
mov edx, eax
invoke WriteFile, hFile2, offset lpBuf, edx, addr bWritten, NULL
; Write db bytes
@work:
invoke ReadFile, hFile, lpFile, 1024, addr bRead, NULL
cmp bRead, 0
jz @close_w
mov ebx, bRead
mov esi, lpFile
@wloop:
invoke wsprintf, offset lpBuf, offset szFmt, byte ptr[esi]
invoke lstrlen, offset lpBuf
mov edx, eax
invoke WriteFile, hFile2, offset lpBuf, edx, addr bWritten, NULL
inc esi
dec ebx
jnz @wloop
jmp @work
@close_w:
invoke CloseHandle, hFile2
@close_r:
invoke CloseHandle, hFile
ret
ProcessFile endp
start:
mov byte ptr[lpStr], 0
invoke GetCommandLine
mov lpArgs, eax
call GetArgStr
call GetArgStr
.IF eax
invoke ProcessFile, eax
.ENDIF
invoke ExitProcess, 0
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -