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