Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 520 → Rev 521

/kernel/trunk/fs/fs_lfn.inc
6,8 → 6,8
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
image_of_eax EQU esp+44 ;36
image_of_ebx EQU esp+32 ;24
image_of_eax EQU esp+36
image_of_ebx EQU esp+24
 
; System function 70 - files with long names (LFN)
; diamond, 2006
82,12 → 82,6
dd 0
endg
 
end_of_file_system_lfn:
pop edx
stdcall kernel_free, edx
ret
 
 
file_system_lfn:
; in: eax->fileinfo block
; operation codes:
102,84 → 96,39
; 8 : delete file
; 9 : create directory
 
; çàìåíà àäðåñà âîçâðàòà
push eax
stdcall kernel_alloc, 200
mov edx,eax
pop eax
 
push edx
push end_of_file_system_lfn
mov ebx,edx
 
mov ecx, [eax]
mov [ebx],ecx
 
add ebx,4
mov ecx, [eax+4]
mov [ebx],ecx
 
add ebx,4
mov ecx, [eax+8]
mov [ebx],ecx
 
add ebx,4
mov ecx, [eax+12]
mov [ebx],ecx
 
add ebx,4
mov ecx, [eax+16]
mov [ebx],ecx
 
add ebx,4
push edx ; !!!!!!!!!!!!!!!!!!!
; eax - yíà÷àëî ñòàðîãî ïàêåòà
; edx - íà÷àëî íîâîãî ïàêåòà
; ebx - êóäà ëîæèòü ñòðîêó
add eax,20
mov cl, [eax]
test cl,cl
jnz @f
mov eax,[eax+1]
@@:
stdcall full_file_name,eax,ebx
pop eax
 
 
 
; add eax, std_application_base_address
; parse file name
xchg ebx, eax
lea esi, [ebx+20]
mov ebp, esi ; for 'start app' function full path must be known
lodsb
test al, al
jnz @f
mov esi, [esi]
; add esi, std_application_base_address
mov ebp, esi
lodsb
@@:
cmp al, '/'
jz .notcurdir
dec esi
mov ebp, esi
test al, al
jnz @f
xor ebp, ebp
@@:
mov esi, [current_slot]
mov esi, [esi+APPDATA.cur_dir]
jmp .parse_normal
.notcurdir:
cmp byte [esi], 0
jz .rootdir
call process_replace_file_name
.parse_normal:
cmp dword [ebx], 7
jne @F
mov edx, [ebx+4]
mov ebx, [ebx+8]
test ebx, ebx
jz .l1
; add ebx, new_app_base
.l1:
call fs_execute ; ebp, ebx, edx
call fs_execute ; esi+ebp, ebx, edx
mov [image_of_eax], eax
ret
@@:
cmp al, '/'
jz @f
.notfound:
mov dword [image_of_eax], 5 ; file not found
ret
@@:
cmp byte [esi], 0
jz .rootdir
mov edi, rootdirs-8
xor ecx, ecx
push esi
189,7 → 138,8
scasd
scasd
mov cl, byte [edi]
jecxz .notfound
test cl, cl
jz .notfound
inc edi
push esi
@@:
356,6 → 306,10
mov [image_of_eax], eax
mov [image_of_ebx], ebx
ret
.notfound:
mov dword [image_of_eax], ERROR_FILE_NOT_FOUND
and dword [image_of_ebx], 0
ret
 
.found1:
pop eax
373,16 → 327,22
sub al, '0'
cmp al, 9
ja .notfound
imul ecx, 10
add ecx, eax
lea ecx, [ecx*5]
lea ecx, [ecx*2+eax]
jmp @b
.done1:
test ecx, ecx
jz .notfound
jecxz .notfound
test al, al
jnz @f
dec esi
@@:
cmp byte [esi], 0
jnz @f
test ebp, ebp
jz @f
mov esi, ebp
xor ebp, ebp
@@:
; now [edi] contains handler address, ecx - partition number,
; esi points to ASCIIZ string - rest of name
jmp dword [edi]
392,6 → 352,7
; in: ecx = partition number
; esi -> relative (for device) name
; ebx -> fileinfo
; ebp = 0 or pointer to rest of name from folder addressed by esi
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
 
fs_OnRamdisk:
424,7 → 385,7
dd fs_RamdiskSetFileEnd
dd fs_RamdiskGetFileInfo
dd fs_RamdiskSetFileInfo
dd 0 ;fs_RamdiskExecute
dd 0
dd fs_RamdiskDelete
dd fs_RamdiskCreateFolder
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
455,7 → 416,7
dd fs_FloppySetFileEnd
dd fs_FloppyGetFileInfo
dd fs_FloppySetFileInfo
dd 0 ;fs_FloppyExecute
dd 0
dd fs_FloppyDelete
dd fs_FloppyCreateFolder
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
528,7 → 489,7
dd fs_HdSetFileEnd
dd fs_HdGetFileInfo
dd fs_HdSetFileInfo
dd 0 ;fs_HdExecute
dd 0
dd fs_HdDelete
dd fs_HdCreateFolder
fs_NumHdServices = ($ - fs_HdServices)/4
604,7 → 565,7
dd fs_NotImplemented
dd fs_CdGetFileInfo
dd fs_NotImplemented
dd fs_CdExecute
dd 0
fs_NumCdServices = ($ - fs_CdServices)/4
 
;*******************************************************
738,3 → 699,156
ret
;*******************************************************
 
process_replace_file_name:
mov ebp, [full_file_name_table]
mov edi, [full_file_name_table.size]
dec edi
shl edi, 7
add edi, ebp
.loop:
cmp edi, ebp
jb .notfound
push esi edi
@@:
cmp byte [edi], 0
jz .dest_done
lodsb
test al, al
jz .cont
or al, 20h
scasb
jz @b
jmp .cont
.dest_done:
cmp byte [esi], 0
jz .found
cmp byte [esi], '/'
jnz .cont
inc esi
jmp .found
.cont:
pop edi esi
sub edi, 128
jmp .loop
.found:
pop edi eax
mov ebp, esi
cmp byte [esi], 0
lea esi, [edi+64]
jnz .ret
.notfound:
xor ebp, ebp
.ret:
ret
 
sys_current_directory:
mov esi, [current_slot]
mov esi, [esi+APPDATA.cur_dir]
mov edx, esi
dec eax
jz .set
dec eax
jz .get
ret
.get:
; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len
; for our code: ebx->buffer,ecx=len
@@:
lodsb
test al, al
jnz @b
sub esi, edx
inc esi
mov [esp+36], esi
cmp ecx, esi
jbe @f
mov ecx, esi
@@:
cmp ecx, 1
jbe .ret
mov esi, edx
mov edi, ebx
mov al, '/'
stosb
dec ecx
dec ecx
rep movsb
mov byte [edi], 0
.ret:
ret
.set:
; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string
; for our code: ebx->string to set
@@:
inc esi
cmp byte [esi-1], 0
jnz @b
dec esi
cmp byte [ebx], '/'
jz .set_absolute
; string gives relative path
.relative:
cmp byte [ebx], 0
jz .set_ok
cmp word [ebx], '.'
jz .set_ok
cmp word [ebx], './'
jnz @f
add ebx, 2
jmp .relative
@@:
cmp word [ebx], '..'
jnz .doset_relative
cmp byte [ebx+2], 0
jz @f
cmp byte [ebx+2], '/'
jnz .doset_relative
@@:
dec esi
cmp byte [esi], '/'
jnz @b
mov byte [esi], 0
add ebx, 3
jmp .relative
.doset_relative:
add edx, 0x1000
mov byte [esi], '/'
inc esi
cmp esi, edx
jae .overflow_esi
@@:
mov al, [ebx]
inc ebx
mov [esi], al
inc esi
test al, al
jz .set_ok
cmp esi, edx
jb @b
.overflow_esi:
mov byte [esi-1], 0 ; force null-terminated string
.set_ok:
ret
.set_absolute:
lea esi, [ebx+1]
call process_replace_file_name
mov edi, edx
add edx, 0x1000
.set_copy:
lodsb
stosb
test al, al
jz .set_part2
.set_copy_cont:
cmp edi, edx
jb .set_copy
.overflow_edi:
mov byte [edi-1], 0
ret
.set_part2:
mov esi, ebp
xor ebp, ebp
test esi, esi
jz .set_ok
mov byte [edi-1], '/'
jmp .set_copy_cont