ext2. return correct date/time

git-svn-id: svn://kolibrios.org@1400 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
turbanoff 2010-02-09 14:17:26 +00:00
parent 8ed4fad765
commit 1ddcc97e9d
2 changed files with 93 additions and 56 deletions

View File

@ -36,6 +36,7 @@ EXT2_S_IROTH = 0x0001
EXT2_FT_REG_FILE = 1 ;это файл, запись в родительском каталоге EXT2_FT_REG_FILE = 1 ;это файл, запись в родительском каталоге
EXT2_FT_DIR = 2 ;это папка EXT2_FT_DIR = 2 ;это папка
FS_FT_HIDDEN = 2
FS_FT_DIR = 0x10 ;это папка FS_FT_DIR = 0x10 ;это папка
FS_FT_ASCII = 0 ;имя в ascii FS_FT_ASCII = 0 ;имя в ascii
FS_FT_UNICODE = 1 ;имя в unicode FS_FT_UNICODE = 1 ;имя в unicode
@ -431,13 +432,13 @@ ext2_HdReadFolder:
cmp eax, [EXT2_end_block] ; проверяем "конец" cmp eax, [EXT2_end_block] ; проверяем "конец"
jb .find_wanted_start jb .find_wanted_start
.end_block_find_wanted: ;вылетили из цикла find_wanted push .find_wanted_start
.end_block: ;вылетили из цикла
mov ebx, [ext2_data.count_block_in_block] mov ebx, [ext2_data.count_block_in_block]
sub [EXT2_counter_blocks], ebx sub [EXT2_counter_blocks], ebx
jz .end_dir jbe .end_dir
;получаем новый блок inc esi ;получаем новый блок
inc esi
push ecx push ecx
mov ecx, esi mov ecx, esi
call ext2_get_inode_block call ext2_get_inode_block
@ -445,17 +446,18 @@ ext2_HdReadFolder:
mov ebx, [ext2_data.ext2_save_block] mov ebx, [ext2_data.ext2_save_block]
call ext2_get_block call ext2_get_block
pop ecx pop ecx
dec ecx
mov eax, ebx mov eax, ebx
add ebx, [ext2_data.block_size] add ebx, [ext2_data.block_size]
mov [EXT2_end_block], ebx mov [EXT2_end_block], ebx
jmp .find_wanted_start ret ; опять в цикл
.wanted_end:
loop .find_wanted_cycle ; ecx = -1
.find_wanted_end: .find_wanted_end:
mov ecx, edi mov ecx, edi
.wanted_start: ; ищем first_wanted+count .wanted_start: ; ищем first_wanted+count
jecxz .find_wanted_cycle ; ecx=0 => огромный цикл до конца папки jecxz .wanted_end
cmp [eax + EXT2_DIR_STRUC.inode], 0 ; if (inode = 0) => not used cmp [eax + EXT2_DIR_STRUC.inode], 0 ; if (inode = 0) => not used
jz .empty_rec jz .empty_rec
inc [EXT2_files_in_folder] inc [EXT2_files_in_folder]
@ -468,24 +470,47 @@ ext2_HdReadFolder:
rep stosd rep stosd
pop ecx eax pop ecx eax
cmp [eax + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR ;папка или нет push eax esi edx ;получим inode
jz @F
push eax ;получим размер, если это файл
mov eax, [eax + EXT2_DIR_STRUC.inode] mov eax, [eax + EXT2_DIR_STRUC.inode]
mov ebx, [ext2_data.ext2_temp_inode] mov ebx, [ext2_data.ext2_temp_inode]
call ext2_get_inode call ext2_get_inode
lea edi, [edx + 8]
mov eax, [ebx + EXT2_INODE_STRUC.i_ctime] ; переведем время в ntfs формат
xor edx, edx
add eax, 3054539008 ;(369 * 365 + 89) * 24 * 3600
adc edx, 2
call ntfs_datetime_to_bdfe.sec
mov eax, [ebx + EXT2_INODE_STRUC.i_atime]
xor edx, edx
add eax, 3054539008
adc edx, 2
call ntfs_datetime_to_bdfe.sec
mov eax, [ebx + EXT2_INODE_STRUC.i_mtime]
xor edx, edx
add eax, 3054539008
adc edx, 2
call ntfs_datetime_to_bdfe.sec
pop edx ; пока достаем только буфер
test [ebx + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR ; для папки размер
jnz @F ; не возвращаем
mov eax, [ebx + EXT2_INODE_STRUC.i_size] ;low size mov eax, [ebx + EXT2_INODE_STRUC.i_size] ;low size
mov ebx, [ebx + EXT2_INODE_STRUC.i_dir_acl] ;high size stosd
mov dword [edx+32], eax mov eax, [ebx + EXT2_INODE_STRUC.i_dir_acl] ;high size
mov dword [edx+36], ebx stosd
xor dword [edx], FS_FT_DIR ; для файлов xor - 2 раза
pop eax
@@:
xor dword [edx], FS_FT_DIR xor dword [edx], FS_FT_DIR
@@:
xor dword [edx], FS_FT_DIR
pop esi eax
or dword [edx+4], FS_FT_ASCII ; symbol type in name or dword [edx+4], FS_FT_ASCII ; symbol type in name
;теперь скопируем название, сконвертировав из UTF-8 в CP866 ;теперь скопируем имя, сконвертировав из UTF-8 в CP866
push eax ecx esi push eax ecx esi
movzx ecx, [eax + EXT2_DIR_STRUC.name_len] movzx ecx, [eax + EXT2_DIR_STRUC.name_len]
lea edi, [edx + 40] lea edi, [edx + 40]
@ -494,8 +519,12 @@ ext2_HdReadFolder:
pop esi ecx eax pop esi ecx eax
and byte [edi], 0 and byte [edi], 0
add edx, 40 + 264 ; go to next record cmp byte [edx + 40], '.'
jne @F
or dword [edx], FS_FT_HIDDEN
@@:
add edx, 40 + 264 ; go to next record
dec ecx ; если запись пустая ecx не надо уменьшать dec ecx ; если запись пустая ecx не надо уменьшать
.empty_rec: .empty_rec:
movzx ebx, [eax + EXT2_DIR_STRUC.rec_len] movzx ebx, [eax + EXT2_DIR_STRUC.rec_len]
@ -503,30 +532,11 @@ ext2_HdReadFolder:
cmp eax, [EXT2_end_block] cmp eax, [EXT2_end_block]
jb .wanted_start jb .wanted_start
.end_block_wanted: ;вылетели из цикла wanted push .wanted_start ; дошли до конца очередного блока
mov ebx, [ext2_data.count_block_in_block] jmp .end_block
sub [EXT2_counter_blocks], ebx
jz .end_dir
inc esi
push ecx
mov ecx, esi
call ext2_get_inode_block
mov eax, ecx
mov ebx, [ext2_data.ext2_save_block]
call ext2_get_block
pop ecx
dec ecx
mov eax, ebx
add ebx, [ext2_data.block_size]
mov [EXT2_end_block], ebx
jmp .wanted_start
.wanted_end:
dec ecx
jmp .find_wanted_cycle
.end_dir: .end_dir:
pop eax ; мусор (адрес возврата в цикл)
pop edx pop edx
mov ebx, [EXT2_read_in_folder] mov ebx, [EXT2_read_in_folder]
mov ecx, [EXT2_files_in_folder] mov ecx, [EXT2_files_in_folder]
@ -549,7 +559,7 @@ utf8toansi_str:
cmp al, 0x80 cmp al, 0x80
jb .ascii jb .ascii
xchg al, ah xchg al, ah ; big-endian
cmp ax, 0xd080 cmp ax, 0xd080
jz .yo1 jz .yo1
cmp ax, 0xd191 cmp ax, 0xd191
@ -626,7 +636,6 @@ ext2_HdRead:
jz .this_is_nofile jz .this_is_nofile
;-----------------------------------------------------------------------------final step ;-----------------------------------------------------------------------------final step
mov edi, edx ; edi = pointer to return mem mov edi, edx ; edi = pointer to return mem
mov esi, ebx ; esi = pointer to first_wanted mov esi, ebx ; esi = pointer to first_wanted
@ -634,9 +643,6 @@ ext2_HdRead:
mov ebx, [esi+4] mov ebx, [esi+4]
mov eax, [esi] ; ebx : eax - стартовый номер байта mov eax, [esi] ; ebx : eax - стартовый номер байта
; mov edx, [ebp + EXT2_INODE_STRUC.i_dir_acl]
; mov ecx, [ebp + EXT2_INODE_STRUC.i_size] ;edx : ecx - размер файла
cmp [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx cmp [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx
ja .size_great ja .size_great
jb .size_less jb .size_less
@ -645,7 +651,6 @@ ext2_HdRead:
ja .size_great ja .size_great
.size_less: .size_less:
pop ecx
xor ebx, ebx xor ebx, ebx
mov eax, 6 ;EOF mov eax, 6 ;EOF
ret ret
@ -753,7 +758,7 @@ ext2_HdRead:
xor eax, eax xor eax, eax
ret ret
;======================== ;========================
;in : esi -> name not save register ;in : esi -> name not save: eax ebx ecx
;out: ebp -> inode cf=0 ;out: ebp -> inode cf=0
; ebp -> trash cf=1 ; ebp -> trash cf=1
ext2_find_lfn: ext2_find_lfn:
@ -795,6 +800,7 @@ ext2_find_lfn:
stc stc
ret ret
.get_inode_ret: .get_inode_ret:
mov [EXT2_end_block], ebx ; сохраняем указатеть на dir_rec
mov eax, [ebx + EXT2_DIR_STRUC.inode] mov eax, [ebx + EXT2_DIR_STRUC.inode]
mov ebx, [ext2_data.ext2_save_inode] mov ebx, [ext2_data.ext2_save_inode]
call ext2_get_inode call ext2_get_inode
@ -833,21 +839,50 @@ ext2_HdGetFileInfo:
.doit: .doit:
mov ebp, [ext2_data.root_inode] mov ebp, [ext2_data.root_inode]
mov ebx, .doit ;неважно что лишь бы этому адресу не '.'
jmp @F
.doit2: .doit2:
mov ebx, [EXT2_end_block]
add ebx, EXT2_DIR_STRUC.name
@@:
xor eax, eax xor eax, eax
mov edi, edx mov edi, edx
mov ecx, 40/4 mov ecx, 40/4
rep stosd ; fill zero rep stosd ; fill zero
cmp byte [ebx], '.'
jnz @F
or dword [edx], FS_FT_HIDDEN
@@:
test [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR test [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
jz @F jnz @F
or dword [edx], FS_FT_DIR
@@:
mov byte [edx+1], FS_FT_ASCII
mov eax, [ebp + EXT2_INODE_STRUC.i_size] ;low size mov eax, [ebp + EXT2_INODE_STRUC.i_size] ;low size
mov ebx, [ebp + EXT2_INODE_STRUC.i_dir_acl] ;high size mov ebx, [ebp + EXT2_INODE_STRUC.i_dir_acl] ;high size
mov dword [edx+32], eax mov dword [edx+32], eax
mov dword [edx+36], ebx mov dword [edx+36], ebx
xor dword [edx], FS_FT_DIR
@@:
xor dword [edx], FS_FT_DIR
lea edi, [edx + 8]
mov eax, [ebx + EXT2_INODE_STRUC.i_ctime]
xor edx, edx
add eax, 3054539008
adc edx, 2
call ntfs_datetime_to_bdfe.sec
mov eax, [ebx + EXT2_INODE_STRUC.i_atime]
xor edx, edx
add eax, 3054539008
adc edx, 2
call ntfs_datetime_to_bdfe.sec
mov eax, [ebx + EXT2_INODE_STRUC.i_mtime]
xor edx, edx
add eax, 3054539008
adc edx, 2
call ntfs_datetime_to_bdfe.sec
xor eax, eax xor eax, eax
ret ret

View File

@ -1640,7 +1640,8 @@ ntfs_datetime_to_bdfe:
div [_10000000] div [_10000000]
xchg eax, [esp] xchg eax, [esp]
div [_10000000] div [_10000000]
pop edx pop edx
.sec:
; edx:eax = number of seconds since January 1, 1601 ; edx:eax = number of seconds since January 1, 1601
push eax push eax
mov eax, edx mov eax, edx
@ -1812,4 +1813,5 @@ ntfs_HdGetFileInfo:
call ntfs_direntry_to_bdfe call ntfs_direntry_to_bdfe
pop edi esi pop edi esi
xor eax, eax xor eax, eax
ret ret