forked from KolibriOS/kolibrios
support for PnP disks, part 4: move NTFS,EXT2,/hd*,/bd* to the new interface
git-svn-id: svn://kolibrios.org@3742 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;; FAT32.INC ;;
|
||||
@@ -58,16 +58,15 @@ PUSHAD_ESI equ [esp+4]
|
||||
PUSHAD_EDI equ [esp+0]
|
||||
|
||||
; Internal data for every FAT partition.
|
||||
struct FAT
|
||||
p PARTITION ; must be the first item
|
||||
struct FAT PARTITION
|
||||
fs_type db ?
|
||||
fat16_root db 0 ; flag for fat16 rootdir
|
||||
fat_change db 0 ; 1=fat has changed
|
||||
db ? ; alignment
|
||||
Lock MUTEX ? ; currently operations with one partition
|
||||
; can not be executed in parallel since the
|
||||
; legacy code is not ready; this mutex guards
|
||||
; all operations
|
||||
; can not be executed in parallel since the
|
||||
; legacy code is not ready; this mutex guards
|
||||
; all operations
|
||||
SECTORS_PER_FAT dd 0x1f3a
|
||||
NUMBER_OF_FATS dd 0x2
|
||||
SECTORS_PER_CLUSTER dd 0x8
|
||||
@@ -121,6 +120,7 @@ endg
|
||||
iglobal
|
||||
align 4
|
||||
fat_user_functions:
|
||||
dd free
|
||||
dd (fat_user_functions_end - fat_user_functions - 4) / 4
|
||||
dd fat_Read
|
||||
dd fat_ReadFolder
|
||||
@@ -138,17 +138,15 @@ endg
|
||||
; these labels are located before the main function to make
|
||||
; most of jumps to these be short
|
||||
fat_create_partition.free_return0:
|
||||
push ebx
|
||||
mov eax, ebp
|
||||
call free
|
||||
pop ebx
|
||||
pop ebp
|
||||
fat_create_partition.return0:
|
||||
xor eax, eax
|
||||
ret
|
||||
fat_create_partition:
|
||||
; bootsector must have been successfully read
|
||||
cmp dword [esp+4], 1
|
||||
cmp dword [esp+4], 0
|
||||
jnz .return0
|
||||
; bootsector signature must be correct
|
||||
cmp word [ebx+0x1fe], 0xaa55
|
||||
@@ -170,16 +168,17 @@ fat_create_partition:
|
||||
call malloc
|
||||
test eax, eax
|
||||
jz .return0
|
||||
mov ecx, [ebp+8]
|
||||
mov dword [eax+FAT.p.FirstSector], ecx
|
||||
mov ecx, [ebp+12]
|
||||
mov dword [eax+FAT.p.FirstSector+4], ecx
|
||||
mov ecx, [ebp+16]
|
||||
mov dword [eax+FAT.p.Length], ecx
|
||||
mov ecx, [ebp+20]
|
||||
mov dword [eax+FAT.p.Length+4], ecx
|
||||
mov [eax+FAT.p.Disk], esi
|
||||
mov [eax+FAT.p.FSUserFunctions], fat_user_functions
|
||||
mov ecx, dword [ebp+PARTITION.FirstSector]
|
||||
mov dword [eax+FAT.FirstSector], ecx
|
||||
mov ecx, dword [ebp+PARTITION.FirstSector+4]
|
||||
mov dword [eax+FAT.FirstSector+4], ecx
|
||||
mov ecx, dword [ebp+PARTITION.Length]
|
||||
mov dword [eax+FAT.Length], ecx
|
||||
mov ecx, dword [ebp+PARTITION.Length+4]
|
||||
mov dword [eax+FAT.Length+4], ecx
|
||||
mov ecx, [ebp+PARTITION.Disk]
|
||||
mov [eax+FAT.Disk], ecx
|
||||
mov [eax+FAT.FSUserFunctions], fat_user_functions
|
||||
or [eax+FAT.fat_in_cache], -1
|
||||
mov [eax+FAT.fat_change], 0
|
||||
push ebp
|
||||
@@ -226,8 +225,8 @@ fat_create_partition:
|
||||
jnz @f
|
||||
mov eax, [ebx+0x20] ; total sector count
|
||||
@@:
|
||||
mov dword [ebp+FAT.p.Length], eax
|
||||
and dword [ebp+FAT.p.Length+4], 0
|
||||
mov dword [ebp+FAT.Length], eax
|
||||
and dword [ebp+FAT.Length+4], 0
|
||||
sub eax, [ebp+FAT.DATA_START] ; eax = count of data sectors
|
||||
xor edx, edx
|
||||
div [ebp+FAT.SECTORS_PER_CLUSTER]
|
||||
@@ -262,7 +261,6 @@ fat_create_partition:
|
||||
mov [ebp+FAT.fatEND], 0x0FFFFFF8
|
||||
mov [ebp+FAT.fatMASK], 0x0FFFFFFF
|
||||
mov al, 32
|
||||
mov [fs_type], al
|
||||
mov [ebp+FAT.fs_type], al
|
||||
mov eax, ebp
|
||||
pop ebp
|
||||
@@ -274,7 +272,6 @@ fat_create_partition:
|
||||
mov [ebp+FAT.fatEND], 0x0000FFF8
|
||||
mov [ebp+FAT.fatMASK], 0x0000FFFF
|
||||
mov al, 16
|
||||
mov [fs_type], al
|
||||
mov [ebp+FAT.fs_type], al
|
||||
mov eax, ebp
|
||||
pop ebp
|
||||
@@ -768,42 +765,6 @@ hd_find_lfn:
|
||||
pop esi
|
||||
ret 4
|
||||
|
||||
;----------------------------------------------------------------
|
||||
;
|
||||
; fs_HdRead - LFN variant for reading hard disk
|
||||
;
|
||||
; Obsolete, will be replaced with filesystem-specific functions.
|
||||
;
|
||||
; esi points to filename
|
||||
; ebx pointer to 64-bit number = first wanted byte, 0+
|
||||
; may be ebx=0 - start from first byte
|
||||
; ecx number of bytes to read, 0+
|
||||
; edx mem location to return data
|
||||
;
|
||||
; ret ebx = bytes read or 0xffffffff file not found
|
||||
; eax = 0 ok read or other = errormsg
|
||||
;
|
||||
;--------------------------------------------------------------
|
||||
fs_HdRead:
|
||||
cmp [fs_type], 16
|
||||
jz @f
|
||||
cmp [fs_type], 32
|
||||
jz @f
|
||||
cmp [fs_type], 1
|
||||
jz ntfs_HdRead
|
||||
cmp [fs_type], 2
|
||||
jz ext2_HdRead
|
||||
or ebx, -1
|
||||
mov eax, ERROR_UNKNOWN_FS
|
||||
ret
|
||||
@@:
|
||||
sub ebx, 4
|
||||
push ebp
|
||||
mov ebp, [fs_dependent_data_start.partition]
|
||||
call fat_Read
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
; fat_Read - FAT16/32 implementation of reading a file
|
||||
; in: ebp = pointer to FAT structure
|
||||
@@ -943,43 +904,6 @@ fat_Read:
|
||||
sub ebx, edx
|
||||
jmp .reteof
|
||||
|
||||
;----------------------------------------------------------------
|
||||
;
|
||||
; fs_HdReadFolder - LFN variant for reading hard disk folder
|
||||
;
|
||||
; Obsolete, will be replaced with filesystem-specific functions.
|
||||
;
|
||||
; esi points to filename
|
||||
; ebx pointer to structure 32-bit number = first wanted block, 0+
|
||||
; & flags (bitfields)
|
||||
; flags: bit 0: 0=ANSI names, 1=UNICODE names
|
||||
; ecx number of blocks to read, 0+
|
||||
; edx mem location to return data
|
||||
;
|
||||
; ret ebx = blocks read or 0xffffffff folder not found
|
||||
; eax = 0 ok read or other = errormsg
|
||||
;
|
||||
;--------------------------------------------------------------
|
||||
fs_HdReadFolder:
|
||||
cmp [fs_type], 16
|
||||
jz @f
|
||||
cmp [fs_type], 32
|
||||
jz @f
|
||||
cmp [fs_type], 1
|
||||
jz ntfs_HdReadFolder
|
||||
cmp [fs_type], 2
|
||||
jz ext2_HdReadFolder
|
||||
movi eax, ERROR_UNSUPPORTED_FS
|
||||
or ebx, -1
|
||||
ret
|
||||
@@:
|
||||
sub ebx, 4
|
||||
push ebp
|
||||
mov ebp, [fs_dependent_data_start.partition]
|
||||
call fat_ReadFolder
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
; fat_ReadFolder - FAT16/32 implementation of reading a folder
|
||||
; in: ebp = pointer to FAT structure
|
||||
@@ -1377,52 +1301,6 @@ fat_get_sector:
|
||||
pop ecx
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
;
|
||||
; fs_HdRewrite - LFN variant for writing hard disk
|
||||
;
|
||||
; Obsolete, will be replaced with filesystem-specific functions.
|
||||
;
|
||||
; esi points to filename
|
||||
; ebx ignored (reserved)
|
||||
; ecx number of bytes to write, 0+
|
||||
; edx mem location to data
|
||||
;
|
||||
; ret ebx = number of written bytes
|
||||
; eax = 0 ok read or other = errormsg
|
||||
;
|
||||
;--------------------------------------------------------------
|
||||
fs_HdCreateFolder:
|
||||
mov al, 1
|
||||
jmp fs_HdRewrite.common
|
||||
|
||||
fs_HdRewrite:
|
||||
xor eax, eax
|
||||
.common:
|
||||
cmp [fs_type], 16
|
||||
jz @f
|
||||
cmp [fs_type], 32
|
||||
jz @f
|
||||
cmp [fs_type], 1
|
||||
jz ntfs_HdRewrite
|
||||
cmp [fs_type], 2
|
||||
jz ext2_HdRewrite
|
||||
mov eax, ERROR_UNKNOWN_FS
|
||||
xor ebx, ebx
|
||||
ret
|
||||
@@:
|
||||
sub ebx, 4
|
||||
push ebp
|
||||
mov ebp, [fs_dependent_data_start.partition]
|
||||
test eax, eax
|
||||
mov eax, fat_CreateFolder
|
||||
jnz @f
|
||||
mov eax, fat_Rewrite
|
||||
@@:
|
||||
call eax
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
fshrad:
|
||||
call fat_unlock
|
||||
mov eax, ERROR_ACCESS_DENIED
|
||||
@@ -1441,7 +1319,7 @@ fat_CreateFolder:
|
||||
jmp fat_Rewrite.common
|
||||
|
||||
;----------------------------------------------------------------
|
||||
; fat_HdRewrite - FAT16/32 implementation of creating a new file
|
||||
; fat_Rewrite - FAT16/32 implementation of creating a new file
|
||||
; in: ebp = pointer to FAT structure
|
||||
; in: esi+[esp+4] = name
|
||||
; in: ebx = pointer to parameters from sysfunc 70
|
||||
@@ -1988,51 +1866,16 @@ fat_Rewrite:
|
||||
mov [edi-32+20], cx
|
||||
jmp .writedircont
|
||||
|
||||
;----------------------------------------------------------------
|
||||
;
|
||||
; fs_HdWrite - LFN variant for writing to hard disk
|
||||
;
|
||||
; Obsolete, will be replaced with filesystem-specific functions.
|
||||
;
|
||||
; esi points to filename
|
||||
; ebx pointer to 64-bit number = first wanted byte, 0+
|
||||
; may be ebx=0 - start from first byte
|
||||
; ecx number of bytes to write, 0+
|
||||
; edx mem location to data
|
||||
;
|
||||
; ret ebx = bytes written (maybe 0)
|
||||
; eax = 0 ok write or other = errormsg
|
||||
;
|
||||
;--------------------------------------------------------------
|
||||
fat_Write.access_denied:
|
||||
push ERROR_ACCESS_DENIED
|
||||
fs_HdWrite.ret0:
|
||||
fat_Write.ret0:
|
||||
pop eax
|
||||
xor ebx, ebx
|
||||
ret
|
||||
|
||||
fs_HdWrite.ret11:
|
||||
fat_Write.ret11:
|
||||
push ERROR_DEVICE
|
||||
jmp fs_HdWrite.ret0
|
||||
|
||||
fs_HdWrite:
|
||||
cmp [fs_type], 16
|
||||
jz @f
|
||||
cmp [fs_type], 32
|
||||
jz @f
|
||||
cmp [fs_type], 1
|
||||
jz ntfs_HdWrite
|
||||
cmp [fs_type], 2
|
||||
jz ext2_HdWrite
|
||||
push ERROR_UNKNOWN_FS
|
||||
jmp .ret0
|
||||
@@:
|
||||
sub ebx, 4
|
||||
push ebp
|
||||
mov ebp, [fs_dependent_data_start.partition]
|
||||
call fat_Write
|
||||
pop ebp
|
||||
ret
|
||||
jmp fat_Write.ret0
|
||||
|
||||
;----------------------------------------------------------------
|
||||
; fat_Write - FAT16/32 implementation of writing to file
|
||||
@@ -2051,7 +1894,7 @@ fat_Write:
|
||||
pop edi
|
||||
push eax
|
||||
call fat_unlock
|
||||
jmp fs_HdWrite.ret0
|
||||
jmp .ret0
|
||||
.found:
|
||||
; FAT does not support files larger than 4GB
|
||||
cmp dword [ebx+8], 0
|
||||
@@ -2060,7 +1903,7 @@ fat_Write:
|
||||
pop edi
|
||||
push ERROR_END_OF_FILE
|
||||
call fat_unlock
|
||||
jmp fs_HdWrite.ret0
|
||||
jmp .ret0
|
||||
@@:
|
||||
mov ecx, [ebx+12]
|
||||
mov edx, [ebx+16]
|
||||
@@ -2361,39 +2204,6 @@ hd_extend_file:
|
||||
stc
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
;
|
||||
; fs_HdSetFileEnd - set end of file on hard disk
|
||||
;
|
||||
; Obsolete, will be replaced with filesystem-specific functions.
|
||||
;
|
||||
; esi points to filename
|
||||
; ebx points to 64-bit number = new file size
|
||||
; ecx ignored (reserved)
|
||||
; edx ignored (reserved)
|
||||
;
|
||||
; ret eax = 0 ok or other = errormsg
|
||||
;
|
||||
;--------------------------------------------------------------
|
||||
fs_HdSetFileEnd:
|
||||
cmp [fs_type], 16
|
||||
jz @f
|
||||
cmp [fs_type], 32
|
||||
jz @f
|
||||
cmp [fs_type], 1
|
||||
jz ntfs_HdSetFileEnd
|
||||
cmp [fs_type], 2
|
||||
jz ext2_HdSetFileEnd
|
||||
movi eax, ERROR_UNKNOWN_FS
|
||||
ret
|
||||
@@:
|
||||
sub ebx, 4
|
||||
push ebp
|
||||
mov ebp, [fs_dependent_data_start.partition]
|
||||
call fat_SetFileEnd
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
; fat_SetFileEnd - FAT16/32 implementation of setting end-of-file
|
||||
; in: ebp = pointer to FAT structure
|
||||
@@ -2634,25 +2444,6 @@ fat_SetFileEnd:
|
||||
movi eax, ERROR_FAT_TABLE
|
||||
ret
|
||||
|
||||
fs_HdGetFileInfo:
|
||||
cmp [fs_type], 16
|
||||
jz @f
|
||||
cmp [fs_type], 32
|
||||
jz @f
|
||||
cmp [fs_type], 1
|
||||
jz ntfs_HdGetFileInfo
|
||||
cmp [fs_type], 2
|
||||
jz ext2_HdGetFileInfo
|
||||
mov eax, ERROR_UNKNOWN_FS
|
||||
ret
|
||||
@@:
|
||||
sub ebx, 4
|
||||
push ebp
|
||||
mov ebp, [fs_dependent_data_start.partition]
|
||||
call fat_GetFileInfo
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
; fat_GetFileInfo - FAT16/32 implementation of getting file info
|
||||
; in: ebp = pointer to FAT structure
|
||||
@@ -2687,25 +2478,6 @@ fat_GetFileInfo:
|
||||
pop edi
|
||||
ret
|
||||
|
||||
fs_HdSetFileInfo:
|
||||
cmp [fs_type], 16
|
||||
jz @f
|
||||
cmp [fs_type], 32
|
||||
jz @f
|
||||
cmp [fs_type], 1
|
||||
jz ntfs_HdSetFileInfo
|
||||
cmp [fs_type], 2
|
||||
jz ext2_HdSetFileInfo
|
||||
mov eax, ERROR_UNKNOWN_FS
|
||||
ret
|
||||
@@:
|
||||
sub ebx, 4
|
||||
push ebp
|
||||
mov ebp, [fs_dependent_data_start.partition]
|
||||
call fat_SetFileInfo
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
; fat_SetFileInfo - FAT16/32 implementation of setting file info
|
||||
; in: ebp = pointer to FAT structure
|
||||
@@ -2741,36 +2513,6 @@ fat_SetFileInfo:
|
||||
pop edi
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
;
|
||||
; fs_HdDelete - delete file or empty folder from hard disk
|
||||
;
|
||||
; Obsolete, will be replaced with filesystem-specific functions.
|
||||
;
|
||||
; esi points to filename
|
||||
;
|
||||
; ret eax = 0 ok or other = errormsg
|
||||
;
|
||||
;--------------------------------------------------------------
|
||||
fs_HdDelete:
|
||||
cmp [fs_type], 16
|
||||
jz @f
|
||||
cmp [fs_type], 32
|
||||
jz @f
|
||||
cmp [fs_type], 1
|
||||
jz ntfs_HdDelete
|
||||
cmp [fs_type], 2
|
||||
jz ext2_HdDelete
|
||||
movi eax, ERROR_UNKNOWN_FS
|
||||
ret
|
||||
@@:
|
||||
sub ebx, 4
|
||||
push ebp
|
||||
mov ebp, [fs_dependent_data_start.partition]
|
||||
call fat_Delete
|
||||
pop ebp
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
; fat_Delete - FAT16/32 implementation of deleting a file/folder
|
||||
; in: ebp = pointer to FAT structure
|
||||
|
@@ -318,86 +318,6 @@ endg
|
||||
fs_noflpdisk:
|
||||
;*****************************************************************
|
||||
|
||||
mov eax, [edi+1]
|
||||
cmp eax, 'HD0 '
|
||||
je fs_yesharddisk_IDE0
|
||||
cmp eax, 'HD1 '
|
||||
je fs_yesharddisk_IDE1
|
||||
cmp eax, 'HD2 '
|
||||
je fs_yesharddisk_IDE2
|
||||
cmp eax, 'HD3 '
|
||||
je fs_yesharddisk_IDE3
|
||||
jmp old_path_harddisk
|
||||
fs_yesharddisk_IDE0:
|
||||
call reserve_hd1
|
||||
mov [hdbase], 0x1f0
|
||||
mov [hdid], 0x0
|
||||
mov [hdpos], 1
|
||||
jmp fs_yesharddisk_partition
|
||||
fs_yesharddisk_IDE1:
|
||||
call reserve_hd1
|
||||
mov [hdbase], 0x1f0
|
||||
mov [hdid], 0x10
|
||||
mov [hdpos], 2
|
||||
jmp fs_yesharddisk_partition
|
||||
fs_yesharddisk_IDE2:
|
||||
call reserve_hd1
|
||||
mov [hdbase], 0x170
|
||||
mov [hdid], 0x0
|
||||
mov [hdpos], 3
|
||||
jmp fs_yesharddisk_partition
|
||||
fs_yesharddisk_IDE3:
|
||||
call reserve_hd1
|
||||
mov [hdbase], 0x170
|
||||
mov [hdid], 0x10
|
||||
mov [hdpos], 4
|
||||
fs_yesharddisk_partition:
|
||||
call reserve_hd_channel
|
||||
; call choice_necessity_partition
|
||||
; jmp fs_yesharddisk_all
|
||||
jmp fs_for_new_semantic
|
||||
|
||||
choice_necessity_partition:
|
||||
mov eax, [edi+1+12]
|
||||
call StringToNumber
|
||||
mov [fat32part], eax
|
||||
choice_necessity_partition_1:
|
||||
mov ecx, [hdpos]
|
||||
xor eax, eax
|
||||
mov [hd_entries], eax; entries in hd cache
|
||||
mov edx, DRIVE_DATA+2
|
||||
cmp ecx, 0x80
|
||||
jb search_partition_array
|
||||
mov ecx, 4
|
||||
search_partition_array:
|
||||
mov bl, [edx]
|
||||
movzx ebx, bl
|
||||
add eax, ebx
|
||||
inc edx
|
||||
loop search_partition_array
|
||||
mov ecx, [hdpos]
|
||||
mov edx, BiosDiskPartitions
|
||||
sub ecx, 0x80
|
||||
jb .s
|
||||
je .f
|
||||
@@:
|
||||
mov ebx, [edx]
|
||||
add edx, 4
|
||||
add eax, ebx
|
||||
loop @b
|
||||
jmp .f
|
||||
.s:
|
||||
sub eax, ebx
|
||||
.f:
|
||||
add eax, [known_part]; add eax,[fat32part]
|
||||
dec eax
|
||||
xor edx, edx
|
||||
imul eax, 100
|
||||
add eax, DRIVE_DATA+0xa
|
||||
mov [transfer_adress], eax
|
||||
call partition_data_transfer_1
|
||||
ret
|
||||
|
||||
old_path_harddisk:
|
||||
mov eax, [edi+1]
|
||||
cmp eax, 'HD '
|
||||
@@ -416,27 +336,7 @@ choice_necessity_partition_1:
|
||||
|
||||
fs_no_LBA_read:
|
||||
|
||||
cmp byte [edi+1+11], 0; directory read
|
||||
je fs_give_dir1
|
||||
call reserve_hd1
|
||||
fs_for_new_semantic:
|
||||
call choice_necessity_partition
|
||||
|
||||
fs_yesharddisk_all:
|
||||
mov eax, 1
|
||||
mov ebx, [esp+24+24]
|
||||
cmp [hdpos], 0 ; is hd base set?
|
||||
jz hd_err_return
|
||||
cmp [fat32part], 0 ; is partition set?
|
||||
jnz @f
|
||||
hd_err_return:
|
||||
call free_hd_channel
|
||||
and [hd1_status], 0
|
||||
jmp file_system_return
|
||||
@@:
|
||||
|
||||
call free_hd_channel
|
||||
and [hd1_status], 0
|
||||
|
||||
fs_noharddisk:
|
||||
; \begin{diamond}[18.03.2006]
|
||||
@@ -542,7 +442,10 @@ LBA_read:
|
||||
|
||||
lbarl1:
|
||||
|
||||
call reserve_hd1
|
||||
pushad
|
||||
mov ecx, ide_mutex
|
||||
call mutex_lock
|
||||
popad
|
||||
|
||||
push eax
|
||||
push ecx
|
||||
@@ -633,6 +536,10 @@ LBA_read:
|
||||
mov [hd_error], 0
|
||||
mov [hd1_status], 0
|
||||
add esp, 2*4
|
||||
pushad
|
||||
mov ecx, ide_mutex
|
||||
call mutex_unlock
|
||||
popad
|
||||
|
||||
ret
|
||||
|
||||
|
@@ -42,18 +42,6 @@ rootdirs:
|
||||
db 10,'floppydisk'
|
||||
dd fs_OnFloppy
|
||||
dd fs_NextFloppy
|
||||
db 3,'hd0'
|
||||
dd fs_OnHd0
|
||||
dd fs_NextHd0
|
||||
db 3,'hd1'
|
||||
dd fs_OnHd1
|
||||
dd fs_NextHd1
|
||||
db 3,'hd2'
|
||||
dd fs_OnHd2
|
||||
dd fs_NextHd2
|
||||
db 3,'hd3'
|
||||
dd fs_OnHd3
|
||||
dd fs_NextHd3
|
||||
;**********************************************
|
||||
db 3,'cd0'
|
||||
dd fs_OnCd0
|
||||
@@ -76,14 +64,6 @@ virtual_root_query:
|
||||
db 'rd',0
|
||||
dd fs_HasFloppy
|
||||
db 'fd',0
|
||||
dd fs_HasHd0
|
||||
db 'hd0',0
|
||||
dd fs_HasHd1
|
||||
db 'hd1',0
|
||||
dd fs_HasHd2
|
||||
db 'hd2',0
|
||||
dd fs_HasHd3
|
||||
db 'hd3',0
|
||||
;**********************************************
|
||||
dd fs_HasCd0
|
||||
db 'cd0',0
|
||||
@@ -97,7 +77,6 @@ virtual_root_query:
|
||||
dd 0
|
||||
|
||||
fs_additional_handlers:
|
||||
dd biosdisk_handler, biosdisk_enum_root
|
||||
dd dyndisk_handler, dyndisk_enum_root
|
||||
; add new handlers here
|
||||
dd 0
|
||||
@@ -523,84 +502,6 @@ fs_FloppyServices:
|
||||
dd fs_FloppyCreateFolder
|
||||
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
|
||||
|
||||
fs_OnHd0:
|
||||
call reserve_hd1
|
||||
mov eax, [hd_address_table]
|
||||
mov [hdbase], eax ;0x1F0
|
||||
mov [hdid], 0
|
||||
push 1
|
||||
jmp fs_OnHd
|
||||
fs_OnHd1:
|
||||
call reserve_hd1
|
||||
mov eax, [hd_address_table]
|
||||
mov [hdbase], eax ;0x1F0
|
||||
mov [hdid], 0x10
|
||||
push 2
|
||||
jmp fs_OnHd
|
||||
fs_OnHd2:
|
||||
call reserve_hd1
|
||||
mov eax, [hd_address_table+16]
|
||||
mov [hdbase], eax ;0x170
|
||||
mov [hdid], 0
|
||||
push 3
|
||||
jmp fs_OnHd
|
||||
fs_OnHd3:
|
||||
call reserve_hd1
|
||||
mov eax, [hd_address_table+16]
|
||||
mov [hdbase], eax ;0x170
|
||||
mov [hdid], 0x10
|
||||
push 4
|
||||
fs_OnHd:
|
||||
call reserve_hd_channel
|
||||
pop eax
|
||||
mov [hdpos], eax
|
||||
cmp ecx, 0x100
|
||||
jae fs_OnHdAndBd.nf
|
||||
cmp cl, [DRIVE_DATA+1+eax]
|
||||
fs_OnHdAndBd:
|
||||
jbe @f
|
||||
.nf:
|
||||
call free_hd_channel
|
||||
and [hd1_status], 0
|
||||
mov dword [image_of_eax], 5 ; not found
|
||||
ret
|
||||
@@:
|
||||
mov [known_part], ecx ; mov [fat32part], ecx
|
||||
push ebx esi
|
||||
call choice_necessity_partition_1
|
||||
pop esi ebx
|
||||
mov ecx, [ebx+12]
|
||||
mov edx, [ebx+16]
|
||||
; add edx, std_application_base_address
|
||||
mov eax, [ebx]
|
||||
cmp eax, fs_NumHdServices
|
||||
jae .not_impl
|
||||
add ebx, 4
|
||||
call dword [fs_HdServices + eax*4]
|
||||
call free_hd_channel
|
||||
and [hd1_status], 0
|
||||
mov [image_of_eax], eax
|
||||
mov [image_of_ebx], ebx
|
||||
ret
|
||||
.not_impl:
|
||||
call free_hd_channel
|
||||
and [hd1_status], 0
|
||||
mov dword [image_of_eax], 2 ; not implemented
|
||||
ret
|
||||
|
||||
fs_HdServices:
|
||||
dd fs_HdRead
|
||||
dd fs_HdReadFolder
|
||||
dd fs_HdRewrite
|
||||
dd fs_HdWrite
|
||||
dd fs_HdSetFileEnd
|
||||
dd fs_HdGetFileInfo
|
||||
dd fs_HdSetFileInfo
|
||||
dd 0
|
||||
dd fs_HdDelete
|
||||
dd fs_HdCreateFolder
|
||||
fs_NumHdServices = ($ - fs_HdServices)/4
|
||||
|
||||
;*******************************************************
|
||||
fs_OnCd0:
|
||||
call reserve_cd
|
||||
@@ -691,22 +592,6 @@ fs_HasFloppy:
|
||||
cmp byte [DRIVE_DATA], 0
|
||||
setnz al
|
||||
ret
|
||||
fs_HasHd0:
|
||||
test byte [DRIVE_DATA+1], 01000000b
|
||||
setnz al
|
||||
ret
|
||||
fs_HasHd1:
|
||||
test byte [DRIVE_DATA+1], 00010000b
|
||||
setnz al
|
||||
ret
|
||||
fs_HasHd2:
|
||||
test byte [DRIVE_DATA+1], 00000100b
|
||||
setnz al
|
||||
ret
|
||||
fs_HasHd3:
|
||||
test byte [DRIVE_DATA+1], 00000001b
|
||||
setnz al
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
fs_HasCd0:
|
||||
@@ -762,27 +647,6 @@ fs_NextFloppy:
|
||||
stc
|
||||
ret
|
||||
|
||||
; on hdx, we have partitions from 1 to [0x40002+x]
|
||||
fs_NextHd0:
|
||||
push 0
|
||||
jmp fs_NextHd
|
||||
fs_NextHd1:
|
||||
push 1
|
||||
jmp fs_NextHd
|
||||
fs_NextHd2:
|
||||
push 2
|
||||
jmp fs_NextHd
|
||||
fs_NextHd3:
|
||||
push 3
|
||||
fs_NextHd:
|
||||
pop ecx
|
||||
movzx ecx, byte [DRIVE_DATA+2+ecx]
|
||||
cmp eax, ecx
|
||||
jae fs_NextFloppy.no2
|
||||
inc eax
|
||||
clc
|
||||
ret
|
||||
|
||||
;*******************************************************
|
||||
fs_NextCd:
|
||||
; we always have /cdX/1
|
||||
@@ -795,147 +659,6 @@ fs_NextCd:
|
||||
ret
|
||||
;*******************************************************
|
||||
|
||||
; Additional FS handlers.
|
||||
; This handler gets the control each time when fn 70 is called
|
||||
; with unknown item of root subdirectory.
|
||||
; in: esi -> name
|
||||
; ebp = 0 or rest of name relative to esi
|
||||
; out: if the handler processes path, he must not return in file_system_lfn,
|
||||
; but instead pop return address and return directly to the caller
|
||||
; otherwise simply return
|
||||
|
||||
; here we test for /bd<N>/... - BIOS disks
|
||||
biosdisk_handler:
|
||||
cmp [NumBiosDisks], 0
|
||||
jz .ret
|
||||
mov al, [esi]
|
||||
or al, 20h
|
||||
cmp al, 'b'
|
||||
jnz .ret
|
||||
mov al, [esi+1]
|
||||
or al, 20h
|
||||
cmp al, 'd'
|
||||
jnz .ret
|
||||
push esi
|
||||
inc esi
|
||||
inc esi
|
||||
cmp byte [esi], '0'
|
||||
jb .ret2
|
||||
cmp byte [esi], '9'
|
||||
ja .ret2
|
||||
xor edx, edx
|
||||
@@:
|
||||
lodsb
|
||||
test al, al
|
||||
jz .ok
|
||||
cmp al, '/'
|
||||
jz .ok
|
||||
sub al, '0'
|
||||
cmp al, 9
|
||||
ja .ret2
|
||||
lea edx, [edx*5]
|
||||
lea edx, [edx*2+eax]
|
||||
jmp @b
|
||||
.ret2:
|
||||
pop esi
|
||||
.ret:
|
||||
ret
|
||||
.ok:
|
||||
cmp al, '/'
|
||||
jz @f
|
||||
dec esi
|
||||
@@:
|
||||
add dl, 80h
|
||||
xor ecx, ecx
|
||||
@@:
|
||||
cmp dl, [BiosDisksData+ecx*4]
|
||||
jz .ok2
|
||||
inc ecx
|
||||
cmp ecx, [NumBiosDisks]
|
||||
jb @b
|
||||
jmp .ret2
|
||||
.ok2:
|
||||
add esp, 8
|
||||
test al, al
|
||||
jnz @f
|
||||
mov esi, fs_BdNext
|
||||
jmp file_system_lfn.maindir_noesi
|
||||
@@:
|
||||
push ecx
|
||||
push ecx
|
||||
push biosdisk_cleanup
|
||||
push fs_OnBd
|
||||
mov edi, esp
|
||||
jmp file_system_lfn.found2
|
||||
|
||||
fs_BdNext:
|
||||
cmp eax, [BiosDiskPartitions+ecx*4]
|
||||
inc eax
|
||||
cmc
|
||||
biosdisk_cleanup:
|
||||
ret
|
||||
|
||||
fs_OnBd:
|
||||
pop edx edx edx edx
|
||||
; edx = disk number, ecx = partition number
|
||||
; esi+ebp = name
|
||||
call reserve_hd1
|
||||
add edx, 0x80
|
||||
mov [hdpos], edx
|
||||
cmp ecx, [BiosDiskPartitions+(edx-0x80)*4]
|
||||
jmp fs_OnHdAndBd
|
||||
|
||||
; This handler is called when virtual root is enumerated
|
||||
; and must return all items which can be handled by this.
|
||||
; It is called several times, first time with eax=0
|
||||
; in: eax = 0 for first call, previously returned value for subsequent calls
|
||||
; out: eax = 0 => no more items
|
||||
; eax != 0 => buffer pointed to by edi contains name of item
|
||||
|
||||
; here we enumerate existing BIOS disks /bd<N>
|
||||
biosdisk_enum_root:
|
||||
cmp eax, [NumBiosDisks]
|
||||
jae .end
|
||||
push eax
|
||||
movzx eax, byte [BiosDisksData+eax*4]
|
||||
sub al, 80h
|
||||
push eax
|
||||
mov al, 'b'
|
||||
stosb
|
||||
mov al, 'd'
|
||||
stosb
|
||||
pop eax
|
||||
cmp al, 10
|
||||
jae .big
|
||||
add al, '0'
|
||||
stosb
|
||||
mov byte [edi], 0
|
||||
pop eax
|
||||
inc eax
|
||||
ret
|
||||
.end:
|
||||
xor eax, eax
|
||||
ret
|
||||
.big:
|
||||
push ecx edx
|
||||
push -'0'
|
||||
mov ecx, 10
|
||||
@@:
|
||||
xor edx, edx
|
||||
div ecx
|
||||
push edx
|
||||
test eax, eax
|
||||
jnz @b
|
||||
xchg eax, edx
|
||||
@@:
|
||||
pop eax
|
||||
add al, '0'
|
||||
stosb
|
||||
jnz @b
|
||||
pop edx ecx
|
||||
pop eax
|
||||
inc eax
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
process_replace_file_name:
|
||||
; in
|
||||
|
@@ -42,26 +42,18 @@ reserve_cd_channel:
|
||||
cmp [ChannelNumber], 1
|
||||
jne .IDE_Channel_2
|
||||
.IDE_Channel_1:
|
||||
cli
|
||||
cmp [IDE_Channel_1], 0
|
||||
je .reserve_ok_1
|
||||
sti
|
||||
call change_task
|
||||
jmp .IDE_Channel_1
|
||||
.IDE_Channel_2:
|
||||
cli
|
||||
cmp [IDE_Channel_2], 0
|
||||
je .reserve_ok_2
|
||||
sti
|
||||
call change_task
|
||||
jmp .IDE_Channel_2
|
||||
.reserve_ok_1:
|
||||
pushad
|
||||
mov ecx, ide_channel1_mutex
|
||||
call mutex_lock
|
||||
mov [IDE_Channel_1], 1
|
||||
sti
|
||||
popad
|
||||
ret
|
||||
.reserve_ok_2:
|
||||
.IDE_Channel_2:
|
||||
pushad
|
||||
mov ecx, ide_channel2_mutex
|
||||
call mutex_lock
|
||||
mov [IDE_Channel_2], 1
|
||||
sti
|
||||
popad
|
||||
ret
|
||||
|
||||
free_cd_channel:
|
||||
@@ -69,11 +61,17 @@ free_cd_channel:
|
||||
jne .IDE_Channel_2
|
||||
.IDE_Channel_1:
|
||||
mov [IDE_Channel_1], 0
|
||||
sti
|
||||
pushad
|
||||
mov ecx, ide_channel1_mutex
|
||||
call mutex_unlock
|
||||
popad
|
||||
ret
|
||||
.IDE_Channel_2:
|
||||
mov [IDE_Channel_2], 0
|
||||
sti
|
||||
pushad
|
||||
mov ecx, ide_channel2_mutex
|
||||
call mutex_unlock
|
||||
popad
|
||||
ret
|
||||
|
||||
uglobal
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,436 +0,0 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision$
|
||||
|
||||
|
||||
;*************************************************************
|
||||
;* 13.02.2010 Find all partition and check supported FS
|
||||
;* 12.07.2007 Check all 4 entry of MBR and EMBR
|
||||
;* 29.04.2006 Elimination of hangup after the
|
||||
;* expiration hd_wait_timeout - Mario79
|
||||
;* 28.01.2006 find all Fat16/32 partition in all input point
|
||||
;* to MBR - Mario79
|
||||
;*************************************************************
|
||||
|
||||
uglobal
|
||||
align 4
|
||||
|
||||
;******************************************************
|
||||
; Please do not change this place - variables in text
|
||||
; Mario79
|
||||
; START place
|
||||
;******************************************************
|
||||
PARTITION_START dd 0x3f
|
||||
PARTITION_END dd 0
|
||||
fs_type db 0 ; 1=NTFS, 2=EXT2/3, 16=FAT16, 32=FAT32
|
||||
align 4
|
||||
|
||||
fs_dependent_data_start:
|
||||
; FATxx data
|
||||
|
||||
.partition dd ?
|
||||
rb 80
|
||||
|
||||
fs_dependent_data_end:
|
||||
file_system_data_size = $ - PARTITION_START
|
||||
if file_system_data_size > 96
|
||||
ERROR:
|
||||
sizeof(file system data) too big!
|
||||
end if
|
||||
|
||||
virtual at fs_dependent_data_start
|
||||
; NTFS data
|
||||
ntfs_data:
|
||||
.sectors_per_cluster dd ?
|
||||
.mft_cluster dd ?
|
||||
.mftmirr_cluster dd ?
|
||||
.frs_size dd ? ; FRS size in bytes
|
||||
.iab_size dd ? ; IndexAllocationBuffer size in bytes
|
||||
.frs_buffer dd ?
|
||||
.iab_buffer dd ?
|
||||
.mft_retrieval dd ?
|
||||
.mft_retrieval_size dd ?
|
||||
.mft_retrieval_alloc dd ?
|
||||
.mft_retrieval_end dd ?
|
||||
.cur_index_size dd ?
|
||||
.cur_index_buf dd ?
|
||||
if $ > fs_dependent_data_end
|
||||
ERROR:
|
||||
increase sizeof(fs_dependent_data)!
|
||||
end if
|
||||
end virtual
|
||||
|
||||
virtual at fs_dependent_data_start
|
||||
; EXT2 data
|
||||
ext2_data:
|
||||
.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 ? ;RUS: блок на глобальную 1 процедуру ;ENG: block for 1 global procedure
|
||||
.ext2_temp_block dd ? ;RUS: блок для мелких процедур ;ENG: block for small procedures
|
||||
.ext2_save_inode dd ? ;RUS: inode на глобальную процедуру ;ENG: inode for global procedure
|
||||
.ext2_temp_inode dd ? ;RUS: inode для мелких процедур ;ENG: inode for small procedures
|
||||
.sb dd ? ; superblock
|
||||
.groups_count dd ?
|
||||
if $ > fs_dependent_data_end
|
||||
ERROR:
|
||||
increase sizeof(fs_dependent_data)!
|
||||
end if
|
||||
end virtual
|
||||
|
||||
;***************************************************************************
|
||||
; End place
|
||||
; Mario79
|
||||
;***************************************************************************
|
||||
endg
|
||||
iglobal
|
||||
|
||||
partition_types: ; list of fat16/32 partitions
|
||||
db 0x04 ; DOS: fat16 <32M
|
||||
db 0x06 ; DOS: fat16 >32M
|
||||
db 0x0b ; WIN95: fat32
|
||||
db 0x0c ; WIN95: fat32, LBA-mapped
|
||||
db 0x0e ; WIN95: fat16, LBA-mapped
|
||||
db 0x14 ; Hidden DOS: fat16 <32M
|
||||
db 0x16 ; Hidden DOS: fat16 >32M
|
||||
db 0x1b ; Hidden WIN95: fat32
|
||||
db 0x1c ; Hidden WIN95: fat32, LBA-mapped
|
||||
db 0x1e ; Hidden WIN95: fat16, LBA-mapped
|
||||
db 0xc4 ; DRDOS/secured: fat16 <32M
|
||||
db 0xc6 ; DRDOS/secured: fat16 >32M
|
||||
db 0xcb ; DRDOS/secured: fat32
|
||||
db 0xcc ; DRDOS/secured: fat32, LBA-mapped
|
||||
db 0xce ; DRDOS/secured: fat16, LBA-mapped
|
||||
db 0xd4 ; Old Multiuser DOS secured: fat16 <32M
|
||||
db 0xd6 ; Old Multiuser DOS secured: fat16 >32M
|
||||
db 0x07 ; NTFS
|
||||
db 0x27 ; NTFS, hidden
|
||||
db 0x83 ; Linux native file system (ext2fs)
|
||||
partition_types_end:
|
||||
|
||||
|
||||
extended_types: ; list of extended partitions
|
||||
db 0x05 ; DOS: extended partition
|
||||
db 0x0f ; WIN95: extended partition, LBA-mapped
|
||||
db 0xc5 ; DRDOS/secured: extended partition
|
||||
db 0xd5 ; Old Multiuser DOS secured: extended partition
|
||||
extended_types_end:
|
||||
|
||||
endg
|
||||
|
||||
; Partition chain used:
|
||||
; MBR <---------------------
|
||||
; | |
|
||||
; |-> PARTITION1 |
|
||||
; |-> EXTENDED PARTITION - ;not need be second partition
|
||||
; |-> PARTITION3
|
||||
; |-> PARTITION4
|
||||
|
||||
set_PARTITION_variables:
|
||||
set_FAT32_variables: ;deprecated
|
||||
and [problem_partition], 0
|
||||
call reserve_hd1
|
||||
call reserve_hd_channel
|
||||
|
||||
pushad
|
||||
|
||||
cmp dword [hdpos], 0
|
||||
je problem_hd
|
||||
|
||||
xor ecx, ecx ; partition count
|
||||
;or edx,-1 ; flag for partition
|
||||
xor eax, eax ; address MBR
|
||||
xor ebp, ebp ; extended partition start
|
||||
|
||||
new_mbr:
|
||||
test ebp, ebp ; is there extended partition? (MBR or EMBR)
|
||||
jnz extended_already_set; yes
|
||||
xchg ebp, eax ; no. set it now
|
||||
|
||||
extended_already_set:
|
||||
add eax, ebp ; mbr=mbr+0, ext_part=ext_start+relat_start
|
||||
mov ebx, buffer
|
||||
call hd_read
|
||||
cmp [hd_error], 0
|
||||
jne problem_hd
|
||||
|
||||
cmp word [ebx+0x1fe], 0xaa55; is it valid boot sector?
|
||||
jnz end_partition_chain
|
||||
push eax ; push only one time
|
||||
cmp dword [ebx+0x1be+0xc], 0; skip over empty partition
|
||||
jnz test_primary_partition_0
|
||||
cmp dword [ebx+0x1be+0xc+16], 0
|
||||
jnz test_primary_partition_1
|
||||
cmp dword [ebx+0x1be+0xc+16+16], 0
|
||||
jnz test_primary_partition_2
|
||||
cmp dword [ebx+0x1be+0xc+16+16+16], 0
|
||||
jnz test_primary_partition_3
|
||||
pop eax
|
||||
jmp end_partition_chain
|
||||
|
||||
test_primary_partition_0:
|
||||
mov al, [ebx+0x1be+4]; get primary partition type
|
||||
call scan_partition_types
|
||||
jnz test_primary_partition_1; no. skip over
|
||||
|
||||
inc ecx
|
||||
cmp ecx, [known_part]; is it wanted partition?
|
||||
jnz test_primary_partition_1; no
|
||||
|
||||
pop eax
|
||||
;mov edx, eax ; start sector
|
||||
add eax, [ebx+0x1be+8] ; add relative start
|
||||
;mov [PARTITON_START],edx
|
||||
;push edx
|
||||
mov edx, [ebx+0x1be+12] ; length
|
||||
;add edx, eax ; add length
|
||||
;dec edx ; PARTITION_END is inclusive
|
||||
;mov [PARTITION_END], edx ; note that this can be changed
|
||||
; when file system data will be available
|
||||
mov cl, [ebx+0x1be+4] ; fs_type
|
||||
;mov [fs_type], dl ; save for FS recognizer (separate FAT vs NTFS)
|
||||
;pop edx
|
||||
jmp hd_and_partition_ok
|
||||
|
||||
test_primary_partition_1:
|
||||
mov al, [ebx+0x1be+4+16]; get primary partition type
|
||||
call scan_partition_types
|
||||
jnz test_primary_partition_2 ; no. skip over
|
||||
|
||||
inc ecx
|
||||
cmp ecx, [known_part]; is it wanted partition?
|
||||
jnz test_primary_partition_2 ; no
|
||||
|
||||
pop eax
|
||||
add eax, [ebx+0x1be+8+16]
|
||||
mov edx, [ebx+0x1be+12+16]
|
||||
mov cl, [ebx+0x1be+4+16]
|
||||
jmp hd_and_partition_ok
|
||||
|
||||
;mov edx, eax
|
||||
;add edx, [ebx+0x1be+8+16]
|
||||
;push edx
|
||||
;add edx, [ebx+0x1be+12+16]
|
||||
;dec edx
|
||||
;mov [PARTITION_END], edx
|
||||
;mov al, [ebx+0x1be+4+16]
|
||||
;mov [fs_type], dl
|
||||
;pop edx
|
||||
|
||||
test_primary_partition_2:
|
||||
mov al, [ebx+0x1be+4+16+16]; get primary partition type
|
||||
call scan_partition_types
|
||||
jnz test_primary_partition_3 ; no. skip over
|
||||
|
||||
inc ecx
|
||||
cmp ecx, [known_part]; is it wanted partition?
|
||||
jnz test_primary_partition_3 ; no
|
||||
|
||||
pop eax
|
||||
add eax, [ebx+0x1be+8+16+16]
|
||||
mov edx, [ebx+0x1be+12+16+16]
|
||||
mov cl, [ebx+0x1be+4+16+16]
|
||||
jmp hd_and_partition_ok
|
||||
;mov edx, eax
|
||||
;add edx, [ebx+0x1be+8+16+16]
|
||||
;push edx
|
||||
;add edx, [ebx+0x1be+12+16+16]
|
||||
;dec edx
|
||||
;mov [PARTITION_END], edx
|
||||
;mov al, [ebx+0x1be+4+16+16]
|
||||
;mov [fs_type], dl
|
||||
;pop edx
|
||||
|
||||
test_primary_partition_3:
|
||||
mov al, [ebx+0x1be+4+16+16+16]; get primary partition type
|
||||
call scan_partition_types
|
||||
jnz test_ext_partition_0 ; no. skip over
|
||||
|
||||
inc ecx
|
||||
cmp ecx, [known_part]; is it wanted partition?
|
||||
jnz test_ext_partition_0; no
|
||||
|
||||
pop eax
|
||||
add eax, [ebx+0x1be+8+16+16+16]
|
||||
mov edx, [ebx+0x1be+12+16+16+16]
|
||||
mov cl, [ebx+0x1be+4+16+16+16]
|
||||
jmp hd_and_partition_ok
|
||||
|
||||
;mov edx, eax
|
||||
;add edx, [ebx+0x1be+8+16+16+16]
|
||||
;push edx
|
||||
;add edx, [ebx+0x1be+12+16+16+16]
|
||||
;dec edx
|
||||
;mov [PARTITION_END], edx
|
||||
;mov al, [ebx+0x1be+4+16+16+16]
|
||||
;mov [fs_type], dl
|
||||
;pop edx
|
||||
|
||||
test_ext_partition_0:
|
||||
pop eax ; просто выкидываем из стека
|
||||
mov al, [ebx+0x1be+4]; get extended partition type
|
||||
call scan_extended_types
|
||||
jnz test_ext_partition_1
|
||||
|
||||
mov eax, [ebx+0x1be+8]; add relative start
|
||||
test eax, eax ; is there extended partition?
|
||||
jnz new_mbr ; yes. read it
|
||||
|
||||
test_ext_partition_1:
|
||||
mov al, [ebx+0x1be+4+16]; get extended partition type
|
||||
call scan_extended_types
|
||||
jnz test_ext_partition_2
|
||||
|
||||
mov eax, [ebx+0x1be+8+16]; add relative start
|
||||
test eax, eax ; is there extended partition?
|
||||
jnz new_mbr ; yes. read it
|
||||
|
||||
test_ext_partition_2:
|
||||
mov al, [ebx+0x1be+4+16+16]; get extended partition type
|
||||
call scan_extended_types
|
||||
jnz test_ext_partition_3
|
||||
|
||||
mov eax, [ebx+0x1be+8+16+16]; add relative start
|
||||
test eax, eax ; is there extended partition?
|
||||
jnz new_mbr ; yes. read it
|
||||
|
||||
test_ext_partition_3:
|
||||
mov al, [ebx+0x1be+4+16+16+16]; get extended partition type
|
||||
call scan_extended_types
|
||||
jnz end_partition_chain; no. end chain
|
||||
|
||||
mov eax, [ebx+0x1be+8+16+16+16]; get start of extended partition
|
||||
test eax, eax ; is there extended partition?
|
||||
jnz new_mbr ; yes. read it
|
||||
|
||||
end_partition_chain:
|
||||
;mov [partition_count],ecx
|
||||
|
||||
;cmp edx,-1 ; found wanted partition?
|
||||
;jnz hd_and_partition_ok ; yes. install it
|
||||
;jmp problem_partition_or_fat
|
||||
problem_hd:
|
||||
or [problem_partition], 2
|
||||
jmp return_from_part_set
|
||||
|
||||
|
||||
scan_partition_types:
|
||||
push ecx
|
||||
mov edi, partition_types
|
||||
mov ecx, partition_types_end-partition_types
|
||||
cld
|
||||
repne scasb ; is partition type ok?
|
||||
pop ecx
|
||||
ret
|
||||
|
||||
scan_extended_types:
|
||||
push ecx
|
||||
mov edi, extended_types
|
||||
mov ecx, extended_types_end-extended_types
|
||||
cld
|
||||
repne scasb ; is it extended partition?
|
||||
pop ecx
|
||||
ret
|
||||
|
||||
problem_fat_dec_count: ; bootsector is missing or another problem
|
||||
; dec [partition_count] ; remove it from partition_count
|
||||
|
||||
problem_partition_or_fat:
|
||||
or [problem_partition], 1
|
||||
|
||||
return_from_part_set:
|
||||
popad
|
||||
;mov [fs_type],0
|
||||
call free_hd_channel
|
||||
mov [hd1_status], 0 ; free
|
||||
ret
|
||||
|
||||
hd_and_partition_ok:
|
||||
|
||||
;eax = PARTITION_START edx=PARTITION_LENGTH cl=fs_type
|
||||
mov [fs_type], cl
|
||||
;mov eax,edx
|
||||
mov [PARTITION_START], eax
|
||||
add edx, eax
|
||||
dec edx
|
||||
mov [PARTITION_END], edx
|
||||
|
||||
; mov edx, [PARTITION_END]
|
||||
; sub edx, eax
|
||||
; inc edx ; edx = length of partition зачем оно нам??
|
||||
|
||||
; mov [hd_setup],1
|
||||
mov ebx, buffer
|
||||
call hd_read ; read boot sector of partition
|
||||
cmp [hd_error], 0
|
||||
jz boot_read_ok
|
||||
cmp [fs_type], 7
|
||||
jnz problem_fat_dec_count
|
||||
; NTFS duplicates bootsector:
|
||||
; NT4/2k/XP+ saves bootsector copy in the end of disk
|
||||
; NT 3.51 saves bootsector copy in the middle of disk
|
||||
and [hd_error], 0
|
||||
mov eax, [PARTITION_END]
|
||||
call hd_read
|
||||
cmp [hd_error], 0
|
||||
jnz @f
|
||||
call ntfs_test_bootsec
|
||||
jnc boot_read_ok
|
||||
@@:
|
||||
and [hd_error], 0
|
||||
mov eax, edx
|
||||
shr eax, 1
|
||||
add eax, [PARTITION_START]
|
||||
call hd_read
|
||||
cmp [hd_error], 0
|
||||
jnz problem_fat_dec_count ; no chance...
|
||||
boot_read_ok:
|
||||
|
||||
; if we are running on NTFS, check bootsector
|
||||
|
||||
call ntfs_test_bootsec ; test ntfs
|
||||
jnc ntfs_setup
|
||||
|
||||
call ext2_test_superblock ; test ext2fs
|
||||
jnc ext2_setup
|
||||
|
||||
mov eax, [PARTITION_START] ;ext2 test changes [buffer]
|
||||
call hd_read
|
||||
cmp [hd_error], 0
|
||||
jnz problem_fat_dec_count
|
||||
|
||||
push 0
|
||||
mov eax, [PARTITION_END]
|
||||
sub eax, [PARTITION_START]
|
||||
inc eax
|
||||
push eax
|
||||
push 0
|
||||
push [PARTITION_START]
|
||||
push ebp
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
mov esi, 'old' ; special value: there is no DISK structure
|
||||
push 1 ; bootsector read successfully
|
||||
call fat_create_partition
|
||||
add esp, 4*7
|
||||
test eax, eax
|
||||
jz problem_fat_dec_count
|
||||
mov [fs_dependent_data_start.partition], eax
|
||||
mov al, [eax+FAT.fs_type]
|
||||
mov [fs_type], al
|
||||
|
||||
popad
|
||||
call free_hd_channel
|
||||
mov [hd1_status], 0 ; free
|
||||
ret
|
Reference in New Issue
Block a user