diff --git a/kernel/trunk/fs/fat32.inc b/kernel/trunk/fs/fat32.inc index 2a9fd2cdeb..5494b9b78a 100644 --- a/kernel/trunk/fs/fat32.inc +++ b/kernel/trunk/fs/fat32.inc @@ -8,6 +8,8 @@ ;; ;; ;; See file COPYING for details ;; ;; ;; +;; 28.01.2006 find all Fat16/32 partition in all input point ;; +;; to MBR, see file part_set.inc - Mario79 ;; ;; 15.01.2005 get file size/attr/date, file_append - ATV ;; ;; 04.12.2004 skip volume label, file delete bug fixed - ATV ;; ;; 29.11.2004 get_free_FAT changed, append dir bug fixed - ATV ;; @@ -51,36 +53,6 @@ PUSHAD_EBP equ [esp+8] PUSHAD_ESI equ [esp+4] PUSHAD_EDI equ [esp+0] -align 4 -;****************************************************** -; Please do not change this place - variables in text -; Mario79 -; START place -;****************************************************** -PARTITION_START dd 0x3f -PARTITION_END dd 0 -SECTORS_PER_FAT dd 0x1f3a -NUMBER_OF_FATS dd 0x2 -SECTORS_PER_CLUSTER dd 0x8 -BYTES_PER_SECTOR dd 0x200 ; Note: if BPS <> 512 need lots of changes -ROOT_CLUSTER dd 2 ; first rootdir cluster -FAT_START dd 0 ; start of fat table -ROOT_START dd 0 ; start of rootdir (only fat16) -ROOT_SECTORS dd 0 ; count of rootdir sectors (only fat16) -DATA_START dd 0 ; start of data area (=first cluster 2) -LAST_CLUSTER dd 0 ; last availabe cluster -ADR_FSINFO dd 0 ; used only by fat32 - -fatRESERVED dd 0x0FFFFFF6 -fatBAD dd 0x0FFFFFF7 -fatEND dd 0x0FFFFFF8 -fatMASK dd 0x0FFFFFFF - -fat_type db 0 ; 0=none, 16=fat16, 32=fat32 -;*************************************************************************** -; End place -; Mario79 -;*************************************************************************** cluster dd 0 ; used by file_write,makedir,append partition_count dd 0 ; partitions found by set_FAT32_variables longname_sec1 dd 0 ; used by analyze_directory to save 2 previous @@ -131,38 +103,6 @@ uglobal 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 - 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 - - reserve_hd1: cli @@ -201,197 +141,7 @@ clear_hd_cache: problem_partition db 0 ; used for partitions search -; Partition chain used: -; MBR ; PARTITION2 ; PARTITION3 ; PARTITION4 -;========================================================== -; fat16/32 +-- fat16/32 +-- fat16/32 +-- fat16/32 +-- -; extended --+ extended --+ extended --+ extended --+ -; 0 0 0 0 -; 0 0 0 0 -; Notes: -; - extended partition need to be in second entry on table -; - it will skip over removed partitions - -set_FAT32_variables: - mov [0xfe10],dword 0 ; entries in hd cache - mov [problem_partition],0 - call reserve_hd1 - call clear_hd_cache - - cmp dword [hdpos],0 - je problem_hd - - pushad - xor ecx,ecx ; partition count - mov edx,-1 ; flag for partition - xor eax,eax ; read MBR - xor ebp,ebp ; extended partition start - -new_partition: - test ebp,ebp ; is there extended partition? - 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 word [ebx+0x1fe],0xaa55 ; is it valid boot sector? - jnz end_partition_chain - cmp dword [ebx+0x1be+0xc],0 ; skip over empty partition - jz next_partition - - push eax ecx - mov edi,partition_types - mov ecx,partition_types_end-partition_types - mov al,[ebx+0x1be+4] ; get partition type - cld - repne scasb ; is partition type ok? - pop ecx eax - jnz next_partition ; no. skip over - - inc ecx - cmp ecx,[fat32part] ; is it wanted partition? - jnz next_partition ; no - - mov edx,eax ; start sector - add edx,[ebx+0x1be+8] ; add relative start - -next_partition: - push ecx - mov edi,extended_types - mov ecx,extended_types_end-extended_types - mov al,[ebx+0x1be+4+16] ; get second partition type - cld - repne scasb ; is it extended partition? - pop ecx - jnz end_partition_chain ; no. end chain - - mov eax,[ebx+0x1be+8+16] ; get start of extended partition - test eax,eax ; is there extended partition? - jnz new_partition ; 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_fat_dec_count: ; bootsector is missing or another problem - dec [partition_count] ; remove it from partition_count - -problem_partition_or_fat: - popad - -problem_hd: - mov [fat_type],0 - mov [hd1_status],0 ; free - mov [problem_partition],1 - ret - -hd_and_partition_ok: - mov eax,edx - mov [PARTITION_START],eax - - mov [hd_setup],1 - mov ebx,buffer - call hd_read ; read boot sector of partition - mov [hd_setup],0 - - cmp word [ebx+0x1fe],0xaa55 ; is it valid boot sector? - jnz problem_fat_dec_count - - movzx eax,word [ebx+0xe] ; sectors reserved - add eax,[PARTITION_START] - mov [FAT_START],eax ; fat_start = partition_start + reserved - - movzx eax,byte [ebx+0xd] ; sectors per cluster - mov [SECTORS_PER_CLUSTER],eax - - movzx ecx,word [ebx+0xb] ; bytes per sector - mov [BYTES_PER_SECTOR],ecx - - movzx eax,word [ebx+0x11] ; count of rootdir entries (=0 fat32) - mov edx,32 - mul edx - dec ecx - add eax,ecx ; round up if not equal count - inc ecx ; bytes per sector - div ecx - mov [ROOT_SECTORS],eax ; count of rootdir sectors - - movzx eax,word [ebx+0x16] ; sectors per fat <65536 - test eax,eax - jnz fat16_fatsize - mov eax,[ebx+0x24] ; sectors per fat - fat16_fatsize: - mov [SECTORS_PER_FAT],eax - - movzx eax,byte [ebx+0x10] ; number of fats - test eax,eax ; if 0 it's not fat partition - jz problem_fat_dec_count - mov [NUMBER_OF_FATS],eax - imul eax,[SECTORS_PER_FAT] - add eax,[FAT_START] - mov [ROOT_START],eax ; rootdir = fat_start + fat_size * fat_count - add eax,[ROOT_SECTORS] ; rootdir sectors should be 0 on fat32 - mov [DATA_START],eax ; data area = rootdir + rootdir_size - - movzx eax,word [ebx+0x13] ; total sector count <65536 - test eax,eax - jnz fat16_total - mov eax,[ebx+0x20] ; total sector count - fat16_total: - add eax,[PARTITION_START] - dec eax - mov [PARTITION_END],eax - inc eax - sub eax,[DATA_START] ; eax = count of data sectors - xor edx,edx - div dword [SECTORS_PER_CLUSTER] - inc eax - mov [LAST_CLUSTER],eax - dec eax ; cluster count - - ; limits by Microsoft Hardware White Paper v1.03 - cmp eax,4085 ; 0xff5 - jb problem_fat_dec_count ; fat12 not supported - cmp eax,65525 ; 0xfff5 - jb fat16_partition - -fat32_partition: - mov eax,[ebx+0x2c] ; rootdir cluster - mov [ROOT_CLUSTER],eax - movzx eax,word [ebx+0x30] ; fs info sector - add eax,[PARTITION_START] - mov [ADR_FSINFO],eax - - popad - - mov [fatRESERVED],0x0FFFFFF6 - mov [fatBAD],0x0FFFFFF7 - mov [fatEND],0x0FFFFFF8 - mov [fatMASK],0x0FFFFFFF - mov [fat_type],32 ; Fat32 - mov [hd1_status],0 ; free - ret - -fat16_partition: - xor eax,eax - mov [ROOT_CLUSTER],eax - - popad - - mov [fatRESERVED],0x0000FFF6 - mov [fatBAD],0x0000FFF7 - mov [fatEND],0x0000FFF8 - mov [fatMASK],0x0000FFFF - mov [fat_type],16 ; Fat16 - mov [hd1_status],0 ; free - ret - +include 'part_set.inc' set_FAT: ;-------------------------------- diff --git a/kernel/trunk/fs/part_set.inc b/kernel/trunk/fs/part_set.inc new file mode 100644 index 0000000000..b48a9f4409 --- /dev/null +++ b/kernel/trunk/fs/part_set.inc @@ -0,0 +1,344 @@ +;************************************************************* +;* 28.01.2006 find all Fat16/32 partition in all input point * +;* to MBR - Mario79 * +;************************************************************* + +align 4 +;****************************************************** +; Please do not change this place - variables in text +; Mario79 +; START place +;****************************************************** +PARTITION_START dd 0x3f +PARTITION_END dd 0 +SECTORS_PER_FAT dd 0x1f3a +NUMBER_OF_FATS dd 0x2 +SECTORS_PER_CLUSTER dd 0x8 +BYTES_PER_SECTOR dd 0x200 ; Note: if BPS <> 512 need lots of changes +ROOT_CLUSTER dd 2 ; first rootdir cluster +FAT_START dd 0 ; start of fat table +ROOT_START dd 0 ; start of rootdir (only fat16) +ROOT_SECTORS dd 0 ; count of rootdir sectors (only fat16) +DATA_START dd 0 ; start of data area (=first cluster 2) +LAST_CLUSTER dd 0 ; last availabe cluster +ADR_FSINFO dd 0 ; used only by fat32 + +fatRESERVED dd 0x0FFFFFF6 +fatBAD dd 0x0FFFFFF7 +fatEND dd 0x0FFFFFF8 +fatMASK dd 0x0FFFFFFF + +fat_type db 0 ; 0=none, 16=fat16, 32=fat32 +;*************************************************************************** +; End place +; Mario79 +;*************************************************************************** + +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 + 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 ; PARTITION2 ; PARTITION3 ; PARTITION4 +;========================================================== +; fat16/32 +-- fat16/32 +-- fat16/32 +-- fat16/32 +-- +; extended --+ extended --+ extended --+ extended --+ +; 0 0 0 0 +; 0 0 0 0 +; Notes: +; - extended partition need to be in second entry on table +; - it will skip over removed partitions + +set_FAT32_variables: + mov [0xfe10],dword 0 ; entries in hd cache + mov [problem_partition],0 + call reserve_hd1 + call clear_hd_cache + + cmp dword [hdpos],0 + je problem_hd + + pushad + xor ecx,ecx ; partition count + mov edx,-1 ; flag for partition + xor eax,eax ; read MBR + xor ebp,ebp ; extended partition start + +new_partition: + test ebp,ebp ; is there extended partition? + 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 word [ebx+0x1fe],0xaa55 ; is it valid boot sector? + jnz end_partition_chain + cmp dword [ebx+0x1be+0xc],0 ; skip over empty partition + jz next_partition + + push eax + mov al,[ebx+0x1be+4] ; get primary partition type + call scan_partition_types + pop eax + jnz next_primary_partition ; no. skip over + + inc ecx + cmp ecx,[fat32part] ; is it wanted partition? + jnz next_primary_partition ; no + + mov edx,eax ; start sector + add edx,[ebx+0x1be+8] ; add relative start + +next_primary_partition: + push eax + mov al,[ebx+0x1be+4+16] ; get primary partition type + call scan_partition_types + pop eax + jnz next_primary_partition_1 ; no. skip over + + inc ecx + cmp ecx,[fat32part] ; is it wanted partition? + jnz next_primary_partition_1 ; no + + mov edx,eax ; start sector + add edx,[ebx+0x1be+8+16] ; add relative start + +next_primary_partition_1: + push eax + mov al,[ebx+0x1be+4+16+16] ; get primary partition type + call scan_partition_types + pop eax + jnz next_primary_partition_2 ; no. skip over + + inc ecx + cmp ecx,[fat32part] ; is it wanted partition? + jnz next_primary_partition_2 ; no + + mov edx,eax ; start sector + add edx,[ebx+0x1be+8+16+16] ; add relative start + +next_primary_partition_2: + push eax + mov al,[ebx+0x1be+4+16+16+16] ; get primary partition type + call scan_partition_types + pop eax + jnz next_partition ; no. skip over + + inc ecx + cmp ecx,[fat32part] ; is it wanted partition? + jnz next_partition ; no + + mov edx,eax ; start sector + add edx,[ebx+0x1be+8+16+16+16] ; add relative start + +next_partition: + push eax + mov al,[ebx+0x1be+4] ; get extended partition type + call scan_extended_types + pop eax + jnz next_partition_1 + + mov eax,[ebx+0x1be+8] ; add relative start + test eax,eax ; is there extended partition? + jnz new_partition ; yes. read it + +next_partition_1: + push eax + mov al,[ebx+0x1be+4+16] ; get extended partition type + call scan_extended_types + pop eax + jnz next_partition_2 + + mov eax,[ebx+0x1be+8+16] ; add relative start + test eax,eax ; is there extended partition? + jnz new_partition ; yes. read it + +next_partition_2: + push eax + mov al,[ebx+0x1be+4+16+16] ; get extended partition type + call scan_extended_types + pop eax + jnz next_partition_3 + + mov eax,[ebx+0x1be+8+16+16] ; add relative start + test eax,eax ; is there extended partition? + jnz new_partition ; yes. read it + +next_partition_3: + push eax + mov al,[ebx+0x1be+4+16+16+16] ; get extended partition type + call scan_extended_types + pop eax + 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_partition ; 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 + +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: + popad + +problem_hd: + mov [fat_type],0 + mov [hd1_status],0 ; free + mov [problem_partition],1 + ret + +hd_and_partition_ok: + mov eax,edx + mov [PARTITION_START],eax + + mov [hd_setup],1 + mov ebx,buffer + call hd_read ; read boot sector of partition + mov [hd_setup],0 + + cmp word [ebx+0x1fe],0xaa55 ; is it valid boot sector? + jnz problem_fat_dec_count + + movzx eax,word [ebx+0xe] ; sectors reserved + add eax,[PARTITION_START] + mov [FAT_START],eax ; fat_start = partition_start + reserved + + movzx eax,byte [ebx+0xd] ; sectors per cluster + mov [SECTORS_PER_CLUSTER],eax + + movzx ecx,word [ebx+0xb] ; bytes per sector + mov [BYTES_PER_SECTOR],ecx + + movzx eax,word [ebx+0x11] ; count of rootdir entries (=0 fat32) + mov edx,32 + mul edx + dec ecx + add eax,ecx ; round up if not equal count + inc ecx ; bytes per sector + div ecx + mov [ROOT_SECTORS],eax ; count of rootdir sectors + + movzx eax,word [ebx+0x16] ; sectors per fat <65536 + test eax,eax + jnz fat16_fatsize + mov eax,[ebx+0x24] ; sectors per fat + fat16_fatsize: + mov [SECTORS_PER_FAT],eax + + movzx eax,byte [ebx+0x10] ; number of fats + test eax,eax ; if 0 it's not fat partition + jz problem_fat_dec_count + mov [NUMBER_OF_FATS],eax + imul eax,[SECTORS_PER_FAT] + add eax,[FAT_START] + mov [ROOT_START],eax ; rootdir = fat_start + fat_size * fat_count + add eax,[ROOT_SECTORS] ; rootdir sectors should be 0 on fat32 + mov [DATA_START],eax ; data area = rootdir + rootdir_size + + movzx eax,word [ebx+0x13] ; total sector count <65536 + test eax,eax + jnz fat16_total + mov eax,[ebx+0x20] ; total sector count + fat16_total: + add eax,[PARTITION_START] + dec eax + mov [PARTITION_END],eax + inc eax + sub eax,[DATA_START] ; eax = count of data sectors + xor edx,edx + div dword [SECTORS_PER_CLUSTER] + inc eax + mov [LAST_CLUSTER],eax + dec eax ; cluster count + + ; limits by Microsoft Hardware White Paper v1.03 + cmp eax,4085 ; 0xff5 + jb problem_fat_dec_count ; fat12 not supported + cmp eax,65525 ; 0xfff5 + jb fat16_partition + +fat32_partition: + mov eax,[ebx+0x2c] ; rootdir cluster + mov [ROOT_CLUSTER],eax + movzx eax,word [ebx+0x30] ; fs info sector + add eax,[PARTITION_START] + mov [ADR_FSINFO],eax + + popad + + mov [fatRESERVED],0x0FFFFFF6 + mov [fatBAD],0x0FFFFFF7 + mov [fatEND],0x0FFFFFF8 + mov [fatMASK],0x0FFFFFFF + mov [fat_type],32 ; Fat32 + mov [hd1_status],0 ; free + ret + +fat16_partition: + xor eax,eax + mov [ROOT_CLUSTER],eax + + popad + + mov [fatRESERVED],0x0000FFF6 + mov [fatBAD],0x0000FFF7 + mov [fatEND],0x0000FFF8 + mov [fatMASK],0x0000FFFF + mov [fat_type],16 ; Fat16 + mov [hd1_status],0 ; free + ret