TECHINFO.TXT
上传用户:jnzhq888
上传日期:2007-01-18
资源大小:51694k
文件大小:9k
- Technical Info on FIPS
- ----------------------
-
- FIPS was written in C++ V2.0 with the Turbo C++ 1.0 and Borland C++ 3.1
- compilers.
- It should compile with any newer C++ compiler (perhaps after minor changes
- to the BIOS calls).
-
- If you're a C++ wizard, don't look too closely at the code, this is my first
- C++ program, so it is far from acceptable (too much public data, some ini-
- tializers and assignment operators are missing etc.). Constructive critizism
- is always welcome however.
-
- How FIPS works:
-
- FIPS uses the BIOS interrupts 13h 00h (reset disks), 13h 02h (read sector),
- 13h 08h (get drive parameters), 13h 03h (write sector) and 13h 04h (verify
- sector).
-
- Here is the sequence of function calls in main:
-
- evaluate_argument_vector
- read the commandline arguments and set the global variables accordingly
- notice
- display copyright notice and version number
- ask_for_drive_number
- let the user choose the drive (if more than 1)
- harddrive.reset
- reset harddrive
- harddrive.rootsector->read
- read the sector 0,0,1 of the chosen drive into an array of unsigned char
- hd.partition_table().get
- extract the necessary information from the root sector (see below - The
- root sector)
- hd.print_partition_table
- print the information
- hd.check
- check if everything is ok (see below - The root sector)
- ask_for_partition_number
- let the user choose the partition
- partition->bootsector->read
- read the first sector of the chosen partition to another array
- partition->bpb().get
- extract info from the boot sector (see below - The boot sector)
- partition->print_bpb
- print the info
- partition->info().get
- calculate no. of clusters, starting sector of FATs etc.
- partition->check
- check boot sector (see below - The boot sector)
- fat1.check_against(fat2)
- check if FAT 1 is identical to FAT 2 (see below - The FAT)
- save_root_and_boot
- write root- and boot sector to floppy disk (optional)
- ask_for_new_start_cylinder
- ask the user for the first cylinder of the new partition
- fat2.check_empty
- check if chosen part of partition is empty (see below - The FAT)
- hd.calculate_new_root
- from the chosen start cylinder calculate the new partition table
- Note that the partition entries will be moved to the beginning of the par-
- tition table, so that the new partition will be the last one and the drive
- names will not change.
- hd.partition_table.put
- write the new partition table into the root sector buffer
- hd.partition_table.get,hd.print_partition_table,hd.check
- check if new root sector is ok
- partition->calculate_new_boot
- put new number of sectors in boot sector info
- partition->bpb()->put
- write new boot sector info into boot sector buffer
- partition->bpb()->get,partition->print_bpb,partition->check
- check if new boot sector is ok
- ask_for_write_permission
- ask if user wants to proceed
- harddrive.rootsector->write
- write the changed root sector to the disk
- partition->bootsector->write
- write the changed boot sector to the disk
-
-
- The root sector
- ---------------
-
- The root sector is the first sector on every hard disk. It contains the
- program that loads the boot sector of the bootable partition and the
- partition table. The last two bytes of the root sector must be 55 aa (hex).
- The partition table begins at 1be. It contains 4 * 16 Bytes for the four
- possible partitions.
- All numbers are zero based except the start/end-sector number (may be 1-63).
- One partition entry contains the following:
-
- 1 Byte - Bootable Flag. Must be 0 (not bootable) or 80h (bootable).
- At most one Partition may be bootable at a time.
- (somewhere I read the bootable flag may also be 81h for the
- second drive - does anybody know anything about that?)
-
- 1 Byte - Start Head. The number of the head of the first sector of the
- partition.
-
- 2 Bytes - Start Sector + Cylinder. The Bits are as follows:
-
- CCSSSSSS CCCCCCCC
-
- where the first byte contains the sector number (1 - 63), and
- the high two bits of the cylinder number. The second byte con-
- tains the low eight bits of the cylinder number.
-
- 1 Byte - System Indicator. For DOS this may be:
-
- 1 - 12-bit FAT, 16-bit sector number
- 4 - 16-bit FAT, 16-bit sector number
- 5 - Extended Partition
- 6 - 16-bit FAT, 32-bit sector number
-
- 1 Byte - End Head. Head Number of the last sector of the partition
-
- 2 Bytes - End Sector + Cylinder. Same format as Start Sector + Cylinder
-
- 4 Bytes - First Sector. Number of the first sector of the partition. This
- corresponds to the Start Head, Sector + Cylinder. High Byte
- comes first.
-
- 4 Bytes - Total number of Sectors.
-
- The function check_rootsector_validity checks the following:
-
- - Signature Bytes (55 aa) in the last two bytes of the sector
- - not more than one bootable partition
- - Bootable flag is 0 or 80h
- - Start/End sector of a partition is not 0
- - Start/End sector & head are not greater than drive geometry allows
- - Start cylinder * sectors * heads + start head * sectors + start sector - 1
- = first sector (where sectors is no. of sectors per track, heads is
- no. of heads of the drive)
- - End cylinder * sectors * heads + end head * sector + end sector = first
- sector + number of sectors
- - if System Indicator is 0, all other bytes of partition entry are 0
- - all partitions except the first begin on cylinder boundaries (head = 0,
- sectors = 1)
- - all partition end on cylinder boundaries
- - partitions don't overlap
- - no free space between partitions
-
-
- The boot sector
- ---------------
-
- The boot sector is the first sector of every partition. It contains the
- program that boots the operating system and the bios parameter block.
- The last two bytes must again contain 55 aa. The information in the
- boot sector is the following:
-
- 00 3 bytes jump instruction ('eb xx 90' or 'e9 xx xx')
- 03 8 bytes OEM name and version - e.g. MSDOS5.0
- 0b 2 bytes bytes per sector - should be 512
- 0d 1 byte sectors per cluster - power of two
- 0e 2 bytes reserved sectors - typically 1 (boot sector)
- 10 1 byte number of FATs - must be 2
- 11 2 bytes number of rootdirectory entries - typically 512
- 13 2 bytes number of sectors (short) - 0, if BIGDOS partition
- 15 1 byte media descriptor - typically f8h
- 16 2 bytes sectors per FAT - varies
- 18 2 bytes sectors per track
- 1a 2 bytes number of heads
- 1c 2 bytes number of hidden sectors (low)
-
- - extended BPB since DOS 4.0 -
-
- 1e 2 bytes number of hidden sectors (high)
- 20 4 bytes number of sectors (long)
- 24 1 byte physical drive number - 80h or 81h
- 25 1 byte reserved
- 26 1 byte signature - 29h
-
- The function check_bootsector_validity checks the following:
-
- - correct jump instruction
- - signature bytes 55 aa in the last two bytes of the sector
- - bytes per sector = 512
- - sectors per cluster is power of two
- - reserved sectors = 1
- - number of FATs = 2
- - number of rootdirectory entries is multiple of 16
- - media descriptor = f8h
- - sectors per fat <= 256
- - sectors per fat big enough to hold complete FAT
- - sectors per track matches BIOS info
- - number of heads matches BIOS info
- - hidden sectors = start sector
- - signature = 29h, if BIGDOS
- - physical drive number = actual drive number
- - number of sectors matches partition info
- - system indicator byte in root sector matches partition type
-
-
- The FAT
- -------
-
- The File Allocation Table contains the information how the clusters of the
- disk are linked to files. Every directory entry contains a pointer to the
- first cluster of the file. The corresponding cluster entry in the FAT con-
- tains a pointer to the next cluster, or an EOF marker (FFFF for 16-bit FATs,
- FFF for 12-bit FATs) if the cluster is the last one of the file.
- Bad clusters are marked with FFF7 or FF7. Empty clusters are marked with 0.
- The first cluster on the disk is cluster number 2, it begins at the first
- sector after the root directory. The FAT entries for the clusters 0 and 1
- contain the media descriptor byte (usually F8h for harddisk) and two or
- three FFh bytes.
- There exist two copies of the FAT on a normal DOS partition, these two
- copies must be identical. FAT 2 is the primary FAT.
-
- The function check_fat_validity checks if the two FATs are identical and if
- the entries 0 and 1 contain what they are supposed to.
-
- The function check_fat_empty checks if the cluster entries that cover the
- new partition contain either 0 (empty) or FFF7 (Bad cluster).
-
-
- ------------------------------------------------------------------------------
-
- I hope you find this information useful. If you found anything not to be
- exact or if you have additions, please let me know asap.
-
- Arno Schaefer
- schaefer@rbg.informatik.th-darmstadt.de