Fixed a bug in libio (concerned file.find functions in particular)

Also, added a file to ease debugging in the future

git-svn-id: svn://kolibrios.org@2570 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2012-04-05 11:27:23 +00:00
parent 595e7179f6
commit 729f5e776a
3 changed files with 305 additions and 254 deletions

View File

@ -37,13 +37,14 @@
;;================================================================================================;; ;;================================================================================================;;
format MS COFF format MS COFF
public @EXPORT as 'EXPORTS' public @EXPORT as 'EXPORTS'
include '../../../../proc32.inc' include '../../../../proc32.inc'
include '../../../../macros.inc' include '../../../../macros.inc'
purge section;mov,add,sub purge section,mov,add,sub
include 'libio.inc' include 'libio.inc'
include 'libio_p.inc' include 'libio_p.inc'
@ -63,33 +64,33 @@ proc file.find_first _dir, _mask, _attr ;///////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) / matched file data pointer (acts as find descriptor) <FileInfo*> ;; ;< eax = 0 (error) / matched file data pointer (acts as find descriptor) <FileInfo*> ;;
;;================================================================================================;; ;;================================================================================================;;
push ebx edx push ebx edx
invoke mem.alloc, sizeof.FindFileBlock invoke mem.alloc, sizeof.FindFileBlock
or eax, eax or eax, eax
jz .exit.error jz .exit.error
mov edx, eax mov edx, eax
mov ebx, [_attr] mov ebx, [_attr]
mov [edx + FindFileBlock.Options.Attributes], ebx mov [edx + FindFileBlock.Options.Attributes], ebx
mov ebx, [_mask] mov ebx, [_mask]
mov [edx + FindFileBlock.Options.Mask], ebx mov [edx + FindFileBlock.Options.Mask], ebx
lea ebx, [edx + FindFileBlock.InfoBlock] lea ebx, [edx + FindFileBlock.InfoBlock]
mov [ebx + FileInfoBlock.Function], F70_READ_D mov [ebx + FileInfoBlock.Function], F70_READ_D
mov [ebx + FileInfoBlock.Count], 1 mov [ebx + FileInfoBlock.Count], 1
lea eax, [edx + FindFileBlock.Header] lea eax, [edx + FindFileBlock.Header]
mov [ebx + FileInfoBlock.Buffer], eax mov [ebx + FileInfoBlock.Buffer], eax
mov eax, [_dir] mov eax, [_dir]
mov [ebx + FileInfoBlock.FileName], eax mov [ebx + FileInfoBlock.FileName], eax
stdcall libio._.find_matching_file, edx stdcall libio._.find_matching_file, edx
pop edx ebx pop edx ebx
ret ret
.exit.error: .exit.error:
xor eax, eax xor eax, eax
pop edx ebx pop edx ebx
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -101,11 +102,11 @@ proc file.find_next _findd ;////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) / matched file data pointer (acts as find descriptor) <FileInfo*> ;; ;< eax = 0 (error) / matched file data pointer (acts as find descriptor) <FileInfo*> ;;
;;================================================================================================;; ;;================================================================================================;;
mov eax, [_findd] mov eax, [_findd]
add eax, -sizeof.FileInfoHeader add eax, -sizeof.FileInfoHeader
inc [eax + FindFileBlock.InfoBlock.Position] inc [eax + FindFileBlock.InfoBlock.Position]
stdcall libio._.find_matching_file, eax stdcall libio._.find_matching_file, eax
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -117,10 +118,10 @@ proc file.find_close _findd ;///////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = result of memory freeing routine ;; ;< eax = result of memory freeing routine ;;
;;================================================================================================;; ;;================================================================================================;;
mov eax, [_findd] mov eax, [_findd]
add eax, -sizeof.FileInfoHeader add eax, -sizeof.FileInfoHeader
invoke mem.free, eax invoke mem.free, eax
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -138,22 +139,22 @@ locals
loc_info FileInfoBlock loc_info FileInfoBlock
endl endl
lea ebx, [loc_info] lea ebx, [loc_info]
invoke mem.alloc, 40 invoke mem.alloc, 40
push eax push eax
mov [ebx + FileInfoBlock.Function], F70_GETATTR_FD mov [ebx + FileInfoBlock.Function], F70_GETATTR_FD
mov [ebx + FileInfoBlock.Buffer], eax mov [ebx + FileInfoBlock.Buffer], eax
mov byte[ebx + FileInfoBlock.FileName - 1], 0 mov byte[ebx + FileInfoBlock.FileName - 1], 0
mov eax, [_name] mov eax, [_name]
mov [ebx + FileInfoBlock.FileName], eax mov [ebx + FileInfoBlock.FileName], eax
mcall 70 mcall 70
pop ebx pop ebx
push eax push eax
mov eax, ebx mov eax, ebx
mov ebx, [ebx + FileInfo.FileSizeLow] mov ebx, [ebx + FileInfo.FileSizeLow]
invoke mem.free, eax invoke mem.free, eax
pop eax pop eax
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -179,62 +180,62 @@ locals
loc_buf rb 40 loc_buf rb 40
endl endl
push ebx esi edi push ebx esi edi
xor ebx, ebx xor ebx, ebx
invoke mem.alloc, sizeof.InternalFileInfo invoke mem.alloc, sizeof.InternalFileInfo
or eax, eax or eax, eax
jz .exit_error jz .exit_error
mov ebx, eax mov ebx, eax
push [_mode] push [_mode]
pop [ebx + InternalFileInfo.Mode] pop [ebx + InternalFileInfo.Mode]
mov [ebx + InternalFileInfo.Position], 0 mov [ebx + InternalFileInfo.Position], 0
lea edi, [ebx + InternalFileInfo.FileName] lea edi, [ebx + InternalFileInfo.FileName]
mov esi, [_name] mov esi, [_name]
mov ecx, 260 / 4 mov ecx, 260 / 4
cld cld
rep movsd rep movsd
.get_info: .get_info:
push ebx push ebx
mov [loc_info.Function], F70_GETATTR_FD mov [loc_info.Function], F70_GETATTR_FD
lea eax, [loc_buf] lea eax, [loc_buf]
mov [loc_info.Buffer], eax mov [loc_info.Buffer], eax
mov byte[loc_info.FileName - 1], 0 mov byte[loc_info.FileName - 1], 0
mov eax, [_name] mov eax, [_name]
mov [loc_info.FileName], eax mov [loc_info.FileName], eax
lea ebx, [loc_info] lea ebx, [loc_info]
mcall 70 mcall 70
pop ebx pop ebx
or eax, eax or eax, eax
jz @f jz @f
cmp eax, 6 cmp eax, 6
jne .exit_error.ex jne .exit_error.ex
@@: @@:
mov eax, ebx mov eax, ebx
pop edi esi ebx pop edi esi ebx
ret ret
.exit_error.ex: .exit_error.ex:
test [_mode], O_CREATE test [_mode], O_CREATE
jz .exit_error jz .exit_error
push ebx push ebx
mov [loc_info.Function], F70_CREATE_F mov [loc_info.Function], F70_CREATE_F
xor eax, eax xor eax, eax
mov [loc_info.Position], eax mov [loc_info.Position], eax
mov [loc_info.Flags], eax mov [loc_info.Flags], eax
mov [loc_info.Count], eax mov [loc_info.Count], eax
lea ebx, [loc_info] lea ebx, [loc_info]
mcall 70 mcall 70
pop ebx pop ebx
or eax, eax or eax, eax
jz .get_info jz .get_info
.exit_error: .exit_error:
invoke mem.free, ebx invoke mem.free, ebx
xor eax, eax xor eax, eax
pop edi esi ebx pop edi esi ebx
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -254,37 +255,37 @@ locals
loc_info FileInfoBlock loc_info FileInfoBlock
endl endl
push ebx esi edi push ebx esi edi
mov ebx, [_filed] mov ebx, [_filed]
test [ebx + InternalFileInfo.Mode], O_READ test [ebx + InternalFileInfo.Mode], O_READ
jz .exit_error jz .exit_error
xor eax, eax xor eax, eax
mov [loc_info.Function], F70_READ_F mov [loc_info.Function], F70_READ_F
mov [loc_info.Flags], eax mov [loc_info.Flags], eax
mov byte[loc_info.FileName - 1], al mov byte[loc_info.FileName - 1], al
push [ebx+InternalFileInfo.Position] [_buflen] [_buf] push [ebx+InternalFileInfo.Position] [_buflen] [_buf]
pop [loc_info.Buffer] [loc_info.Count] [loc_info.Position] pop [loc_info.Buffer] [loc_info.Count] [loc_info.Position]
lea eax, [ebx + InternalFileInfo.FileName] lea eax, [ebx + InternalFileInfo.FileName]
mov [loc_info.FileName], eax mov [loc_info.FileName], eax
lea ebx, [loc_info] lea ebx, [loc_info]
mcall 70 mcall 70
or eax, eax or eax, eax
jz @f jz @f
cmp eax, 6 cmp eax, 6
jne .exit_error jne .exit_error
@@: @@:
mov eax, ebx mov eax, ebx
mov ebx, [_filed] mov ebx, [_filed]
add [ebx + InternalFileInfo.Position], eax add [ebx + InternalFileInfo.Position], eax
pop edi esi ebx pop edi esi ebx
ret ret
.exit_error: .exit_error:
or eax, -1 or eax, -1
pop edi esi ebx pop edi esi ebx
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -304,41 +305,41 @@ locals
loc_info FileInfoBlock loc_info FileInfoBlock
endl endl
push ebx esi edi push ebx esi edi
mov ebx, [_filed] mov ebx, [_filed]
test [ebx + InternalFileInfo.Mode], O_WRITE test [ebx + InternalFileInfo.Mode], O_WRITE
jz .exit_error jz .exit_error
stdcall file.eof?, [_filed] stdcall file.eof?, [_filed]
or eax, eax or eax, eax
js .exit_error js .exit_error
jz @f jz @f
stdcall file.truncate, [_filed] stdcall file.truncate, [_filed]
@@: @@:
mov [loc_info.Function], F70_WRITE_F mov [loc_info.Function], F70_WRITE_F
xor eax, eax xor eax, eax
mov [loc_info.Flags], eax mov [loc_info.Flags], eax
mov byte[loc_info.FileName - 1], al mov byte[loc_info.FileName - 1], al
push [ebx + InternalFileInfo.Position] [_buflen] [_buf] push [ebx + InternalFileInfo.Position] [_buflen] [_buf]
pop [loc_info.Buffer] [loc_info.Count] [loc_info.Position] pop [loc_info.Buffer] [loc_info.Count] [loc_info.Position]
lea eax, [ebx + InternalFileInfo.FileName] lea eax, [ebx + InternalFileInfo.FileName]
mov [loc_info.FileName], eax mov [loc_info.FileName], eax
lea ebx, [loc_info] lea ebx, [loc_info]
mcall 70 mcall 70
or eax, eax or eax, eax
jnz .exit_error jnz .exit_error
@@: @@:
mov eax, ebx mov eax, ebx
mov ebx, [_filed] mov ebx, [_filed]
add [ebx + InternalFileInfo.Position],eax add [ebx + InternalFileInfo.Position],eax
pop edi esi ebx pop edi esi ebx
ret ret
.exit_error: .exit_error:
or eax, -1 or eax, -1
pop edi esi ebx pop edi esi ebx
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -357,50 +358,50 @@ proc file.seek _filed, _where, _origin ;////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;# call `file.err` to obtain extended error information ;; ;# call `file.err` to obtain extended error information ;;
;;================================================================================================;; ;;================================================================================================;;
push ebx ecx edx push ebx ecx edx
mov ecx, [_filed] mov ecx, [_filed]
lea eax, [ecx + InternalFileInfo.FileName] lea eax, [ecx + InternalFileInfo.FileName]
stdcall file.size, eax stdcall file.size, eax
or eax, eax or eax, eax
jnz .exit_error jnz .exit_error
mov edx, [_where] mov edx, [_where]
cmp [_origin], SEEK_SET cmp [_origin], SEEK_SET
jne .n_set jne .n_set
mov [ecx + InternalFileInfo.Position], edx mov [ecx + InternalFileInfo.Position], edx
jmp .exit_ok jmp .exit_ok
.n_set: .n_set:
cmp [_origin], SEEK_CUR cmp [_origin], SEEK_CUR
jne .n_cur jne .n_cur
add [ecx + InternalFileInfo.Position], edx add [ecx + InternalFileInfo.Position], edx
jmp .exit_ok jmp .exit_ok
.n_cur: .n_cur:
cmp [_origin], SEEK_END cmp [_origin], SEEK_END
jne .exit_error jne .exit_error
neg edx neg edx
add edx, ebx add edx, ebx
mov [ecx + InternalFileInfo.Position], edx mov [ecx + InternalFileInfo.Position], edx
.exit_ok: .exit_ok:
cmp [ecx + InternalFileInfo.Position], 0 cmp [ecx + InternalFileInfo.Position], 0
jge @f jge @f
mov [ecx + InternalFileInfo.Position], 0 mov [ecx + InternalFileInfo.Position], 0
@@: @@:
; cmp ebx, [ecx+InternalFileInfo.Position] ; cmp ebx, [ecx+InternalFileInfo.Position]
; jae @f ; jae @f
; mov [ecx + InternalFileInfo.Position], ebx ; mov [ecx + InternalFileInfo.Position], ebx
; @@: ; @@:
xor eax, eax xor eax, eax
pop edx ecx ebx pop edx ecx ebx
ret ret
.exit_error: .exit_error:
or eax, -1 or eax, -1
pop edx ecx ebx pop edx ecx ebx
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -414,25 +415,25 @@ proc file.eof? _filed ;/////////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;# call `file.err` to obtain extended error information ;; ;# call `file.err` to obtain extended error information ;;
;;================================================================================================;; ;;================================================================================================;;
push ebx ecx push ebx ecx
mov ecx, [_filed] mov ecx, [_filed]
lea eax, [ecx + InternalFileInfo.FileName] lea eax, [ecx + InternalFileInfo.FileName]
stdcall file.size, eax stdcall file.size, eax
or eax, eax or eax, eax
jnz .exit_error jnz .exit_error
xor eax, eax xor eax, eax
cmp [ecx + InternalFileInfo.Position], ebx cmp [ecx + InternalFileInfo.Position], ebx
jb @f jb @f
inc eax inc eax
@@: pop ecx ebx @@: pop ecx ebx
ret ret
.exit_error: .exit_error:
or eax, -1 or eax, -1
pop ecx ebx pop ecx ebx
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -450,36 +451,36 @@ locals
loc_info FileInfoBlock loc_info FileInfoBlock
endl endl
push ebx esi edi push ebx esi edi
mov ebx, [_filed] mov ebx, [_filed]
test [ebx + InternalFileInfo.Mode], O_WRITE test [ebx + InternalFileInfo.Mode], O_WRITE
jz .exit_error jz .exit_error
mov [loc_info.Function], F70_SETSIZE_F mov [loc_info.Function], F70_SETSIZE_F
mov eax, [ebx + InternalFileInfo.Position] mov eax, [ebx + InternalFileInfo.Position]
mov [loc_info.Position], eax mov [loc_info.Position], eax
xor eax, eax xor eax, eax
mov [loc_info.Flags], eax mov [loc_info.Flags], eax
mov [loc_info.Count], eax mov [loc_info.Count], eax
mov [loc_info.Buffer], eax mov [loc_info.Buffer], eax
mov byte[loc_info.FileName - 1], al mov byte[loc_info.FileName - 1], al
lea eax, [ebx + InternalFileInfo.FileName] lea eax, [ebx + InternalFileInfo.FileName]
mov [loc_info.FileName], eax mov [loc_info.FileName], eax
lea ebx, [loc_info] lea ebx, [loc_info]
mcall 70 mcall 70
cmp eax, 2 cmp eax, 2
je .exit_error je .exit_error
cmp eax, 8 cmp eax, 8
je .exit_error je .exit_error
@@: xor eax, eax @@: xor eax, eax
pop edi esi ebx pop edi esi ebx
ret ret
.exit_error: .exit_error:
or eax, -1 or eax, -1
pop edi esi ebx pop edi esi ebx
ret ret
endp endp
file.seteof equ file.truncate file.seteof equ file.truncate
@ -495,9 +496,9 @@ proc file.tell _filed ;/////////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;# call `file.err` to obtain extended error information ;; ;# call `file.err` to obtain extended error information ;;
;;================================================================================================;; ;;================================================================================================;;
mov eax, [_filed] mov eax, [_filed]
mov eax, [eax + InternalFileInfo.Position] mov eax, [eax + InternalFileInfo.Position]
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -511,12 +512,12 @@ proc file.close _filed ;////////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;# call `file.err` to obtain extended error information ;; ;# call `file.err` to obtain extended error information ;;
;;================================================================================================;; ;;================================================================================================;;
mov eax, [_filed] mov eax, [_filed]
mov [eax + InternalFileInfo.Mode], 0 mov [eax + InternalFileInfo.Mode], 0
mov [eax + InternalFileInfo.FileName], 0 mov [eax + InternalFileInfo.FileName], 0
invoke mem.free, eax invoke mem.free, eax
xor eax, eax xor eax, eax
ret ret
endp endp
@ -532,19 +533,20 @@ endp
align 16 align 16
@EXPORT: @EXPORT:
export \ export \
libio._.init , 'lib_init' , \ libio._.init , 'lib_init' , \
0x00040004 , 'version' , \ 0x00040004 , 'version' , \
file.find_first , 'file_find_first' , \ file.find_first , 'file_find_first' , \
file.find_next , 'file_find_next' , \ file.find_next , 'file_find_next' , \
file.find_close , 'file_find_close' , \ file.find_close , 'file_find_close' , \
file.size , 'file_size' , \ file.size , 'file_size' , \
file.open , 'file_open' , \ file.open , 'file_open' , \
file.read , 'file_read' , \ file.read , 'file_read' , \
file.write , 'file_write' , \ file.write , 'file_write' , \
file.seek , 'file_seek' , \ file.seek , 'file_seek' , \
file.tell , 'file_tell' , \ file.tell , 'file_tell' , \
file.eof? , 'file_iseof' , \ file.eof? , 'file_iseof' , \
file.seteof , 'file_seteof' , \ file.seteof , 'file_seteof' , \
file.truncate , 'file_truncate' , \ file.truncate , 'file_truncate' , \
file.close , 'file_close' file.close , 'file_close'

View File

@ -19,11 +19,11 @@
O_BINARY = 00000000b O_BINARY = 00000000b
O_READ = 00000001b O_READ = 00000001b
O_WRITE = 00000010b O_WRITE = 00000010b
O_CREATE = 00000100b O_CREATE = 00000100b
O_SHARE = 00001000b O_SHARE = 00001000b
O_TEXT = 00010000b O_TEXT = 00010000b
SEEK_SET = 0 SEEK_SET = 0
SEEK_CUR = 1 SEEK_CUR = 1
@ -54,7 +54,7 @@ struct FileInfoBlock
Flags dd ? Flags dd ?
Count dd ? Count dd ?
Buffer dd ? Buffer dd ?
db ? db ?
FileName dd ? FileName dd ?
ends ends
@ -62,7 +62,7 @@ struct FileInfoHeader
Version dd ? Version dd ?
FilesRead dd ? FilesRead dd ?
FilesCount dd ? FilesCount dd ?
rd 5 rd 5
ends ends
struct FileInfoA struct FileInfoA
@ -78,7 +78,7 @@ struct FileInfoA
FileSizeHigh dd ? FileSizeHigh dd ?
ends ends
ends ends
FileName rb 252 FileName rb 264
ends ends
struct FileInfoW struct FileInfoW
@ -98,8 +98,8 @@ struct FileInfoW
ends ends
virtual at 0 virtual at 0
FileInfo FileInfoA FileInfo FileInfoA
FileInfo fix FileInfoA FileInfo fix FileInfoA
sizeof.FileInfo fix sizeof.FileInfoA sizeof.FileInfo fix sizeof.FileInfoA
end virtual end virtual
@ -109,4 +109,4 @@ FA_SYSTEM = 00000100b
FA_LABEL = 00001000b FA_LABEL = 00001000b
FA_FOLDER = 00010000b FA_FOLDER = 00010000b
FA_ARCHIVED = 00100000b FA_ARCHIVED = 00100000b
FA_ANY = 00111111b FA_ANY = 00111111b

View File

@ -0,0 +1,49 @@
macro debug_FileInfoHeader ptr {
DEBUGF 1, "FileInfoHeader (0x%x)\n", ptr
DEBUGF 1, "Version: %u\n", [ptr + FileInfoHeader.Version]:4
DEBUGF 1, "FilesRead: %u\n", [ptr + FileInfoHeader.FilesRead]:4
DEBUGF 1, "FilesCount: %u\n\n", [ptr + FileInfoHeader.FilesCount]:4
}
macro debug_FileInfoA ptr {
DEBUGF 1, "FileInfoA (0x%x)\n", ptr
DEBUGF 1, "Attributes: 0x%x\n", [ptr + FileInfoA.Attributes]:8
DEBUGF 1, "Flags: 0x%x\n", [ptr + FileInfoA.Flags]:8
DEBUGF 1, "FileSizeLow: 0x%x\n", [ptr + FileInfoA.FileSize]:8
DEBUGF 1, "FileSizeHigh: 0x%x\n", [ptr + FileInfoA.FileSize+4]:8
push eax
lea eax, [ptr + FileInfoA.FileName]
DEBUGF 1, "FileName: %s\n\n", eax
pop eax
}
macro debug_FileInfoBlock ptr {
DEBUGF 1, "FileInfoBlock (0x%x)\n", ptr
DEBUGF 1, "Function: %u\n", [ptr + FileInfoBlock.Function]:4
DEBUGF 1, "Position: %u\n", [ptr + FileInfoBlock.Position]:4
DEBUGF 1, "Flags: 0x%x\n", [ptr + FileInfoBlock.Flags]:8
DEBUGF 1, "Count: %u\n", [ptr + FileInfoBlock.Count]:4
DEBUGF 1, "Buffer: 0x%x\n", [ptr + FileInfoBlock.Buffer]:8
DEBUGF 1, "FileName: %s\n\n", [ptr + FileInfoBlock.FileName]:8
}
macro debug_FindOptions ptr {
DEBUGF 1, "FindOptions (0x%x)\n", ptr
DEBUGF 1, "Attributes: 0x%x\n", [ptr + FindOptions.Attributes]:8
DEBUGF 1, "Mask: %s\n\n", [ptr + FindOptions.Mask]
}
macro debug_FindFileBlock ptr {
push eax
mov eax, ptr
DEBUGF 1, "FindFileBlock (0x%x)\n\n", eax
debug_FileInfoHeader eax
add eax, sizeof.FileInfoHeader
debug_FileInfoA eax
add eax, sizeof.FileInfoA
debug_FileInfoBlock eax
add eax, sizeof.FileInfoBlock
debug_FindOptions eax
pop eax
}