From : Jerry Coffin 1:128/77.3 Subj : Physical Location of file ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ BC> Can anyone tell me how to find the physical location (head, sector, BC> track) of a file. Basically you'll have to find the file yourself. You start with the root directory and progress through the path, one directory at a time. (Under the circumstances, you might want to make your own life easier by putting the file in the root directory. To find the file, you'll start by reading the boot sector ( sector 0 ) of the partition, which is a record like this: bootsector struc jump db 3 dup(?) ; jump to actual boot code... OEMname db 8 dup(?) sectorsize dw ? ; bytes per sector clustersize db ? ; sectors per cluster res_sectors dw ? ; reserved sectors. num_FATs db ? ; number of FATs. rootsize dw ? ; entries in root directory. sectors dw ? ; sectors in volume for volumes <32 Meg. descriptor db ? FATsize dw ? ; sectors per FAT. ; DOS >= 3 tracksize dw ? ; sectors per track heads dw ? ; heads in disk drive. hidden dd ? ; number of hidden sectors. ; DOS >= 4. bigsectors dd ? ; sectors in volume if > 32 Meg. drivenum db ? reserved1 db ? EBSR db ? ; generally ( always ? ) has value of 029h volumeID dd ? disklabel db 11 dup(?) reserved2 db 8 dup(?) bootsector ends To get to the root directory, you skip over the number of reserved sectors. The FAT(s) follow immediately after that, so you multiply the number of FATs by the size of each FAT, and add that number to the number of reserved sectors. This will give you the starting sector of the root directory. The root directory is made up of 32 byte records like this one: filename struc filename db 8 dup(?) extension db 3 dup(?) attribute db ? reserved db 10 dup(?) filetime dw ? filedate dw ? cluster dw ? filesize dd ? filename ends The root directory is always in contiguous clusters, so you can take the number of root directory entries, multiply by 32, divide by the number of bytes per sector and then by the number of sectors per cluster, and you have the number of clusters in the root directory. It's usually easiest to read in the root directory at a single shot. You then search through and find your filename in the root directory. Assuming you start at the beginning, if you run into a file with its first byte set to 0, this signals the last directory entry that's in use, so your file isn't there. Assuming you do find the file, you'll now use its cluster entry as an index into the FAT. Assuming a 16 bit FAT, you'll index into the FAT by the number of words given as the cluster number. There you'll find a word that give the number of the next cluster in the file. Following the chain, you'll eventually get to a cluster number of -1 ( 0ffffh ) which signifies that you've reached the last cluster in the file. Finding whether the file is fragmented consists of following the chain of cluster numbers and see if if the numbers are consecutive. Immediately following the root directory is cluster number 2 ( 0 and 1 are used as special marks in the FAT ) and clusters progress consecutively from there to the end of the disk. Figuring a DOS sector to give to int 25h basically consists of subtracting 2, multiplying the cluster number by the number of sectors per cluster and adding the number or sectors used by the reserved area, FATs and root directory. For the moment I've ingored 12 bit FATs, as they're more of a pain to deal with - since each FAT entry takes up 1.5 bytes, you've got to figure out whether the start at the beginning of middle of a byte. To do this, you start by multiplying the number by cluster number by 1.5, using the integer part of the result, read in a word from that offset. Then if the number you got from multiplying was in integer, you and with word with 0fffh. Otherwise, you right shift it by 4 bits. Unless your file might end up on a floppy disk, or you know up-front that it'll be used on a small hard drive, I wouldn't bother with 12 bit FATs... Later, Jerry. ... The Universe is a figment of its own imagination.