; OPENFILE = 1 ; READFILE = 1 ; WRITEFILE = 1 ; LSEEKFILE = 1 ; CREATEFILE = 1 ; FILESIZE = 1 ; FILECOPY = 1 ; DELETEFILE = 1 ; FINDFILE = 1 .386p code32 segment para public use32 assume cs:code32, ds:code32 include pmode.inc public _filebufloc, _filebuflen public _closefile ;ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ ; DATA ;ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ _filebufloc dd 0 ; location must be in low mem _filebuflen dw 4000h ;ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ ; CODE ;ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ ifdef CREATEFILE public _createfile ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Create file ; In: ; EDX -> ASCIIZ filename ; Out: ; CF=1 - Error creating file ; CF=0 - File created succesfully ; V86R_BX - file handle ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _createfile: push ax push edx add edx,_code32a mov ax,dx shr edx,4 and ax,0fh mov v86r_dx,ax mov v86r_ds,dx mov v86r_ax,3c00h mov v86r_cx,20h mov al,21h int 33h mov ax,v86r_ax mov v86r_bx,ax pop edx pop ax ret endif ifdef OPENFILE public _openfile ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Open file ; In: ; EDX -> ASCIIZ filename ; Out: ; CF=1 - Error opening file ; CF=0 - File opened succesfully ; V86R_BX - file handle ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _openfile: push ax push edx add edx,_code32a mov ax,dx shr edx,4 and ax,0fh mov v86r_dx,ax mov v86r_ds,dx mov v86r_ax,3d02h mov al,21h int 33h mov ax,v86r_ax mov v86r_bx,ax pop edx pop ax ret endif ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Close a file ; In: ; V86R_BX - file handle ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _closefile: push ax mov v86r_ax,3e00h mov al,21h int 33h pop ax ret ifdef DELETEFILE public _deletefile ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Delete a file ; In: ; EDX -> ASCIIZ filename ; Out: ; CF=1 - Error opening file ; CF=0 - File opened succesfully ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _deletefile: push ax push edx add edx,_code32a mov ax,dx shr edx,4 and ax,0fh mov v86r_dx,ax mov v86r_ds,dx mov v86r_ah,41h mov al,21h int 33h pop edx pop ax ret endif ifdef LSEEKFILE public _lseekfile ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Seek position in file ; In: ; V86R_BX - file handle ; EAX - signed offset to move to ; BL - from: 0-beginning of file, 1-current location, 2-end of file ; Out: ; CF=1 - Error seeking in file ; EAX - ? ; CF=0 - Seek fine ; EAX - new offset from beginning of file ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _lseekfile: mov v86r_ah,42h mov v86r_al,bl mov v86r_dx,ax shr eax,16 mov v86r_cx,ax mov al,21h int 33h pushf mov ax,v86r_dx shl eax,16 mov ax,v86r_ax popf ret endif ifdef FILESIZE public _filesize ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Get size of file ; In: ; V86R_BX - file handle ; Out: ; CF=1 - Error checking file ; EAX - ? ; CF=0 - chek fine ; EAX - size of file ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _filesize: mov v86r_ax,4201h xor eax,eax mov v86r_cx,ax mov v86r_dx,ax mov al,21h int 33h push v86r_dx push v86r_ax mov v86r_ax,4202h xor eax,eax mov v86r_cx,ax mov v86r_dx,ax mov al,21h int 33h mov ax,v86r_dx shl eax,16 mov ax,v86r_ax pop v86r_dx pop v86r_cx mov v86r_ax,4200h push eax mov al,21h int 33h pop eax ret endif ifdef READFILE public _readfile ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Read from file ; In: ; V86R_BX - file handle ; EDX -> buffer to read to ; ECX - number of bytes to read ; Out: ; CF=1 - Error reading file ; EAX - ? ; CF=0 - Read went fine ; EAX - number of bytes read ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _readfile: pushad xor ebp,ebp add edx,_code32a lea ebx,[ecx+edx] cmp ebx,100000h ja readlong mov eax,edx shr eax,4 and dx,0fh mov v86r_ds,ax mov v86r_dx,dx readl: mov eax,0fff0h cmp eax,ecx jbe readlf1 mov eax,ecx readlf1: mov v86r_cx,ax mov v86r_ax,3f00h mov al,21h int 33h jc readdone2 movzx ebx,v86r_ax add ebp,ebx sub ecx,ebx jbe readdone or ebx,ebx jz readdone add v86r_ds,0fffh jmp readl readlong: mov edi,edx sub edi,_code32a mov edx,ecx mov eax,_filebufloc add eax,_code32a mov ebx,eax shr eax,4 and bx,0fh mov v86r_ds,ax mov v86r_dx,bx movzx ebx,_filebuflen readlongl: mov eax,ebx cmp eax,edx jbe readlonglf1 mov eax,edx readlonglf1: mov v86r_cx,ax mov v86r_ax,3f00h mov al,21h int 33h jc short readdone2 movzx ecx,v86r_ax add ebp,ecx mov eax,ecx or eax,eax jz readdone mov esi,_filebufloc rep movsb sub edx,eax ja readlongl readdone: clc readdone2: mov [esp+28],ebp popad ret endif ifdef WRITEFILE public _writefile ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Write to file ; In: ; V86R_BX - file handle ; EDX -> buffer to write from ; ECX - number of bytes to write ; Out: ; CF=1 - Error writing file ; EAX - ? ; CF=0 - Write went fine ; EAX - number of bytes read ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _writefile: pushad xor ebp,ebp add edx,_code32a lea ebx,[ecx+edx] cmp ebx,100000h ja writelong mov eax,edx shr edx,4 and ax,0fh mov v86r_ds,dx mov v86r_dx,ax writel: mov eax,0fff0h cmp eax,ecx jbe writelf1 mov eax,ecx writelf1: mov v86r_cx,ax mov v86r_ax,4000h mov al,21h int 33h jc writedone2 movzx ebx,v86r_ax add ebp,ebx sub ecx,ebx jbe writedone add v86r_ds,0fffh jmp writel writelong: mov esi,edx sub esi,_code32a mov edx,ecx mov eax,_filebufloc add eax,_code32a mov ebx,eax shr eax,4 and bx,0fh mov v86r_ds,ax mov v86r_dx,bx movzx ebx,_filebuflen writelongl: mov eax,ebx cmp eax,edx jbe writelonglf1 mov eax,edx writelonglf1: mov ecx,eax mov edi,_filebufloc rep movsb mov v86r_cx,ax mov v86r_ax,4000h mov al,21h int 33h jc writedone2 movzx ecx,v86r_ax add ebp,ecx sub edx,ecx ja writelongl writedone: clc writedone2: mov [esp+28],ebp popad ret endif ifdef FILECOPY public _filecopy ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Copy some bytes from one file to another ; In: ; V86R_SI - source file handle ; V86R_DI - destination file handle ; ECX - number of bytes to copy ; Out: ; CF=1 - Error copying file ; EAX - ? ; CF=0 - copied fine ; EAX - number of bytes copied ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _filecopy: pushad xor ebp,ebp mov edx,_filebufloc add edx,_code32a mov al,dl and ax,0fh shr edx,4 mov v86r_ds,dx mov v86r_dx,ax movzx ebx,_filebuflen copylongl: mov eax,ebx cmp eax,ecx jbe copylonglf1 mov eax,ecx copylonglf1: mov v86r_cx,ax mov v86r_ax,3f00h mov ax,v86r_si mov v86r_bx,ax mov al,21h int 33h jc copydone2 mov ax,v86r_ax or ax,ax jz copydone mov v86r_cx,ax mov v86r_ax,4000h mov ax,v86r_di mov v86r_bx,ax mov al,21h int 33h jc copydone2 movzx edx,v86r_ax add ebp,edx sub ecx,edx ja copylongl copydone: clc copydone2: mov [esp+28],ebp popad ret endif ifdef FINDFILE public _findfile ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ; Do an AH=4E findfirst ; In: ; AL - type of search: 4E-first, 4F-next ; CX - search attributes ; EDX -> 13 byte buffer for filename found ; EDI -> search mask ; Out: ; CF=1 - file not found ; [EDX] - ? ; CF=0 - file found ; [EDX] - filename ;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° _findfile: push eax push esi push edi add edi,_code32a mov esi,edi and esi,0fh shr edi,4 mov v86r_ds,di mov v86r_dx,si mov v86r_ah,al mov v86r_cx,cx mov esi,_code16a sub esi,62h mov edi,edx mov al,21h int 33h mov ax,gs mov ds,ax movsd movsd movsd movsb mov ax,es mov ds,ax pop edi pop esi pop eax ret endif code32 ends end