jgabriel@mtecv2.mty.itesm.mx (Juan Gabriel Ruiz Pinto) (09/12/90)
You can use the Norton Disk Doctor (NDD) program it can fix many disk errors. Hope this helps... gabriel ruiz -- ***** Greetings from Mexico! ***** Juan Gabriel Ruiz Pinto Internet: Ing. Sistemas Electronicos jgabriel@mtecv2.mty.itesm.mx I.T.E.S.M. Campus Monterrey
donm@pnet07.cts.com (Don Maslin) (09/13/90)
The following is an old message that I picked up some time ago. I played with it when I had a FAT problem and the approach seemed to work OK. Hope it helps you also. clip here=========================================================clip here Message-ID: #233.pnet12.ibm/general 701 lines, 17009 chars. From: stevek (Steve King, Ramona, CA) Sun, 26 Mar 89 03:44:35 PST Subject: Scrambled FAT Uploading a text file on how to fix FAT with Debug. October 20, 1987 It doesn't take a trojan to wipe out your hard disk! My FATs (File Allocation Table) were wiped out when I had several TSRs loaded, a DOS shell on top of those and I loaded another COMMAND.COM on top of that. When my word processor ran out of memory the whole stack of programs crashed and wrote garbage over my FAT. When I rebooted the computer it wouldn't boot off the hard disk. I hadn't backed up my drives for four months and I was facing the loss of close to 40MB of memory off two 20MB drives. When I ran CHKDSK it came up with the cyptic message "Probable non-DOS disk. Continue (Y/N)?" Of course it was a DOS disk. What was going on? Well I finally figured out I had access to a couple of subdirectories but my disk was obviously wasted. I was desperate. What do I do now? Norton Utilities wouldn't read the disk saying I was running out of memory. I didn't have MACE so I don't know how that program would have worked. Then I remembered -- there are two copies of the FAT on a disk. It seems DOS writes two copies of the FAT every time a change is made but it only reads the first when reading the disk. The second FAT isn't even used for CHKDSK. Was that FAT still in one piece? Fortunately it was. Now all I had to do was get the second copy of the FAT copied over to where the first one was. How do you do this? If you're like me you take a stab at it using DEBUG. It actually took me three days to figure out how the process worked but once I knew all the steps it only took about 15 minutes for the entire operation. I'm writing this file in the hope that I can help someone else in similar circumstances to bypass the three day portion. I have two Seagate ST-225's formatted under 3.10 and I'm not sure that everything will work the same for other versions of DOS or if you have a RLL controller. But what are your alternatives? First let me explain how a hard drive is set up at the byte level. Your disk is set up with sectors labeled in ascending sequence starting at zero. Depending under what DOS you are formatted with, the Boot sector occupies the first sector, the FAT is in sectors 1-82, the root directory is sector 83 and all the rest of your subdirectories and files occupy the remainder of the disk. So right now we have: Sector 0 Boot record Sector 1-82 FATs Sector 83 Root directory Sector 84-? Subdirectories and files Using DEBUG the BOOT sector should look like this under 3.10 (similar under other versions). Notice the identifying IBM 3.1 on the first line. This is the version the disk was formatted under. xxxx:0100 EB 29 90 49 42 4D 20 20-33 2E 31 00 02 04 01 00 .).IBM 3.1..... xxxx:0110 02 00 02 3B A2 F8 29 00-11 00 04 00 11 00 80 00 ...;..)......... xxxx:0120 00 00 00 00 0F 00 00 00-00 01 00 FA 33 C0 8E D0 ............3... xxxx:0130 BC 00 7C 16 07 BB 78 00-36 C5 37 1E 56 16 53 BF ..|...x.6.7.V.S. xxxx:0140 20 7C B9 0B 00 FC AC 26-80 3D 00 74 03 26 8A 05 |.....&.=.t.&.. xxxx:0150 AA 8A C4 E2 F1 06 1F 89-47 02 C7 07 20 7C FB CD ........G... |.. xxxx:0160 13 72 67 A0 10 7C 98 F7-26 16 7C 03 06 1C 7C 03 .rg..|..&.|...|. xxxx:0170 06 0E 7C A3 34 7C A3 2C-7C B8 20 00 F7 26 11 7C ..|.4|.,|. ..&.| xxxx:0180 8B 1E 0B 7C 03 C3 48 F7-F3 01 06 2C 7C BB 00 05 ...|..H....,|... xxxx:0190 A1 34 7C E8 96 00 B8 01-02 E8 AA 00 72 19 8B FB .4|.........r... xxxx:01A0 B9 0B 00 BE BE 7D F3 A6-75 0D 8D 7F 20 BE C9 7D .....}..u... ..} xxxx:01B0 B9 0B 00 F3 A6 74 18 BE-5F 7D E8 61 00 32 E4 CD .....t.._}.a.2.. xxxx:01C0 16 5E 1F 8F 04 8F 44 02-CD 19 BE A8 7D EB EB A1 .^....D.....}... xxxx:01D0 1C 05 33 D2 F7 36 0B 7C-FE C0 A2 31 7C A1 2C 7C ..3..6.|...1|.,| xxxx:01E0 A3 32 7C BB 00 07 A1 2C-7C E8 40 00 A1 18 7C 2A .2|....,|.@...|* xxxx:01F0 06 30 7C 40 50 E8 4E 00-58 72 CF 28 06 31 7C 76 .0|@P.N.Xr.(.1|v xxxx:0200 0C 01 06 2C 7C F7 26 0B-7C 03 D8 EB D9 8A 2E 15 ...,|.&.|....... xxxx:0210 7C 8A 16 1E 7C 8B 1E 32-7C EA 00 00 70 00 AC 0A |...|..2|...p... xxxx:0220 C0 74 22 B4 0E BB 07 00-CD 10 EB F2 33 D2 F7 36 .t".........3..6 xxxx:0230 18 7C FE C2 88 16 30 7C-33 D2 F7 36 1A 7C 88 16 .|....0|3..6.|.. xxxx:0240 1F 7C A3 2E 7C C3 B4 02-8B 16 2E 7C B1 06 D2 E6 .|..|......|.... xxxx:0250 0A 36 30 7C 8B CA 86 E9-8B 16 1E 7C CD 13 C3 0D .60|.......|.... xxxx:0260 0A 4E 6F 6E 2D 53 79 73-74 65 6D 20 64 69 73 6B .Non-System disk xxxx:0270 20 6F 72 20 64 69 73 6B-20 65 72 72 6F 72 0D 0A or disk error.. xxxx:0280 52 65 70 6C 61 63 65 20-61 6E 64 20 73 74 72 69 Replace and stri xxxx:0290 6B 65 20 61 6E 79 20 6B-65 79 20 77 68 65 6E 20 ke any key when xxxx:02A0 72 65 61 64 79 0D 0A 00-0D 0A 44 69 73 6B 20 42 ready.....Disk B xxxx:02B0 6F 6F 74 20 66 61 69 6C-75 72 65 0D 0A 00 49 42 oot failure...IB xxxx:02C0 4D 42 49 4F 20 20 43 4F-4D 49 42 4D 44 4F 53 20 MBIO COMIBMDOS xxxx:02D0 20 43 4F 4D 00 00 00 00-00 00 00 00 00 00 00 00 COM............ xxxx:02E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ xxxx:02F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U. I've listed the boot sector only so that you can compare it to your's and see if it's intact. In my case it wasn't and I had to get it from another disk. Alternatively you could enter it onto the disk using debug. The next portion of your disk is the FAT. Here is what the first portion of mine looks like. xxxx:0300 F8 FF FF FF 03 00 04 00-05 00 06 00 FF FF 08 00 ................ xxxx:0310 09 00 0A 00 0B 00 0C 00-0D 00 0E 00 0F 00 10 00 ................ xxxx:0320 11 00 12 00 13 00 14 00-FF FF 16 00 17 00 18 00 ................ xxxx:0330 19 00 1A 00 1B 00 1C 00-1D 00 1E 00 1F 00 20 00 .............. . xxxx:0340 FF FF FF FF FF FF FF FF-25 00 26 00 27 00 28 00 ........%.&.'.(. xxxx:0350 29 00 2A 00 2B 00 2C 00-FF FF 2E 00 2F 00 30 00 ).*.+.,...../.0. xxxx:0360 31 00 32 00 33 00 34 00-35 00 36 00 37 00 38 00 1.2.3.4.5.6.7.8. xxxx:0370 39 00 3A 00 3B 00 3C 00-3D 00 3E 00 3F 00 40 00 9.:.;.<.=.>.?.@. The FAT is the road map which DOS uses to find it's way around your disk. When DOS needs to access a file it finds the first sector the file is in by looking it up in the directory listing. Then it takes a look at the FAT listing for that sector. If the FAT for that sector is a FFFF there are no more sectors for DOS to read. If there is a number there that is the number to the next sector which the file is in. DOS goes to the next sector and continues on until it reaches a FFFF. It's fairly easy to read this. Each word (2 bytes) corresponds to a disk sector. Two rules to this table. All the numbers are in hex and the words have the bytes reversed. So if you were looking at a word from the table that read "EF 12" first you would invert them "12 EF". Next convert them to decimal. 12EF hex = 4847 decimal. The first file starts in sector 2, goes to 3, 4, 5 and then 6 where it reads a FFFF and stops. Since your system files are normally the first files on a disk the first couple of files should be contiguous. This will help you locate the start of your FAT. Hopefully the next figure will make it clearer. Sector --> 0 1 2 3 4 5 6 7 | | | | | | | | / \ / \ / \ / \ / \ / \ / \ / \ xxxx:0300 F8 FF FF FF 03 00 04 00-05 00 06 00 FF FF 08 00 ................ Sector --> 8 9 10 11 12 13 14 15 | | | | | | | | / \ / \ / \ / \ / \ / \ / \ / \ xxxx:0310 09 00 0A 00 0B 00 0C 00-0D 00 0E 00 0F 00 10 00 ................ Sector --> 16 17 18 19 20 21 22 23 | | | | | | | | / \ / \ / \ / \ / \ / \ / \ / \ xxxx:0320 11 00 12 00 13 00 14 00-FF FF 16 00 17 00 18 00 ................ The first byte is is not a sector but a special marker which tells DOS what type of disk it is. Now that you have an idea how to read the FAT I'll explain a little bit about DEBUG so that you can read the FAT from your disk and manipulate it if neccessary. First DEBUG only understands hexadecimal numbers. So in the following discussion all numbers are in hex unless otherwise noted. DEBUG uses single letters for all it's commands. The ones you will need are explained below. There are more DEBUG commands but since explaining DEBUG is not the intent of this file I will have to direct you to your manual for any additional ones you may be interested in. The DEBUG prompt is a very unimposing dash "-". All commands are entered from the "-". Dump command - displays a portion of memory syntax - D address or range address - address to start displaying memory range - range of memory to display notes - if no address is specified display starts at current instruction pointer address Fill command - fills a specified range of memory with any list of characters syntax - F range list range - fill specified range list - bytes to fill range with Load command - Loads a file or disk sectors into memory syntax - L address drive sector sector address - memory address to start loading at drive - drive number to load from (A: is 0, B: is 1) sector - beginning sector of drive sector - ending sector of drive notes - max sectors to load is 80 (hex) Move command - Moves the contents of memory from one location to another. syntax - M range address range - range of memory to move address - address to move to notes - actually this is a copy operation. The source code isn't changed unless the move operation overwrites it. Name command - assigns a name for the W command to use syntax - N d:path filename.ext notes - drive and path are optional. Quit command - quit debug syntax - Q notes - self explanatory Register command - displays and optionally changes value of a register syntax - R registername registername - name of register to change. Search command - Searches a specified area of memory syntax - S range list range - range of memory to search list - list of bytes to search for notes - if no matches are found you will be returned to the DEBUG prompt Write command - writes the contents of memory to disk syntax - W address drive sector sector address - beginning address of memory to write drive - drive to write to sector - sector to begin writing on sector - number of sectors to write notes - this is a VERY DANGEROUS command as you are writing to absolute disk sectors and bypassing DOS. Ensure you are entering correct information. There is no backing up from this one. - if writing to a file the CX register must be set. Now to the actual steps to fix your FAT (we hope). Boot your computer with a system formatted disk in A: Have the minimum of files on this disk as we will be writing the FAT to this disk in case of a mistake. The only files you should need beside the system files is COMMAND.COM and DEBUG.COM In the following discussion it is assumed your hard disk is C: First you have to load the entire FAT into memory. If your disk is setup different then mine you will have to experiment to load just the boot sector and FAT. Before we load the FAT, just to make sure we'll clear the spot of memory we're going to use. Remember that all numbers are in hex. Do not type the items in {notes and explanations} To find the second copy of the FAT you can search for the first four bytes of the FAT or the sequence of sectors 3, 4, 5. Then subtract the start of the first FAT from the start of the second. This will give you the length of the FAT. Then add the length of the FAT to the start of the second FAT. This should be the end of the second FAT. Make sure this is the end of the display in memory. The xxxx can be any number, it depends on your computer. A:\ {DOS prompt} >debug {enter DEBUG} -F 0 ffff 00 {fill memeory with 0's just in case} -L 100 2 0 53 {load boot sector and FAT} -S 0 FFFF F8 FF FF FF {search from 0 to FFFF for the string F8 FF FF FF} \ xxxx:0300 {my computer responds with this \ xxxx:5500 first FAT at 0300, second at 5500} \ \ OR / / / -S 0 FFFF 03 00 04 00 {search from 0 to FFFF for the / string 03 00 04 00} xxxx:0304 {FAT starts at even number 0300 xxxx:5504 and 5500} -D 5500 {display second FAT to make sure we can use it} xxxx:5500 F8 FF FF FF 03 00 04 00-05 00 06 00 FF FF 08 00 ................ xxxx:5510 09 00 0A 00 0B 00 0C 00-0D 00 0E 00 0F 00 10 00 ................ xxxx:5520 11 00 12 00 13 00 14 00-FF FF 16 00 17 00 18 00 ................ xxxx:5530 19 00 1A 00 1B 00 1C 00-1D 00 1E 00 1F 00 20 00 .............. . xxxx:5540 FF FF FF FF FF FF FF FF-25 00 26 00 27 00 28 00 ........%.&.'.(. A-rcx {change CX register to end of FAT} CX 0000 {DEBUG responds with this} :a600 {you type this, may need to be adjusted for your disk} -n fatc {write file to floppy disk with this name, this is the backup in case a mistake is made} -w {this will write your C: FAT to floppy} Writing A600 bytes {DEBUG responds with this} -q {quit DEBUG} At this point you should check the file on the floppy. It should be about 50K long. Look at it using your favorite viewing program to make sure it was written correctly. The biggest item to look for is that the boot sector is the first portion of the file. Up to this point we haven't modified anything on the hard drive. The next step will directly modify the sectors on the hard drive. Make sure you understand what you are doing if your disk is configured different than mine. :\ {DOS prompt} >debug {enter DEBUG} -f 0 ffff 00 {fill memeory with 0's just in case} -l 100 2 0 53 {load boot sector and FAT} -M 5500 A700 300 {copy second FAT to position of first FAT} -W 100 2 0 53 {write the whole thing back to hard disk. this is the inverse of the L command} -Q {quit debug} If everything worked your hard drive should now be operational. I recommend you run chkdsk to see if there are any errors, fix them if any, backup your disk, then do a low level format. If you find this file useful (or suggestions to expand it) you can reach me at EXEC-PC 414-768-5160 MBBS 414-xxx-xxxx Erik Dufek UUCP: {nosc ucsd crash ncr-sd}!pnet07!donm ARPA: simasd!pnet07!donm@nosc.mil INET: donm@pnet07.cts.com