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. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License. ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
@ -965,3 +965,11 @@ get_full_file_name:
|
||||
jz .ret.ok
|
||||
mov byte [edi-1], '/'
|
||||
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. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; Distributed under terms of the GNU General Public License. ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$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:
|
||||
; File is a FileRecord in the $MFT.
|
||||
@ -95,7 +118,7 @@ namespace = 51h
|
||||
fileName = 52h
|
||||
|
||||
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.
|
||||
sectors_per_cluster dd ?
|
||||
mft_cluster dd ? ; location
|
||||
@ -151,31 +174,6 @@ attrlist_mft_buf rb 1024
|
||||
bitmap_buf rb 1024
|
||||
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:
|
||||
; in: ebx -> buffer, edx = size of partition
|
||||
; out: CF=1 -> invalid
|
||||
@ -258,7 +256,14 @@ ntfs_test_bootsec:
|
||||
stc
|
||||
ret
|
||||
|
||||
; Mount if it's a valid NTFS 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
|
||||
jnz .nope
|
||||
mov edx, dword [ebp+PARTITION.Length]
|
||||
@ -1684,7 +1689,7 @@ ntfs_ReadFolder:
|
||||
mov eax, 0x10
|
||||
stosd
|
||||
scasd
|
||||
push edx
|
||||
push ebx ecx edx
|
||||
mov eax, dword [ebp+NTFS.bitmap_buf]
|
||||
mov edx, dword [ebp+NTFS.bitmap_buf+4]
|
||||
call ntfs_datetime_to_bdfe
|
||||
@ -1694,7 +1699,7 @@ ntfs_ReadFolder:
|
||||
mov eax, dword [ebp+NTFS.bitmap_buf+8]
|
||||
mov edx, dword [ebp+NTFS.bitmap_buf+0xC]
|
||||
call ntfs_datetime_to_bdfe
|
||||
pop edx
|
||||
pop edx ecx ebx
|
||||
xor eax, eax
|
||||
stosd
|
||||
stosd
|
||||
@ -1778,7 +1783,7 @@ ntfs_direntry_to_bdfe:
|
||||
@@:
|
||||
stosd
|
||||
scasd
|
||||
push edx
|
||||
push ebx ecx edx
|
||||
mov eax, [esi+fileCreated]
|
||||
mov edx, [esi+fileCreated+4]
|
||||
call ntfs_datetime_to_bdfe
|
||||
@ -1788,91 +1793,26 @@ ntfs_direntry_to_bdfe:
|
||||
mov eax, [esi+fileModified]
|
||||
mov edx, [esi+fileModified+4]
|
||||
call ntfs_datetime_to_bdfe
|
||||
pop edx
|
||||
pop edx ecx ebx
|
||||
mov eax, [esi+fileRealSize]
|
||||
stosd
|
||||
mov eax, [esi+fileRealSize+4]
|
||||
stosd
|
||||
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:
|
||||
; edx:eax = number of 100-nanosecond intervals since January 1, 1601, in UTC
|
||||
push ebx ecx
|
||||
mov ebx, eax
|
||||
mov eax, edx
|
||||
xor edx, edx
|
||||
; in: edx:eax = seconds since 01.01.1601 x10000000
|
||||
; edi -> data block
|
||||
; out: edi = edi+8
|
||||
sub eax, 3365781504
|
||||
sbb edx, 29389701
|
||||
mov ecx, 10000000
|
||||
div ecx
|
||||
xchg eax, ebx
|
||||
div ecx
|
||||
.forEXT:
|
||||
xchg eax, ebx
|
||||
cmp edx, ecx
|
||||
jc @f
|
||||
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
|
||||
mov ecx, months-1
|
||||
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
|
||||
div ecx
|
||||
jmp fsTime2bdfe
|
||||
|
||||
;----------------------------------------------------------------
|
||||
ntfs_GetFileInfo:
|
||||
@ -4179,90 +4119,19 @@ ntfs_SetFileEnd:
|
||||
call ntfsSpaceClean
|
||||
jmp ntfsDone
|
||||
|
||||
ntfsReadCMOS:
|
||||
out 70h, al
|
||||
in al, 71h
|
||||
xor ah, ah
|
||||
shl ax, 4
|
||||
shr al, 4
|
||||
aad
|
||||
ret
|
||||
|
||||
ntfsGetTime:
|
||||
mov al, 7
|
||||
call ntfsReadCMOS
|
||||
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
|
||||
call fsGetTime
|
||||
jmp @f
|
||||
|
||||
ntfsCalculateTime:
|
||||
; in: esi -> data block
|
||||
; out: edx:eax = time
|
||||
movzx eax, word [esi+6]
|
||||
sub eax, 2001
|
||||
jnc @f
|
||||
xor eax, eax
|
||||
; out: edx:eax = seconds since 01.01.1601 x10000000
|
||||
call fsCalculateTime
|
||||
@@:
|
||||
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
|
||||
mov edx, 365
|
||||
mov edx, 10000000
|
||||
mul edx
|
||||
shr ebx, 2
|
||||
add eax, ebx
|
||||
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
|
||||
add eax, 3365781504
|
||||
adc edx, 29389701
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
|
@ -1,7 +1,7 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License. ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
@ -391,3 +391,72 @@ ansi2uni_char:
|
||||
.unk:
|
||||
mov al, '_'
|
||||
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. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; Copyright (C) KolibriOS team 2013-2016. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License. ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$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'
|
||||
|
||||
;
|
||||
; 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
|
||||
; Mount if it's a valid XFS partition.
|
||||
xfs_create_partition:
|
||||
; in:
|
||||
; ebp -> PARTITION structure
|
||||
; ebx -> boot sector
|
||||
; out:
|
||||
; eax -> XFS structure, 0 = not XFS
|
||||
push ebx ecx edx esi edi
|
||||
cmp dword [esi+DISK.MediaInfo.SectorSize], 512
|
||||
jnz .error
|
||||
@ -94,7 +111,7 @@ xfs_create_partition:
|
||||
mov dword[edi + XFS.rootino + 0], eax ; endian
|
||||
mov eax, dword[ebx + xfs_sb.sb_rootino + 0] ; 64bit
|
||||
bswap eax ; number
|
||||
mov dword[edi + XFS.rootino + 4], eax ;
|
||||
mov dword[edi + XFS.rootino + 4], eax ;
|
||||
|
||||
mov eax, [edi + XFS.blocksize]
|
||||
mov ecx, [edi + XFS.dirblklog]
|
||||
@ -211,25 +228,6 @@ xfs_create_partition:
|
||||
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
|
||||
proc xfs_lock
|
||||
;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
|
||||
@@:
|
||||
mov dword[edx + 12], 0 ; reserved
|
||||
mov dword[edx + 16], 0 ;
|
||||
mov dword[edx + 20], 0 ;
|
||||
mov dword[edx + 24], 0 ;
|
||||
mov dword[edx + 28], 0 ;
|
||||
mov dword[edx + 16], 0 ;
|
||||
mov dword[edx + 20], 0 ;
|
||||
mov dword[edx + 24], 0 ;
|
||||
mov dword[edx + 28], 0 ;
|
||||
add edx, 32
|
||||
lea esi, [ebx + xfs_inode.di_u + xfs_dir2_sf_hdr.parent + eax]
|
||||
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
|
||||
;DEBUGF 1,"actually read entries: %d\n",eax
|
||||
mov dword[edx + 12], 0 ; reserved
|
||||
mov dword[edx + 16], 0 ;
|
||||
mov dword[edx + 20], 0 ;
|
||||
mov dword[edx + 24], 0 ;
|
||||
mov dword[edx + 28], 0 ;
|
||||
mov dword[edx + 16], 0 ;
|
||||
mov dword[edx + 20], 0 ;
|
||||
mov dword[edx + 24], 0 ;
|
||||
mov dword[edx + 28], 0 ;
|
||||
add ebx, xfs_dir2_block.u
|
||||
|
||||
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 dword[edx + 12], 0 ; reserved
|
||||
mov dword[edx + 16], 0 ;
|
||||
mov dword[edx + 20], 0 ;
|
||||
mov dword[edx + 24], 0 ;
|
||||
mov dword[edx + 28], 0 ;
|
||||
mov dword[edx + 16], 0 ;
|
||||
mov dword[edx + 20], 0 ;
|
||||
mov dword[edx + 24], 0 ;
|
||||
mov dword[edx + 28], 0 ;
|
||||
|
||||
mov eax, [ebp + XFS.cur_dirblock]
|
||||
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 dword[edx + 12], 0 ; reserved
|
||||
mov dword[edx + 16], 0 ;
|
||||
mov dword[edx + 20], 0 ;
|
||||
mov dword[edx + 24], 0 ;
|
||||
mov dword[edx + 28], 0 ;
|
||||
mov dword[edx + 16], 0 ;
|
||||
mov dword[edx + 20], 0 ;
|
||||
mov dword[edx + 24], 0 ;
|
||||
mov dword[edx + 28], 0 ;
|
||||
|
||||
mov eax, [ebp + XFS.cur_dirblock]
|
||||
add eax, [ebp + XFS.dirblocksize]
|
||||
@ -1739,28 +1737,22 @@ xfs_get_inode_info:
|
||||
mov eax, [edx + xfs_inode.di_core.di_ctime.t_sec]
|
||||
bswap eax
|
||||
push edx
|
||||
xor edx, edx
|
||||
add eax, 3054539008 ;(369 * 365 + 89) * 24 * 3600
|
||||
adc edx, 2
|
||||
call ntfs_datetime_to_bdfe.sec
|
||||
sub eax, 978307200 ; 01.01.1970-01.01.2001 = (365*31+8)*24*60*60
|
||||
call fsTime2bdfe
|
||||
pop edx
|
||||
|
||||
mov eax, [edx + xfs_inode.di_core.di_atime.t_sec]
|
||||
bswap eax
|
||||
push edx
|
||||
xor edx, edx
|
||||
add eax, 3054539008 ;(369 * 365 + 89) * 24 * 3600
|
||||
adc edx, 2
|
||||
call ntfs_datetime_to_bdfe.sec
|
||||
sub eax, 978307200
|
||||
call fsTime2bdfe
|
||||
pop edx
|
||||
|
||||
mov eax, [edx + xfs_inode.di_core.di_mtime.t_sec]
|
||||
bswap eax
|
||||
push edx
|
||||
xor edx, edx
|
||||
add eax, 3054539008 ;(369 * 365 + 89) * 24 * 3600
|
||||
adc edx, 2
|
||||
call ntfs_datetime_to_bdfe.sec
|
||||
sub eax, 978307200
|
||||
call fsTime2bdfe
|
||||
pop edx
|
||||
|
||||
.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: esi+[esp+4] = name
|
||||
; in: ebx = pointer to parameters from sysfunc 70
|
||||
; out: eax, ebx = return values for sysfunc 70
|
||||
;----------------------------------------------------------------
|
||||
xfs_Read:
|
||||
xfs_ReadFile:
|
||||
push ebx ecx edx esi edi
|
||||
call xfs_lock
|
||||
|
||||
add esi, [esp + 24]
|
||||
;DEBUGF 1,"xfs_Read: %d %d |%s|\n",[ebx+4],[ebx+12],esi
|
||||
stdcall xfs_get_inode, esi
|
||||
mov ecx, edx
|
||||
or ecx, eax
|
||||
@ -2353,7 +2343,7 @@ xfs_dir2_node_get_numfiles:
|
||||
test eax, eax
|
||||
jnz .error
|
||||
jmp .common
|
||||
|
||||
|
||||
.leaf:
|
||||
;DEBUGF 1,".leaf\n"
|
||||
movzx ecx, word[ebx + xfs_dir2_leaf.hdr.count]
|
||||
@ -2514,7 +2504,7 @@ xfs_dir2_btree_get_numfiles:
|
||||
test eax, eax
|
||||
jnz .error
|
||||
jmp .common
|
||||
|
||||
|
||||
.leaf:
|
||||
;DEBUGF 1,".leaf\n"
|
||||
movzx ecx, word[ebx + xfs_dir2_leaf.hdr.count]
|
||||
@ -2750,7 +2740,7 @@ DEBUGF 1,".root.not_root\n"
|
||||
jmp .quit
|
||||
|
||||
.leaf:
|
||||
|
||||
|
||||
jmp .quit
|
||||
|
||||
.error:
|
||||
|
@ -141,40 +141,18 @@ deltaToScreen = 28
|
||||
.drawUTF8:
|
||||
dec dword [esp]
|
||||
js .done
|
||||
@@:
|
||||
movzx ebx, byte [esi]
|
||||
inc esi
|
||||
test bl, bl
|
||||
mov ecx, 256
|
||||
xor eax, eax
|
||||
call utf8to16
|
||||
test ax, ax
|
||||
jz .done
|
||||
jns .valid
|
||||
shl bx, 10
|
||||
jnc @b
|
||||
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
|
||||
cmp eax, 1419
|
||||
jc @f
|
||||
xor eax, eax
|
||||
@@:
|
||||
xor ebx, ebx
|
||||
.valid:
|
||||
shl eax, 4
|
||||
lea ebx, [eax+fontUni]
|
||||
pushd esi edi 16
|
||||
shl ebx, 4
|
||||
add ebx, fontUni
|
||||
mov esi, [esp+12+fontMultiplier]
|
||||
call drawChar
|
||||
imul esi, 8*4
|
||||
|
@ -1,132 +1,70 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
||||
;; 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. ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License. ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision$
|
||||
|
||||
; Core functions
|
||||
include "core/sync.inc" ; macros for synhronization objects
|
||||
include "core/sys32.inc" ; process management
|
||||
include "core/sched.inc" ; process scheduling
|
||||
include "core/syscall.inc" ; system call
|
||||
include "core/fpu.inc" ; all fpu/sse support
|
||||
include "core/sync.inc" ; macros for synhronization objects
|
||||
include "core/sys32.inc" ; process management
|
||||
include "core/sched.inc" ; process scheduling
|
||||
include "core/syscall.inc"
|
||||
include "core/fpu.inc" ; all fpu/sse support
|
||||
include "core/memory.inc"
|
||||
include "core/mtrr.inc"
|
||||
include "core/heap.inc" ; kernel and app heap
|
||||
include "core/malloc.inc" ; small kernel heap
|
||||
include "core/heap.inc"
|
||||
include "core/malloc.inc" ; small kernel heap
|
||||
include "core/taskman.inc"
|
||||
include "core/dll.inc"
|
||||
include "core/peload.inc" ;
|
||||
include "core/peload.inc"
|
||||
include "core/exports.inc"
|
||||
include "core/string.inc"
|
||||
include "core/v86.inc" ; virtual-8086 manager
|
||||
include "core/irq.inc" ; irq handling functions
|
||||
include "core/apic.inc" ; Interrupt Controller functions
|
||||
include "core/v86.inc" ; 16-bit mode machine
|
||||
include "core/irq.inc" ; interrupt handling functions
|
||||
include "core/apic.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/event.inc"
|
||||
include "gui/font.inc"
|
||||
include "gui/button.inc"
|
||||
|
||||
include "boot/shutdown.inc" ; kernel shutdown
|
||||
|
||||
; 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 "gui/mouse.inc" ; cursor
|
||||
include "gui/skincode.inc" ; windows' skin
|
||||
|
||||
include "hid/keyboard.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/parse_fn.inc"
|
||||
include "fs/fs_lfn.inc" ; sysfunction 70
|
||||
|
||||
; work with conf lib
|
||||
include "core/conf_lib.inc"
|
||||
include "network/stack.inc"
|
||||
|
||||
; load external lib
|
||||
include "core/ext_lib.inc"
|
||||
|
||||
; list of external functions
|
||||
include "imports.inc"
|
||||
include "imports.inc" ; list of external functions
|
||||
|
Loading…
Reference in New Issue
Block a user