137,7 → 137,7 |
.l1: |
push ecx edx |
push 0 |
mov eax, [edi+10] ; ðåàëüíûé ðàçìåð ôàéëîâîé ñåêöèè |
mov eax, [edi+10] ; реальный размер файловой секции |
sub eax, ebx |
jb .eof |
cmp eax, ecx |
159,7 → 159,7 |
jb .incomplete_sector |
; we may read and memmove complete sector |
mov [CDDataBuf_pointer], edx |
call ReadCDWRetr; ÷èòàåì ñåêòîð ôàéëà |
call ReadCDWRetr; читаем сектор файла |
cmp [DevErrorCode], 0 |
jne .noaccess_3 |
add edx, 2048 |
170,7 → 170,7 |
.incomplete_sector: |
; we must read and memmove incomplete sector |
mov [CDDataBuf_pointer], CDDataBuf |
call ReadCDWRetr; ÷èòàåì ñåêòîð ôàéëà |
call ReadCDWRetr; читаем сектор файла |
cmp [DevErrorCode], 0 |
jne .noaccess_3 |
push ecx |
240,7 → 240,7 |
.found_dir: |
mov eax, [edi+2] ; eax=cluster |
mov [CDSectorAddress], eax |
mov eax, [edi+10] ; ðàçìåð äèðåêòðîðèè |
mov eax, [edi+10] ; размер директрории |
.doit: |
; init header |
push eax ecx |
252,7 → 252,7 |
mov byte [edx], 1 ; version |
mov [cd_mem_location], edx |
add [cd_mem_location], 32 |
; íà÷èíàåì ïåðåáðîñêó ÁÄÂÊ â ÓÑÂÊ |
; начинаем переброску БДВК в УСВК |
;.mainloop: |
mov [cd_counter_block], dword 0 |
dec dword [CDSectorAddress] |
260,12 → 260,12 |
.read_to_buffer: |
inc dword [CDSectorAddress] |
mov [CDDataBuf_pointer], CDDataBuf |
call ReadCDWRetr ; ÷èòàåì ñåêòîð äèðåêòîðèè |
call ReadCDWRetr ; читаем сектор директории |
cmp [DevErrorCode], 0 |
jne .noaccess_1 |
call .get_names_from_buffer |
sub eax, 2048 |
; äèðåêòîðèÿ çàêîí÷èëàñü? |
; директория закончилась? |
ja .read_to_buffer |
mov edi, [cd_counter_block] |
mov [edx+8], edi |
310,17 → 310,17 |
call uni2ansi_char |
cld |
stosb |
; ïðîâåðêà êîíöà ôàéëà |
; проверка конца файла |
mov ax, [esi] |
cmp ax, word 3B00h; ñåïàðàòîð êîíöà ôàéëà ';' |
cmp ax, word 3B00h; сепаратор конца файла ';' |
je .cd_get_parameters_of_file_1 |
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
; проверка для файлов не заканчивающихся сепаратором |
movzx eax, byte [ebp-33] |
add eax, ebp |
sub eax, 34 |
cmp esi, eax |
je .cd_get_parameters_of_file_1 |
; ïðîâåðêà êîíöà ïàïêè |
; проверка конца папки |
movzx eax, byte [ebp-1] |
add eax, ebp |
cmp esi, eax |
347,17 → 347,17 |
jbe .unicode_parent_directory |
cld |
movsw |
; ïðîâåðêà êîíöà ôàéëà |
; проверка конца файла |
mov ax, [esi] |
cmp ax, word 3B00h; ñåïàðàòîð êîíöà ôàéëà ';' |
cmp ax, word 3B00h; сепаратор конца файла ';' |
je .cd_get_parameters_of_file_2 |
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
; проверка для файлов не заканчивающихся сепаратором |
movzx eax, byte [ebp-33] |
add eax, ebp |
sub eax, 34 |
cmp esi, eax |
je .cd_get_parameters_of_file_2 |
; ïðîâåðêà êîíöà ïàïêè |
; проверка конца папки |
movzx eax, byte [ebp-1] |
add eax, ebp |
cmp esi, eax |
386,60 → 386,60 |
cd_get_parameters_of_file: |
mov edi, [cd_mem_location] |
cd_get_parameters_of_file_1: |
; ïîëó÷àåì àòðèáóòû ôàéëà |
; получаем атрибуты файла |
xor eax, eax |
; ôàéë íå àðõèâèðîâàëñÿ |
; файл не архивировался |
inc eax |
shl eax, 1 |
; ýòî êàòàëîã? |
; это каталог? |
test [ebp-8], byte 2 |
jz .file |
inc eax |
.file: |
; ìåòêà òîìà íå êàê â FAT, â ýòîì âèäå îòñóòñâóåò |
; ôàéë íå ÿâëÿåòñÿ ñèñòåìíûì |
; метка тома не как в FAT, в этом виде отсутсвует |
; файл не является системным |
shl eax, 3 |
; ôàéë ÿâëÿåòñÿ ñêðûòûì? (àòðèáóò ñóùåñòâîâàíèå) |
; файл является скрытым? (атрибут существование) |
test [ebp-8], byte 1 |
jz .hidden |
inc eax |
.hidden: |
shl eax, 1 |
; ôàéë âñåãäà òîëüêî äëÿ ÷òåíèÿ, òàê êàê ýòî CD |
; файл всегда только для чтения, так как это CD |
inc eax |
mov [edi], eax |
; ïîëó÷àåì âðåìÿ äëÿ ôàéëà |
;÷àñ |
; получаем время для файла |
;час |
movzx eax, byte [ebp-12] |
shl eax, 8 |
;ìèíóòà |
;минута |
mov al, [ebp-11] |
shl eax, 8 |
;ñåêóíäà |
;секунда |
mov al, [ebp-10] |
;âðåìÿ ñîçäàíèÿ ôàéëà |
;время создания файла |
mov [edi+8], eax |
;âðåìÿ ïîñëåäíåãî äîñòóïà |
;время последнего доступа |
mov [edi+16], eax |
;âðåìÿ ïîñëåäíåé çàïèñè |
;время последней записи |
mov [edi+24], eax |
; ïîëó÷àåì äàòó äëÿ ôàéëà |
;ãîä |
; получаем дату для файла |
;год |
movzx eax, byte [ebp-15] |
add eax, 1900 |
shl eax, 8 |
;ìåñÿö |
;месяц |
mov al, [ebp-14] |
shl eax, 8 |
;äåíü |
;день |
mov al, [ebp-13] |
;äàòà ñîçäàíèÿ ôàéëà |
;дата создания файла |
mov [edi+12], eax |
;âðåìÿ ïîñëåäíåãî äîñòóïà |
;время последнего доступа |
mov [edi+20], eax |
;âðåìÿ ïîñëåäíåé çàïèñè |
;время последней записи |
mov [edi+28], eax |
; ïîëó÷àåì òèï äàííûõ èìåíè |
; получаем тип данных имени |
xor eax, eax |
test dword [ebx+4], 1; 0=ANSI, 1=UNICODE |
jnz .unicode_1 |
449,7 → 449,7 |
inc eax |
mov [edi+4], eax |
@@: |
; ïîëó÷àåì ðàçìåð ôàéëà â áàéòàõ |
; получаем размер файла в байтах |
xor eax, eax |
mov [edi+32+4], eax |
mov eax, [ebp-23] |
503,7 → 503,7 |
; out: CF=1 - file not found |
; else CF=0 and [cd_current_pointer_of_input] direntry |
push eax esi |
; 16 ñåêòîð íà÷àëî íàáîðà äåñêðèïòîðîâ òîìîâ |
; 16 сектор начало набора дескрипторов томов |
|
call WaitUnitReady |
cmp [DevErrorCode], 0 |
510,7 → 510,7 |
jne .access_denied |
|
call prevent_medium_removal |
; òåñòîâîå ÷òåíèå |
; тестовое чтение |
mov [CDSectorAddress], dword 16 |
mov [CDDataBuf_pointer], CDDataBuf |
call ReadCDWRetr;_1 |
517,7 → 517,7 |
cmp [DevErrorCode], 0 |
jne .access_denied |
|
; âû÷èñëåíèå ïîñëåäíåé ñåññèè |
; вычисление последней сессии |
call WaitUnitReady |
cmp [DevErrorCode], 0 |
jne .access_denied |
539,37 → 539,37 |
jne .access_denied |
|
.start_check: |
; ïðîâåðêà íà âøèâîñòü |
; проверка на вшивость |
cmp [CDDataBuf+1], dword 'CD00' |
jne .access_denied |
cmp [CDDataBuf+5], byte '1' |
jne .access_denied |
; ñåêòîð ÿâëÿåòñÿ òåðìèíàòîðîì íàáîð äåñêðèïòîðîâ òîìîâ? |
; сектор является терминатором набор дескрипторов томов? |
cmp [CDDataBuf], byte 0xff |
je .access_denied |
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì è óëó÷øåííûì äåñêðèïòîðîì òîìà? |
; сектор является дополнительным и улучшенным дескриптором тома? |
cmp [CDDataBuf], byte 0x2 |
jne .start |
; ñåêòîð ÿâëÿåòñÿ äîïîëíèòåëüíûì äåñêðèïòîðîì òîìà? |
; сектор является дополнительным дескриптором тома? |
cmp [CDDataBuf+6], byte 0x1 |
jne .start |
|
; ïàðàìåòðû root äèðåêòðîðèè |
mov eax, [CDDataBuf+0x9c+2]; íà÷àëî root äèðåêòðîðèè |
; параметры root директрории |
mov eax, [CDDataBuf+0x9c+2]; начало root директрории |
mov [CDSectorAddress], eax |
mov eax, [CDDataBuf+0x9c+10]; ðàçìåð root äèðåêòðîðèè |
mov eax, [CDDataBuf+0x9c+10]; размер root директрории |
cmp byte [esi], 0 |
jnz @f |
mov [cd_current_pointer_of_input], CDDataBuf+0x9c |
jmp .done |
@@: |
; íà÷èíàåì ïîèñê |
; начинаем поиск |
.mainloop: |
dec dword [CDSectorAddress] |
.read_to_buffer: |
inc dword [CDSectorAddress] |
mov [CDDataBuf_pointer], CDDataBuf |
call ReadCDWRetr ; ÷èòàåì ñåêòîð äèðåêòîðèè |
call ReadCDWRetr ; читаем сектор директории |
cmp [DevErrorCode], 0 |
jne .access_denied |
push ebp |
577,27 → 577,27 |
pop ebp |
jnc .found |
sub eax, 2048 |
; äèðåêòîðèÿ çàêîí÷èëàñü? |
; директория закончилась? |
cmp eax, 0 |
ja .read_to_buffer |
; íåò èñêîìîãî ýëåìåíòà öåïî÷êè |
; нет искомого элемента цепочки |
.access_denied: |
pop esi eax |
mov [cd_appl_data], 1 |
stc |
ret |
; èñêîìûé ýëåìåíò öåïî÷êè íàéäåí |
; искомый элемент цепочки найден |
.found: |
; êîíåö ïóòè ôàéëà |
; конец пути файла |
cmp byte [esi-1], 0 |
jz .done |
.nested: |
mov eax, [cd_current_pointer_of_input] |
push dword [eax+2] |
pop dword [CDSectorAddress] ; íà÷àëî äèðåêòîðèè |
mov eax, [eax+2+8]; ðàçìåð äèðåêòîðèè |
pop dword [CDSectorAddress] ; начало директории |
mov eax, [eax+2+8]; размер директории |
jmp .mainloop |
; óêàçàòåëü ôàéëà íàéäåí |
; указатель файла найден |
.done: |
test ebp, ebp |
jz @f |
629,13 → 629,13 |
mov ebp, [cd_current_pointer_of_input_2] |
mov [cd_current_pointer_of_input], ebp |
mov eax, [ebp] |
test eax, eax ; âõîäû çàêîí÷èëèñü? |
test eax, eax ; входы закончились? |
jz .next_sector |
cmp ebp, CDDataBuf+2048 ; áóôåð çàêîí÷èëñÿ? |
cmp ebp, CDDataBuf+2048 ; буфер закончился? |
jae .next_sector |
movzx eax, byte [ebp] |
add [cd_current_pointer_of_input_2], eax; ñëåäóþùèé âõîä êàòàëîãà |
add ebp, 33; óêàçàòåëü óñòàíîâëåí íà íà÷àëî èìåíè |
add [cd_current_pointer_of_input_2], eax; следующий вход каталога |
add ebp, 33; указатель установлен на начало имени |
pop eax |
clc |
ret |
669,9 → 669,9 |
scasw |
jne .name_not_coincide |
.coincides: |
cmp [esi], byte '/'; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà |
cmp [esi], byte '/'; разделитель пути, конец имени текущего элемента |
je .done |
cmp [esi], byte 0; ðàçäåëèòåëü ïóòè, êîíåö èìåíè òåêóùåãî ýëåìåíòà |
cmp [esi], byte 0; разделитель пути, конец имени текущего элемента |
je .done |
jmp .loop |
.name_not_coincide: |
679,16 → 679,16 |
stc |
ret |
.done: |
; ïðîâåðêà êîíöà ôàéëà |
cmp [edi], word 3B00h; ñåïàðàòîð êîíöà ôàéëà ';' |
; проверка конца файла |
cmp [edi], word 3B00h; сепаратор конца файла ';' |
je .done_1 |
; ïðîâåðêà äëÿ ôàéëîâ íå çàêàí÷èâàþùèõñÿ ñåïàðàòîðîì |
; проверка для файлов не заканчивающихся сепаратором |
movzx eax, byte [ebp-33] |
add eax, ebp |
sub eax, 34 |
cmp edi, eax |
je .done_1 |
; ïðîâåðêà êîíöà ïàïêè |
; проверка конца папки |
movzx eax, byte [ebp-1] |
add eax, ebp |
cmp edi, eax |
708,14 → 708,14 |
jb .ret |
cmp al, 'Z' |
jbe .az |
cmp al, '' |
cmp al, 0x80 ; 'А' |
jb .ret |
cmp al, '' |
cmp al, 0x90 ; 'Р' |
jb .rus1 |
cmp al, '' |
cmp al, 0x9F ; 'Я' |
ja .ret |
; 0x90-0x9F -> 0xE0-0xEF |
add al, 'à'-'' |
add al, 0xE0-0x90 |
.ret: |
ret |
.rus1: |
744,10 → 744,10 |
mov al, '_' |
jmp .doit |
.yo1: |
mov al, 'ð' |
mov al, 0xF0 ; 'Ё' in cp866 |
jmp .doit |
.yo2: |
mov al, 'ñ' |
mov al, 0xF1 ; 'ё' in cp866 |
jmp .doit |
.rus1: |
; 0x410-0x43F -> 0x80-0xAF |