А какая именно FAT32? Если WIN4.1, то она немного отличается. И какая архитектура у AVR — LE или BE. Тут подводный камень лежит. Скажем, Mega8515 and Mega162 имеют LE, поэтому не надо дополнительной обмены байтами в словах (2 байта) и двойных словах (4-е байта).
#include <stdio.h>
/* assumption: 32 bit compiler */
typedef char byte;
typedef unsigned char ubyte;
typedef short int word;
typedef unsigned short int uword;
typedef int dword;
typedef unsigned int udword;
/* turn off alignment! structure should be packed! */
/* usually pragma works but it's compiler dependent! */
/* this works with gcc */
#pragma pack( push, 1 )
struct _BIOS_PARAMETER_BLOCK
{
uword bytesPerSector;
ubyte sectorPerCluster;
uword reservedSectors;
ubyte numberOfFATs;
uword rootEntries;
uword totalSectors;
ubyte mediaDescriptor;
uword sectorsPerFAT;
uword sectorsPerTrack;
uword heads;
udword hiddenSectors;
udword bigTotalSectors;
udword bigSectorsPerFat;
uword extFlags;
uword FS_Version;
udword rootDirStrtClus;
uword FSInfoSec;
uword bkUpBootSec;
uword reserved[ 6 ];
};
typedef struct _BIOS_PARAMETER_BLOCK BIOS_PARAMETER_BLOCK;
struct _FAT32_BOOT
{
ubyte jump[ 3 ];
ubyte oemName[ 8 ];
BIOS_PARAMETER_BLOCK bpb;
ubyte physicalDiskDriveID;
ubyte reserved;
ubyte extendedBootSignature; /* 0x29 */
udword volumeSerialNumber;
ubyte volumeName[ 11 ]; /* "FAT32 " */
ubyte FATName[ 8 ];
ubyte executableCode[ 420 ];
uword signature; /* 0x55 0xAA */
};
typedef struct _FAT32_BOOT FAT32_BOOT;
union _FAT32_BUFF
{
ubyte ubuffer[ 512 ];
byte buffer[ 512 ];
FAT32_BOOT boot;
};
typedef union _FAT32_BUFF FAT32_BUFF;
/* restore alignment */
#pragma pack( pop )
/* This procedure just for the pupose of binary file creation */
/* that we will read and parse */
void writeIt( )
{
FILE* f;
ubyte buf[ 512 ];
size_t rc;
/*
Based on real sector
Absolute Sector 63 (Cylinder 0, Head 1, Sector 1)
BPB "System Name"
| |
0 1 2 3 4 5 6 7 8 9 A B C |D E F |
0000: EB 58 90 4D 53 57 49 4E 34 2E 31 00 02 08 20 00 .X.MSWIN4.1... .
0010: 02 00 00 00 00 F8 00 00 3F 00 FF 00 EE 39 D7 00 ........?....9..
0020: BD 86 BB 00 CD 2E 00 00 00 00 00 00 93 B2 0B 00 ................
0030: 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0040: 80 00 29 56 2F BF 10 57 49 4E 39 38 5F 44 41 54 ..)V/..WIN98_DAT
0050: 41 00 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4 A.FAT32 3.....
0060: 7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 08 {......|.N..V@..
0070: CD 13 73 05 B9 FF FF 8A F1 66 0F B6 C6 40 66 0F ..s......f...@f.
0080: B6 D1 80 E2 3F F7 E2 86 CD C0 ED 06 41 66 0F B7 ....?.......Af..
0090: C9 66 F7 E1 66 89 46 F8 83 7E 16 00 75 38 83 7E .f..f.F..~..u8.~
00A0: 2A 00 77 32 66 8B 46 1C 66 83 C0 0C BB 00 80 B9 *.w2f.F.f.......
00B0: 01 00 E8 2B 00 E9 48 03 A0 FA 7D B4 7D 8B F0 AC ...+..H...}.}...
00C0: 84 C0 74 17 3C FF 74 09 B4 0E BB 07 00 CD 10 EB ..t.<.t.........
00D0: EE A0 FB 7D EB E5 A0 F9 7D EB E0 98 CD 16 CD 19 ...}....}.......
00E0: 66 60 66 3B 46 F8 0F 82 4A 00 66 6A 00 66 50 06 f`f;F...J.fj.fP.
00F0: 53 66 68 10 00 01 00 80 7E 02 00 0F 85 20 00 B4 Sfh.....~.... ..
0100: 41 BB AA 55 8A 56 40 CD 13 0F 82 1C 00 81 FB 55 A..U.V@........U
0110: AA 0F 85 14 00 F6 C1 01 0F 84 0D 00 FE 46 02 B4 .............F..
0120: 42 8A 56 40 8B F4 CD 13 B0 F9 66 58 66 58 66 58 B.V@......fXfXfX
0130: 66 58 EB 2A 66 33 D2 66 0F B7 4E 18 66 F7 F1 FE fX.*f3.f..N.f...
0140: C2 8A CA 66 8B D0 66 C1 EA 10 F7 76 1A 86 D6 8A ...f..f....v....
0150: 56 40 8A E8 C0 E4 06 0A CC B8 01 02 CD 13 66 61 V@............fa
0160: 0F 82 54 FF 81 C3 00 02 66 40 49 0F 85 71 FF C3 ..T.....f@I..q..
0170: 4E 54 4C 44 52 20 20 20 20 20 20 00 00 00 00 00 NTLDR .....
0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01A0: 00 00 00 00 00 00 00 00 00 00 00 00 0D 0A 4E 54 ..............NT
01B0: 4C 44 52 20 69 73 20 6D 69 73 73 69 6E 67 FF 0D LDR is missing..
01C0: 0A 44 69 73 6B 20 65 72 72 6F 72 FF 0D 0A 50 72 .Disk error...Pr
01D0: 65 73 73 20 61 6E 79 20 6B 65 79 20 74 6F 20 72 ess any key to r
01E0: 65 73 74 61 72 74 0D 0A 00 00 00 00 00 00 00 00 estart..........
01F0: 00 00 00 00 00 00 00 00 00 AC BF CC 00 00 55 AA ..............U.
0 1 2 3 4 5 6 7 8 9 A B C D E F
*/
buf[ 0 ] = 0xEB;
buf[ 1 ] = 0x58;
buf[ 2 ] = 0x90;
buf[ 3 ] = 'M';
buf[ 4 ] = 'S';
buf[ 5 ] = 'W';
buf[ 6 ] = 'I';
buf[ 7 ] = 'N';
buf[ 8 ] = '4';
buf[ 9 ] = '.';
buf[ 10 ] = '1';
buf[ 11 ] = 0x00;
buf[ 12 ] = 0x02;
buf[ 13 ] = 0x08;
buf[ 14 ] = 0x20;
buf[ 15 ] = 0x00;
buf[ 16 ] = 0x02;
buf[ 17 ] = 0x00;
buf[ 18 ] = 0x00;
buf[ 19 ] = 0x00;
buf[ 20 ] = 0x00;
buf[ 21 ] = 0xF8;
buf[ 22 ] = 0x00;
buf[ 23 ] = 0x00;
buf[ 24 ] = 0x3F;
buf[ 25 ] = 0x00;
buf[ 26 ] = 0xFF;
buf[ 27 ] = 0x00;
buf[ 28 ] = 0xEE;
buf[ 29 ] = 0x39;
buf[ 30 ] = 0xD7;
buf[ 31 ] = 0x00;
buf[ 32 ] = 0xBD;
buf[ 33 ] = 0x86;
buf[ 34 ] = 0xBB;
buf[ 35 ] = 0x00;
buf[ 36 ] = 0xCD;
buf[ 37 ] = 0x2E;
buf[ 38 ] = 0x00;
buf[ 39 ] = 0x00;
buf[ 40 ] = 0x00;
buf[ 41 ] = 0x00;
buf[ 42 ] = 0x00;
buf[ 43 ] = 0x00;
buf[ 44 ] = 0x93;
buf[ 45 ] = 0xB2;
buf[ 46 ] = 0x0B;
buf[ 47 ] = 0x00;
buf[ 48 ] = 0x01;
buf[ 49 ] = 0x00;
buf[ 50 ] = 0x06;
buf[ 51 ] = 0x00;
buf[ 52 ] = 0x00;
buf[ 53 ] = 0x00;
buf[ 54 ] = 0x00;
buf[ 55 ] = 0x00;
buf[ 56 ] = 0x00;
buf[ 57 ] = 0x00;
buf[ 58 ] = 0x00;
buf[ 59 ] = 0x00;
buf[ 60 ] = 0x00;
buf[ 61 ] = 0x00;
buf[ 62 ] = 0x00;
buf[ 63 ] = 0x00;
buf[ 64 ] = 0x80;
buf[ 65 ] = 0x00;
buf[ 66 ] = 0x29;
buf[ 67 ] = 0x56;
buf[ 68 ] = 0x2F;
buf[ 69 ] = 0xBF;
buf[ 70 ] = 0x10;
buf[ 71 ] = 0x57;
buf[ 72 ] = 0x49;
buf[ 73 ] = 0x4E;
buf[ 74 ] = 0x39;
buf[ 75 ] = 0x38;
buf[ 76 ] = 0x5F;
buf[ 77 ] = 0x44;
buf[ 78 ] = 0x41;
buf[ 79 ] = 0x54;
buf[ 80 ] = 0x41;
buf[ 81 ] = 0x00;
buf[ 82 ] = 0x46;
buf[ 83 ] = 0x41;
buf[ 84 ] = 0x54;
buf[ 85 ] = 0x33;
buf[ 86 ] = 0x32;
buf[ 87 ] = 0x20;
buf[ 88 ] = 0x20;
buf[ 89 ] = 0x20;
buf[ 510 ] = 0x55;
buf[ 511 ] = 0xAA;
f
= fopen( "boot.bin", "wb" );
if ( f )
{
rc
= fwrite( buf
, sizeof( buf
), 1, f
);
if ( rc != 1 )
{
printf( "could not write.\n" );
}
}
else
{
printf( "Could not open for writting.\n" );
}
}
int main( int argc, char* argv[ ] )
{
FAT32_BUFF fat32Buffer;
size_t rc;
printf( "sizeof( FAT32_BOOT )=%d.\n", sizeof( FAT32_BOOT
) );
fat32Buffer.buffer[ 0 ] = 0x00;
writeIt( );
FILE* f;
f
= fopen( "boot.bin", "rb" );
if ( f )
{
rc
= fread( fat32Buffer.
buffer, sizeof( fat32Buffer.
buffer ), 1, f
);
if ( rc == 1 )
{
printf( "bytes per sector=%hu\n"
"OEM Name=%8.8s\n"
"FAT Name=%8.8s\n"
"sectorPerCluster=%hu\n"
"reservedSectors=hu\n"
"numberOfFATs=%hu\n"
"rootEntries=%hu\n"
"totalSectors=%hu\n"
"mediaDescriptor=%hu\n"
"sectorsPerFAT=%hu\n"
"sectorsPerTrack=$hu\n"
"heads=%hu\n"
"hiddenSectors=%u\n"
"bigTotalSectors=%u\n"
"bigSectorsPerFat=%u\n"
"extFlags=%02hX\n"
"FS_Version=%hu\n"
"rootDirStrtClus=%u\n"
"FSInfoSec=%hu\n"
"bkUpBootSec=%hu\n"
,
fat32Buffer.boot.bpb.bytesPerSector,
fat32Buffer.boot.oemName,
fat32Buffer.boot.FATName,
fat32Buffer.boot.bpb.sectorPerCluster,
fat32Buffer.boot.bpb.reservedSectors,
fat32Buffer.boot.bpb.numberOfFATs,
fat32Buffer.boot.bpb.rootEntries,
fat32Buffer.boot.bpb.totalSectors,
fat32Buffer.boot.bpb.mediaDescriptor,
fat32Buffer.boot.bpb.sectorsPerFAT,
fat32Buffer.boot.bpb.sectorsPerTrack,
fat32Buffer.boot.bpb.heads,
fat32Buffer.boot.bpb.hiddenSectors,
fat32Buffer.boot.bpb.bigTotalSectors,
fat32Buffer.boot.bpb.bigSectorsPerFat,
fat32Buffer.boot.bpb.extFlags,
fat32Buffer.boot.bpb.FS_Version,
fat32Buffer.boot.bpb.rootDirStrtClus,
fat32Buffer.boot.bpb.FSInfoSec,
fat32Buffer.boot.bpb.bkUpBootSec
);
}
else
{
printf( "was not able to read.\n" );
}
}
return 0;
}
(evstiomv@opal)/<6>fat:91> gcc fat32.c -o fat32
(evstiomv@opal)/<6>fat:92> ./fat32
sizeof( FAT32_BOOT )=512.
bytes per sector=512
OEM Name=MSWIN4.1
FAT Name=FAT32
sectorPerCluster=8
(evstiomv@opal)/<6>fat:93> gcc fat32.c -o fat32
(evstiomv@opal)/<6>fat:94> ./fat32
sizeof( FAT32_BOOT )=512.
bytes per sector=512
OEM Name=MSWIN4.1
FAT Name=FAT32
sectorPerCluster=8
reservedSectors=hu
numberOfFATs=32
rootEntries=2
totalSectors=0
mediaDescriptor=0
sectorsPerFAT=248
sectorsPerTrack=$hu
heads=0
hiddenSectors=63
bigTotalSectors=255
bigSectorsPerFat=14105070
extFlags=BB86BD
FS_Version=11981
rootDirStrtClus=0
FSInfoSec=0
bkUpBootSec=45715
(evstiomv@opal)/<6>fat:95> gcc fat32.c -o fat32
(evstiomv@opal)/<6>fat:96> ./fat32
sizeof( FAT32_BOOT )=512.
bytes per sector=512
OEM Name=MSWIN4.1
FAT Name=FAT32
sectorPerCluster=8
reservedSectors=hu
numberOfFATs=32
rootEntries=2
totalSectors=0
mediaDescriptor=0
sectorsPerFAT=248
sectorsPerTrack=$hu
heads=0
hiddenSectors=63
bigTotalSectors=255
bigSectorsPerFat=14105070
extFlags=86BD
FS_Version=11981
rootDirStrtClus=0
FSInfoSec=0
bkUpBootSec=45715
(evstiomv@opal)/<6>fat:97>
Т.е. типы введены, структурки и юнион. Основное использование в main — объявление, в fread и распечатка. Т.е. читаем, как буфер из char, а работаем со структурой. В юнионе два типа буфера — с char и unsigned char — иногда программки капризничают. Но это скорее к C++.