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:
Evgeny Grechnikov (Diamond) 2007-01-08 15:10:18 +00:00
parent 853d0ada7d
commit 3fd82557ce
2 changed files with 203 additions and 33 deletions

View File

@ -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

View File

@ -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