Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6844 → Rev 6845

/kernel/trunk/blkdev/disk.inc
1393,10 → 1393,16
; 11c. Let the procedure from fs_lfn.inc do the job.
jmp file_system_lfn.maindir_noesi
 
.root:
pop ecx edx
xor eax, eax
cmp byte [ebx], 9
jz .cleanup_ecx
.access_denied:
mov dword [esp+32], ERROR_ACCESS_DENIED
movi eax, ERROR_ACCESS_DENIED
.cleanup_ecx:
mov [esp+32], eax
mov esi, ecx ; disk*dereference assume that esi points to DISK
.cleanup_esi:
test edx, edx ; if there are no media, we didn't reference it
jz @f
call disk_media_dereference
1406,15 → 1412,13
ret
 
.dyndisk_cleanup:
pop esi
pop edx
mov dword [esp+32], ERROR_FILE_NOT_FOUND
jmp .cleanup_esi
pop ecx edx
movi eax, ERROR_FILE_NOT_FOUND
jmp .cleanup_ecx
 
.haspartition:
; 12. The fs operation has specified some partition.
push edx
push ecx
push edx ecx
xor eax, eax
lodsb
sub eax, '0'
1429,6 → 1433,13
jnz .dyndisk_cleanup
dec esi
@@:
cmp byte [esi], 0
jnz @f
cmp byte [ebx], 1
jz @f
cmp byte [ebx], 5
jnz .root
@@:
dec ecx ; convert to zero-based partition index
pop edx ; edx = pointer to DISK, dword [esp] = NULL or edx
; If the driver does not support insert notifications and we are the only fs
1479,9 → 1490,9
call dword [edi+8+ecx*4]
pop ebp
pop edx
mov dword [esp+32], eax
mov dword [esp+20], ebx
.cleanup:
mov dword [esp+32], eax
mov esi, edx
call disk_media_dereference
@@:
1490,14 → 1501,14
ret
 
.unsupported:
mov dword [esp+32], ERROR_UNKNOWN_FS
movi eax, ERROR_UNKNOWN_FS
cmp edi, default_fs_functions
jz .cleanup
mov dword [esp+32], ERROR_UNSUPPORTED_FS
movi eax, ERROR_UNSUPPORTED_FS
jmp .cleanup
 
.notfound2:
mov dword [esp+32], ERROR_FILE_NOT_FOUND
movi eax, ERROR_FILE_NOT_FOUND
jmp .cleanup
 
.nomedia:
/kernel/trunk/fs/ext.inc
1753,9 → 1753,6
ret
 
extfsWritingInit:
movi eax, ERROR_ACCESS_DENIED
cmp byte [esi], 0
jz @f
movi eax, ERROR_UNSUPPORTED_FS
test [ebp+EXTFS.mountType], READ_ONLY
jnz @f
1987,10 → 1984,7
;----------------------------------------------------------------
ext_ReadFile:
call ext_lock
pushd 0 ERROR_ACCESS_DENIED
cmp byte [esi], 0
jz .ret ; root
mov [esp], ebx
pushd 0 ebx
call findInode
pop ebx
push eax
/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
/kernel/trunk/fs/iso9660.inc
160,112 → 160,88
 
;-----------------------------------------------------------------------------
fs_CdRead:
push edi
cmp byte [esi], 0
jnz @f
;--------------------------------------
.noaccess:
pop edi
;--------------------------------------
.noaccess_2:
or ebx, -1
mov eax, ERROR_ACCESS_DENIED
ret
;--------------------------------------
.noaccess_3:
pop eax edx ecx edi
jmp .noaccess_2
;--------------------------------------
@@:
call cd_find_lfn
jnc .found
 
pop edi
cmp [DevErrorCode], 0
jne .noaccess_2
 
or ebx, -1
mov eax, ERROR_FILE_NOT_FOUND
ret
;--------------------------------------
.found:
jc .notFound
mov edi, [cd_current_pointer_of_input]
test byte [edi+25], 10b; do not allow read directories
jnz .noaccess
 
test ebx, ebx
jz .l1
 
cmp dword [ebx+4], 0
jz @f
xor ebx, ebx
movi eax, ERROR_END_OF_FILE
ret
 
.notFound:
cmp [DevErrorCode], 0
jne .noaccess
xor ebx, ebx
;--------------------------------------
.reteof:
mov eax, 6; end of file
pop edi
movi eax, ERROR_FILE_NOT_FOUND
ret
;--------------------------------------
 
.noaccess_3:
pop eax edx ecx
.noaccess:
xor ebx, ebx
movi eax, ERROR_ACCESS_DENIED
ret
 
@@:
mov ebx, [ebx]
;--------------------------------------
.l1:
push ecx edx
push 0
push ecx edx 0
mov eax, [edi+10] ; real size of the file section
sub eax, ebx
jb .eof
 
cmp eax, ecx
jae @f
 
mov ecx, eax
mov byte [esp], 6
;--------------------------------------
pop eax
push ERROR_END_OF_FILE
@@:
mov eax, [edi+2]
mov [CDSectorAddress], eax
;--------------------------------------
; now eax=cluster, ebx=position, ecx=count, edx=buffer for data
.new_sector:
test ecx, ecx
jz .done
 
sub ebx, 2048
jae .next
 
add ebx, 2048
jnz .incomplete_sector
 
cmp ecx, 2048
jb .incomplete_sector
; we may read and memmove complete sector
mov [CDDataBuf_pointer], edx
call ReadCDWRetr ; read sector of file
call ReadCDWRetr
cmp [DevErrorCode], 0
jne .noaccess_3
 
add edx, 2048
sub ecx, 2048
;--------------------------------------
.next:
inc dword [CDSectorAddress]
jmp .new_sector
;--------------------------------------
.incomplete_sector:
; we must read and memmove incomplete sector
 
.eof:
pop eax
push ERROR_END_OF_FILE
.done:
mov ebx, edx
pop eax edx ecx
sub ebx, edx
ret
 
.incomplete_sector: ; we must read and memmove incomplete sector
mov [CDDataBuf_pointer], CDDataBuf
call ReadCDWRetr ; read sector of file
call ReadCDWRetr
cmp [DevErrorCode], 0
jne .noaccess_3
 
push ecx
add ecx, ebx
cmp ecx, 2048
jbe @f
 
mov ecx, 2048
;--------------------------------------
@@:
sub ecx, ebx
push edi esi ecx
279,18 → 255,6
pop ecx
xor ebx, ebx
jmp .next
;--------------------------------------
.done:
mov ebx, edx
pop eax edx ecx edi
sub ebx, edx
ret
;--------------------------------------
.eof:
mov ebx, edx
pop eax edx ecx
sub ebx, edx
jmp .reteof
 
;-----------------------------------------------------------------------------
fs_CdReadFolder:
/kernel/trunk/fs/ntfs.inc
1320,47 → 1320,18
 
;----------------------------------------------------------------
ntfs_ReadFile:
cmp byte [esi], 0
jnz @f
or ebx, -1
movi eax, ERROR_ACCESS_DENIED
ret
 
@@:
call ntfs_lock
call ntfs_find_lfn
jnc .found
call ntfs_unlock
or ebx, -1
movi eax, ERROR_FILE_NOT_FOUND
ret
 
.found:
jc ntfsNotFound
mov [ebp+NTFS.cur_attr], 0x80 ; $DATA
and [ebp+NTFS.cur_offs], 0
and [ebp+NTFS.cur_size], 0
call ntfs_read_attr
jnc @f
call ntfs_unlock
or ebx, -1
movi eax, ERROR_ACCESS_DENIED
ret
 
@@:
pushad
and dword [esp+10h], 0
jc ntfsDenied
xor eax, eax
push eax
cmp dword [ebx+8], 0x200
jb @f
.eof0:
popad
xor ebx, ebx
.eof:
call ntfs_unlock
movi eax, ERROR_END_OF_FILE
ret
 
@@:
jnc .eof
mov ecx, [ebx+12]
mov edx, [ebx+16]
mov eax, [ebx+4]
1379,7 → 1350,7
and eax, 0x1FF
lea esi, [ebp+NTFS.bitmap_buf+eax]
sub eax, [ebp+NTFS.cur_read]
jae .eof0
jae .eof
neg eax
push ecx
cmp ecx, eax
1386,26 → 1357,15
jb @f
mov ecx, eax
@@:
mov [esp+10h+4], ecx
mov [esp+4], ecx
mov edi, edx
rep movsb
mov edx, edi
pop ecx
sub ecx, [esp+10h]
jnz @f
.retok:
popad
call ntfs_unlock
xor eax, eax
ret
 
@@:
sub ecx, [esp]
jz .retok
cmp [ebp+NTFS.cur_read], 0x200
jz .alignedstart
.eof_ebx:
popad
jmp .eof
 
jnz .eof
.alignedstart:
mov eax, [ebx+4]
push edx
1424,11 → 1384,11
call ntfs_read_attr.continue
pop [ebp+NTFS.cur_offs]
mov eax, [ebp+NTFS.cur_read]
add [esp+10h], eax
add [esp], eax
mov eax, ecx
and eax, not 0x1FF
cmp [ebp+NTFS.cur_read], eax
jnz .eof_ebx
jnz .eof
and ecx, 0x1FF
jz .retok
add edx, [ebp+NTFS.cur_read]
1444,19 → 1404,22
push ecx
mov edi, edx
lea esi, [ebp+NTFS.bitmap_buf]
add [esp+10h+4], ecx
add [esp+4], ecx
rep movsb
pop ecx
xor eax, eax
cmp ecx, [ebp+NTFS.cur_read]
jz @f
mov al, ERROR_END_OF_FILE
@@:
mov [esp+1Ch], eax
jnz .eof
.retok:
pushd 0
.ret:
call ntfs_unlock
popad
pop eax ebx
ret
 
.eof:
push ERROR_END_OF_FILE
jmp .ret
 
;----------------------------------------------------------------
ntfs_ReadFolder:
call ntfs_lock
1854,13 → 1817,6
 
ntfs_CreateFile:
mov [ebp+NTFS.bFolder], 0
@@:
cmp byte [esi], 0
jnz @f
xor ebx, ebx
movi eax, ERROR_ACCESS_DENIED
ret
 
@@: ; 1. Search file
call ntfs_lock
call ntfs_find_lfn
3483,12 → 3439,6
 
;----------------------------------------------------------------
ntfs_WriteFile:
cmp byte [esi], 0
jnz @f
xor ebx, ebx
movi eax, ERROR_ACCESS_DENIED
ret
@@:
call ntfs_lock
call ntfs_find_lfn
jc ntfsNotFound
3662,13 → 3612,6
 
;----------------------------------------------------------------
ntfs_Delete:
cmp byte [esi], 0
jnz @f
xor ebx, ebx
movi eax, ERROR_ACCESS_DENIED
ret
 
@@:
call ntfs_lock
call ntfs_find_lfn
jc ntfsNotFound
3981,12 → 3924,6
 
;----------------------------------------------------------------
ntfs_SetFileEnd:
cmp byte [esi], 0
jnz @f
xor ebx, ebx
movi eax, ERROR_ACCESS_DENIED
ret
@@:
call ntfs_lock
call ntfs_find_lfn
jc ntfsNotFound
4116,11 → 4053,6
 
;----------------------------------------------------------------
ntfs_SetFileInfo:
cmp byte [esi], 0
jnz @f
movi eax, ERROR_UNSUPPORTED_FS
ret
@@:
call ntfs_lock
call ntfs_find_lfn
jnc @f