;************************************************************************************* ; MODULE: CFILE.ASM DATE: APRIL 27,1997 ; AUTHOR: SEAN M. KESSLER ; TARGET: 32 BIT LAT MODEL ; FUNCTION : BUFFERED FILE FUNCTIONS ;************************************************************************************* .386 .MODEL FLAT INCLUDE devioctl.inc INCLUDE string.inc INCLUDE openfile.inc .DATA crlf DB 0Dh,0Ah,00h .CODE _FileOpen proc near ; int FileOpen(char *pathFileName,FileInfo *pFileInfo,int access,int share,int open,int attributes) push ebp ; save stack frame mov ebp,esp ; create new frame xor eax,eax ; clear eax register cmp byte ptr[ebp+08h],0000h ; is pathFileName NULL je @@FileOpenEnd ; if it is then we've got an error push esi ; save source index CREATEFILE [ebp+08h],[ebp+10h],[ebp+14h],[ebp+18h],[ebp+1Ch] ; call create file mov esi,[ebp+0Ch] ; move FileInfo ptr to esi mov [FileInfo ptr [esi]].FileInfo@@mhFileHandle,eax ; store handle pop esi ; restore source index @@FileOpenEnd: pop ebp ; restore previous frame retn ; return near to caller _FileOpen endp _FileClose proc near ; int CloseFile(FileInfo *pFileInfo); push ebp ; save prior frame mov ebp,esp ; create new stack frame push esi ; save source index register mov esi,[ebp+08h] ; move FileInfo * into esi cmp [FileInfo ptr [esi]].FileInfo@@mhFileHandle,INVALID_HANDLE ; check for valid handle je @@FileCloseEnd ; handle is not valid CLOSEHANDLE [FileInfo ptr[esi]].FileInfo@@mhFileHandle ; close handle mov [FileInfo ptr[esi]].FileInfo@@mhFileHandle,INVALID_HANDLE ; set handle to invalid state @@FileCloseEnd: ; end sync address pop esi ; restore source index pop ebp ; restore prior stack frame retn ; return near to caller _FileClose endp _FileSize proc near ; DWORD GetFileSize(FileInfo *pFileInfo) push ebp ; save previous stack frame mov ebp,esp ; create new frame push esi ; save source index register mov esi,[ebp+08h] ; move (FileInfo *) into source index register cmp [FileInfo ptr [esi]].FileInfo@@mhFileHandle,INVALID_HANDLE ; check for valid handle je @@FileSizeError ; handle is not valid GETFILESIZE [FileInfo ptr [esi]].FileInfo@@mhFileHandle ; get size of file jmp @@FileSizeEnd ; jump to exit code @@FileSizeError: ; handle error(s) xor eax,eax ; by clearing eax register @@FileSizeEnd: ; FileSizeEnd sync address pop esi ; restore source index register pop ebp ; restore previous stack frame retn ; return near to caller _FileSize endp ; end procedure _FileRead proc near ; FileRead(FileInfo *pFileInfo,BYTE *ptrByte); push ebp ; save stack frame mov ebp,esp ; create new stack frame push esi ; save source index register push edi ; save destination index register mov esi,[ebp+08h] ; move pFileInfo to esi register mov edi,[ebp+0Ch] ; move ptrByte to destination index register FREAD esi,edi ; perform read from disk, or cache pop edi ; restore destination index register pop esi ; restore source index register pop ebp ; restore stack frame retn ; return near to caller _FileRead endp _FileReadLength proc near ; FileRead(FileInfo *pFileInfo,BYTE *ptrByte,int length); push ebp ; save stack frame mov ebp,esp ; create new stack frame push esi ; save source index register push edi ; save destination index register push ebx ; save ebx register mov esi,[ebp+08h] ; move pFileInfo to esi register mov edi,[ebp+0Ch] ; move ptrByte to destination index register mov ebx,[ebp+10h] ; move length into ebx register cmp [FileInfo ptr [esi]].FileInfo@@mhFileHandle,INVALID_HANDLE ; check for valid handle je @@FileReadLengthError @@FileReadLengthContinue: ; continue sync address FREAD esi,edi ; perform read from disk, or cache inc edi ; increment pointer index dec ebx ; decrement counter cmp ebx,0000h ; is counter zero jne @@FileReadLengthContinue ; if not then keep going jmp @@FileReadLengthEnd ; otherwise we're done @@FileReadLengthError: ; error sync address xor eax,eax ; clear eax register on error @@FileReadLengthEnd: ; end sync address pop ebx ; restore ebx register pop edi ; restore destination index register pop esi ; restore source index register pop ebp ; restore stack frame retn ; return near to caller _FileReadLength endp _FileWriteLength proc near ; int FileWriteLength(FileInfo *pFileInfo,char *ptrByte,int length) push ebp ; save previous stack frame mov ebp,esp ; create new frame push esi ; save source index register push edi ; save destination index register push ebx ; save ebx register (counter) mov ebx,[ebp+10h] ; move length into ebx register mov esi,[ebp+08h] ; move (pFileInfo*) to edi register mov edi,[ebp+0Ch] ; move ptrByte to source index register cmp [FileInfo ptr [esi]].FileInfo@@mhFileHandle,INVALID_HANDLE ; check for valid handle je @@FileWriteLengthEnd @@FileWriteLengthContinue: ; continue sync address FWRITE esi,edi ; perform write inc edi ; decrement source index dec ebx ; decrement counter cmp ebx,0000h ; is counter zero jne @@FileWriteLengthContinue ; if not then keep going jmp @@FileWriteLengthEnd ; otherwise we're done @@FileWriteLengthError: ; error sync address xor eax,eax ; clear eax register on error @@FileWriteLengthEnd: ; end sync address pop ebx ; restore ecx register pop edi ; restore destination index register pop esi ; restore source index register pop ebp ; restore previous stack frame retn ; return near to caller _FileWriteLength endp _FileWrite proc near ; int FileWrite(FileInfo *pFileInfo,char *ptrByte) push ebp ; save previous stack frame mov ebp,esp ; create new stack frame push esi ; save source index register push edi ; save destination index register mov esi,[ebp+08h] ; move (pFileInfo*) to source index register mov edi,[ebp+0Ch] ; move ptrByte to destination index register FWRITE esi,edi ; perform write pop edi ; restore destination index register pop esi ; restore source index register pop ebp ; restore previous stack frame retn ; return near to caller _FileWrite endp _FileSeek proc near ; int FileSeek(FileInfo *pFileInfo,int offset,int whence) push ebp ; save stack frame mov ebp,esp ; create new frame push esi ; save source index register push ebx ; save ebx register mov esi,[ebp+08h] ; move pFileInfo into source index register mov eax,[ebp+0Ch] ; move offset into eax register mov ebx,[ebp+10h] ; move whence into ebx register FSEEK esi,eax,ebx ; perform the seek pop ebx ; restore ebx register pop esi ; restore source index register pop ebp ; restore previous frame retn ; return near to caller _FileSeek endp _FileReadLine proc near ; int FileReadLine(FileInfo *pFileInfo,char *strLine) push ebp ; save stack frame mov ebp,esp ; create new frame push esi ; save source index register push edi ; save destination index register mov esi,[ebp+08h] ; move (pFileInfo *) to source index register mov edi,[ebp+0Ch] ; move strLine to destination index register FREADLINE esi,edi ; perform getLine pop edi ; restore destination index register pop esi ; restore source index register pop ebp ; restore previous stack frame retn ; return near to caller _FileReadLine endp _FileWriteLine proc near ; int FileWrite(FileInfo *pFileInfo,char *strLine,int length); push ebp ; save previous stack frame mov ebp,esp ; create new frame push esi ; save source index register push edi ; save destination index register mov esi,[ebp+08h] ; move pFileInfo to source index register mov edi,[ebp+0Ch] ; move strLine to destination index register FWRITELINE esi,edi ; write string to file lea edi,crlf ; get crlf address to edi register FWRITELINE esi,edi ; write string to file pop edi ; restore destination index register pop esi ; restore source index register pop ebp ; restore previous stack frame retn ; return near to caller _FileWriteLine endp _FileFlush proc near push ebp ; save previous stack frame mov ebp,esp ; create new frame push esi ; save source index register mov esi,[ebp+08h] ; move pFileInfo to source index register FFLUSH esi ; flush cache pop esi ; restore source index register pop ebp ; restore previous stack frame retn ; return near to caller _FileFlush endp public _FileOpen public _FileClose public _FileRead public _FileReadLength public _FileWrite public _FileWriteLength public _FileReadLine public _FileWriteLine public _FileFlush public _FileSize public _FileSeek END