kolibrios/kernel/trunk/fs/fs_lfn.inc
Evgeny Grechnikov (Diamond) 7c7f68ee6f File system: read files with long names (LFN)
git-svn-id: svn://kolibrios.org@71 a494cfbc-eb01-0410-851d-a64ba20cac60
2006-04-24 14:28:05 +00:00

207 lines
3.7 KiB
PHP

; System function 58, subfunctions 1xx
; diamond, 2006
iglobal
; in this table names must be in lowercase
rootdirs:
db 2,'rd'
dd fs_OnRamdisk
db 7,'ramdisk'
dd fs_OnRamdisk
db 2,'fd'
dd fs_OnFloppy
db 10,'floppydisk'
dd fs_OnFloppy
db 3,'hd0'
dd fs_OnHd0
db 3,'hd1'
dd fs_OnHd1
db 3,'hd2'
dd fs_OnHd2
db 3,'hd3'
dd fs_OnHd3
db 0
endg
file_system_lfn:
; in: eax->fileinfo block
; operation codes:
; 0x100 : read file
; 0x101 : rewrite file - not implemented yet
; 0x102 : delete file - not implemented yet
; 0x103 : write/append to file - not implemented yet
; 0x104 : create directory - not implemented yet
; 0x105 : rename file/directory - not implemented yet
; 0x106 : get file attributes structure - not implemented yet
; 0x107 : start application - not implemented yet
; 0x108 : find file with mask - not implemented yet
; parse file name
xchg ebx, eax
lea esi, [ebx+20]
lodsb
cmp al, '/'
jz @f
.notfound:
mov dword [esp+36], 5 ; file not found
ret
@@:
cmp byte [esi], 0
jz .rootdir
mov edi, rootdirs-4
xor ecx, ecx
push esi
.scan1:
pop esi
add edi, ecx
scasd
mov cl, byte [edi]
jecxz .notfound
inc edi
push esi
@@:
lodsb
or al, 20h
scasb
loopz @b
jnz .scan1
pop eax
lodsb
cmp al, '/'
jz .found1
test al, al
jnz .scan1
; directory /xxx
.maindir:
; directory /
.rootdir:
mov dword [esp+36], 10 ; access denied
ret
.found1:
cmp byte [esi], 0
jz .maindir
mov ebp, dword [edi] ; handler for this device
; read partition number
xor ecx, ecx
xor eax, eax
@@:
lodsb
cmp al, '/'
jz .done1
test al, al
jz .done1
sub al, '0'
cmp al, 9
ja .notfound
imul ecx, 10
add ecx, eax
jmp @b
.done1:
test ecx, ecx
jz .notfound
test al, al
jnz @f
dec esi
@@:
; now ebp contains handler address, ecx - partition number, esi points to ASCIIZ string - rest of name
jmp ebp
; handlers for devices
; in: ecx = partition number
; esi -> relative (for device) name
; ebx -> fileinfo
; out: [esp+36]=image of eax, [esp+24]=image of ebx
fs_OnRamdisk:
cmp ecx, 1
jnz file_system_lfn.notfound
movzx eax, byte [ebx]
test eax, eax
jnz .not_impl
mov ecx, [ebx+12]
mov edx, [ebx+16]
add edx, std_application_base_address
add ebx, 4
call dword [fs_RamdiskServices + eax*4]
mov [esp+36], eax
mov [esp+24], ebx
ret
.not_impl:
mov dword [esp+36], 2 ; not implemented
ret
fs_RamdiskServices:
dd fs_RamdiskRead
fs_OnFloppy:
cmp ecx, 2
ja file_system_lfn.notfound
movzx eax, byte [ebx]
test eax, eax
jnz fs_OnRamdisk.not_impl
call reserve_flp
mov [flp_number], cl
mov ecx, [ebx+12]
mov edx, [ebx+16]
add edx, std_application_base_address
add ebx, 4
call dword [fs_FloppyServices + eax*4]
and [flp_status], 0
mov [esp+36], eax
mov [esp+24], ebx
ret
fs_FloppyServices:
dd fs_FloppyRead
fs_OnHd0:
call reserve_hd1
mov [hdbase], 0x1F0
mov [hdid], 0
push 1
jmp fs_OnHd
fs_OnHd1:
call reserve_hd1
mov [hdbase], 0x1F0
mov [hdid], 0x10
push 2
jmp fs_OnHd
fs_OnHd2:
call reserve_hd1
mov [hdbase], 0x170
mov [hdid], 0
push 3
jmp fs_OnHd
fs_OnHd3:
call reserve_hd1
mov [hdbase], 0x170
mov [hdid], 0x10
push 4
fs_OnHd:
pop eax
mov [hdpos], eax
cmp ecx, [0x40001+eax]
jbe @f
and [hd1_status], 0
mov dword [esp+36], 5 ; not found
ret
@@:
mov [fat32part], ecx
push ebx esi
call choice_necessity_partition_1
pop esi ebx
mov ecx, [ebx+12]
mov edx, [ebx+16]
add edx, std_application_base_address
movzx eax, byte [ebx]
add ebx, 4
call dword [fs_HdServices + eax*4]
and [hd1_status], 0
mov [esp+36], eax
mov [esp+24], ebx
ret
fs_HdServices:
dd fs_HdRead