forked from KolibriOS/kolibrios
ext fs and other global cleaning
git-svn-id: svn://kolibrios.org@6462 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
326d13ad14
commit
0179d69549
2508
kernel/trunk/fs/ext.inc
Normal file
2508
kernel/trunk/fs/ext.inc
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,412 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Contains ext2 block handling code. ;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2013-2015. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
$Revision$
|
|
||||||
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Write ext2 block from memory to disk.
|
|
||||||
; Input: eax = i_block (block number in ext2 terms);
|
|
||||||
; ebx = buffer address
|
|
||||||
; ebp = pointer to EXTFS
|
|
||||||
; Output: eax = error code (0 implies no error)
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_block_write:
|
|
||||||
push edx ebx ecx
|
|
||||||
|
|
||||||
mov edx, fs_write32_sys
|
|
||||||
jmp ext2_block_modify
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Read ext2 block from disk to memory.
|
|
||||||
; Input: eax = i_block (block number in ext2 terms);
|
|
||||||
; ebx = address of where to read block
|
|
||||||
; ebp = pointer to EXTFS
|
|
||||||
; Output: eax = error code (0 implies no error)
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_block_read:
|
|
||||||
push edx ebx ecx
|
|
||||||
|
|
||||||
mov edx, fs_read32_sys
|
|
||||||
jmp ext2_block_modify
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Modify ext2 block.
|
|
||||||
; Input: eax = i_block (block number in ext2 terms);
|
|
||||||
; ebx = I/O buffer address;
|
|
||||||
; edx = fs_read/write32_sys
|
|
||||||
; ebp = pointer to EXTFS
|
|
||||||
; edx, ebx, ecx on stack.
|
|
||||||
; Output: eax = error code (0 implies no error)
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_block_modify:
|
|
||||||
; Get block number in hard-disk terms in eax.
|
|
||||||
mov ecx, [ebp + EXTFS.log_block_size]
|
|
||||||
shl eax, cl
|
|
||||||
mov ecx, eax
|
|
||||||
push [ebp + EXTFS.count_block_in_block]
|
|
||||||
|
|
||||||
@@:
|
|
||||||
mov eax, ecx
|
|
||||||
call edx
|
|
||||||
test eax, eax
|
|
||||||
jnz .fail
|
|
||||||
|
|
||||||
inc ecx
|
|
||||||
add ebx, 512
|
|
||||||
dec dword[esp]
|
|
||||||
jnz @B
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
@@:
|
|
||||||
pop ecx
|
|
||||||
pop ecx ebx edx
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fail:
|
|
||||||
mov eax, ERROR_DEVICE
|
|
||||||
jmp @B
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Zeroes a block.
|
|
||||||
; Input: ebx = block ID.
|
|
||||||
; ebp = pointer to EXTFS.
|
|
||||||
; Output: eax = error code.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_block_zero:
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov eax, ebx
|
|
||||||
mov ebx, [ebp + EXTFS.ext2_temp_block]
|
|
||||||
|
|
||||||
call ext2_block_read
|
|
||||||
test eax, eax
|
|
||||||
jnz .return
|
|
||||||
|
|
||||||
push edi ecx
|
|
||||||
xor eax, eax
|
|
||||||
mov ecx, [ebp + EXTFS.block_size]
|
|
||||||
mov edi, [ebp + EXTFS.ext2_temp_block]
|
|
||||||
rep stosb
|
|
||||||
pop ecx edi
|
|
||||||
|
|
||||||
mov eax, [esp]
|
|
||||||
call ext2_block_write
|
|
||||||
|
|
||||||
.return:
|
|
||||||
pop ebx
|
|
||||||
ret
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Allocates a block.
|
|
||||||
; Input: eax = inode ID for "preference".
|
|
||||||
; ebp = pointer to EXTFS.
|
|
||||||
; Output: Block marked as set in block group.
|
|
||||||
; eax = error code.
|
|
||||||
; ebx = block ID.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_block_alloc:
|
|
||||||
push [ebp + EXTFS.superblock + EXT2_SB_STRUC.blocks_count]
|
|
||||||
push EXT2_BLOCK_GROUP_DESC.free_blocks_count
|
|
||||||
push [ebp + EXTFS.superblock + EXT2_SB_STRUC.blocks_per_group]
|
|
||||||
|
|
||||||
lea ebx, [ebp + EXTFS.superblock + EXT2_SB_STRUC.free_block_count]
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
push ext2_bg_read_blk_bitmap
|
|
||||||
|
|
||||||
call ext2_resource_alloc
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Zero-allocates a block.
|
|
||||||
; Input: eax = inode ID for "preference".
|
|
||||||
; ebp = pointer to EXTFS.
|
|
||||||
; Output: Block marked as set in block group.
|
|
||||||
; eax = error code.
|
|
||||||
; ebx = block ID.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_block_calloc:
|
|
||||||
call ext2_block_alloc
|
|
||||||
test eax, eax
|
|
||||||
jnz @F
|
|
||||||
|
|
||||||
call ext2_block_zero
|
|
||||||
@@:
|
|
||||||
ret
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Frees a block.
|
|
||||||
; Input: eax = block ID.
|
|
||||||
; ebp = pointer to EXTFS.
|
|
||||||
; Output: Block marked as free in block group.
|
|
||||||
; eax = error code.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_block_free:
|
|
||||||
push edi ecx
|
|
||||||
|
|
||||||
mov edi, ext2_bg_read_blk_bitmap
|
|
||||||
xor ecx, ecx
|
|
||||||
call ext2_resource_free
|
|
||||||
|
|
||||||
pop ecx edi
|
|
||||||
ret
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Find parent from file path in block.
|
|
||||||
; Input: esi = file path.
|
|
||||||
; ebx = pointer to directory block.
|
|
||||||
; ebp = pointer to EXTFS structure.
|
|
||||||
; Output: esi = name without parent, or not changed.
|
|
||||||
; ebx = directory record matched.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_block_find_parent:
|
|
||||||
sub esp, 256 ; Space for EXT2 filename.
|
|
||||||
mov edx, ebx
|
|
||||||
add edx, [ebp + EXTFS.block_size] ; Save block end.
|
|
||||||
|
|
||||||
.start_rec:
|
|
||||||
cmp [ebx + EXT2_DIR_STRUC.inode], 0
|
|
||||||
jz .next_rec
|
|
||||||
|
|
||||||
mov edi, esp
|
|
||||||
push esi
|
|
||||||
movzx ecx, [ebx + EXT2_DIR_STRUC.name_len]
|
|
||||||
lea esi, [ebx + EXT2_DIR_STRUC.name]
|
|
||||||
call utf8_to_cp866
|
|
||||||
|
|
||||||
mov ecx, edi
|
|
||||||
lea edi, [esp + 4]
|
|
||||||
sub ecx, edi ; Number of bytes in resulting string.
|
|
||||||
|
|
||||||
mov esi, [esp]
|
|
||||||
|
|
||||||
; esi: original file path.
|
|
||||||
; edi: converted string stored on stack.
|
|
||||||
; ecx: size of converted string.
|
|
||||||
@@:
|
|
||||||
; If no bytes left in resulting string, test it.
|
|
||||||
jecxz .test_find
|
|
||||||
dec ecx
|
|
||||||
|
|
||||||
lodsb
|
|
||||||
call char_toupper
|
|
||||||
|
|
||||||
mov ah, [edi]
|
|
||||||
inc edi
|
|
||||||
xchg al, ah
|
|
||||||
call char_toupper
|
|
||||||
|
|
||||||
; If both are same, check next byte.
|
|
||||||
cmp al, ah
|
|
||||||
je @B
|
|
||||||
@@: ; Doesn't match.
|
|
||||||
pop esi
|
|
||||||
|
|
||||||
.next_rec:
|
|
||||||
movzx eax, [ebx + EXT2_DIR_STRUC.rec_len]
|
|
||||||
add ebx, eax ; Go to next record.
|
|
||||||
cmp ebx, edx ; Check if this is the end.
|
|
||||||
jb .start_rec
|
|
||||||
|
|
||||||
add esp, 256
|
|
||||||
ret
|
|
||||||
|
|
||||||
.test_find:
|
|
||||||
cmp byte [esi], 0
|
|
||||||
je .ret ; The end reached.
|
|
||||||
cmp byte [esi], '/' ; If not end of directory name, not matched.
|
|
||||||
jne @B
|
|
||||||
inc esi
|
|
||||||
|
|
||||||
.ret:
|
|
||||||
add esp, 256 + 4
|
|
||||||
ret
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Finds free space in a directory block, modifying last entry appropriately.
|
|
||||||
; Input: ebp = pointer to EXTFS.
|
|
||||||
; ecx = size of free space required.
|
|
||||||
; [EXTFS.ext2_temp_block] contains the block relevant.
|
|
||||||
; Output: edi = free entry.
|
|
||||||
; rec_len of free entry is set.
|
|
||||||
; eax = error code; if the block doesn't link to the next one, this is 0x00000001 on failure.
|
|
||||||
; ; else, 0xFFFFFFFF.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_block_find_fspace:
|
|
||||||
push ebx edx
|
|
||||||
|
|
||||||
mov edi, [ebp + EXTFS.ext2_temp_block]
|
|
||||||
mov edx, edi
|
|
||||||
add edx, [ebp + EXTFS.block_size]
|
|
||||||
|
|
||||||
@@:
|
|
||||||
movzx eax, [edi + EXT2_DIR_STRUC.rec_len]
|
|
||||||
test eax, eax
|
|
||||||
jz .zero_len
|
|
||||||
|
|
||||||
cmp [edi + EXT2_DIR_STRUC.inode], 0
|
|
||||||
je .unused_entry
|
|
||||||
|
|
||||||
; It's a used entry, so see if we can fit it between current one and next.
|
|
||||||
; Subtract the size used by the name and the structure from rec_len.
|
|
||||||
movzx ebx, [edi + EXT2_DIR_STRUC.name_len]
|
|
||||||
add ebx, 8 + 3
|
|
||||||
and ebx, 0xfffffffc ; Align it on the next 4-byte boundary.
|
|
||||||
|
|
||||||
sub eax, ebx
|
|
||||||
add edi, ebx
|
|
||||||
cmp eax, ecx
|
|
||||||
jb .next_iter
|
|
||||||
|
|
||||||
sub edi, ebx
|
|
||||||
mov [edi + EXT2_DIR_STRUC.rec_len], bx ; Make previous entry point to us.
|
|
||||||
add edi, ebx
|
|
||||||
|
|
||||||
mov [edi + EXT2_DIR_STRUC.rec_len], ax ; Make current entry point to next one.
|
|
||||||
jmp .found
|
|
||||||
|
|
||||||
.unused_entry:
|
|
||||||
; It's an unused inode.
|
|
||||||
cmp eax, ecx
|
|
||||||
jge .found
|
|
||||||
|
|
||||||
.next_iter:
|
|
||||||
add edi, eax
|
|
||||||
cmp edi, edx
|
|
||||||
jb @B
|
|
||||||
|
|
||||||
.not_found:
|
|
||||||
xor eax, eax
|
|
||||||
not eax
|
|
||||||
jmp .ret
|
|
||||||
|
|
||||||
; Zero length entry means we have the rest of the block for us.
|
|
||||||
.zero_len:
|
|
||||||
mov eax, edx
|
|
||||||
sub eax, edi
|
|
||||||
|
|
||||||
; Point to next block.
|
|
||||||
mov [edi + EXT2_DIR_STRUC.rec_len], ax
|
|
||||||
|
|
||||||
cmp eax, ecx
|
|
||||||
jge .fits
|
|
||||||
|
|
||||||
mov [edi + EXT2_DIR_STRUC.inode], 0
|
|
||||||
|
|
||||||
; It doesn't fit, but the block doesn't link to the next block.
|
|
||||||
xor eax, eax
|
|
||||||
inc eax
|
|
||||||
jmp .ret
|
|
||||||
|
|
||||||
.fits:
|
|
||||||
mov [edi + EXT2_DIR_STRUC.rec_len], cx
|
|
||||||
|
|
||||||
.found:
|
|
||||||
xor eax, eax
|
|
||||||
|
|
||||||
.ret:
|
|
||||||
pop edx ebx
|
|
||||||
ret
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Gets the block group's descriptor.
|
|
||||||
; Input: eax = block group.
|
|
||||||
; Output: eax = if zero, error; else, points to block group descriptor.
|
|
||||||
; [EXTFS.ext2_temp_block] contains relevant block.
|
|
||||||
; ebp = pointer to EXTFS.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_bg_read_desc:
|
|
||||||
push edx ebx
|
|
||||||
mov edx, 32
|
|
||||||
mul edx ; Get index of descriptor in global_desc_table.
|
|
||||||
|
|
||||||
; eax: block group descriptor offset relative to global descriptor table start
|
|
||||||
; Find the block this block descriptor is in.
|
|
||||||
div [ebp + EXTFS.block_size]
|
|
||||||
add eax, [ebp + EXTFS.superblock + EXT2_SB_STRUC.first_data_block]
|
|
||||||
inc eax
|
|
||||||
mov ebx, [ebp + EXTFS.ext2_temp_block]
|
|
||||||
call ext2_block_read
|
|
||||||
test eax, eax
|
|
||||||
jnz .fail
|
|
||||||
|
|
||||||
add ebx, edx ; edx: local index of descriptor inside block
|
|
||||||
mov eax, ebx
|
|
||||||
|
|
||||||
.return:
|
|
||||||
pop ebx edx
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fail:
|
|
||||||
xor eax, eax
|
|
||||||
jmp .return
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Writes a block group's descriptor.
|
|
||||||
; Input: eax = block group.
|
|
||||||
; [EXTFS.ext2_temp_data] contains the block relevant.
|
|
||||||
; ebp = pointer to EXTFS.
|
|
||||||
; Output: eax = error code.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_bg_write_desc:
|
|
||||||
push edx ebx
|
|
||||||
mov edx, 32
|
|
||||||
mul edx ; Get index of descriptor in global_desc_table.
|
|
||||||
|
|
||||||
; eax: block group descriptor offset relative to global descriptor table start
|
|
||||||
; Find the block this block descriptor is in.
|
|
||||||
div [ebp + EXTFS.block_size]
|
|
||||||
add eax, [ebp + EXTFS.superblock + EXT2_SB_STRUC.first_data_block]
|
|
||||||
inc eax
|
|
||||||
mov ebx, [ebp + EXTFS.ext2_temp_block]
|
|
||||||
call ext2_block_write
|
|
||||||
|
|
||||||
.return:
|
|
||||||
pop ebx edx
|
|
||||||
ret
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Gets the block group's block bitmap.
|
|
||||||
; Input: eax = block group.
|
|
||||||
; Output: eax = if zero, error; else, points to block group descriptor.
|
|
||||||
; ebx = block bitmap's block (hard disk).
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_bg_read_blk_bitmap:
|
|
||||||
push ecx
|
|
||||||
|
|
||||||
call ext2_bg_read_desc
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
|
|
||||||
mov ebx, [eax + EXT2_BLOCK_GROUP_DESC.block_bitmap] ; Block number of block group bitmap - in ext2 terms.
|
|
||||||
|
|
||||||
.return:
|
|
||||||
pop ecx
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fail:
|
|
||||||
xor eax, eax
|
|
||||||
jmp .return
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Updates superblock, plus backups.
|
|
||||||
; Input: ebp = pointer to EXTFS.
|
|
||||||
; Output: eax = error code.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_sb_update:
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov eax, 2
|
|
||||||
lea ebx, [ebp + EXTFS.superblock]
|
|
||||||
call fs_write32_sys
|
|
||||||
|
|
||||||
pop ebx
|
|
||||||
ret
|
|
File diff suppressed because it is too large
Load Diff
@ -1,673 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Contains ext2 structures, and macros. ;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2013-2015. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
$Revision$
|
|
||||||
|
|
||||||
|
|
||||||
; Future jobs for driver, in order of preference:
|
|
||||||
; * clean up existing extents support.
|
|
||||||
; * add b-tree directories support.
|
|
||||||
; * add long file support.
|
|
||||||
; * add journal support.
|
|
||||||
; * add minor features that come with ext3/4.
|
|
||||||
|
|
||||||
; Recommended move to some kernel-wide bitmap handling code (with a bit of abstraction, of course).
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Clears a bit.
|
|
||||||
; Input: eax = index into bitmap.
|
|
||||||
; [EXTFS.ext2_save_block] = address of bitmap.
|
|
||||||
; ebp = address of EXTFS.
|
|
||||||
; Output: Bit cleared.
|
|
||||||
; eax = non-zero, if already cleared.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
bitmap_clear_bit:
|
|
||||||
push ebx ecx edx
|
|
||||||
|
|
||||||
xor edx, edx
|
|
||||||
mov ecx, 8
|
|
||||||
div ecx
|
|
||||||
|
|
||||||
add eax, [ebp + EXTFS.ext2_save_block]
|
|
||||||
|
|
||||||
; Get the mask.
|
|
||||||
mov ebx, 1
|
|
||||||
mov ecx, edx
|
|
||||||
shl ebx, cl
|
|
||||||
|
|
||||||
test [eax], ebx
|
|
||||||
jz .cleared
|
|
||||||
|
|
||||||
not ebx
|
|
||||||
and [eax], ebx
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
.return:
|
|
||||||
pop edx ecx ebx
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Already cleared.
|
|
||||||
.cleared:
|
|
||||||
xor eax, eax
|
|
||||||
not eax
|
|
||||||
jmp .return
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Finds free bit in the bitmap.
|
|
||||||
; Input: ecx = number of bits in the bitmap.
|
|
||||||
; [EXTFS.ext2_save_block] = address of bitmap.
|
|
||||||
; ebp = address of EXTFS.
|
|
||||||
; Output: eax = index of free bit in the bitmap; marked set.
|
|
||||||
; 0xFFFFFFFF if no free bit found.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_find_free_bit:
|
|
||||||
bitmap_find_free_bit:
|
|
||||||
push esi ebx ecx edx
|
|
||||||
mov esi, [ebp + EXTFS.ext2_save_block]
|
|
||||||
|
|
||||||
; Get total DWORDS in eax; total bits in last dword, if any, in edx.
|
|
||||||
xor edx, edx
|
|
||||||
mov eax, ecx
|
|
||||||
mov ecx, 32
|
|
||||||
div ecx
|
|
||||||
|
|
||||||
mov ecx, eax
|
|
||||||
xor eax, eax
|
|
||||||
push edx
|
|
||||||
|
|
||||||
test ecx, ecx
|
|
||||||
jz .last_bits
|
|
||||||
|
|
||||||
; Check in the DWORDS.
|
|
||||||
.dwords:
|
|
||||||
mov ebx, [esi]
|
|
||||||
not ebx
|
|
||||||
|
|
||||||
bsf edx, ebx
|
|
||||||
|
|
||||||
; If 0, then the original value would be 0xFFFFFFFF, hence no free bits.
|
|
||||||
jz @F
|
|
||||||
|
|
||||||
; We found the value. Let's return with it.
|
|
||||||
add esp, 4
|
|
||||||
|
|
||||||
add eax, edx
|
|
||||||
jmp .return
|
|
||||||
|
|
||||||
@@:
|
|
||||||
add esi, 4
|
|
||||||
add eax, 32
|
|
||||||
loop .dwords
|
|
||||||
|
|
||||||
.last_bits:
|
|
||||||
; Check in the last few bits.
|
|
||||||
pop ecx
|
|
||||||
test ecx, ecx
|
|
||||||
jz @F
|
|
||||||
|
|
||||||
mov ebx, [esi]
|
|
||||||
not ebx
|
|
||||||
bsf ebx, edx
|
|
||||||
|
|
||||||
; If 0, no free bits.
|
|
||||||
jz @F
|
|
||||||
|
|
||||||
; If free bit is greater than the last known bit, then error.
|
|
||||||
cmp edx, ecx
|
|
||||||
jg @F
|
|
||||||
|
|
||||||
add eax, edx
|
|
||||||
jmp .return
|
|
||||||
|
|
||||||
@@:
|
|
||||||
; Didn't find any free bits.
|
|
||||||
xor eax, eax
|
|
||||||
not eax
|
|
||||||
jmp @F
|
|
||||||
|
|
||||||
.return:
|
|
||||||
mov ecx, edx
|
|
||||||
mov edx, 1
|
|
||||||
shl edx, cl
|
|
||||||
or [esi], edx
|
|
||||||
|
|
||||||
@@:
|
|
||||||
pop edx ecx ebx esi
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Recommended move to some kernel-wide string handling code.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Find the length of a string.
|
|
||||||
; Input: esi = source.
|
|
||||||
; Output: length in ecx
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
strlen:
|
|
||||||
push eax esi
|
|
||||||
xor ecx, ecx
|
|
||||||
|
|
||||||
@@:
|
|
||||||
lodsb
|
|
||||||
test al, al
|
|
||||||
jz .ret
|
|
||||||
|
|
||||||
inc ecx
|
|
||||||
jmp @B
|
|
||||||
|
|
||||||
.ret:
|
|
||||||
pop esi eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Convert UTF-8 string to ASCII-string (codepage 866)
|
|
||||||
; Input: esi = source.
|
|
||||||
; edi = buffer.
|
|
||||||
; ecx = length of source.
|
|
||||||
; Output: destroys eax, esi, edi
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
utf8_to_cp866:
|
|
||||||
; Check for zero-length string.
|
|
||||||
jecxz .return
|
|
||||||
|
|
||||||
.start:
|
|
||||||
lodsw
|
|
||||||
cmp al, 0x80
|
|
||||||
jb .ascii
|
|
||||||
|
|
||||||
xchg al, ah ; Big-endian.
|
|
||||||
cmp ax, 0xd080
|
|
||||||
jz .yo1
|
|
||||||
|
|
||||||
cmp ax, 0xd191
|
|
||||||
jz .yo2
|
|
||||||
|
|
||||||
cmp ax, 0xd090
|
|
||||||
jb .unk
|
|
||||||
|
|
||||||
cmp ax, 0xd180
|
|
||||||
jb .rus1
|
|
||||||
|
|
||||||
cmp ax, 0xd190
|
|
||||||
jb .rus2
|
|
||||||
|
|
||||||
.unk:
|
|
||||||
mov al, '_'
|
|
||||||
jmp .doit
|
|
||||||
|
|
||||||
.yo1:
|
|
||||||
mov al, 0xf0 ; Ё capital.
|
|
||||||
jmp .doit
|
|
||||||
|
|
||||||
.yo2:
|
|
||||||
mov al, 0xf1 ; ё small.
|
|
||||||
jmp .doit
|
|
||||||
|
|
||||||
.rus1:
|
|
||||||
sub ax, 0xd090 - 0x80
|
|
||||||
jmp .doit
|
|
||||||
|
|
||||||
.rus2:
|
|
||||||
sub ax, 0xd18f - 0xEF
|
|
||||||
|
|
||||||
.doit:
|
|
||||||
stosb
|
|
||||||
sub ecx, 2
|
|
||||||
ja .start
|
|
||||||
ret
|
|
||||||
|
|
||||||
.ascii:
|
|
||||||
stosb
|
|
||||||
dec esi
|
|
||||||
dec ecx
|
|
||||||
jnz .start
|
|
||||||
|
|
||||||
.return:
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Recommended move to some kernel-wide time handling code.
|
|
||||||
|
|
||||||
; Total cumulative seconds till each month.
|
|
||||||
cumulative_seconds_in_month:
|
|
||||||
.january: dd 0 * (60 * 60 * 24)
|
|
||||||
.february: dd 31 * (60 * 60 * 24)
|
|
||||||
.march: dd 59 * (60 * 60 * 24)
|
|
||||||
.april: dd 90 * (60 * 60 * 24)
|
|
||||||
.may: dd 120 * (60 * 60 * 24)
|
|
||||||
.june: dd 151 * (60 * 60 * 24)
|
|
||||||
.july: dd 181 * (60 * 60 * 24)
|
|
||||||
.august: dd 212 * (60 * 60 * 24)
|
|
||||||
.september: dd 243 * (60 * 60 * 24)
|
|
||||||
.october: dd 273 * (60 * 60 * 24)
|
|
||||||
.november: dd 304 * (60 * 60 * 24)
|
|
||||||
.december: dd 334 * (60 * 60 * 24)
|
|
||||||
|
|
||||||
current_bdfe_time:
|
|
||||||
dd 0
|
|
||||||
current_bdfe_date:
|
|
||||||
dd 0
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Stores current unix time.
|
|
||||||
; Input: edi = buffer to output Unix time.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
current_unix_time:
|
|
||||||
push eax esi
|
|
||||||
mov esi, current_bdfe_time
|
|
||||||
|
|
||||||
; Just a small observation:
|
|
||||||
; The CMOS is a pretty bad source to get time from. One shouldn't rely on it,
|
|
||||||
; since it messes up the time by tiny bits. Of course, this is all technical,
|
|
||||||
; but one can look it up on the osdev wiki. What is better is to get the time
|
|
||||||
; from CMOS during boot, then update system time using a more accurate timer.
|
|
||||||
; I'll probably add that after the Summer of Code, so TODO! TODO! TODO!.
|
|
||||||
|
|
||||||
; Get time from CMOS.
|
|
||||||
; Seconds.
|
|
||||||
mov al, 0x00
|
|
||||||
out 0x70, al
|
|
||||||
in al, 0x71
|
|
||||||
call bcd2bin
|
|
||||||
mov [esi + 0], al
|
|
||||||
|
|
||||||
; Minute.
|
|
||||||
mov al, 0x02
|
|
||||||
out 0x70, al
|
|
||||||
in al, 0x71
|
|
||||||
call bcd2bin
|
|
||||||
mov [esi + 1], al
|
|
||||||
|
|
||||||
; Hour.
|
|
||||||
mov al, 0x04
|
|
||||||
out 0x70, al
|
|
||||||
in al, 0x71
|
|
||||||
call bcd2bin
|
|
||||||
mov [esi + 2], al
|
|
||||||
|
|
||||||
; Get date.
|
|
||||||
|
|
||||||
; Day.
|
|
||||||
mov al, 0x7
|
|
||||||
out 0x70, al
|
|
||||||
in al, 0x71
|
|
||||||
call bcd2bin
|
|
||||||
mov [esi + 4], al
|
|
||||||
|
|
||||||
; Month.
|
|
||||||
mov al, 0x8
|
|
||||||
out 0x70, al
|
|
||||||
in al, 0x71
|
|
||||||
call bcd2bin
|
|
||||||
mov [esi + 5], al
|
|
||||||
|
|
||||||
; Year.
|
|
||||||
mov al, 0x9
|
|
||||||
out 0x70, al
|
|
||||||
in al, 0x71
|
|
||||||
call bcd2bin
|
|
||||||
add ax, 2000 ; CMOS only returns last two digits.
|
|
||||||
; Note that everywhere in KolibriOS this is used.
|
|
||||||
; This is hacky, since the RTC can be incorrectly set
|
|
||||||
; to something before 2000.
|
|
||||||
mov [esi + 6], ax
|
|
||||||
|
|
||||||
call bdfe_to_unix_time
|
|
||||||
pop esi eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Convert time+date from BDFE to Unix time.
|
|
||||||
; Input: esi = pointer to BDFE time+date.
|
|
||||||
; edi = buffer to output Unix time.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
bdfe_to_unix_time:
|
|
||||||
push eax ebx ecx edx
|
|
||||||
mov dword[edi], 0x00000000
|
|
||||||
|
|
||||||
; The minimum representable time is 1901-12-13.
|
|
||||||
cmp word[esi + 6], 1901
|
|
||||||
jb .ret
|
|
||||||
jg .max
|
|
||||||
|
|
||||||
cmp byte[esi + 5], 12
|
|
||||||
jb .ret
|
|
||||||
|
|
||||||
cmp byte[esi + 4], 13
|
|
||||||
jbe .ret
|
|
||||||
jg .convert
|
|
||||||
|
|
||||||
; Check if it is more than the maximum representable time.
|
|
||||||
.max:
|
|
||||||
; The maximum representable time is 2038-01-19.
|
|
||||||
cmp word[esi + 6], 2038
|
|
||||||
jg .ret
|
|
||||||
jb .convert
|
|
||||||
|
|
||||||
cmp byte[esi + 5], 1
|
|
||||||
jg .ret
|
|
||||||
|
|
||||||
cmp byte[esi + 4], 19
|
|
||||||
jge .ret
|
|
||||||
|
|
||||||
; Convert the time.
|
|
||||||
.convert:
|
|
||||||
; Get if current year is leap year in ECX.
|
|
||||||
xor ecx, ecx
|
|
||||||
mov ebx, 4
|
|
||||||
xor edx, edx
|
|
||||||
|
|
||||||
cmp word[esi + 6], 1970
|
|
||||||
jb .negative
|
|
||||||
|
|
||||||
movzx eax, word[esi + 6] ; Year.
|
|
||||||
cmp byte[esi + 5], 3 ; If the month is less than March, than that year doesn't matter.
|
|
||||||
jge @F
|
|
||||||
|
|
||||||
test eax, 3
|
|
||||||
; Not a leap year.
|
|
||||||
jnz @F
|
|
||||||
|
|
||||||
inc ecx
|
|
||||||
@@:
|
|
||||||
; Number of leap years between two years = ((end date - 1)/4) - (1970/4)
|
|
||||||
dec eax
|
|
||||||
div ebx
|
|
||||||
sub eax, 1970/4
|
|
||||||
|
|
||||||
; EAX is the number of leap years.
|
|
||||||
add eax, ecx
|
|
||||||
mov ecx, (60 * 60 * 24) ; Seconds in a day.
|
|
||||||
mul ecx
|
|
||||||
|
|
||||||
; Account for leap years, i.e., one day extra for each.
|
|
||||||
add [edi], eax
|
|
||||||
|
|
||||||
; Get total days in EAX.
|
|
||||||
movzx eax, byte[esi + 4]
|
|
||||||
dec eax
|
|
||||||
mul ecx
|
|
||||||
|
|
||||||
; Account for days.
|
|
||||||
add [edi], eax
|
|
||||||
|
|
||||||
; Account for month.
|
|
||||||
movzx eax, byte[esi + 5]
|
|
||||||
dec eax
|
|
||||||
mov eax, [cumulative_seconds_in_month + (eax * 4)]
|
|
||||||
add [edi], eax
|
|
||||||
|
|
||||||
; Account for year.
|
|
||||||
movzx eax, word[esi + 6]
|
|
||||||
sub eax, 1970
|
|
||||||
mov ecx, (60 * 60 * 24) * 365 ; Seconds in a year.
|
|
||||||
mul ecx
|
|
||||||
add [edi], eax
|
|
||||||
|
|
||||||
; Seconds.
|
|
||||||
movzx eax, byte[esi + 0]
|
|
||||||
add [edi], eax
|
|
||||||
|
|
||||||
; Minutes.
|
|
||||||
movzx eax, byte[esi + 1]
|
|
||||||
mov ecx, 60
|
|
||||||
mul ecx
|
|
||||||
add [edi], eax
|
|
||||||
|
|
||||||
; Hours.
|
|
||||||
movzx eax, byte[esi + 2]
|
|
||||||
mov ecx, (60 * 60)
|
|
||||||
mul ecx
|
|
||||||
add [edi], eax
|
|
||||||
|
|
||||||
; The time wanted is before the epoch; handle it here.
|
|
||||||
.negative:
|
|
||||||
; TODO.
|
|
||||||
|
|
||||||
.ret:
|
|
||||||
pop edx ecx ebx eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Recommended move to some kernel-wide alloc handling code.
|
|
||||||
macro KERNEL_ALLOC store, label
|
|
||||||
{
|
|
||||||
call kernel_alloc
|
|
||||||
mov store, eax
|
|
||||||
test eax, eax
|
|
||||||
jz label
|
|
||||||
}
|
|
||||||
|
|
||||||
macro KERNEL_FREE data, label
|
|
||||||
{
|
|
||||||
cmp data, 0
|
|
||||||
jz label
|
|
||||||
push data
|
|
||||||
call kernel_free
|
|
||||||
}
|
|
||||||
|
|
||||||
struct EXTFS PARTITION
|
|
||||||
lock MUTEX
|
|
||||||
partition_flags dd ?
|
|
||||||
log_block_size dd ?
|
|
||||||
block_size dd ?
|
|
||||||
count_block_in_block dd ?
|
|
||||||
blocks_per_group dd ?
|
|
||||||
global_desc_table dd ?
|
|
||||||
root_inode dd ? ; Pointer to root inode in memory.
|
|
||||||
inode_size dd ?
|
|
||||||
count_pointer_in_block dd ? ; (block_size / 4)
|
|
||||||
count_pointer_in_block_square dd ? ; (block_size / 4)**2
|
|
||||||
ext2_save_block dd ? ; Block for 1 global procedure.
|
|
||||||
ext2_temp_block dd ? ; Block for small procedures.
|
|
||||||
ext2_save_inode dd ? ; inode for global procedures.
|
|
||||||
ext2_temp_inode dd ? ; inode for small procedures.
|
|
||||||
groups_count dd ?
|
|
||||||
superblock rd 1024/4
|
|
||||||
ends
|
|
||||||
|
|
||||||
; EXT2 revisions.
|
|
||||||
EXT2_GOOD_OLD_REV = 0
|
|
||||||
|
|
||||||
; For fs_type.
|
|
||||||
FS_TYPE_UNDEFINED = 0
|
|
||||||
FS_TYPE_EXT = 2
|
|
||||||
|
|
||||||
; Some set inodes.
|
|
||||||
EXT2_BAD_INO = 1
|
|
||||||
EXT2_ROOT_INO = 2
|
|
||||||
EXT2_ACL_IDX_INO = 3
|
|
||||||
EXT2_ACL_DATA_INO = 4
|
|
||||||
EXT2_BOOT_LOADER_INO = 5
|
|
||||||
EXT2_UNDEL_DIR_INO = 6
|
|
||||||
|
|
||||||
; EXT2_SUPER_MAGIC.
|
|
||||||
EXT2_SUPER_MAGIC = 0xEF53
|
|
||||||
EXT2_VALID_FS = 1
|
|
||||||
|
|
||||||
; Flags defining i_mode values.
|
|
||||||
EXT2_S_IFMT = 0xF000 ; Mask for file type.
|
|
||||||
|
|
||||||
EXT2_S_IFREG = 0x8000 ; Regular file.
|
|
||||||
EXT2_S_IFDIR = 0x4000 ; Directory.
|
|
||||||
|
|
||||||
EXT2_S_IRUSR = 0x0100 ; User read
|
|
||||||
EXT2_S_IWUSR = 0x0080 ; User write
|
|
||||||
EXT2_S_IXUSR = 0x0040 ; User execute
|
|
||||||
EXT2_S_IRGRP = 0x0020 ; Group read
|
|
||||||
EXT2_S_IWGRP = 0x0010 ; Group write
|
|
||||||
EXT2_S_IXGRP = 0x0008 ; Group execute
|
|
||||||
EXT2_S_IROTH = 0x0004 ; Others read
|
|
||||||
EXT2_S_IWOTH = 0x0002 ; Others write
|
|
||||||
EXT2_S_IXOTH = 0x0001 ; Others execute
|
|
||||||
|
|
||||||
PERMISSIONS = EXT2_S_IRUSR or EXT2_S_IWUSR \
|
|
||||||
or EXT2_S_IRGRP or EXT2_S_IWGRP \
|
|
||||||
or EXT2_S_IROTH or EXT2_S_IWOTH
|
|
||||||
|
|
||||||
; File type defining values in directory entry.
|
|
||||||
EXT2_FT_REG_FILE = 1 ; Regular file.
|
|
||||||
EXT2_FT_DIR = 2 ; Directory.
|
|
||||||
|
|
||||||
; Flags used by KolibriOS.
|
|
||||||
FS_FT_HIDDEN = 2
|
|
||||||
FS_FT_DIR = 0x10 ; Directory.
|
|
||||||
|
|
||||||
; ext2 partition flags.
|
|
||||||
EXT2_RO = 0x01
|
|
||||||
|
|
||||||
FS_FT_ASCII = 0 ; Name in ASCII.
|
|
||||||
FS_FT_UNICODE = 1 ; Name in Unicode.
|
|
||||||
|
|
||||||
EXT2_FEATURE_INCOMPAT_FILETYPE = 0x0002 ; Have file type in directory entry.
|
|
||||||
EXT4_FEATURE_INCOMPAT_EXTENTS = 0x0040 ; Extents.
|
|
||||||
EXT4_FEATURE_INCOMPAT_FLEX_BG = 0x0200 ; Flexible block groups.
|
|
||||||
|
|
||||||
EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER = 0x0001 ; Sparse Superblock
|
|
||||||
EXT2_FEATURE_RO_COMPAT_LARGE_FILE = 0x0002 ; Large file support (64-bit file size)
|
|
||||||
|
|
||||||
; Implemented ext[2,3,4] features.
|
|
||||||
EXT4_FEATURE_INCOMPAT_SUPP = EXT2_FEATURE_INCOMPAT_FILETYPE \
|
|
||||||
or EXT4_FEATURE_INCOMPAT_EXTENTS \
|
|
||||||
or EXT4_FEATURE_INCOMPAT_FLEX_BG
|
|
||||||
|
|
||||||
; Implemented features which otherwise require "read-only" mount.
|
|
||||||
EXT2_FEATURE_RO_COMPAT_SUPP = EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER \
|
|
||||||
or EXT2_FEATURE_RO_COMPAT_LARGE_FILE
|
|
||||||
|
|
||||||
; ext4 features not support for write.
|
|
||||||
EXT4_FEATURE_INCOMPAT_W_NOT_SUPP = EXT4_FEATURE_INCOMPAT_EXTENTS \
|
|
||||||
or EXT4_FEATURE_INCOMPAT_FLEX_BG
|
|
||||||
|
|
||||||
; Flags specified in i_flags.
|
|
||||||
EXT2_EXTENTS_FL = 0x00080000 ; Extents.
|
|
||||||
|
|
||||||
struct EXT2_INODE_STRUC
|
|
||||||
i_mode dw ?
|
|
||||||
i_uid dw ?
|
|
||||||
i_size dd ?
|
|
||||||
i_atime dd ?
|
|
||||||
i_ctime dd ?
|
|
||||||
i_mtime dd ?
|
|
||||||
i_dtime dd ?
|
|
||||||
i_gid dw ?
|
|
||||||
i_links_count dw ?
|
|
||||||
i_blocks dd ?
|
|
||||||
i_flags dd ?
|
|
||||||
i_osd1 dd ?
|
|
||||||
i_block rd 15
|
|
||||||
i_generation dd ?
|
|
||||||
i_file_acl dd ?
|
|
||||||
i_dir_acl dd ?
|
|
||||||
i_faddr dd ?
|
|
||||||
i_osd2 dd ? ; 12 bytes.
|
|
||||||
ends
|
|
||||||
|
|
||||||
struct EXT2_DIR_STRUC
|
|
||||||
inode dd ?
|
|
||||||
rec_len dw ?
|
|
||||||
name_len db ?
|
|
||||||
file_type db ?
|
|
||||||
name db ? ; 255 (max) bytes.
|
|
||||||
ends
|
|
||||||
|
|
||||||
struct EXT2_BLOCK_GROUP_DESC
|
|
||||||
block_bitmap dd ? ; +0
|
|
||||||
inode_bitmap dd ? ; +4
|
|
||||||
inode_table dd ? ; +8
|
|
||||||
free_blocks_count dw ? ; +12
|
|
||||||
free_inodes_count dw ? ; +14
|
|
||||||
used_dirs_count dw ? ; +16
|
|
||||||
pad dw ? ; +18
|
|
||||||
reserved rb 12 ; +20
|
|
||||||
ends
|
|
||||||
|
|
||||||
struct EXT2_SB_STRUC
|
|
||||||
inodes_count dd ? ; +0
|
|
||||||
blocks_count dd ? ; +4
|
|
||||||
r_block_count dd ? ; +8
|
|
||||||
free_block_count dd ? ; +12
|
|
||||||
free_inodes_count dd ? ; +16
|
|
||||||
first_data_block dd ? ; +20
|
|
||||||
log_block_size dd ? ; +24
|
|
||||||
log_frag_size dd ? ; +28
|
|
||||||
blocks_per_group dd ? ; +32
|
|
||||||
frags_per_group dd ? ; +36
|
|
||||||
inodes_per_group dd ? ; +40
|
|
||||||
mtime dd ? ; +44
|
|
||||||
wtime dd ? ; +48
|
|
||||||
mnt_count dw ? ; +52
|
|
||||||
max_mnt_count dw ? ; +54
|
|
||||||
magic dw ? ; +56
|
|
||||||
state dw ? ; +58
|
|
||||||
errors dw ? ; +60
|
|
||||||
minor_rev_level dw ? ; +62
|
|
||||||
lastcheck dd ? ; +64
|
|
||||||
check_intervals dd ? ; +68
|
|
||||||
creator_os dd ? ; +72
|
|
||||||
rev_level dd ? ; +76
|
|
||||||
def_resuid dw ? ; +80
|
|
||||||
def_resgid dw ? ; +82
|
|
||||||
first_ino dd ? ; +84
|
|
||||||
inode_size dw ? ; +88
|
|
||||||
block_group_nr dw ? ; +90
|
|
||||||
feature_compat dd ? ; +92
|
|
||||||
feature_incompat dd ? ; +96
|
|
||||||
feature_ro_compat dd ? ; +100
|
|
||||||
uuid rb 16 ; +104
|
|
||||||
volume_name rb 16 ; +120
|
|
||||||
last_mounted rb 64 ; +136
|
|
||||||
algo_bitmap dd ? ; +200
|
|
||||||
prealloc_blocks db ? ; +204
|
|
||||||
preallock_dir_blocks db ? ; +205
|
|
||||||
reserved_gdt_blocks dw ? ; +206
|
|
||||||
journal_uuid rb 16 ; +208
|
|
||||||
journal_inum dd ? ; +224
|
|
||||||
journal_dev dd ? ; +228
|
|
||||||
last_orphan dd ? ; +232
|
|
||||||
hash_seed rd 4 ; +236
|
|
||||||
def_hash_version db ? ; +252
|
|
||||||
reserved rb 3 ; +253 (reserved)
|
|
||||||
default_mount_options dd ? ; +256
|
|
||||||
first_meta_bg dd ? ; +260
|
|
||||||
mkfs_time dd ? ; +264
|
|
||||||
jnl_blocks rd 17 ; +268
|
|
||||||
blocks_count_hi dd ? ; +336
|
|
||||||
r_blocks_count_hi dd ? ; +340
|
|
||||||
free_blocks_count_hi dd ? ; +344
|
|
||||||
min_extra_isize dw ? ; +348
|
|
||||||
want_extra_isize dw ? ; +350
|
|
||||||
flags dd ? ; +352
|
|
||||||
raid_stride dw ? ; +356
|
|
||||||
mmp_interval dw ? ; +358
|
|
||||||
mmp_block dq ? ; +360
|
|
||||||
raid_stripe_width dd ? ; +368
|
|
||||||
log_groups_per_flex db ? ; +372
|
|
||||||
ends
|
|
||||||
|
|
||||||
; Header block extents.
|
|
||||||
struct EXT4_EXTENT_HEADER
|
|
||||||
eh_magic dw ? ; Magic value of 0xF30A, for ext4.
|
|
||||||
eh_entries dw ? ; Number of blocks covered by the extent.
|
|
||||||
eh_max dw ? ; Capacity of entries.
|
|
||||||
eh_depth dw ? ; Tree depth (if 0, extents in the array are not extent indexes)
|
|
||||||
eh_generation dd ? ; ???
|
|
||||||
ends
|
|
||||||
|
|
||||||
; Extent.
|
|
||||||
struct EXT4_EXTENT
|
|
||||||
ee_block dd ? ; First logical block extent covers.
|
|
||||||
ee_len dw ? ; Number of blocks covered by extent.
|
|
||||||
ee_start_hi dw ? ; Upper 16 bits of 48-bit address (unused in KOS)
|
|
||||||
ee_start_lo dd ? ; Lower 32 bits of 48-bit address.
|
|
||||||
ends
|
|
||||||
|
|
||||||
; Index on-disk structure; pointer to block of extents/indexes.
|
|
||||||
struct EXT4_EXTENT_IDX
|
|
||||||
ei_block dd ? ; Covers logical blocks from here.
|
|
||||||
ei_leaf_lo dd ? ; Lower 32-bits of pointer to the physical block of the next level.
|
|
||||||
ei_leaf_hi dw ? ; Higher 16-bits (unused in KOS).
|
|
||||||
ei_unused dw ? ; Reserved.
|
|
||||||
ends
|
|
File diff suppressed because it is too large
Load Diff
@ -1,226 +0,0 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; ;;
|
|
||||||
;; Contains common resource allocation + freeing code. ;;
|
|
||||||
;; ;;
|
|
||||||
;; Copyright (C) KolibriOS team 2013-2015. All rights reserved. ;;
|
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
|
||||||
;; ;;
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
$Revision$
|
|
||||||
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Frees a resource (block/inode).
|
|
||||||
; Input: eax = resource ID.
|
|
||||||
; edi = function pointer of ext2_bg_*_bitmap form, to
|
|
||||||
; get bitmap of resource.
|
|
||||||
; ecx = 0, block; 1, inode.
|
|
||||||
; ebp = pointer to EXTFS.
|
|
||||||
; Output: Block marked as free in block group.
|
|
||||||
; eax = error code.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_resource_free:
|
|
||||||
push ebx edx esi
|
|
||||||
|
|
||||||
; Get block group.
|
|
||||||
sub eax, [ebp + EXTFS.superblock + EXT2_SB_STRUC.first_data_block]
|
|
||||||
xor edx, edx
|
|
||||||
div [ebp + EXTFS.superblock + EXT2_SB_STRUC.blocks_per_group]
|
|
||||||
push eax edx
|
|
||||||
|
|
||||||
call edi
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
mov esi, eax
|
|
||||||
|
|
||||||
; Read the bitmap.
|
|
||||||
mov eax, ebx
|
|
||||||
mov edx, eax
|
|
||||||
mov ebx, [ebp + EXTFS.ext2_save_block]
|
|
||||||
call ext2_block_read
|
|
||||||
test eax, eax
|
|
||||||
jnz .fail
|
|
||||||
|
|
||||||
pop eax
|
|
||||||
; Mark bit free.
|
|
||||||
call bitmap_clear_bit
|
|
||||||
test eax, eax
|
|
||||||
jz @F
|
|
||||||
|
|
||||||
; No need to save anything.
|
|
||||||
xor eax, eax
|
|
||||||
|
|
||||||
add esp, 4
|
|
||||||
jmp .return
|
|
||||||
|
|
||||||
@@:
|
|
||||||
mov eax, edx
|
|
||||||
mov ebx, [ebp + EXTFS.ext2_save_block]
|
|
||||||
call ext2_block_write
|
|
||||||
test eax, eax
|
|
||||||
jnz .fail
|
|
||||||
|
|
||||||
; Read the descriptor.
|
|
||||||
mov eax, [esp]
|
|
||||||
call ext2_bg_read_desc
|
|
||||||
test eax, eax
|
|
||||||
jz .fail_bg_desc_read
|
|
||||||
|
|
||||||
lea eax, [eax + EXT2_BLOCK_GROUP_DESC.free_blocks_count]
|
|
||||||
shl ecx, 1
|
|
||||||
add eax, ecx
|
|
||||||
inc word[eax]
|
|
||||||
|
|
||||||
lea eax, [ebp + EXTFS.superblock + EXT2_SB_STRUC.free_block_count]
|
|
||||||
shl ecx, 1
|
|
||||||
add eax, ecx
|
|
||||||
inc dword[eax]
|
|
||||||
|
|
||||||
pop eax
|
|
||||||
call ext2_bg_write_desc
|
|
||||||
|
|
||||||
.return:
|
|
||||||
pop esi edx ebx
|
|
||||||
ret
|
|
||||||
|
|
||||||
.fail:
|
|
||||||
add esp, 4
|
|
||||||
.fail_bg_desc_read:
|
|
||||||
add esp, 4
|
|
||||||
xor eax, eax
|
|
||||||
not eax
|
|
||||||
jmp .return
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
; Allocates a resource.
|
|
||||||
; Input: eax = inode ID for "preference".
|
|
||||||
; ebp = pointer to EXTFS.
|
|
||||||
; [esp + 4], func pointer to ext2_bg_*_bitmap
|
|
||||||
; [esp + 8], pointer to free_*_count in SB.
|
|
||||||
; [esp + 12], *_per_group
|
|
||||||
; [esp + 16], offset to free_*_count in bg descriptor.
|
|
||||||
; [esp + 20], *_count
|
|
||||||
; Output: Resource marked as set in block group.
|
|
||||||
; eax = error code.
|
|
||||||
; ebx = resource ID.
|
|
||||||
;---------------------------------------------------------------------
|
|
||||||
ext2_resource_alloc:
|
|
||||||
; Block allocation is a pretty serious area, since bad allocation
|
|
||||||
; can lead to fragmentation. Thus, the best way to allocate that
|
|
||||||
; comes to mind is to allocate around an inode as much as possible.
|
|
||||||
; On the other hand, this isn't about a single inode/file/directory,
|
|
||||||
; and focusing just around the preferred inode would lead to
|
|
||||||
; congestion. Thus, after much thought, the chosen allocation algorithm
|
|
||||||
; is to search forward, then backward.
|
|
||||||
push ecx edx esi edi
|
|
||||||
|
|
||||||
cmp dword[esp + 16 + 8], 0
|
|
||||||
jnz @F
|
|
||||||
|
|
||||||
; No free blocks.
|
|
||||||
xor eax, eax
|
|
||||||
not eax
|
|
||||||
pop edi esi edx ecx
|
|
||||||
ret 20
|
|
||||||
|
|
||||||
@@:
|
|
||||||
; Calculate which block group the preferred inode belongs to.
|
|
||||||
dec eax
|
|
||||||
xor edx, edx
|
|
||||||
|
|
||||||
; EAX = block group.
|
|
||||||
div [ebp + EXTFS.superblock + EXT2_SB_STRUC.inodes_per_group]
|
|
||||||
push eax
|
|
||||||
push eax
|
|
||||||
|
|
||||||
mov edi, .forward
|
|
||||||
|
|
||||||
.test_block_group:
|
|
||||||
call dword[esp + 16 + 8 + 4]
|
|
||||||
test eax, eax
|
|
||||||
jz .fail
|
|
||||||
mov esi, eax
|
|
||||||
|
|
||||||
mov eax, ebx
|
|
||||||
mov edx, eax
|
|
||||||
mov ebx, [ebp + EXTFS.ext2_save_block]
|
|
||||||
call ext2_block_read
|
|
||||||
test eax, eax
|
|
||||||
jnz .fail
|
|
||||||
|
|
||||||
mov ecx, [esp + 16 + 8 + 12]
|
|
||||||
call ext2_find_free_bit
|
|
||||||
cmp eax, 0xFFFFFFFF
|
|
||||||
jne @F
|
|
||||||
|
|
||||||
mov eax, edi
|
|
||||||
jmp eax
|
|
||||||
|
|
||||||
@@:
|
|
||||||
mov ecx, eax
|
|
||||||
|
|
||||||
mov eax, edx
|
|
||||||
mov ebx, [ebp + EXTFS.ext2_save_block]
|
|
||||||
call ext2_block_write
|
|
||||||
test eax, eax
|
|
||||||
jnz .fail
|
|
||||||
|
|
||||||
; ecx: the index of the matched entry.
|
|
||||||
; [esp]: block group where we found.
|
|
||||||
; [esp + 4]: starting block group.
|
|
||||||
; esi: block group descriptor.
|
|
||||||
mov eax, [esp] ; Index of block group in which we found.
|
|
||||||
mul dword[esp + 16 + 8 + 12]
|
|
||||||
add eax, ecx
|
|
||||||
mov ebx, eax
|
|
||||||
|
|
||||||
mov eax, [esp + 16 + 8 + 8]
|
|
||||||
dec dword[eax]
|
|
||||||
|
|
||||||
mov eax, esi
|
|
||||||
add eax, [esp + 16 + 8 + 16]
|
|
||||||
dec word[eax]
|
|
||||||
|
|
||||||
pop eax
|
|
||||||
call ext2_bg_write_desc
|
|
||||||
|
|
||||||
add esp, 4
|
|
||||||
jmp .return
|
|
||||||
|
|
||||||
; Continue forward.
|
|
||||||
.forward:
|
|
||||||
inc dword[esp]
|
|
||||||
mov eax, [esp]
|
|
||||||
mul dword[esp + 16 + 8 + 12]
|
|
||||||
cmp eax, [esp + 16 + 8 + 20]
|
|
||||||
jbe @F
|
|
||||||
|
|
||||||
; We need to go backward.
|
|
||||||
mov eax, [esp + 4]
|
|
||||||
mov [esp], eax
|
|
||||||
mov edi, .backward
|
|
||||||
jmp .backward
|
|
||||||
|
|
||||||
@@:
|
|
||||||
mov eax, [esp]
|
|
||||||
jmp .test_block_group
|
|
||||||
|
|
||||||
; Continue backward.
|
|
||||||
.backward:
|
|
||||||
cmp dword[esp], 0
|
|
||||||
je .fail
|
|
||||||
|
|
||||||
dec dword[esp]
|
|
||||||
mov eax, [esp]
|
|
||||||
jmp .test_block_group
|
|
||||||
|
|
||||||
.return:
|
|
||||||
pop edi esi edx ecx
|
|
||||||
ret 20
|
|
||||||
|
|
||||||
.fail:
|
|
||||||
add esp, 8
|
|
||||||
xor eax, eax
|
|
||||||
not eax
|
|
||||||
jmp .return
|
|
142
kernel/trunk/fs/fs_common.inc
Normal file
142
kernel/trunk/fs/fs_common.inc
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||||
|
;; Distributed under terms of the GNU General Public License. ;;
|
||||||
|
;; ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
$Revision$
|
||||||
|
|
||||||
|
fsReadCMOS:
|
||||||
|
out 70h, al
|
||||||
|
in al, 71h
|
||||||
|
xor ah, ah
|
||||||
|
shl ax, 4
|
||||||
|
shr al, 4
|
||||||
|
aad
|
||||||
|
ret
|
||||||
|
|
||||||
|
fsGetTime:
|
||||||
|
mov al, 7
|
||||||
|
call fsReadCMOS
|
||||||
|
ror eax, 8
|
||||||
|
mov al, 8
|
||||||
|
call fsReadCMOS
|
||||||
|
ror eax, 8
|
||||||
|
mov al, 9
|
||||||
|
call fsReadCMOS
|
||||||
|
add eax, 2000
|
||||||
|
ror eax, 16
|
||||||
|
push eax
|
||||||
|
xor eax, eax
|
||||||
|
call fsReadCMOS
|
||||||
|
ror eax, 8
|
||||||
|
mov al, 2
|
||||||
|
call fsReadCMOS
|
||||||
|
ror eax, 8
|
||||||
|
mov al, 4
|
||||||
|
call fsReadCMOS
|
||||||
|
ror eax, 16
|
||||||
|
push eax
|
||||||
|
mov esi, esp
|
||||||
|
add esp, 8
|
||||||
|
fsCalculateTime:
|
||||||
|
; in: esi -> data block
|
||||||
|
; out: eax = seconds since 01.01.2001
|
||||||
|
movzx eax, word [esi+6]
|
||||||
|
sub eax, 2001
|
||||||
|
jnc @f
|
||||||
|
xor eax, eax
|
||||||
|
@@:
|
||||||
|
mov edx, months
|
||||||
|
mov ebx, eax
|
||||||
|
inc eax
|
||||||
|
test eax, 3
|
||||||
|
jnz @f
|
||||||
|
add edx, 12
|
||||||
|
@@:
|
||||||
|
movzx eax, byte [esi+5]
|
||||||
|
dec eax
|
||||||
|
xor ecx, ecx
|
||||||
|
@@:
|
||||||
|
dec eax
|
||||||
|
js @f
|
||||||
|
add cl, [edx+eax]
|
||||||
|
adc ch, 0
|
||||||
|
jmp @b
|
||||||
|
@@:
|
||||||
|
mov eax, ebx ; years
|
||||||
|
mov edx, 365
|
||||||
|
mul edx
|
||||||
|
shr ebx, 2
|
||||||
|
add eax, ebx
|
||||||
|
add eax, ecx
|
||||||
|
mov bl, [esi+4]
|
||||||
|
dec eax
|
||||||
|
add eax, ebx ; days
|
||||||
|
mov dl, 24
|
||||||
|
mul edx
|
||||||
|
mov bl, [esi+2]
|
||||||
|
add eax, ebx ; hours
|
||||||
|
mov ecx, 60
|
||||||
|
mul ecx
|
||||||
|
mov bl, [esi+1]
|
||||||
|
add eax, ebx ; minutes
|
||||||
|
mul ecx
|
||||||
|
mov bl, [esi]
|
||||||
|
add eax, ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
iglobal
|
||||||
|
months db 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
||||||
|
months2 db 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
||||||
|
endg
|
||||||
|
|
||||||
|
fsTime2bdfe:
|
||||||
|
; in: eax = seconds since 01.01.2001
|
||||||
|
; edi -> data block
|
||||||
|
; out: edi = edi+8
|
||||||
|
xor edx, edx
|
||||||
|
mov ecx, 60
|
||||||
|
div ecx
|
||||||
|
mov [edi], dl
|
||||||
|
xor edx, edx
|
||||||
|
div ecx
|
||||||
|
mov [edi+1], dl
|
||||||
|
xor edx, edx
|
||||||
|
mov cl, 24
|
||||||
|
div ecx
|
||||||
|
mov [edi+2], dx
|
||||||
|
xor edx, edx
|
||||||
|
mov cx, 365
|
||||||
|
div ecx
|
||||||
|
mov ebx, eax
|
||||||
|
add ebx, 2001
|
||||||
|
shr eax, 2
|
||||||
|
sub edx, eax
|
||||||
|
jns @f
|
||||||
|
dec ebx
|
||||||
|
add edx, 365
|
||||||
|
test ebx, 3
|
||||||
|
jnz @f
|
||||||
|
inc edx
|
||||||
|
@@:
|
||||||
|
xor eax, eax
|
||||||
|
mov ecx, months-1
|
||||||
|
test ebx, 3
|
||||||
|
jnz @f
|
||||||
|
add ecx, 12
|
||||||
|
@@:
|
||||||
|
inc ecx
|
||||||
|
inc eax
|
||||||
|
sub dl, [ecx]
|
||||||
|
jnc @b
|
||||||
|
dec dh
|
||||||
|
jns @b
|
||||||
|
add dl, [ecx]
|
||||||
|
inc edx
|
||||||
|
mov [edi+4], dl
|
||||||
|
mov [edi+5], al
|
||||||
|
mov [edi+6], bx
|
||||||
|
add edi, 8
|
||||||
|
ret
|
@ -1,7 +1,7 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License. ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
@ -965,3 +965,11 @@ get_full_file_name:
|
|||||||
jz .ret.ok
|
jz .ret.ok
|
||||||
mov byte [edi-1], '/'
|
mov byte [edi-1], '/'
|
||||||
jmp .set_copy_cont
|
jmp .set_copy_cont
|
||||||
|
|
||||||
|
include "parse_fn.inc"
|
||||||
|
include "fs_common.inc"
|
||||||
|
include "iso9660.inc" ; read for CD filesystem
|
||||||
|
include "fat.inc"
|
||||||
|
include "ntfs.inc"
|
||||||
|
include "ext.inc"
|
||||||
|
include "xfs.asm"
|
||||||
|
@ -1,13 +1,36 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License. ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
; NTFS driver
|
; NTFS external functions
|
||||||
|
; in:
|
||||||
|
; ebx -> parameter structure of sysfunc 70
|
||||||
|
; ebp -> NTFS structure
|
||||||
|
; [esi]+[[esp+4]] = name
|
||||||
|
; out:
|
||||||
|
; eax, ebx = return values for sysfunc 70
|
||||||
|
iglobal
|
||||||
|
align 4
|
||||||
|
ntfs_user_functions:
|
||||||
|
dd ntfs_free
|
||||||
|
dd (ntfs_user_functions_end - ntfs_user_functions - 4) / 4
|
||||||
|
dd ntfs_ReadFile
|
||||||
|
dd ntfs_ReadFolder
|
||||||
|
dd ntfs_CreateFile
|
||||||
|
dd ntfs_WriteFile
|
||||||
|
dd ntfs_SetFileEnd
|
||||||
|
dd ntfs_GetFileInfo
|
||||||
|
dd ntfs_SetFileInfo
|
||||||
|
dd 0
|
||||||
|
dd ntfs_Delete
|
||||||
|
dd ntfs_CreateFolder
|
||||||
|
ntfs_user_functions_end:
|
||||||
|
endg
|
||||||
|
|
||||||
; Basic concepts:
|
; Basic concepts:
|
||||||
; File is a FileRecord in the $MFT.
|
; File is a FileRecord in the $MFT.
|
||||||
@ -95,7 +118,7 @@ namespace = 51h
|
|||||||
fileName = 52h
|
fileName = 52h
|
||||||
|
|
||||||
struct NTFS PARTITION
|
struct NTFS PARTITION
|
||||||
Lock MUTEX ? ; Currently operations with one partition
|
Lock MUTEX ; Currently operations with one partition
|
||||||
; can not be executed in parallel since the legacy code is not ready.
|
; can not be executed in parallel since the legacy code is not ready.
|
||||||
sectors_per_cluster dd ?
|
sectors_per_cluster dd ?
|
||||||
mft_cluster dd ? ; location
|
mft_cluster dd ? ; location
|
||||||
@ -151,31 +174,6 @@ attrlist_mft_buf rb 1024
|
|||||||
bitmap_buf rb 1024
|
bitmap_buf rb 1024
|
||||||
ends
|
ends
|
||||||
|
|
||||||
; NTFS external functions
|
|
||||||
; in:
|
|
||||||
; ebx -> parameter structure of sysfunc 70
|
|
||||||
; ebp -> NTFS structure
|
|
||||||
; [esi]+[esp+4] = name
|
|
||||||
; out:
|
|
||||||
; eax, ebx = return values for sysfunc 70
|
|
||||||
iglobal
|
|
||||||
align 4
|
|
||||||
ntfs_user_functions:
|
|
||||||
dd ntfs_free
|
|
||||||
dd (ntfs_user_functions_end - ntfs_user_functions - 4) / 4
|
|
||||||
dd ntfs_ReadFile
|
|
||||||
dd ntfs_ReadFolder
|
|
||||||
dd ntfs_CreateFile
|
|
||||||
dd ntfs_WriteFile
|
|
||||||
dd ntfs_SetFileEnd
|
|
||||||
dd ntfs_GetFileInfo
|
|
||||||
dd ntfs_SetFileInfo
|
|
||||||
dd 0
|
|
||||||
dd ntfs_Delete
|
|
||||||
dd ntfs_CreateFolder
|
|
||||||
ntfs_user_functions_end:
|
|
||||||
endg
|
|
||||||
|
|
||||||
ntfs_test_bootsec:
|
ntfs_test_bootsec:
|
||||||
; in: ebx -> buffer, edx = size of partition
|
; in: ebx -> buffer, edx = size of partition
|
||||||
; out: CF=1 -> invalid
|
; out: CF=1 -> invalid
|
||||||
@ -258,7 +256,14 @@ ntfs_test_bootsec:
|
|||||||
stc
|
stc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; Mount if it's a valid NTFS partition.
|
||||||
ntfs_create_partition:
|
ntfs_create_partition:
|
||||||
|
; in:
|
||||||
|
; ebp -> PARTITION structure
|
||||||
|
; ebx -> boot sector
|
||||||
|
; ebx+512 -> buffer
|
||||||
|
; out:
|
||||||
|
; eax -> NTFS structure, 0 = not NTFS
|
||||||
cmp dword [esi+DISK.MediaInfo.SectorSize], 512
|
cmp dword [esi+DISK.MediaInfo.SectorSize], 512
|
||||||
jnz .nope
|
jnz .nope
|
||||||
mov edx, dword [ebp+PARTITION.Length]
|
mov edx, dword [ebp+PARTITION.Length]
|
||||||
@ -1684,7 +1689,7 @@ ntfs_ReadFolder:
|
|||||||
mov eax, 0x10
|
mov eax, 0x10
|
||||||
stosd
|
stosd
|
||||||
scasd
|
scasd
|
||||||
push edx
|
push ebx ecx edx
|
||||||
mov eax, dword [ebp+NTFS.bitmap_buf]
|
mov eax, dword [ebp+NTFS.bitmap_buf]
|
||||||
mov edx, dword [ebp+NTFS.bitmap_buf+4]
|
mov edx, dword [ebp+NTFS.bitmap_buf+4]
|
||||||
call ntfs_datetime_to_bdfe
|
call ntfs_datetime_to_bdfe
|
||||||
@ -1694,7 +1699,7 @@ ntfs_ReadFolder:
|
|||||||
mov eax, dword [ebp+NTFS.bitmap_buf+8]
|
mov eax, dword [ebp+NTFS.bitmap_buf+8]
|
||||||
mov edx, dword [ebp+NTFS.bitmap_buf+0xC]
|
mov edx, dword [ebp+NTFS.bitmap_buf+0xC]
|
||||||
call ntfs_datetime_to_bdfe
|
call ntfs_datetime_to_bdfe
|
||||||
pop edx
|
pop edx ecx ebx
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
stosd
|
stosd
|
||||||
stosd
|
stosd
|
||||||
@ -1778,7 +1783,7 @@ ntfs_direntry_to_bdfe:
|
|||||||
@@:
|
@@:
|
||||||
stosd
|
stosd
|
||||||
scasd
|
scasd
|
||||||
push edx
|
push ebx ecx edx
|
||||||
mov eax, [esi+fileCreated]
|
mov eax, [esi+fileCreated]
|
||||||
mov edx, [esi+fileCreated+4]
|
mov edx, [esi+fileCreated+4]
|
||||||
call ntfs_datetime_to_bdfe
|
call ntfs_datetime_to_bdfe
|
||||||
@ -1788,91 +1793,26 @@ ntfs_direntry_to_bdfe:
|
|||||||
mov eax, [esi+fileModified]
|
mov eax, [esi+fileModified]
|
||||||
mov edx, [esi+fileModified+4]
|
mov edx, [esi+fileModified+4]
|
||||||
call ntfs_datetime_to_bdfe
|
call ntfs_datetime_to_bdfe
|
||||||
pop edx
|
pop edx ecx ebx
|
||||||
mov eax, [esi+fileRealSize]
|
mov eax, [esi+fileRealSize]
|
||||||
stosd
|
stosd
|
||||||
mov eax, [esi+fileRealSize+4]
|
mov eax, [esi+fileRealSize+4]
|
||||||
stosd
|
stosd
|
||||||
ret
|
ret
|
||||||
|
|
||||||
iglobal
|
|
||||||
months db 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
|
||||||
months2 db 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
|
||||||
endg
|
|
||||||
|
|
||||||
ntfs_datetime_to_bdfe:
|
ntfs_datetime_to_bdfe:
|
||||||
; edx:eax = number of 100-nanosecond intervals since January 1, 1601, in UTC
|
; in: edx:eax = seconds since 01.01.1601 x10000000
|
||||||
push ebx ecx
|
; edi -> data block
|
||||||
mov ebx, eax
|
; out: edi = edi+8
|
||||||
mov eax, edx
|
sub eax, 3365781504
|
||||||
xor edx, edx
|
sbb edx, 29389701
|
||||||
mov ecx, 10000000
|
mov ecx, 10000000
|
||||||
div ecx
|
cmp edx, ecx
|
||||||
xchg eax, ebx
|
jc @f
|
||||||
div ecx
|
|
||||||
.forEXT:
|
|
||||||
xchg eax, ebx
|
|
||||||
xor edx, edx
|
xor edx, edx
|
||||||
mov ecx, 60
|
|
||||||
div ecx
|
|
||||||
xchg eax, ebx
|
|
||||||
div ecx
|
|
||||||
mov [edi], dl
|
|
||||||
mov edx, ebx
|
|
||||||
; edx:eax = number of minutes
|
|
||||||
div ecx
|
|
||||||
mov [edi+1], dl
|
|
||||||
; eax = number of hours
|
|
||||||
xor edx, edx
|
|
||||||
mov cl, 24
|
|
||||||
div ecx
|
|
||||||
mov [edi+2], dx
|
|
||||||
; eax = number of days since January 1, 1601
|
|
||||||
xor edx, edx
|
|
||||||
mov cx, 365
|
|
||||||
div ecx
|
|
||||||
mov ebx, eax
|
|
||||||
add ebx, 1601
|
|
||||||
shr eax, 2
|
|
||||||
sub edx, eax
|
|
||||||
mov cl, 25
|
|
||||||
div cl
|
|
||||||
xor ah, ah
|
|
||||||
add edx, eax
|
|
||||||
shr eax, 2
|
|
||||||
sub edx, eax
|
|
||||||
jns @f
|
|
||||||
dec ebx
|
|
||||||
add edx, 365
|
|
||||||
test bl, 3
|
|
||||||
jnz @f
|
|
||||||
inc edx
|
|
||||||
@@:
|
@@:
|
||||||
xor eax, eax
|
div ecx
|
||||||
mov ecx, months-1
|
jmp fsTime2bdfe
|
||||||
test bl, 3
|
|
||||||
jnz @f
|
|
||||||
add ecx, 12
|
|
||||||
@@:
|
|
||||||
inc ecx
|
|
||||||
inc eax
|
|
||||||
sub dl, [ecx]
|
|
||||||
jnc @b
|
|
||||||
dec dh
|
|
||||||
jns @b
|
|
||||||
add dl, [ecx]
|
|
||||||
inc edx
|
|
||||||
mov [edi+4], dl
|
|
||||||
mov [edi+5], al
|
|
||||||
mov [edi+6], bx
|
|
||||||
add edi, 8
|
|
||||||
pop ecx ebx
|
|
||||||
ret
|
|
||||||
|
|
||||||
.sec:
|
|
||||||
push ebx ecx
|
|
||||||
mov ebx, edx
|
|
||||||
jmp .forEXT
|
|
||||||
|
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
ntfs_GetFileInfo:
|
ntfs_GetFileInfo:
|
||||||
@ -4179,90 +4119,19 @@ ntfs_SetFileEnd:
|
|||||||
call ntfsSpaceClean
|
call ntfsSpaceClean
|
||||||
jmp ntfsDone
|
jmp ntfsDone
|
||||||
|
|
||||||
ntfsReadCMOS:
|
|
||||||
out 70h, al
|
|
||||||
in al, 71h
|
|
||||||
xor ah, ah
|
|
||||||
shl ax, 4
|
|
||||||
shr al, 4
|
|
||||||
aad
|
|
||||||
ret
|
|
||||||
|
|
||||||
ntfsGetTime:
|
ntfsGetTime:
|
||||||
mov al, 7
|
call fsGetTime
|
||||||
call ntfsReadCMOS
|
jmp @f
|
||||||
ror eax, 8
|
|
||||||
mov al, 8
|
|
||||||
call ntfsReadCMOS
|
|
||||||
ror eax, 8
|
|
||||||
mov al, 9
|
|
||||||
call ntfsReadCMOS
|
|
||||||
add eax, 2000
|
|
||||||
ror eax, 16
|
|
||||||
push eax
|
|
||||||
xor eax, eax
|
|
||||||
call ntfsReadCMOS
|
|
||||||
ror eax, 8
|
|
||||||
mov al, 2
|
|
||||||
call ntfsReadCMOS
|
|
||||||
ror eax, 8
|
|
||||||
mov al, 4
|
|
||||||
call ntfsReadCMOS
|
|
||||||
ror eax, 16
|
|
||||||
push eax
|
|
||||||
mov esi, esp
|
|
||||||
add esp, 8
|
|
||||||
ntfsCalculateTime:
|
ntfsCalculateTime:
|
||||||
; in: esi -> data block
|
; in: esi -> data block
|
||||||
; out: edx:eax = time
|
; out: edx:eax = seconds since 01.01.1601 x10000000
|
||||||
movzx eax, word [esi+6]
|
call fsCalculateTime
|
||||||
sub eax, 2001
|
|
||||||
jnc @f
|
|
||||||
xor eax, eax
|
|
||||||
@@:
|
@@:
|
||||||
mov edx, months
|
mov edx, 10000000
|
||||||
mov ebx, eax
|
|
||||||
inc eax
|
|
||||||
test eax, 3
|
|
||||||
jnz @f
|
|
||||||
add edx, 12
|
|
||||||
@@:
|
|
||||||
movzx eax, byte [esi+5]
|
|
||||||
dec eax
|
|
||||||
xor ecx, ecx
|
|
||||||
@@:
|
|
||||||
dec eax
|
|
||||||
js @f
|
|
||||||
add cl, [edx+eax]
|
|
||||||
adc ch, 0
|
|
||||||
jmp @b
|
|
||||||
@@:
|
|
||||||
mov eax, ebx
|
|
||||||
mov edx, 365
|
|
||||||
mul edx
|
mul edx
|
||||||
shr ebx, 2
|
add eax, 3365781504
|
||||||
add eax, ebx
|
adc edx, 29389701
|
||||||
add eax, ecx
|
|
||||||
mov bl, [esi+4]
|
|
||||||
add eax, ebx
|
|
||||||
add eax, 400*365+100-4
|
|
||||||
mov dl, 24
|
|
||||||
mul edx
|
|
||||||
mov bl, [esi+2]
|
|
||||||
add eax, ebx
|
|
||||||
mov ecx, 60
|
|
||||||
mul ecx
|
|
||||||
mov bl, [esi+1]
|
|
||||||
add eax, ebx
|
|
||||||
mul ecx
|
|
||||||
mov bl, [esi]
|
|
||||||
add ebx, eax
|
|
||||||
mov eax, edx
|
|
||||||
mov ecx, 10000000
|
|
||||||
mul ecx
|
|
||||||
xchg eax, ebx
|
|
||||||
mul ecx
|
|
||||||
add edx, ebx
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License. ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
@ -391,3 +391,72 @@ ansi2uni_char:
|
|||||||
.unk:
|
.unk:
|
||||||
mov al, '_'
|
mov al, '_'
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
utf8_to_cp866:
|
||||||
|
; in: esi, edi, ecx
|
||||||
|
; destroys esi, edi, ecx, eax
|
||||||
|
call utf8to16
|
||||||
|
js utf8to16.ret
|
||||||
|
call uni2ansi_char
|
||||||
|
stosb
|
||||||
|
jmp utf8_to_cp866
|
||||||
|
|
||||||
|
utf8to16:
|
||||||
|
; in:
|
||||||
|
; esi -> string
|
||||||
|
; ecx = byte counter
|
||||||
|
; out:
|
||||||
|
; SF=1 -> end
|
||||||
|
; ax = UTF-16 char
|
||||||
|
; changes esi, ecx
|
||||||
|
dec ecx
|
||||||
|
js .ret
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jns .got
|
||||||
|
shl al, 2
|
||||||
|
jnc utf8to16
|
||||||
|
@@:
|
||||||
|
shl ax, 8
|
||||||
|
dec ecx
|
||||||
|
js .ret
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jns .got
|
||||||
|
shl al, 2
|
||||||
|
jc @b
|
||||||
|
shr ah, 2
|
||||||
|
shl ax, 3
|
||||||
|
jnc @f
|
||||||
|
shl eax, 3
|
||||||
|
dec ecx
|
||||||
|
js .ret
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jns .got
|
||||||
|
shl al, 2
|
||||||
|
jc @b
|
||||||
|
shr eax, 2
|
||||||
|
ret
|
||||||
|
|
||||||
|
@@:
|
||||||
|
shr ax, 5
|
||||||
|
ret
|
||||||
|
|
||||||
|
.got:
|
||||||
|
xor ah, ah
|
||||||
|
.ret:
|
||||||
|
ret
|
||||||
|
|
||||||
|
strlen:
|
||||||
|
; in: esi -> source
|
||||||
|
; out: ecx = length
|
||||||
|
push edi eax
|
||||||
|
or ecx, -1
|
||||||
|
mov edi, esi
|
||||||
|
xor eax, eax
|
||||||
|
repnz scasb
|
||||||
|
inc ecx
|
||||||
|
not ecx
|
||||||
|
pop eax edi
|
||||||
|
ret
|
||||||
|
@ -1,29 +1,46 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2013-2015. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2013-2016. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License. ;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
|
; XFS external functions
|
||||||
|
; in:
|
||||||
|
; ebx -> parameter structure of sysfunc 70
|
||||||
|
; ebp -> XFS structure
|
||||||
|
; [esi]+[[esp+4]] = name
|
||||||
|
; out:
|
||||||
|
; eax, ebx = return values for sysfunc 70
|
||||||
|
iglobal
|
||||||
|
align 4
|
||||||
|
xfs_user_functions:
|
||||||
|
dd xfs_free
|
||||||
|
dd (xfs_user_functions_end - xfs_user_functions - 4) / 4
|
||||||
|
dd xfs_ReadFile
|
||||||
|
dd xfs_ReadFolder
|
||||||
|
dd 0;xfs_CreateFile
|
||||||
|
dd 0;xfs_WriteFile
|
||||||
|
dd 0;xfs_SetFileEnd
|
||||||
|
dd xfs_GetFileInfo
|
||||||
|
dd 0;xfs_SetFileInfo
|
||||||
|
dd 0
|
||||||
|
dd 0;xfs_Delete
|
||||||
|
dd 0;xfs_CreateFolder
|
||||||
|
xfs_user_functions_end:
|
||||||
|
endg
|
||||||
|
|
||||||
include 'xfs.inc'
|
include 'xfs.inc'
|
||||||
|
|
||||||
;
|
; Mount if it's a valid XFS partition.
|
||||||
; This file contains XFS related code.
|
|
||||||
; For more information on XFS check sources below.
|
|
||||||
;
|
|
||||||
; 1. XFS Filesystem Structure, 2nd Edition, Revision 1. Silicon Graphics Inc. 2006
|
|
||||||
; 2. Linux source http://kernel.org
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
; test partition type (valid XFS one?)
|
|
||||||
; alloc and fill XFS (see xfs.inc) structure
|
|
||||||
; this function is called for each partition
|
|
||||||
; returns 0 (not XFS or invalid) / pointer to partition structure
|
|
||||||
xfs_create_partition:
|
xfs_create_partition:
|
||||||
|
; in:
|
||||||
|
; ebp -> PARTITION structure
|
||||||
|
; ebx -> boot sector
|
||||||
|
; out:
|
||||||
|
; eax -> XFS structure, 0 = not XFS
|
||||||
push ebx ecx edx esi edi
|
push ebx ecx edx esi edi
|
||||||
cmp dword [esi+DISK.MediaInfo.SectorSize], 512
|
cmp dword [esi+DISK.MediaInfo.SectorSize], 512
|
||||||
jnz .error
|
jnz .error
|
||||||
@ -94,7 +111,7 @@ xfs_create_partition:
|
|||||||
mov dword[edi + XFS.rootino + 0], eax ; endian
|
mov dword[edi + XFS.rootino + 0], eax ; endian
|
||||||
mov eax, dword[ebx + xfs_sb.sb_rootino + 0] ; 64bit
|
mov eax, dword[ebx + xfs_sb.sb_rootino + 0] ; 64bit
|
||||||
bswap eax ; number
|
bswap eax ; number
|
||||||
mov dword[edi + XFS.rootino + 4], eax ;
|
mov dword[edi + XFS.rootino + 4], eax ;
|
||||||
|
|
||||||
mov eax, [edi + XFS.blocksize]
|
mov eax, [edi + XFS.blocksize]
|
||||||
mov ecx, [edi + XFS.dirblklog]
|
mov ecx, [edi + XFS.dirblklog]
|
||||||
@ -211,25 +228,6 @@ xfs_create_partition:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
iglobal
|
|
||||||
align 4
|
|
||||||
xfs_user_functions:
|
|
||||||
dd xfs_free
|
|
||||||
dd (xfs_user_functions_end - xfs_user_functions - 4) / 4
|
|
||||||
dd xfs_Read
|
|
||||||
dd xfs_ReadFolder
|
|
||||||
dd 0;xfs_Rewrite
|
|
||||||
dd 0;xfs_Write
|
|
||||||
dd 0;xfs_SetFileEnd
|
|
||||||
dd xfs_GetFileInfo
|
|
||||||
dd 0;xfs_SetFileInfo
|
|
||||||
dd 0
|
|
||||||
dd 0;xfs_Delete
|
|
||||||
dd 0;xfs_CreateFolder
|
|
||||||
xfs_user_functions_end:
|
|
||||||
endg
|
|
||||||
|
|
||||||
|
|
||||||
; lock partition access mutex
|
; lock partition access mutex
|
||||||
proc xfs_lock
|
proc xfs_lock
|
||||||
;DEBUGF 1,"xfs_lock\n"
|
;DEBUGF 1,"xfs_lock\n"
|
||||||
@ -510,10 +508,10 @@ DEBUGF 1,"xfs_dir_get_bdfes: %d entries from %d\n",[esp+8],[esp+4]
|
|||||||
add eax, eax ; 4+4=8, iff i8count != 0
|
add eax, eax ; 4+4=8, iff i8count != 0
|
||||||
@@:
|
@@:
|
||||||
mov dword[edx + 12], 0 ; reserved
|
mov dword[edx + 12], 0 ; reserved
|
||||||
mov dword[edx + 16], 0 ;
|
mov dword[edx + 16], 0 ;
|
||||||
mov dword[edx + 20], 0 ;
|
mov dword[edx + 20], 0 ;
|
||||||
mov dword[edx + 24], 0 ;
|
mov dword[edx + 24], 0 ;
|
||||||
mov dword[edx + 28], 0 ;
|
mov dword[edx + 28], 0 ;
|
||||||
add edx, 32
|
add edx, 32
|
||||||
lea esi, [ebx + xfs_inode.di_u + xfs_dir2_sf_hdr.parent + eax]
|
lea esi, [ebx + xfs_inode.di_u + xfs_dir2_sf_hdr.parent + eax]
|
||||||
dec ecx
|
dec ecx
|
||||||
@ -642,10 +640,10 @@ DEBUGF 1,"xfs_dir_get_bdfes: %d entries from %d\n",[esp+8],[esp+4]
|
|||||||
mov [ebp + XFS.entries_read], eax
|
mov [ebp + XFS.entries_read], eax
|
||||||
;DEBUGF 1,"actually read entries: %d\n",eax
|
;DEBUGF 1,"actually read entries: %d\n",eax
|
||||||
mov dword[edx + 12], 0 ; reserved
|
mov dword[edx + 12], 0 ; reserved
|
||||||
mov dword[edx + 16], 0 ;
|
mov dword[edx + 16], 0 ;
|
||||||
mov dword[edx + 20], 0 ;
|
mov dword[edx + 20], 0 ;
|
||||||
mov dword[edx + 24], 0 ;
|
mov dword[edx + 24], 0 ;
|
||||||
mov dword[edx + 28], 0 ;
|
mov dword[edx + 28], 0 ;
|
||||||
add ebx, xfs_dir2_block.u
|
add ebx, xfs_dir2_block.u
|
||||||
|
|
||||||
mov ecx, [esp + 24] ; start entry number
|
mov ecx, [esp + 24] ; start entry number
|
||||||
@ -742,10 +740,10 @@ DEBUGF 1,"xfs_dir_get_bdfes: %d entries from %d\n",[esp+8],[esp+4]
|
|||||||
mov [edx + 4], eax ; number of actually read entries
|
mov [edx + 4], eax ; number of actually read entries
|
||||||
|
|
||||||
mov dword[edx + 12], 0 ; reserved
|
mov dword[edx + 12], 0 ; reserved
|
||||||
mov dword[edx + 16], 0 ;
|
mov dword[edx + 16], 0 ;
|
||||||
mov dword[edx + 20], 0 ;
|
mov dword[edx + 20], 0 ;
|
||||||
mov dword[edx + 24], 0 ;
|
mov dword[edx + 24], 0 ;
|
||||||
mov dword[edx + 28], 0 ;
|
mov dword[edx + 28], 0 ;
|
||||||
|
|
||||||
mov eax, [ebp + XFS.cur_dirblock]
|
mov eax, [ebp + XFS.cur_dirblock]
|
||||||
add eax, [ebp + XFS.dirblocksize]
|
add eax, [ebp + XFS.dirblocksize]
|
||||||
@ -886,10 +884,10 @@ DEBUGF 1,"xfs_dir_get_bdfes: %d entries from %d\n",[esp+8],[esp+4]
|
|||||||
mov [edx + 4], eax ; number of actually read entries
|
mov [edx + 4], eax ; number of actually read entries
|
||||||
|
|
||||||
mov dword[edx + 12], 0 ; reserved
|
mov dword[edx + 12], 0 ; reserved
|
||||||
mov dword[edx + 16], 0 ;
|
mov dword[edx + 16], 0 ;
|
||||||
mov dword[edx + 20], 0 ;
|
mov dword[edx + 20], 0 ;
|
||||||
mov dword[edx + 24], 0 ;
|
mov dword[edx + 24], 0 ;
|
||||||
mov dword[edx + 28], 0 ;
|
mov dword[edx + 28], 0 ;
|
||||||
|
|
||||||
mov eax, [ebp + XFS.cur_dirblock]
|
mov eax, [ebp + XFS.cur_dirblock]
|
||||||
add eax, [ebp + XFS.dirblocksize]
|
add eax, [ebp + XFS.dirblocksize]
|
||||||
@ -1739,28 +1737,22 @@ xfs_get_inode_info:
|
|||||||
mov eax, [edx + xfs_inode.di_core.di_ctime.t_sec]
|
mov eax, [edx + xfs_inode.di_core.di_ctime.t_sec]
|
||||||
bswap eax
|
bswap eax
|
||||||
push edx
|
push edx
|
||||||
xor edx, edx
|
sub eax, 978307200 ; 01.01.1970-01.01.2001 = (365*31+8)*24*60*60
|
||||||
add eax, 3054539008 ;(369 * 365 + 89) * 24 * 3600
|
call fsTime2bdfe
|
||||||
adc edx, 2
|
|
||||||
call ntfs_datetime_to_bdfe.sec
|
|
||||||
pop edx
|
pop edx
|
||||||
|
|
||||||
mov eax, [edx + xfs_inode.di_core.di_atime.t_sec]
|
mov eax, [edx + xfs_inode.di_core.di_atime.t_sec]
|
||||||
bswap eax
|
bswap eax
|
||||||
push edx
|
push edx
|
||||||
xor edx, edx
|
sub eax, 978307200
|
||||||
add eax, 3054539008 ;(369 * 365 + 89) * 24 * 3600
|
call fsTime2bdfe
|
||||||
adc edx, 2
|
|
||||||
call ntfs_datetime_to_bdfe.sec
|
|
||||||
pop edx
|
pop edx
|
||||||
|
|
||||||
mov eax, [edx + xfs_inode.di_core.di_mtime.t_sec]
|
mov eax, [edx + xfs_inode.di_core.di_mtime.t_sec]
|
||||||
bswap eax
|
bswap eax
|
||||||
push edx
|
push edx
|
||||||
xor edx, edx
|
sub eax, 978307200
|
||||||
add eax, 3054539008 ;(369 * 365 + 89) * 24 * 3600
|
call fsTime2bdfe
|
||||||
adc edx, 2
|
|
||||||
call ntfs_datetime_to_bdfe.sec
|
|
||||||
pop edx
|
pop edx
|
||||||
|
|
||||||
.quit:
|
.quit:
|
||||||
@ -1947,18 +1939,16 @@ xfs_GetFileInfo:
|
|||||||
|
|
||||||
|
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
; xfs_Read - XFS implementation of reading a file
|
; xfs_ReadFile - XFS implementation of reading a file
|
||||||
; in: ebp = pointer to XFS structure
|
; in: ebp = pointer to XFS structure
|
||||||
; in: esi+[esp+4] = name
|
; in: esi+[esp+4] = name
|
||||||
; in: ebx = pointer to parameters from sysfunc 70
|
; in: ebx = pointer to parameters from sysfunc 70
|
||||||
; out: eax, ebx = return values for sysfunc 70
|
; out: eax, ebx = return values for sysfunc 70
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
xfs_Read:
|
xfs_ReadFile:
|
||||||
push ebx ecx edx esi edi
|
push ebx ecx edx esi edi
|
||||||
call xfs_lock
|
call xfs_lock
|
||||||
|
|
||||||
add esi, [esp + 24]
|
add esi, [esp + 24]
|
||||||
;DEBUGF 1,"xfs_Read: %d %d |%s|\n",[ebx+4],[ebx+12],esi
|
|
||||||
stdcall xfs_get_inode, esi
|
stdcall xfs_get_inode, esi
|
||||||
mov ecx, edx
|
mov ecx, edx
|
||||||
or ecx, eax
|
or ecx, eax
|
||||||
@ -2353,7 +2343,7 @@ xfs_dir2_node_get_numfiles:
|
|||||||
test eax, eax
|
test eax, eax
|
||||||
jnz .error
|
jnz .error
|
||||||
jmp .common
|
jmp .common
|
||||||
|
|
||||||
.leaf:
|
.leaf:
|
||||||
;DEBUGF 1,".leaf\n"
|
;DEBUGF 1,".leaf\n"
|
||||||
movzx ecx, word[ebx + xfs_dir2_leaf.hdr.count]
|
movzx ecx, word[ebx + xfs_dir2_leaf.hdr.count]
|
||||||
@ -2514,7 +2504,7 @@ xfs_dir2_btree_get_numfiles:
|
|||||||
test eax, eax
|
test eax, eax
|
||||||
jnz .error
|
jnz .error
|
||||||
jmp .common
|
jmp .common
|
||||||
|
|
||||||
.leaf:
|
.leaf:
|
||||||
;DEBUGF 1,".leaf\n"
|
;DEBUGF 1,".leaf\n"
|
||||||
movzx ecx, word[ebx + xfs_dir2_leaf.hdr.count]
|
movzx ecx, word[ebx + xfs_dir2_leaf.hdr.count]
|
||||||
@ -2750,7 +2740,7 @@ DEBUGF 1,".root.not_root\n"
|
|||||||
jmp .quit
|
jmp .quit
|
||||||
|
|
||||||
.leaf:
|
.leaf:
|
||||||
|
|
||||||
jmp .quit
|
jmp .quit
|
||||||
|
|
||||||
.error:
|
.error:
|
||||||
|
@ -141,40 +141,18 @@ deltaToScreen = 28
|
|||||||
.drawUTF8:
|
.drawUTF8:
|
||||||
dec dword [esp]
|
dec dword [esp]
|
||||||
js .done
|
js .done
|
||||||
@@:
|
mov ecx, 256
|
||||||
movzx ebx, byte [esi]
|
xor eax, eax
|
||||||
inc esi
|
call utf8to16
|
||||||
test bl, bl
|
test ax, ax
|
||||||
jz .done
|
jz .done
|
||||||
jns .valid
|
cmp eax, 1419
|
||||||
shl bx, 10
|
jc @f
|
||||||
jnc @b
|
xor eax, eax
|
||||||
mov bl, [esi]
|
|
||||||
test bl, bl
|
|
||||||
jns @b
|
|
||||||
shl bl, 2
|
|
||||||
jc @b
|
|
||||||
shr bh, 2
|
|
||||||
shr bx, 2
|
|
||||||
inc esi
|
|
||||||
cmp bx, 1419
|
|
||||||
jc .valid
|
|
||||||
shl bh, 4
|
|
||||||
jns @f
|
|
||||||
.tail:
|
|
||||||
mov bl, [esi]
|
|
||||||
shl bl, 1
|
|
||||||
jnc @b
|
|
||||||
js @b
|
|
||||||
inc esi
|
|
||||||
shl bh, 1
|
|
||||||
js .tail
|
|
||||||
@@:
|
@@:
|
||||||
xor ebx, ebx
|
shl eax, 4
|
||||||
.valid:
|
lea ebx, [eax+fontUni]
|
||||||
pushd esi edi 16
|
pushd esi edi 16
|
||||||
shl ebx, 4
|
|
||||||
add ebx, fontUni
|
|
||||||
mov esi, [esp+12+fontMultiplier]
|
mov esi, [esp+12+fontMultiplier]
|
||||||
call drawChar
|
call drawChar
|
||||||
imul esi, 8*4
|
imul esi, 8*4
|
||||||
|
@ -1,132 +1,70 @@
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; ;;
|
;; ;;
|
||||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License. ;;
|
||||||
;; ;;
|
|
||||||
;; KERNEL32.INC ;;
|
|
||||||
;; ;;
|
|
||||||
;; Included 32 bit kernel files for MenuetOS ;;
|
|
||||||
;; ;;
|
|
||||||
;; This file is kept separate as it will be easier to ;;
|
|
||||||
;; maintain and compile with an automated SETUP program ;;
|
|
||||||
;; in the future. ;;
|
|
||||||
;; ;;
|
;; ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
; Core functions
|
include "core/sync.inc" ; macros for synhronization objects
|
||||||
include "core/sync.inc" ; macros for synhronization objects
|
include "core/sys32.inc" ; process management
|
||||||
include "core/sys32.inc" ; process management
|
include "core/sched.inc" ; process scheduling
|
||||||
include "core/sched.inc" ; process scheduling
|
include "core/syscall.inc"
|
||||||
include "core/syscall.inc" ; system call
|
include "core/fpu.inc" ; all fpu/sse support
|
||||||
include "core/fpu.inc" ; all fpu/sse support
|
|
||||||
include "core/memory.inc"
|
include "core/memory.inc"
|
||||||
include "core/mtrr.inc"
|
include "core/mtrr.inc"
|
||||||
include "core/heap.inc" ; kernel and app heap
|
include "core/heap.inc"
|
||||||
include "core/malloc.inc" ; small kernel heap
|
include "core/malloc.inc" ; small kernel heap
|
||||||
include "core/taskman.inc"
|
include "core/taskman.inc"
|
||||||
include "core/dll.inc"
|
include "core/dll.inc"
|
||||||
include "core/peload.inc" ;
|
include "core/peload.inc"
|
||||||
include "core/exports.inc"
|
include "core/exports.inc"
|
||||||
include "core/string.inc"
|
include "core/string.inc"
|
||||||
include "core/v86.inc" ; virtual-8086 manager
|
include "core/v86.inc" ; 16-bit mode machine
|
||||||
include "core/irq.inc" ; irq handling functions
|
include "core/irq.inc" ; interrupt handling functions
|
||||||
include "core/apic.inc" ; Interrupt Controller functions
|
include "core/apic.inc"
|
||||||
include "core/timers.inc"
|
include "core/timers.inc"
|
||||||
include "core/clipboard.inc" ; custom clipboard
|
include "core/clipboard.inc"
|
||||||
|
include "core/conf_lib.inc"
|
||||||
|
include "core/ext_lib.inc" ; load external library
|
||||||
|
|
||||||
|
include "boot/shutdown.inc" ; kernel shutdown
|
||||||
|
|
||||||
|
include "video/vesa20.inc"
|
||||||
|
include "video/blitter.inc"
|
||||||
|
include "video/vga.inc" ; VGA 16 color functions
|
||||||
|
include "video/cursors.inc"
|
||||||
|
include "video/framebuffer.inc"
|
||||||
|
|
||||||
; GUI stuff
|
|
||||||
include "gui/window.inc"
|
include "gui/window.inc"
|
||||||
include "gui/event.inc"
|
include "gui/event.inc"
|
||||||
include "gui/font.inc"
|
include "gui/font.inc"
|
||||||
include "gui/button.inc"
|
include "gui/button.inc"
|
||||||
|
include "gui/mouse.inc" ; cursor
|
||||||
include "boot/shutdown.inc" ; kernel shutdown
|
include "gui/skincode.inc" ; windows' skin
|
||||||
|
|
||||||
; file system
|
|
||||||
|
|
||||||
include "blkdev/disk.inc" ; support for plug-n-play disks
|
|
||||||
include "blkdev/disk_cache.inc" ; caching for plug-n-play disks
|
|
||||||
include "blkdev/rd.inc" ; ramdisk read /write
|
|
||||||
include "fs/fat.inc" ; read / write for fat filesystem
|
|
||||||
include "fs/ntfs.inc" ; read / write for ntfs filesystem
|
|
||||||
include "fs/fs_lfn.inc" ; syscall, version 2
|
|
||||||
include "fs/iso9660.inc" ; read for iso9660 filesystem CD
|
|
||||||
include "fs/ext2/ext2.asm" ; read / write for ext2 filesystem
|
|
||||||
include "fs/xfs.asm" ; read / write for xfs filesystem
|
|
||||||
|
|
||||||
; sound
|
|
||||||
|
|
||||||
include "sound/playnote.inc" ; player Note for Speaker PC
|
|
||||||
|
|
||||||
; display
|
|
||||||
|
|
||||||
;include "video/vesa12.inc" ; Vesa 1.2 functions
|
|
||||||
include "video/vesa20.inc" ; Vesa 2.0 functions
|
|
||||||
include "video/blitter.inc"
|
|
||||||
include "video/vga.inc" ; VGA 16 color functions
|
|
||||||
include "video/cursors.inc" ; cursors functions
|
|
||||||
include "video/framebuffer.inc" ; framebuffer functions
|
|
||||||
|
|
||||||
; Network Interface & TCPIP Stack
|
|
||||||
|
|
||||||
include "network/stack.inc"
|
|
||||||
|
|
||||||
;include "drivers/uart.inc"
|
|
||||||
|
|
||||||
|
|
||||||
; Mouse pointer
|
|
||||||
|
|
||||||
include "gui/mouse.inc"
|
|
||||||
|
|
||||||
; Window skinning
|
|
||||||
|
|
||||||
include "gui/skincode.inc"
|
|
||||||
|
|
||||||
; Pci functions
|
|
||||||
|
|
||||||
include "bus/pci/pci32.inc"
|
|
||||||
|
|
||||||
; USB functions
|
|
||||||
include "bus/usb/init.inc"
|
|
||||||
|
|
||||||
; Floppy drive controller
|
|
||||||
|
|
||||||
include "blkdev/fdc.inc"
|
|
||||||
include "blkdev/flp_drv.inc"
|
|
||||||
|
|
||||||
; IDE cache
|
|
||||||
include "blkdev/ide_cache.inc"
|
|
||||||
|
|
||||||
; HD drive controller
|
|
||||||
include "blkdev/hd_drv.inc"
|
|
||||||
; Access through BIOS
|
|
||||||
include "blkdev/bd_drv.inc"
|
|
||||||
|
|
||||||
; CD drive controller
|
|
||||||
|
|
||||||
include "blkdev/cd_drv.inc"
|
|
||||||
|
|
||||||
; Character devices
|
|
||||||
|
|
||||||
include "hid/keyboard.inc"
|
include "hid/keyboard.inc"
|
||||||
include "hid/mousedrv.inc"
|
include "hid/mousedrv.inc"
|
||||||
|
include "hid/set_dtc.inc" ; setting date,time,clock and alarm-clock
|
||||||
|
|
||||||
; setting date,time,clock and alarm-clock
|
include "sound/playnote.inc" ; player Note for PC Speaker
|
||||||
|
|
||||||
include "hid/set_dtc.inc"
|
include "bus/pci/pci32.inc"
|
||||||
|
include "bus/usb/init.inc"
|
||||||
|
|
||||||
;% -include
|
include "blkdev/flp_drv.inc" ; floppy driver
|
||||||
|
include "blkdev/fdc.inc"
|
||||||
|
include "blkdev/cd_drv.inc" ; CD driver
|
||||||
|
include "blkdev/ide_cache.inc" ; CD cache
|
||||||
|
include "blkdev/hd_drv.inc" ; HDD driver
|
||||||
|
include "blkdev/bd_drv.inc" ; BIOS disks driver
|
||||||
|
include "blkdev/rd.inc" ; ramdisk driver
|
||||||
|
include "blkdev/disk.inc" ; support for plug-n-play disks
|
||||||
|
include "blkdev/disk_cache.inc" ; caching for plug-n-play disks
|
||||||
|
|
||||||
;parser file names
|
include "fs/fs_lfn.inc" ; sysfunction 70
|
||||||
include "fs/parse_fn.inc"
|
|
||||||
|
|
||||||
; work with conf lib
|
include "network/stack.inc"
|
||||||
include "core/conf_lib.inc"
|
|
||||||
|
|
||||||
; load external lib
|
include "imports.inc" ; list of external functions
|
||||||
include "core/ext_lib.inc"
|
|
||||||
|
|
||||||
; list of external functions
|
|
||||||
include "imports.inc"
|
|
||||||
|
Loading…
Reference in New Issue
Block a user