NTFS: advanced file deletion

git-svn-id: svn://kolibrios.org@6401 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
pathoswithin 2016-04-14 16:29:04 +00:00
parent 7c539d8e19
commit 47b8ff4666

View File

@ -3582,11 +3582,12 @@ ntfs_WriteFile:
;---------------------------------------------------------------- ;----------------------------------------------------------------
ntfs_Delete: ntfs_Delete:
xor ebx, ebx
cmp byte [esi], 0 cmp byte [esi], 0
jnz @f jnz @f
xor ebx, ebx
movi eax, ERROR_ACCESS_DENIED movi eax, ERROR_ACCESS_DENIED
ret ret
@@: @@:
call ntfs_lock call ntfs_lock
stdcall ntfs_find_lfn, [esp+4] stdcall ntfs_find_lfn, [esp+4]
@ -3595,13 +3596,89 @@ ntfs_Delete:
jc ntfsDenied jc ntfsDenied
cmp [ebp+NTFS.fragmentCount], 1 cmp [ebp+NTFS.fragmentCount], 1
jnz ntfsUnsupported ; record fragmented jnz ntfsUnsupported ; record fragmented
test byte [eax+indexFlags], 1
jnz ntfsUnsupported ; index has a subnode
mov edx, [ebp+NTFS.cur_iRecord] mov edx, [ebp+NTFS.cur_iRecord]
shr edx, 3 shr edx, 3
cmp edx, [ebp+NTFS.mftBitmapSize] cmp edx, [ebp+NTFS.mftBitmapSize]
jnc ntfsUnsupported jnc ntfsUnsupported
; delete index from the node mov edx, [ebp+NTFS.secondIndexBuffer]
mov byte [edx], 0
mov edx, [ebp+NTFS.LastRead]
mov [ebp+NTFS.nodeLastRead], edx
test byte [eax+indexFlags], 1
jz .deleteIndex ; no subnode
movzx edx, word [eax+indexAllocatedSize]
mov edi, eax
mov eax, [eax+edx-8]
mov edx, [ebp+NTFS.cur_size]
push edx
cmp edx, [ebp+NTFS.cur_subnode_size]
jz @f
mul [ebp+NTFS.sectors_per_cluster]
@@:
mov [ebp+NTFS.cur_attr], 0xA0
mov [ebp+NTFS.cur_offs], eax
push eax
mov ebx, [ebp+NTFS.secondIndexBuffer]
mov esi, ebx
mov [ebp+NTFS.cur_buf], ebx
call ntfs_read_attr.newAttribute
pop [ebp+NTFS.cur_offs]
pop eax
jc ntfsFail
cmp dword [esi], 'INDX'
jnz ntfsFail
mov [ebp+NTFS.cur_size], eax
shl eax, 9
call ntfs_restore_usa
jc ntfsFail
add esi, recordNode
cmp byte [esi+nonLeafFlag], 0
jnz ntfsUnsupported ; non leaf node
add esi, [esi+indexOffset]
test byte [esi+indexFlags], 2
jnz .deleteSubnode ; empty node
xor eax, eax
@@:
add esi, eax
mov ax, [esi+indexAllocatedSize]
test byte [esi+eax+indexFlags], 2
jz @b
movzx edx, word [edi+indexAllocatedSize]
sub edx, eax
sub edx, 8
mov ebx, esi
mov eax, edi
jmp @f
.deleteSubnode:
mov esi, [ebp+NTFS.attr_offs]
add esi, [esi+sizeWithHeader]
cmp byte [esi], 0xB0
jnz ntfsFail
movzx eax, byte [esi+attributeOffset]
add esi, eax
mov eax, [ebp+NTFS.cur_offs]
xor edx, edx
div [ebp+NTFS.cur_size]
mov edx, eax
shr eax, 3
and edx, 7
btr [esi+eax], edx
mov dx, [edi+indexAllocatedSize]
mov eax, edi
mov edi, [ebp+NTFS.secondIndexBuffer]
mov byte [edi], 0
xor ebx, ebx
mov esi, [ebp+NTFS.cur_index_buf]
cmp dword [esi], 'INDX'
jnz @f
mov esi, [ebp+NTFS.frs_buffer]
mov ecx, [esi+recordRealSize]
shr ecx, 2
rep movsd
jmp @f
.deleteIndex:
movzx edx, word [eax+indexAllocatedSize] movzx edx, word [eax+indexAllocatedSize]
mov ecx, [eax+fileRecordReference] mov ecx, [eax+fileRecordReference]
cmp [eax+edx+fileRecordReference], ecx cmp [eax+edx+fileRecordReference], ecx
@ -3616,7 +3693,7 @@ ntfs_Delete:
shr ecx, 2 shr ecx, 2
rep movsd rep movsd
mov esi, [ebp+NTFS.cur_index_buf] mov esi, [ebp+NTFS.cur_index_buf]
mov edi, [ebp+NTFS.attr_offs] mov edi, [ebp+NTFS.indexRoot]
sub edi, [ebp+NTFS.frs_buffer] sub edi, [ebp+NTFS.frs_buffer]
add edi, esi add edi, esi
sub [edi+sizeWithHeader], edx sub [edi+sizeWithHeader], edx
@ -3629,24 +3706,59 @@ ntfs_Delete:
add eax, edi add eax, edi
sub [esi+recordRealSize], edx sub [esi+recordRealSize], edx
mov ecx, [esi+recordRealSize] mov ecx, [esi+recordRealSize]
cmp [esi+recordAllocatedSize], ecx
jc ntfsUnsupported
jmp @f jmp @f
.indexRecord: .indexRecord:
add edi, recordNode+nodeRealSize add edi, recordNode
sub [edi], edx sub [edi+nodeRealSize], edx
mov ecx, [edi] mov ecx, [edi+nodeRealSize]
cmp [edi+nodeAllocatedSize], ecx
jc ntfsUnsupported
add ecx, recordNode add ecx, recordNode
@@: @@:
add ecx, [ebp+NTFS.cur_index_buf] add ecx, [ebp+NTFS.cur_index_buf]
sub ecx, eax sub ecx, eax
shr ecx, 2
mov esi, eax mov esi, eax
add esi, edx add esi, edx
mov edi, eax mov edi, eax
test edx, edx
jns @f
neg edx
add edx, ecx
sub edx, 4
add esi, edx
add edi, edx
std
@@:
jz @f
shr ecx, 2
rep movsd rep movsd
cld
@@:
test ebx, ebx
jz @f
; copy index from the subnode to replace deleted pointing index
movzx ecx, word [ebx+indexAllocatedSize]
mov edx, ecx
shr ecx, 2
mov esi, ebx
mov edi, eax
rep movsd
mov edi, [ebp+NTFS.cur_index_buf]
xchg [ebp+NTFS.secondIndexBuffer], edi
mov [ebp+NTFS.cur_index_buf], edi
add word [eax+indexAllocatedSize], 8
mov byte [eax+indexFlags], 1
mov eax, [ebp+NTFS.LastRead] mov eax, [ebp+NTFS.LastRead]
mov [ebp+NTFS.nodeLastRead], eax xchg [ebp+NTFS.nodeLastRead], eax
; examine file record mov [ebp+NTFS.rootLastRead], eax
mov eax, ebx
xor ebx, ebx
jmp .indexRecord
@@: ; examine file record
mov [ebp+NTFS.cur_attr], 0x80 mov [ebp+NTFS.cur_attr], 0x80
mov [ebp+NTFS.cur_offs], 0 mov [ebp+NTFS.cur_offs], 0
mov [ebp+NTFS.cur_size], 0 mov [ebp+NTFS.cur_size], 0
@ -3706,10 +3818,17 @@ ntfs_Delete:
mov byte [esi+recordFlags], 0 mov byte [esi+recordFlags], 0
call writeRecord call writeRecord
; write directory node ; write directory node
mov eax, [ebp+NTFS.nodeLastRead]
mov [ebp+NTFS.LastRead], eax
mov eax, [ebp+NTFS.cur_index_buf] mov eax, [ebp+NTFS.cur_index_buf]
mov [ebp+NTFS.cur_buf], eax mov [ebp+NTFS.cur_buf], eax
mov eax, [ebp+NTFS.nodeLastRead]
mov [ebp+NTFS.LastRead], eax
call writeRecord
mov eax, [ebp+NTFS.secondIndexBuffer]
cmp byte [eax], 0
jz ntfsDone
mov [ebp+NTFS.cur_buf], eax
mov eax, [ebp+NTFS.rootLastRead]
mov [ebp+NTFS.LastRead], eax
call writeRecord call writeRecord
jmp ntfsDone jmp ntfsDone