Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6844 → Rev 6845

/kernel/trunk/fs/fat.inc
1525,34 → 1525,12
fat_Read:
call fat_lock
push edi
cmp byte [esi], 0
jnz @f
.noaccess:
pop edi
call fat_unlock
or ebx, -1
mov eax, ERROR_ACCESS_DENIED
ret
@@:
call hd_find_lfn
jnc .found
pop edi
push eax
call fat_unlock
pop eax
or ebx, -1
ret
.found:
jc .notFound
test byte [edi+11], 0x10 ; do not allow read directories
jnz .noaccess
cmp dword [ebx+8], 0
jz @f
xor ebx, ebx
call fat_unlock
mov eax, ERROR_END_OF_FILE
pop edi
ret
@@:
jnz .endOfFile
mov edx, [ebx+4] ; file offset
mov ecx, [ebx+12] ; size
mov ebx, [ebx+16] ; buffer
1583,6 → 1561,23
call get_FAT
jc .noaccess2
jmp @b
 
.notFound:
push eax
jmp .ret
 
.noaccess:
push ERROR_ACCESS_DENIED
jmp .ret
 
.endOfFile:
push ERROR_END_OF_FILE
.ret:
call fat_unlock
pop eax edi
xor ebx, ebx
ret
 
@@:
mov esi, eax
dec eax
1674,6 → 1669,7
xor edx, edx
jecxz .done
jmp .alignedCluster
 
.readEnd:
add ecx, edi
mov edi, ecx
1688,6 → 1684,7
push eax
mov ecx, eax
jmp .readFragment
 
.noaccess3:
pop eax
.noaccess2:
1697,12 → 1694,15
pop eax edx edi
sub ebx, edx
ret
 
.fileEnd:
mov byte [esp], ERROR_END_OF_FILE
jmp .done
 
.noaccess4:
mov byte [esp], ERROR_DEVICE
jmp @f
 
.fileEnd2:
mov byte [esp], ERROR_END_OF_FILE
@@:
2101,12 → 2101,6
pop ecx
ret
 
fshrad:
call fat_unlock
mov eax, ERROR_ACCESS_DENIED
xor ebx, ebx
ret
 
;----------------------------------------------------------------
fat_CreateFolder:
push 1
2117,8 → 2111,6
@@:
call fat_lock
pop eax
cmp byte [esi], 0
jz fshrad
mov ecx, [ebx+12]
mov edx, [ebx+16]
pushad
2661,33 → 2653,12
 
;----------------------------------------------------------------
fat_Write:
cmp byte [esi], 0
jz .access_denied
call fat_lock
push edi
call hd_find_lfn
jnc .found
pop edi
push eax
call fat_unlock
.ret0:
pop eax
xor ebx, ebx
ret
 
.access_denied:
push ERROR_ACCESS_DENIED
jmp .ret0
 
.found: ; FAT does not support files larger than 4GB
jc .error
cmp dword [ebx+8], 0
jz @f
.eof:
pop edi
push ERROR_END_OF_FILE
call fat_unlock
jmp .ret0
@@:
jnz .eof ; FAT does not support files larger than 4GB
mov ecx, [ebx+12]
mov edx, [ebx+16]
mov ebx, [ebx+4]
2715,16 → 2686,7
; hd_extend_file can return three error codes: FAT table error, device error or disk full.
; First two cases are fatal errors, in third case we may write some data
cmp al, ERROR_DISK_FULL
jz .disk_full
call fat_unlock
pop eax
pop eax
pop ecx
pop edx
pop edi
xor ebx, ebx
ret
.disk_full:
jnz @f
; correct number of bytes to write
mov ecx, [edi+28]
cmp ecx, ebx
2739,13 → 2701,29
jz @f
mov byte [esp+4], ERROR_DEVICE
@@:
pop eax eax ecx edx
.error:
push eax
@@:
call fat_unlock
pop eax
pop eax
pop eax edi
xor ebx, ebx
ret
 
.eof:
push ERROR_END_OF_FILE
jmp @b
 
.device_err2:
pop ecx
pop edx
pop edi
ret
.device_err:
mov byte [esp+8], ERROR_DEVICE
jmp .ret
 
.fat_err:
mov byte [esp+8], ERROR_FS_FAIL
jmp .ret
 
.length_ok:
mov esi, [edi+28]
mov eax, [edi+20-2]
2759,15 → 2737,7
call fs_write32_sys
pop ebx
test eax, eax
jz @f
.device_err:
mov byte [esp+8], ERROR_DEVICE
jmp .ret
.fat_err:
mov byte [esp+8], ERROR_FS_FAIL
jmp .ret
@@:
 
jnz .device_err
; now ebx=start pos, ecx=end pos, both lie inside file
sub ecx, ebx
jz .ret
2811,11 → 2781,7
call fs_read32_app
test eax, eax
pop ebx eax
jz @f
.device_err2:
pop ecx
jmp .device_err
@@:
jnz .device_err2
.noread:
; zero uninitialized data if file was extended (because hd_extend_file does not this)
push eax ecx edi
2996,31 → 2962,14
fat_SetFileEnd:
call fat_lock
push edi
cmp byte [esi], 0
jnz @f
.access_denied:
push ERROR_ACCESS_DENIED
.ret:
call fat_unlock
pop eax
pop edi
ret
@@:
call hd_find_lfn
jnc @f
.reteax:
push eax
jmp .ret
@@:
jc .reteax
; must not be directory
test byte [edi+11], 10h
jnz .access_denied
; file size must not exceed 4 Gb
cmp dword [ebx+8], 0
jz @f
push ERROR_END_OF_FILE
jmp .ret
@@:
jnz .endOfFile
push eax ; save directory sector
; set file modification date/time to current
call fat_update_datetime
3032,12 → 2981,22
lea ebx, [ebp+FAT.buffer]
call fs_write32_sys
test eax, eax
jz @f
jnz .errorDevice
push 0
jmp .ret
 
.access_denied:
push ERROR_ACCESS_DENIED
jmp .ret
 
.endOfFile:
push ERROR_END_OF_FILE
jmp .ret
 
.errorDevice:
push ERROR_DEVICE
jmp .ret
@@:
push 0
jmp .ret
 
.expand:
push ebx ebp ecx
push dword [edi+28] ; save old size
3046,14 → 3005,8
push eax ; return code
jnc .expand_ok
cmp al, ERROR_DISK_FULL
jz .disk_full
.pop_ret:
call update_disk
pop eax ecx ecx ebp ebx ecx
jmp .reteax
.expand_ok:
.disk_full:
; save directory
jnz .pop_ret
.expand_ok: ; save directory
mov eax, [edi+28]
xchg eax, [esp+20]
lea ebx, [ebp+FAT.buffer]
3062,11 → 3015,7
mov eax, [edi+20-2]
mov ax, [edi+26]
mov edi, eax
jz @f
.pop_ret11:
mov byte [esp], ERROR_DEVICE
jmp .pop_ret
@@:
jnz .pop_ret11
test edi, edi
jz .pop_ret
; now zero new data
3123,7 → 3072,29
mov edi, eax
jnc .zero_loop
pop eax
jmp .pop_ret11
.pop_ret11:
mov byte [esp], ERROR_DEVICE
.pop_ret:
call update_disk
pop eax ecx ecx ebp ebx ecx
.reteax:
push eax
.ret:
call fat_unlock
pop eax edi
ret
 
.error_fat:
pop eax
mov byte [esp], ERROR_FS_FAIL
jmp .pop_ret
 
.error_fat2:
pop eax ecx eax
call update_disk
push ERROR_FS_FAIL
jmp .ret
 
.truncate:
mov [edi+28], eax
push ecx
3132,8 → 3103,7
push eax
test eax, eax
jz .zero_size
; find new last cluster
@@:
@@: ; find new last cluster
cmp ecx, 2
jb .error_fat2
cmp ecx, [ebp+FAT.fatRESERVED]
3147,11 → 3117,11
mov ecx, eax
jnc @b
.device_err3:
pop eax ecx eax edi
pop eax ecx eax
call update_disk
call fat_unlock
movi eax, ERROR_DEVICE
ret
push ERROR_DEVICE
jmp .ret
 
@@:
; we will zero data at the end of last sector - remember it
push ecx
3166,6 → 3136,7
.device_err4:
pop ecx
jmp .device_err3
 
.zero_size:
and word [edi+20], 0
and word [edi+26], 0
3215,16 → 3186,6
call fat_unlock
xor eax, eax
ret
.error_fat:
pop eax
mov byte [esp], ERROR_FS_FAIL
jmp .pop_ret
.error_fat2:
pop eax ecx eax edi
call update_disk
call fat_unlock
movi eax, ERROR_FS_FAIL
ret
 
;----------------------------------------------------------------
fat_GetFileInfo:
3256,11 → 3217,6
 
;----------------------------------------------------------------
fat_SetFileInfo:
cmp byte [esi], 0
jnz @f
mov eax, 2
ret
@@:
push edi
call fat_lock
call hd_find_lfn
3286,26 → 3242,11
;----------------------------------------------------------------
fat_Delete:
call fat_lock
cmp byte [esi], 0
jnz @f
; cannot delete root!
.access_denied:
push ERROR_ACCESS_DENIED
.pop_ret:
call fat_unlock
pop eax
xor ebx, ebx
ret
@@:
and [ebp+FAT.longname_sec1], 0
and [ebp+FAT.longname_sec2], 0
push edi
call hd_find_lfn
jnc .found
pop edi
push ERROR_FILE_NOT_FOUND
jmp .pop_ret
.found:
jc .notFound
cmp dword [edi], '. '
jz .access_denied2
cmp dword [edi], '.. '
3359,23 → 3300,27
.err1:
popad
.err2:
pop edi
push ERROR_DEVICE
.ret:
call fat_unlock
movi eax, ERROR_DEVICE
pop eax edi
ret
 
.notFound:
push ERROR_FILE_NOT_FOUND
jmp .ret
 
.error_fat:
popad
pop edi
call fat_unlock
movi eax, ERROR_FS_FAIL
ret
push ERROR_FS_FAIL
jmp .ret
 
.notempty:
popad
.access_denied2:
pop edi
call fat_unlock
movi eax, ERROR_ACCESS_DENIED
ret
push ERROR_ACCESS_DENIED
jmp .ret
 
.empty:
popad
push eax ebx