NTFS reader, part 3: get file info & read normal files
taskman.inc: now invalid command line and/or path fields in program header will not crash the kernel git-svn-id: svn://kolibrios.org@262 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
853d0ada7d
commit
3fd82557ce
@ -998,15 +998,25 @@ proc set_app_params stdcall,slot:dword, params:dword,\
|
|||||||
mov edx,[edx] ;app_cmdline
|
mov edx,[edx] ;app_cmdline
|
||||||
test edx,edx
|
test edx,edx
|
||||||
jz @F ;application don't need parameters
|
jz @F ;application don't need parameters
|
||||||
|
mov eax, edx
|
||||||
|
add eax, 256
|
||||||
|
jc @f
|
||||||
|
cmp eax, [PROC_BASE+APPDATA.mem_size+ebx*8]
|
||||||
|
ja @f
|
||||||
add edx, new_app_base
|
add edx, new_app_base
|
||||||
stdcall k_strncpy, edx, [cmd_line], 255
|
stdcall k_strncpy, edx, [cmd_line], 256
|
||||||
@@:
|
@@:
|
||||||
mov edx,[params]
|
mov edx,[params]
|
||||||
mov edx, [edx+4] ;app_path
|
mov edx, [edx+4] ;app_path
|
||||||
test edx,edx
|
test edx,edx
|
||||||
jz @F ;application don't need path of file
|
jz @F ;application don't need path of file
|
||||||
|
mov eax, edx
|
||||||
|
add eax, 1024
|
||||||
|
jc @f
|
||||||
|
cmp eax, [PROC_BASE+APPDATA.mem_size+ebx*8]
|
||||||
|
ja @f
|
||||||
add edx, new_app_base
|
add edx, new_app_base
|
||||||
stdcall k_strncpy, edx, [app_path], 64
|
stdcall k_strncpy, edx, [app_path], 1024
|
||||||
@@:
|
@@:
|
||||||
mov ebx,[slot]
|
mov ebx,[slot]
|
||||||
mov eax,ebx
|
mov eax,ebx
|
||||||
|
@ -293,6 +293,7 @@ ntfs_attr_iBaseRecord dd ?
|
|||||||
ntfs_attr_offs dd ?
|
ntfs_attr_offs dd ?
|
||||||
ntfs_attr_list dd ?
|
ntfs_attr_list dd ?
|
||||||
ntfs_attr_size dq ?
|
ntfs_attr_size dq ?
|
||||||
|
ntfs_cur_tail dd ?
|
||||||
endg
|
endg
|
||||||
|
|
||||||
ntfs_read_attr:
|
ntfs_read_attr:
|
||||||
@ -434,6 +435,9 @@ ntfs_read_attr:
|
|||||||
.scancont:
|
.scancont:
|
||||||
add eax, [eax+4]
|
add eax, [eax+4]
|
||||||
jmp .scanattr
|
jmp .scanattr
|
||||||
|
.continue:
|
||||||
|
pushad
|
||||||
|
and [ntfs_cur_read], 0
|
||||||
.scandone:
|
.scandone:
|
||||||
; c) Check for required offset and length
|
; c) Check for required offset and length
|
||||||
mov ecx, [ntfs_attr_offs]
|
mov ecx, [ntfs_attr_offs]
|
||||||
@ -666,9 +670,13 @@ ntfs_read_attr:
|
|||||||
ret
|
ret
|
||||||
@@:
|
@@:
|
||||||
; reduce read length
|
; reduce read length
|
||||||
|
and [ntfs_cur_tail], 0
|
||||||
cmp [ntfs_cur_size], eax
|
cmp [ntfs_cur_size], eax
|
||||||
jb @f
|
jb @f
|
||||||
mov [ntfs_cur_size], eax
|
mov [ntfs_cur_size], eax
|
||||||
|
mov eax, dword [ntfs_attr_size]
|
||||||
|
and eax, 0x1FF
|
||||||
|
mov [ntfs_cur_tail], eax
|
||||||
@@:
|
@@:
|
||||||
cmp [ntfs_cur_size], 0
|
cmp [ntfs_cur_size], 0
|
||||||
jz .okret
|
jz .okret
|
||||||
@ -719,6 +727,11 @@ ntfs_read_attr:
|
|||||||
cmp [ntfs_cur_size], 0
|
cmp [ntfs_cur_size], 0
|
||||||
jnz .readloop
|
jnz .readloop
|
||||||
add esp, 10h
|
add esp, 10h
|
||||||
|
mov eax, [ntfs_cur_tail]
|
||||||
|
test eax, eax
|
||||||
|
jz .okret
|
||||||
|
sub eax, 0x200
|
||||||
|
add [ntfs_cur_read], eax
|
||||||
jmp .okret
|
jmp .okret
|
||||||
.errread2:
|
.errread2:
|
||||||
pop ecx
|
pop ecx
|
||||||
@ -864,7 +877,7 @@ ntfs_decode_mcb_entry:
|
|||||||
ntfs_find_lfn:
|
ntfs_find_lfn:
|
||||||
; in: esi->name
|
; in: esi->name
|
||||||
; out: CF=1 - file not found
|
; out: CF=1 - file not found
|
||||||
; else CF=0 and eax=ntfs_cur_iRecord valid
|
; else CF=0, [ntfs_cur_iRecord] valid, eax->record in parent directory
|
||||||
mov [ntfs_cur_iRecord], 5 ; start parse from root cluster
|
mov [ntfs_cur_iRecord], 5 ; start parse from root cluster
|
||||||
.doit2:
|
.doit2:
|
||||||
mov [ntfs_cur_attr], 0x90 ; $INDEX_ROOT
|
mov [ntfs_cur_attr], 0x90 ; $INDEX_ROOT
|
||||||
@ -1008,7 +1021,7 @@ ntfs_find_lfn:
|
|||||||
pop esi
|
pop esi
|
||||||
mov eax, [esi]
|
mov eax, [esi]
|
||||||
mov [ntfs_cur_iRecord], eax
|
mov [ntfs_cur_iRecord], eax
|
||||||
mov [esp+1Ch], eax
|
mov [esp+1Ch], esi
|
||||||
mov [esp+4], edi
|
mov [esp+4], edi
|
||||||
popad
|
popad
|
||||||
inc esi
|
inc esi
|
||||||
@ -1031,8 +1044,132 @@ ntfs_find_lfn:
|
|||||||
;
|
;
|
||||||
;--------------------------------------------------------------
|
;--------------------------------------------------------------
|
||||||
ntfs_HdRead:
|
ntfs_HdRead:
|
||||||
|
cmp byte [esi], 0
|
||||||
|
jnz @f
|
||||||
or ebx, -1
|
or ebx, -1
|
||||||
mov eax, ERROR_UNSUPPORTED_FS
|
push ERROR_ACCESS_DENIED
|
||||||
|
pop eax
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
call ntfs_find_lfn
|
||||||
|
jnc .found
|
||||||
|
or ebx, -1
|
||||||
|
push ERROR_FILE_NOT_FOUND
|
||||||
|
pop eax
|
||||||
|
ret
|
||||||
|
.found:
|
||||||
|
mov [ntfs_cur_attr], 0x80 ; $DATA
|
||||||
|
and [ntfs_cur_offs], 0
|
||||||
|
and [ntfs_cur_size], 0
|
||||||
|
call ntfs_read_attr
|
||||||
|
jnc @f
|
||||||
|
or ebx, -1
|
||||||
|
push ERROR_ACCESS_DENIED
|
||||||
|
pop eax
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
pushad
|
||||||
|
and dword [esp+10h], 0
|
||||||
|
xor eax, eax
|
||||||
|
test ebx, ebx
|
||||||
|
jz .zero1
|
||||||
|
cmp dword [ebx+4], 0x200
|
||||||
|
jb @f
|
||||||
|
.eof0:
|
||||||
|
popad
|
||||||
|
xor ebx, ebx
|
||||||
|
.eof:
|
||||||
|
push ERROR_END_OF_FILE
|
||||||
|
pop eax
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
mov eax, [ebx]
|
||||||
|
test eax, 0x1FF
|
||||||
|
jz .alignedstart
|
||||||
|
push edx
|
||||||
|
mov edx, [ebx+4]
|
||||||
|
shrd eax, edx, 9
|
||||||
|
pop edx
|
||||||
|
mov [ntfs_cur_offs], eax
|
||||||
|
mov [ntfs_cur_size], 1
|
||||||
|
mov [ntfs_cur_buf], ntfs_bitmap_buf
|
||||||
|
call ntfs_read_attr.continue
|
||||||
|
mov eax, [ebx]
|
||||||
|
and eax, 0x1FF
|
||||||
|
lea esi, [ntfs_bitmap_buf+eax]
|
||||||
|
sub eax, [ntfs_cur_read]
|
||||||
|
jae .eof0
|
||||||
|
neg eax
|
||||||
|
push ecx
|
||||||
|
cmp ecx, eax
|
||||||
|
jb @f
|
||||||
|
mov ecx, eax
|
||||||
|
@@:
|
||||||
|
mov [esp+10h+4], ecx
|
||||||
|
mov edi, edx
|
||||||
|
rep movsb
|
||||||
|
mov edx, edi
|
||||||
|
pop ecx
|
||||||
|
sub ecx, [esp+10h]
|
||||||
|
jnz @f
|
||||||
|
.retok:
|
||||||
|
popad
|
||||||
|
xor eax, eax
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
cmp [ntfs_cur_read], 0x200
|
||||||
|
jz .alignedstart
|
||||||
|
.eof_ebx:
|
||||||
|
popad
|
||||||
|
jmp .eof
|
||||||
|
.alignedstart:
|
||||||
|
mov eax, [ebx]
|
||||||
|
push edx
|
||||||
|
mov edx, [ebx+4]
|
||||||
|
add eax, 511
|
||||||
|
adc edx, 0
|
||||||
|
shrd eax, edx, 9
|
||||||
|
pop edx
|
||||||
|
.zero1:
|
||||||
|
mov [ntfs_cur_offs], eax
|
||||||
|
mov [ntfs_cur_buf], edx
|
||||||
|
mov eax, ecx
|
||||||
|
shr eax, 9
|
||||||
|
mov [ntfs_cur_size], eax
|
||||||
|
add eax, [ntfs_cur_offs]
|
||||||
|
push eax
|
||||||
|
call ntfs_read_attr.continue
|
||||||
|
pop [ntfs_cur_offs]
|
||||||
|
mov eax, [ntfs_cur_read]
|
||||||
|
add [esp+10h], eax
|
||||||
|
mov eax, ecx
|
||||||
|
and eax, not 0x1FF
|
||||||
|
cmp [ntfs_cur_read], eax
|
||||||
|
jnz .eof_ebx
|
||||||
|
and ecx, 0x1FF
|
||||||
|
jz .retok
|
||||||
|
add edx, [ntfs_cur_read]
|
||||||
|
mov [ntfs_cur_size], 1
|
||||||
|
mov [ntfs_cur_buf], ntfs_bitmap_buf
|
||||||
|
call ntfs_read_attr.continue
|
||||||
|
cmp [ntfs_cur_read], ecx
|
||||||
|
jb @f
|
||||||
|
mov [ntfs_cur_read], ecx
|
||||||
|
@@:
|
||||||
|
xchg ecx, [ntfs_cur_read]
|
||||||
|
push ecx
|
||||||
|
mov edi, edx
|
||||||
|
mov esi, ntfs_bitmap_buf
|
||||||
|
add [esp+10h+4], ecx
|
||||||
|
rep movsb
|
||||||
|
pop ecx
|
||||||
|
xor eax, eax
|
||||||
|
cmp ecx, [ntfs_cur_read]
|
||||||
|
jz @f
|
||||||
|
mov al, ERROR_END_OF_FILE
|
||||||
|
@@:
|
||||||
|
mov [esp+1Ch], eax
|
||||||
|
popad
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
@ -1344,32 +1481,7 @@ ntfs_HdReadFolder:
|
|||||||
js .ret
|
js .ret
|
||||||
inc dword [eax+4] ; new file block copied
|
inc dword [eax+4] ; new file block copied
|
||||||
mov eax, [edx+4] ; flags
|
mov eax, [edx+4] ; flags
|
||||||
|
call ntfs_direntry_to_bdfe
|
||||||
ntfs_direntry_to_bdfe:
|
|
||||||
mov [edi+4], eax ; ANSI/UNICODE name
|
|
||||||
mov eax, [esi+48h]
|
|
||||||
test eax, 0x10000000
|
|
||||||
jz @f
|
|
||||||
and eax, not 0x10000000
|
|
||||||
or al, 0x10
|
|
||||||
@@:
|
|
||||||
stosd
|
|
||||||
scasd
|
|
||||||
push edx
|
|
||||||
mov eax, [esi+0x18]
|
|
||||||
mov edx, [esi+0x1C]
|
|
||||||
call ntfs_datetime_to_bdfe
|
|
||||||
mov eax, [esi+0x30]
|
|
||||||
mov edx, [esi+0x34]
|
|
||||||
call ntfs_datetime_to_bdfe
|
|
||||||
mov eax, [esi+0x20]
|
|
||||||
mov edx, [esi+0x24]
|
|
||||||
call ntfs_datetime_to_bdfe
|
|
||||||
pop edx
|
|
||||||
mov eax, [esi+0x40]
|
|
||||||
stosd
|
|
||||||
mov eax, [esi+0x44]
|
|
||||||
stosd
|
|
||||||
push ecx esi edi
|
push ecx esi edi
|
||||||
movzx ecx, byte [esi+0x50]
|
movzx ecx, byte [esi+0x50]
|
||||||
add esi, 0x52
|
add esi, 0x52
|
||||||
@ -1399,6 +1511,33 @@ ntfs_direntry_to_bdfe:
|
|||||||
pop esi ecx
|
pop esi ecx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
ntfs_direntry_to_bdfe:
|
||||||
|
mov [edi+4], eax ; ANSI/UNICODE name
|
||||||
|
mov eax, [esi+48h]
|
||||||
|
test eax, 0x10000000
|
||||||
|
jz @f
|
||||||
|
and eax, not 0x10000000
|
||||||
|
or al, 0x10
|
||||||
|
@@:
|
||||||
|
stosd
|
||||||
|
scasd
|
||||||
|
push edx
|
||||||
|
mov eax, [esi+0x18]
|
||||||
|
mov edx, [esi+0x1C]
|
||||||
|
call ntfs_datetime_to_bdfe
|
||||||
|
mov eax, [esi+0x30]
|
||||||
|
mov edx, [esi+0x34]
|
||||||
|
call ntfs_datetime_to_bdfe
|
||||||
|
mov eax, [esi+0x20]
|
||||||
|
mov edx, [esi+0x24]
|
||||||
|
call ntfs_datetime_to_bdfe
|
||||||
|
pop edx
|
||||||
|
mov eax, [esi+0x40]
|
||||||
|
stosd
|
||||||
|
mov eax, [esi+0x44]
|
||||||
|
stosd
|
||||||
|
ret
|
||||||
|
|
||||||
iglobal
|
iglobal
|
||||||
_24 dd 24
|
_24 dd 24
|
||||||
_60 dd 60
|
_60 dd 60
|
||||||
@ -1570,6 +1709,27 @@ ntfs_HdDelete:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
ntfs_HdGetFileInfo:
|
ntfs_HdGetFileInfo:
|
||||||
mov eax, ERROR_UNSUPPORTED_FS
|
cmp byte [esi], 0
|
||||||
|
jnz @f
|
||||||
|
push 2
|
||||||
|
pop eax
|
||||||
|
ret
|
||||||
|
@@:
|
||||||
|
call ntfs_find_lfn
|
||||||
|
jnc .doit
|
||||||
|
push ERROR_FILE_NOT_FOUND
|
||||||
|
pop eax
|
||||||
|
cmp [hd_error], 0
|
||||||
|
jz @f
|
||||||
|
mov al, 11
|
||||||
|
@@:
|
||||||
|
ret
|
||||||
|
.doit:
|
||||||
|
push esi edi
|
||||||
|
mov esi, eax
|
||||||
|
mov edi, edx
|
||||||
|
xor eax, eax
|
||||||
|
call ntfs_direntry_to_bdfe
|
||||||
|
pop edi esi
|
||||||
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user