70,6 → 70,9 |
RCX_high dd ? |
RDX_high dd ? |
RDI_high dd ? |
current_hash dd ? |
hash_flag dd ? |
need_hash dd ? |
volumeLabel rb 12 |
; The next two areas (32+32) should be arranged sequentially. |
; Do not change their location!!! |
365,7 → 368,9 |
;-------------------------------------- |
.file_directory_entry: |
; DEBUGF 1, "K : exFAT_get_name 0x85\n" |
movzx eax, byte [edi+1] ; Number of Secondary directory entries |
xor eax, eax |
mov [ebp+exFAT.hash_flag], eax ; dword 0 |
mov al, byte [edi+1] ; Number of Secondary directory entries |
dec eax |
mov [ebp+exFAT.secondary_dir_entry], eax |
; DEBUGF 1, "K : exFAT_get_name 0x85 SDE: %x\n", eax |
375,6 → 380,20 |
;-------------------------------------- |
.stream_extension_directory_entry: |
; DEBUGF 1, "K : exFAT_get_name 0xC0\n" |
; DEBUGF 1, "K : exFAT SEDE need_hash :%x\n", [ebp+exFAT.need_hash] |
mov eax, [ebp+exFAT.need_hash] |
test eax, eax |
jz .stream_extension_directory_entry_1 ; @f |
movzx eax, word [edi+4] ; hash of the file name |
; DEBUGF 1, "K : exFAT hash 1 :%x\n", eax |
; DEBUGF 1, "K : exFAT hash 2 :%x\n", [ebp+exFAT.current_hash] |
cmp eax, [ebp+exFAT.current_hash] |
je .stream_extension_directory_entry_1 ; @f |
xor eax, eax |
inc eax |
mov [ebp+exFAT.hash_flag], eax ; dword 1 |
; DEBUGF 1, "K : exFAT hashes don't match! \n" |
.stream_extension_directory_entry_1: |
lea esi, [ebp+exFAT.str_ext_dir_entry] |
; DEBUGF 1, "K : exFAT.str_ext_dir_entry ESI: %x [ESI]: %x\n", esi, [esi] |
@@: |
411,6 → 430,10 |
; DEBUGF 1, "K : exFAT_get_name.longname Input FS EBP:%x\n", ebp |
; pop ebp |
|
mov eax, [ebp+exFAT.hash_flag] |
test eax, eax |
jnz .no |
; DEBUGF 1, "K : exFAT_get_name.longname hash match! \n" |
push edi esi |
|
xchg esi, edi |
686,7 → 709,10 |
; esi -> next name in the path |
; edi -> direntry |
; CF=1 -> file not found, eax = error code |
mov [ebp+exFAT.secondary_dir_entry], dword 1 |
xor eax, eax |
inc eax |
mov [ebp+exFAT.secondary_dir_entry], eax ; dword 1 |
mov [ebp+exFAT.need_hash], eax ; dword 1 |
lea eax, [esp+12] |
call dword [eax-4] ; exFAT_notroot_first |
jc .reterr |
696,6 → 722,70 |
mov [ebp+exFAT.LFN_reserve_place], eax |
mov [ebp+exFAT.path_in_UTF8], esi |
; DEBUGF 1, "K : exFAT_find_lfn Path: %s\n", esi |
; DEBUGF 1, "K : exFAT Path: %s\n", esi |
; DEBUGF 1, "K : exFAT Path1: %x %x %x\n", [esi], [esi+4], [esi+8] |
push esi edi |
; lea edi, [esp+8] |
mov edi, eax |
align 4 |
@@: |
; in: esi -> UTF-8 char (increasing) |
; out: ax = UTF-16 char |
call utf8to16 |
call utf16toUpper |
stosw |
test ax, ax |
jz @f |
cmp ax, word 0x002f ; "/" |
jne @b |
@@: |
; mov [edi-2], dword 0 |
mov esi, [ebp+exFAT.LFN_reserve_place] |
; DEBUGF 1, "K : exFAT Path2: %x %x %x\n", [esi], [esi+4], [esi+8] |
push ebx ecx |
mov ecx, edi |
sub ecx, esi |
sub ecx, 2 ; correction for zero or "/" |
; exFAT_hash_calculate |
; in: |
; esi -> NameUTF16 |
; ecx -> NameUTF16 length |
; out: ax = hash |
xor eax, eax |
xor ebx, ebx |
;-------------------------------------- |
align 4 |
.start: |
; DEBUGF 1, "Hash start EAX:%x ECX:%x\n", eax, ecx |
mov bx, ax |
; (Hash&1) ? 0x8000 : 0) |
and ax, 0x1 |
jz .else |
|
mov ax, 0x8000 |
jmp @f |
;-------------------------------------- |
.else: |
xor ax, ax |
;-------------------------------------- |
@@: |
; DEBUGF 1, "(Hash&1) EAX:%x\n", eax |
; (Hash>>1) |
shr bx, 1 |
; DEBUGF 1, "(Hash>>1) EBX:%x\n", ebx |
add ax, bx |
; DEBUGF 1, "+ (Hash>>1)) EAX:%x\n", eax |
movzx bx, byte [esi] |
add ax, bx |
; DEBUGF 1, "+ (UInt16)Buffer[Index] EAX:%x\n", eax |
inc esi |
dec ecx |
jnz .start |
;-------------------------------------- |
pop ecx ebx |
mov [ebp+exFAT.current_hash], eax |
; DEBUGF 1, "K : exFAT current hash :%x\n", eax |
pop edi esi |
.l1: |
; push esi |
; lea esi, [esp+4] |
706,7 → 796,7 |
; mov ebp,[esp+12+8+4+4+7*4+262*2+4] |
; DEBUGF 1, "K : exFAT_get_name Input FS EBP:%x\n", ebp |
; pop ebp |
|
; DEBUGF 1, "K : exFAT FL need_hash :%x\n", [ebp+exFAT.need_hash] |
call exFAT_get_name |
; mov [ebp+exFAT.LFN_reserve_place], esi |
; pop esi |
718,10 → 808,10 |
|
jc .no |
|
push eax |
; push eax |
xor eax, eax |
cmp [ebp+exFAT.secondary_dir_entry], eax |
pop eax |
; pop eax |
jnz .no |
|
push edi esi |
808,6 → 898,9 |
; out: |
; eax, ebx = return values for sysfunc 70 |
call exFAT_lock |
xor eax, eax |
mov [ebp+exFAT.need_hash], eax ; dword 0 |
mov [ebp+exFAT.hash_flag], eax ; dword 0 |
call exFAT_hd_find_lfn |
jc .notFound |
; test byte [edi+11], 0x10 ; do not allow read directories |
1320,6 → 1413,8 |
; eax, ebx = return values for sysfunc 70 |
call exFAT_lock |
xor eax, eax |
mov [ebp+exFAT.need_hash], eax ; dword 0 |
mov [ebp+exFAT.hash_flag], eax ; dword 0 |
mov [ebp+exFAT.General_Sec_Flags], eax |
; DEBUGF 1, "K : exFAT_ReadFolder General_Sec_Flags 1 %x\n", eax |
mov eax, [ebp+exFAT.ROOT_CLUSTER] |
1343,6 → 1438,9 |
; jmp .error |
; test byte [edi+11], 0x10 ; do not allow read files |
; jz .accessDenied |
xor eax, eax |
mov [ebp+exFAT.need_hash], eax ; dword 0 |
mov [ebp+exFAT.hash_flag], eax ; dword 0 |
lea eax, [ebp+exFAT.file_dir_entry] |
test byte [eax+4], 10000b ; do not allow read files |
jz .accessDenied |
1464,6 → 1562,7 |
; DEBUGF 1, "K : exFAT_ReadFolder.l1 \n" |
; push esi |
; lea esi, [esp+20] |
; DEBUGF 1, "K : exFAT RD need_hash :%x\n", [ebp+exFAT.need_hash] |
call exFAT_get_name |
; pop esi |
jc .l2 |
1667,6 → 1766,9 |
cmp byte [esi], 0 |
jz .volume |
call exFAT_lock |
xor eax, eax |
mov [ebp+exFAT.need_hash], eax ; dword 0 |
mov [ebp+exFAT.hash_flag], eax ; dword 0 |
call exFAT_hd_find_lfn |
jc @f |
lea edi, [ebp+exFAT.file_dir_entry] |