fat: get volume info

git-svn-id: svn://kolibrios.org@6868 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
pathoswithin 2017-02-28 12:33:45 +00:00
parent 2e874adffb
commit a66ba0a1e0

View File

@ -78,6 +78,7 @@ fat_in_cache dd ?
; there is how work was done before my edits, and I'm just keeping the principle.
fat_cache_ptr dd ?
fat12_unpacked_ptr dd ?
volumeLabel rb 12
buffer rb 512
fsinfo_buffer rb 512
ends
@ -199,12 +200,16 @@ fat_create_partition:
dec eax ; cluster count
jz .free_return0
mov [ebp+FAT.fatStartScan], 2
; limits by Microsoft Hardware White Paper v1.03
cmp eax, 0xff5
jb .fat12
cmp eax, 0xfff5
jb .fat16
.fat32:
pusha
lea esi, [ebx+71]
lea edi, [ebp+FAT.volumeLabel]
movsd
movsd
movsd
popa
mov eax, [ebx+0x2c] ; rootdir cluster
mov [ebp+FAT.ROOT_CLUSTER], eax
movzx eax, word [ebx+0x30]
@ -238,6 +243,15 @@ fat_create_partition:
ret
.fat16:
pusha
lea esi, [ebx+43]
lea edi, [ebp+FAT.volumeLabel]
movsd
movsd
movsd
popa
cmp eax, 0xff5
jb .fat12
and [ebp+FAT.ROOT_CLUSTER], 0
mov [ebp+FAT.fatRESERVED], 0x0000FFF6
mov [ebp+FAT.fatBAD], 0x0000FFF7
@ -912,23 +926,23 @@ fat_unlock:
jmp mutex_unlock
fat_get_name:
; in: edi -> FAT entry
; out: ebp -> UTF-16 name, CF=1 -> no valid entry
; in: edi -> FAT entry, esi -> buffer for UTF-16 name
; out: CF=1 -> no valid entry
cmp byte [edi], 0
jz .no
cmp byte [edi], 0xE5
jz .no
cmp byte [edi+11], 0xF
jz .longname
test byte [edi+11], 8
jnz .no
push ecx esi edi
mov esi, edi
mov edi, ebp
mov ecx, 8
push edi
xchg esi, edi
test byte [esi+11], 8
jnz .label
pushd ecx 8
pop ecx
xor eax, eax
@@:
lodsb
call ansi2uni_char
stosw
loop @b
mov cl, 8
@ -943,7 +957,6 @@ fat_get_name:
mov cl, 3
@@:
lodsb
call ansi2uni_char
stosw
loop @b
mov cl, 3
@ -955,9 +968,15 @@ fat_get_name:
sub edi, 2
@@:
and word [edi], 0 ; CF=0
pop edi esi ecx
pop ecx edi
ret
.label:
lea edi, [ebp+FAT.volumeLabel]
movsd
movsd
movsd
pop edi
.no:
stc
ret
@ -968,50 +987,73 @@ fat_get_name:
dec eax
cmp al, 20
jae .no ; ignore invalid entries
mov word [ebp+260*2], 0 ; force null-terminating for orphans
mov word [esi+260*2], 0 ; force null-terminating for orphans
imul eax, 13*2
test byte [edi], 0x40
jz @f
mov word [ebp+eax+13*2], 0
mov word [esi+eax+13*2], 0
@@: ; copy name (13 chars in UTF-16)
push esi edi
lea esi, [edi+1]
lea edi, [ebp+eax]
push edi
inc edi
add esi, eax
xchg esi, edi
movsd
movsd
movsd
inc esi
sub edi, 2
movsw
add esi, 3
movsd
movsd
movsd
add esi, 2
movsd
pop edi esi
pop edi
test eax, eax
jnz .no ; if this is not first entry, more processing required
ret
fat_compare_name:
; in: esi -> name in UTF-8, ebp -> name in UTF-16
fat_find_lfn:
; in:
; esi -> path in UTF-8
; parameters in the stack
; out:
; ZF=1 -> names match, esi -> next component of name
; ZF=0 -> esi is not changed
push ebp esi
; esi -> next name in the path
; edi -> direntry
; CF=1 -> file not found, eax = error code
lea eax, [esp+12]
call dword [eax-4]
jc .reterr
sub esp, 262*2 ; reserve place for LFN
.l1:
push esi
lea esi, [esp+4]
call fat_get_name
pop esi
jc .no
push edi esi
lea edi, [esp+8]
@@:
call utf8to16
call utf16toUpper
mov edx, eax
mov ax, [ebp]
mov ax, [edi]
call utf16toUpper
cmp ax, dx
jnz .done
add ebp, 2
add edi, 2
test ax, ax
jnz @b
dec esi
pop eax ebp
xor eax, eax ; set ZF
pop eax edi
.found:
add esp, 262*2
; if this is LFN entry, advance to true entry
cmp byte [edi+11], 0xF
jnz @f
lea eax, [esp+12]
call dword[eax-8]
jc .reterr
@@:
xor eax, eax
ret
.done:
@ -1021,53 +1063,15 @@ fat_compare_name:
jnz @f
mov [esp], esi
@@:
pop esi ebp
ret
fat_find_lfn:
; in: esi -> name in UTF-8
; [esp+4] = next
; [esp+8] = first
; [esp+C]... - possibly parameters for first and next
; out: CF=1 - file not found, eax=error code
; else CF=0, esi->next name component, edi->direntry
pusha
lea eax, [esp+0Ch+20h]
call dword [eax-4]
jc .reterr
sub esp, 262*2 ; reserve place for LFN
.l1:
lea ebp, [esp]
call fat_get_name
jc .l2
call fat_compare_name
pop esi edi
jz .found
.l2:
mov ebp, [esp+8+262*2]
lea eax, [esp+0Ch+20h+262*2]
.no:
lea eax, [esp+262*2+12]
call dword[eax-8]
jnc .l1
add esp, 262*2
.reterr:
mov [esp+28], eax
stc
popa
ret
.found:
add esp, 262*2
mov ebp, [esp+8]
; if this is LFN entry, advance to true entry
cmp byte [edi+11], 0xF
jnz @f
lea eax, [esp+0Ch+20h]
call dword [eax-8]
jc .reterr
@@:
add esp, 8 ; CF=0
push esi
push edi
popa
ret
fat_time_to_bdfe:
@ -1475,7 +1479,6 @@ fat_ReadFolder:
mov eax, [edi+20-2]
mov ax, [edi+26] ; eax=cluster
.doit:
push esi
sub esp, 262*2 ; reserve space for LFN
push dword [ebx+8] ; cp866/UNICODE name
mov edx, [ebx+16] ; pointer to buffer
@ -1519,10 +1522,10 @@ fat_ReadFolder:
add ebx, 512
push eax
.l1:
push ebp
lea ebp, [esp+20]
push esi
lea esi, [esp+20]
call fat_get_name
pop ebp
pop esi
jc .l2
cmp byte [edi+11], 0xF
jnz .do_bdfe
@ -1600,12 +1603,12 @@ fat_ReadFolder:
.notfound2:
add esp, 8
.notfound:
add esp, 262*2+8
add esp, 262*2+4
push ERROR_DEVICE
jmp @f
.done:
add esp, 262*2+16
add esp, 262*2+12
pushd 0
dec ecx
js @f
@ -1961,11 +1964,9 @@ fat_CreateFile:
@@:
cmp eax, [ebp+FAT.fatRESERVED]
jae .done1
push edx
xor edx, edx
call set_FAT
mov eax, edx
pop edx
jc .done1
inc ecx
jmp @b
@ -2218,10 +2219,8 @@ fat_CreateFile:
lea eax, [esp+16+8]
call dword [eax+16] ; flush directory
pop eax
push edx
mov edx, [ebp+FAT.fatEND]
call set_FAT
pop edx
.write_cluster:
push eax
dec eax
@ -2306,13 +2305,11 @@ fat_CreateFile:
mov ecx, eax
call get_free_FAT
jc .diskfull
push edx
mov edx, [ebp+FAT.fatEND]
call set_FAT
xchg eax, ecx
mov edx, ecx
call set_FAT
pop edx
xchg eax, ecx
jmp .write_cluster
@ -2909,10 +2906,7 @@ fat_SetFileEnd:
;----------------------------------------------------------------
fat_GetFileInfo:
cmp byte [esi], 0
jnz @f
mov eax, 2
ret
@@:
jz .volume
call fat_lock
call hd_find_lfn
jc @f
@ -2929,6 +2923,40 @@ fat_GetFileInfo:
pop eax
ret
.volume:
mov eax, dword[ebp+FAT.Length]
mov edx, dword[ebp+FAT.Length+4]
mov edi, [ebx+16]
shld edx, eax, 9
shl eax, 9
mov [edi+36], edx
mov [edi+32], eax
mov eax, [ebx+8]
mov byte [edi], 8
mov [edi+4], eax
lea esi, [ebp+FAT.volumeLabel]
mov ecx, 11
@@:
mov byte [esi+ecx], 0
dec ecx
jz @f
cmp byte [esi+ecx], ' '
jz @b
@@:
mov cl, 12
add edi, 40
cmp eax, 2
jz @f
rep movsb
xor eax, eax
ret
@@:
lodsb
stosw
loop @b
ret
;----------------------------------------------------------------
fat_SetFileInfo:
call fat_lock