FAT FS ƒtƒH[ƒ}ƒbƒg‚ÌŽÀ‘•‚ɂ‚¢‚Ä‚ÌŠo‚¦‘‚«

2004-05-09ŒöŠJ
2004-05-10MBRŠg’£ƒtƒH[ƒ}ƒbƒgEƒwƒbƒhî•ñ
LNF •¶ŽšƒpƒfƒBƒ“ƒO‚ðC³


‚±‚Ì•¶‘‚́AFAT ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ɂ‚¢‚Ä‚Ì‹Zp“à—e‚ð‘‚«•\‚µ‚½‚à‚Ì‚Å‚ ‚éB
FAT ‚́Aƒpƒ\ƒRƒ“‚ð‚Í‚¶‚߁AƒfƒWƒJƒ‚È‚Ç‚Ì‚³‚Ü‚´‚Ü‚È‹@Ší‚Å—˜—p‰Â”\‚ȃtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚Å‚ ‚éB ƒn[ƒhEƒfƒBƒXƒN‚ð‚Í‚¶‚߁AŠeŽíƒƒ‚ƒŠ[EƒJ[ƒh‚È‚Ç‚ÌŠO•”‹L‰¯‘•’uE‹L˜^”}‘̂̃tƒH[ƒ}ƒbƒg‚Æ‚µ‚Ä—˜—p‰Â”\‚¾B
‚µ‚©‚µA‰½‚ç‚©‚Ì——R‚Å FAT ‚ð—˜—p‚µ‚½‹@Ší‚ðì‚낤‚Æ‚µ‚½‚Æ‚«A FAT ‚ð—˜—p‚·‚é•û–@‚ɂ‚¢‚Ă͐”‘½‚­‚̏î•ñ‚ªŽUÝ‚·‚邪A ŽÀÛ‚Ì‹@Ší‚ÉŽÀ‘•‚·‚éê‡‚́i“ú–{Œê‚́j‹Zpî•ñ‚ª‚«‚í‚߂ď­‚È‚¢‚±‚Æ‚É‹C‚ª‚‚¢‚½B
‚±‚̃y[ƒW‚ðì‚Á‚½–{—ˆ‚ÌŽïŽ|‚́AŽï–¡‚̃}ƒCƒRƒ“Hì‚Å MMC (Multi-Media Card) ‚â SD ƒJ[ƒh‚ðŽg‚¨‚¤‚Æ‚µ‚½‚Æ‚«‚ɏW‚ß‚½ FAT ‚̏î•ñ‚ð‘‚«—¯‚ß‚Ä‚¨‚±‚¤‚Æ‚µ‚½‚à‚Ì‚Å‚ ‚éB ‚Ü‚¾Aî•ñ‚ðW‚ß‚½‚¾‚¯‚Å‚ ‚邪AFAT ‚ÉŠÖ‚·‚é‹Zp‰ðà‚ª­‚È‚¢‚±‚Æ‚©‚ç Web ã‚ÅŒöŠJ‚·‚邱‚Æ‚Æ‚µ‚½B ŠÔˆá‚¢‚â’ljÁ‚·‚ׂ«î•ñ‚ª‚ ‚ê‚΁A“K‹X•ÏX‚µ‚Ä‚¢‚é—\’è‚Å‚ ‚éB
¬Œ^‚Ì‘g‚ݍž‚Ý‹@Ší‚âŽï–¡‚̃}ƒCƒRƒ“Hì‚Å FAT ‚ðŽg‚¢A ‘å—e—Ê‚Ì‹L‰¯”}‘Ì‚ð—˜—p‚·‚邽‚ß‚Ì“ú–{Œê‚̏î•ñŒ¹‚Æ‚µ‚āA‚±‚̃y[ƒW‚ð—˜—p‚µ‚Ä‚¢‚½‚¾‚¯‚ê‚΍K‚¢‚Å‚ ‚éB

‚±‚̃y[ƒW‚ð“Ç‚Þ‚½‚߂ɂ́A­‚È‚­‚Ä‚àŽï–¡ƒŒƒxƒ‹‚̃}ƒCƒRƒ“Hì‚ɂ‚¢‚Ä‚Ì’mŽ¯‚ª•K—v‚Å‚ ‚éB ‚³‚ç‚ɁAƒvƒƒOƒ‰ƒ~ƒ“ƒOŒ¾Œê (C) ‚ÉŠÖ‚·‚é’mŽ¯‚ª‚ ‚ê‚΂Ȃ¨—Ç‚¢B

1. ‚Í‚¶‚ß‚É

(1) FAT ‚Æ‚Í

FAT (File Allocation Table) ‚́A‚©‚Â‚Ä MS-DOS ‚̃tƒƒbƒs[EƒfƒBƒXƒN‚̃tƒH[ƒ}ƒbƒg‚Æ‚µ‚Ä—˜—p‚³‚ꂽB ‚»‚ÌŒãA—ðŽj‚ðŒo‚āA‚³‚Ü‚´‚Ü‚È‚n‚r‚â‹@Ší‚Å—˜—p‚³‚êAÅ‚à•‹y‚µ‚½ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚Æ‚È‚Á‚½B

‰Šú‚Ì‹L˜^”}‘Ì‚Í—e—Ê‚ª­‚È‚­ FAT12 ‚ƌĂ΂ê‚é‹L˜^•ûŽ®‚ðŽæ‚Á‚Ä‚¢‚½B‚»‚ÌŒãA‹L˜^—e—Ê‚Ì‘‘å‚É‚µ‚½‚ª‚Á‚āA 2 GBytes ‚Ü‚Å‚Ì‹L˜^‚ª‰Â”\‚È FAT16A‚³‚ç‚É 2 TBytes ‚Ü‚Å‹L˜^‰Â”\‚È FAT32 ‚Ö‚ÆŠg’£‚³‚ꂽB

MS-DOS ‚ł́Aƒtƒ@ƒCƒ‹‚Ì–¼‘O‚́A8.3 Œ`Ž®‚Æ‚¢‚¤‚ׂ«A‚W•¶Žš{‚R•¶Žš‚Å•\‚µ‚Ä‚¢‚½B ‚»‚ÌŒãA’·‚¢ƒtƒ@ƒCƒ‹–¼ (LNF: Long File Name) ‚ª—˜—p‰Â”\‚È VFAT (Virtual FAT) ‚ªŒ»‚ꂽB

‚±‚̃y[ƒW‚ł́AFAT16 ‚ðŽå‚ÉŽæ‚èã‚°‚éB‰E‚̐}‚É FAT16 ƒtƒH[ƒ}ƒbƒg‚ÌŠT—v‚ðŽ¦‚·B FAT12 ‚Í FAT16 ‚Æ‚Ù‚Æ‚ñ‚Ç•Ï‚í‚ç‚È‚¢B

(2) ŽáŠ±‚Ì—pŒêà–¾

FAT ‚́AƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚Ì‚Í‚¶‚ß‚Ì‚Ù‚¤‚É‚ ‚éAƒtƒ@ƒCƒ‹‚Ì‹L˜^‡‚ð‹L‰¯‚µ‚½”z—ñ (table) ‚ðŽ¦‚·B ‚±‚̃e[ƒuƒ‹‚Ì–¼‘O‚ªƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚Ì–¼‘O‚Æ‚µ‚Ä•‹y‚µ‚½‚Ì‚Å‚ ‚éB

‹L˜^”}‘̂̓ZƒNƒ^ (sector) ‚ƌĂ΂ê‚éƒuƒƒbƒN’PˆÊ‚œǂݏ‘‚«‚ðs‚¤B‚±‚̃ZƒNƒ^‚́A MS-DOS ‚©‚ç‚Ì“`“‚ɏ]‚Á‚Ä 512 Bytes ‚ª•W€“I‚È‘å‚«‚³‚Æ‚È‚Á‚Ä‚¢‚éB

ŽÀÛ‚̃tƒ@ƒCƒ‹‚́AƒZƒNƒ^‚ð‚³‚ç‚É‚Ü‚Æ‚ß‚½ƒNƒ‰ƒXƒ^ (cluster) ’PˆÊ‚œǂݏ‘‚«‚ðs‚¤B ‚PƒNƒ‰ƒXƒ^‚́A•¡” (1 ` 64) ŒÂ‚̃ZƒNƒ^‚ð‚Ü‚Æ‚ß‚½‚à‚Ì‚Æ‚È‚Á‚Ä‚¢‚é‚Ì‚¾B ‚»‚Ì‚½‚߁Aˆê”Ê‚É’m‚ç‚ê‚Ä‚¢‚é‚悤‚ɁA‚½‚Æ‚¦‚PƒoƒCƒg‚̃tƒ@ƒCƒ‹‚Å‚ ‚낤‚Æ‚àA ‚PƒNƒ‰ƒXƒ^•ª‚Ì—e—Ê‚ð‹L˜^”}‘̏ã‚ɐè‚߂邱‚Æ‚Æ‚È‚éB

MMC ‚â SD ƒJ[ƒh‚̂悤‚È‹L˜^”}‘̂̍ŏ‰‚̃ZƒNƒ^ (sector zero) ‚Ì‚±‚Æ‚ð MBR (Master Boot Recode) ‚Æ‚æ‚ԁB ‚±‚Ì MBR ‚ɂ́A•¨—“I‚È‹L˜^”}‘Ì‚ð‚PŒÂ‚©‚ç‚SŒÂ‚̃hƒ‰ƒCƒu‚É•ªŠ„‚·‚邽‚߂̃p[ƒeƒBƒVƒ‡ƒ“î•ñ‚ª‹L˜^‚³‚ê‚Ä‚¢‚éB

‚»‚Ì‘¼‚ɁAƒŒƒR[ƒhAƒgƒ‰ƒbƒNAƒwƒbƒh‚È‚Ç‚Æ‚¢‚¤—pŒê‚ª‚ ‚邪A‚Ù‚Æ‚ñ‚ÇŽg‚í‚È‚¢‚̂ŁA‚±‚Ì•¶‘‚Å‚Í–³Ž‹‚·‚éB

(3) ƒf[ƒ^\‘¢‚ɂ‚¢‚Ä

‹L˜^”}‘̏ã‚ɏ‘‚«ž‚ñ‚Å‚¢‚é FAT ‚̃f[ƒ^\‘¢‚ð•\‚·‚½‚߁A‚bŒ¾Œê•—‚̃f[ƒ^\‘¢•\‹L‚ðs‚Á‚Ä‚¢‚éB ‚±‚ê‚́AŽÀÛ‚É FAT ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ðŽÀ‘•‚·‚邱‚Æ‚ð”O“ª‚É‚¨‚¢‚āA‚±‚̃y[ƒW‚ð‘‚¢‚Ä‚¢‚邽‚ß‚Å‚ ‚éB

ŽÀÛ‚̃VƒXƒeƒ€ã‚ɃvƒƒOƒ‰ƒ€‚ð‘g‚Þ‚Æ‚«‚́AFAT ‚̃f[ƒ^\‘¢‚ªƒpƒbƒNó‘Ô (‚PƒoƒCƒg‚Ì‚·‚«ŠÔ‚à–³‚­‹l‚ߍž‚܂ꂽó‘Ô) ‚Å‚ ‚邱‚ƂƁAƒoƒCƒg•À‚Ñ‚ªƒrƒbƒOEƒGƒ“ƒfƒBƒAƒ“ (Intel •À‚Ñ) ‚Å‚ ‚邱‚Æ‚É—¯ˆÓ‚·‚é•K—v‚ª‚ ‚éB

(4) “Á‹–‚ɂ‚¢‚Ä

FAT ‚ÉŠÖ‚·‚é’m“IŠ—LŒ ‚́A•Ä‘ Microsoft ŽÐ‚É‚ ‚éB
•Ä‘ Microsoft ŽÐ‚́AFAT ŠÖ˜A‚Ì“Á‹–‚ðƒ‰ƒCƒZƒ“ƒX‹Ÿ—^‚·‚é•ûj‚Å‚ ‚éB
‚ ‚é‹Zp‚ªL‚­•‹y‚µ‚Ä‚©‚çA“Á‹–Œ ‚ðŽå’£‚·‚é‚Ì‚Í“¹‹`“I‚É‚·‚΂炵‚¢‚Æ‚¢‚¦‚È‚¢B ‚µ‚©‚µAFAT ‚ÉŠÖ‚·‚é•Ä‘“Á‹–‚́A•Ä‘ Microsoft ŽÐ‚É‚ ‚邱‚Æ‚ÍŠm‚©‚Ȃ悤‚¾B FAT (‚Æ‚­‚É VFAT) ‚̓ƐèŽg—pŒ ‚́A•Ä‘ Microsoft ŽÐ‚É‚ ‚é‚ÆŒ©‚Ä‚æ‚¢‚¾‚낤B

2. FAT ƒtƒH[ƒ}ƒbƒg

(1) MBR (Master Boot Recode)

MMC ‚â SD ƒJ[ƒh‚̂悤‚È‹L˜^”}‘̂̐擪ƒZƒNƒ^ (sector 0) ‚ɁAMBR (Master Boot Recode) ‚ª‚ ‚éB ‚±‚ê‚́AŽŸ‚̂悤‚È 512 Bytes ‚̃f[ƒ^\‘¢‚Æ‚È‚Á‚Ä‚¢‚éB

typedef struct MasterBootRecode {
    Byte    checkRoutionOnx86[446];
    struct {
        Byte    bootDescriptor;             /* 0x80: bootable device, 0x00: non-bootable */
        Byte    firstPartitionSector[3];    /* 1st sector number */
        Byte    fileSystemDescriptor;       /* 1:FAT12, 4:FAT16(less than 32MB), 5:Šg’£ DOS ƒp[ƒeƒBƒVƒ‡ƒ“,
                                               6:FAT16(more 32MB), 0xb:FAT32(more 2GB),
                                               0xc:FAT32 Int32h Šg’£, 0xe:FAT16 Int32h Šg’£,
                                               0xf:Šg’£ DOS ƒp[ƒeƒBƒVƒ‡ƒ“‚Ì Int32h Šg’£ */
        Byte    lastPartitionSector[3];
        Byte    firstSectorNumbers[4];      /* first sector number (link to BPB sector) */
        Byte    numberOfSectors[4];
    }   partitionTable[4];
    Byte    sig[2];                         /* 0x55, 0xaa */
}   MBRecode;

(32 bit ˆÈã‚Ì CPU ‚ł́ApartionTable \‘¢‘Ì‚ªƒpƒbƒN‚³‚ê‚È‚¢‚©‚à‚µ‚ê‚È‚¢)

MBR ’†‚̃p[ƒeƒBƒVƒ‡ƒ“Eƒe[ƒuƒ‹‚ÉŠeƒp[ƒeƒBƒVƒ‡ƒ“‚̃tƒ@ƒCƒ‹EƒVƒXƒeƒ€Eƒ^ƒCƒv‚Ɛ擪ƒZƒNƒ^‚ª‹Lq‚µ‚Ä‚¢‚éB
ƒp[ƒeƒBƒVƒ‡ƒ“Eƒe[ƒuƒ‹ (partitionTable[]) ‚Ì fileSystemDescriptor ‚ª 4 or 6 ‚È‚ç‚Î FAT16 ‚ðŽ¦‚µA 11 ‚È‚ç‚Î FAT32 ‚ð•\‚·B ƒp[ƒeƒBƒVƒ‡ƒ“Eƒe[ƒuƒ‹‚É‚ ‚éƒp[ƒeƒBƒVƒ‡ƒ“‚̐擪ƒZƒNƒ^ (partitionTable[].firstSectorNumbers) ‚Ì ƒZƒNƒ^”ԍ†‚Ƀp[ƒeƒBƒVƒ‡ƒ“‚̐擪ƒZƒNƒ^ BPB (BIOS Parameter Block) ‚ª‘¶Ý‚·‚éB
ÅŒã‚Ì 2 Bytes ‚Ì 0x55, 0xaa ŒÅ’èƒpƒ^[ƒ“‚ŁAMBR ƒZƒNƒ^‚Å‚ ‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚éB

‰º‚Ì‚P‚Uiƒ_ƒ“ƒv‚́AMBR ‚Ì“à—e‚̃_ƒ“ƒv—á‚Å‚ ‚éB

‚±‚Ì‚P‚Uiƒ_ƒ“ƒv‚́A32 MBytes ‚Ì MMC (Multi-Media Card) ‚Å‚Ì—á‚Å‚ ‚éB(SDƒJ[ƒh‚È‚Ç‚Å‚à“¯‚¶‚Å‚ ‚낤)

ã‹L—á‚ł́AƒAƒhƒŒƒX 0x5101be ‚©‚çƒp[ƒeƒBƒVƒ‡ƒ“Eƒe[ƒuƒ‹‚ªŽn‚Ü‚Á‚Ä‚¢‚é (’…F•”•ª) B
ƒp[ƒeƒBƒVƒ‡ƒ“‚́A‚P‚‚µ‚©‚È‚­A‚»‚Ì fileSystemDescriptor ‚ª 4 ‚Å‚ ‚邽‚߁A FAT16 ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚Å‚ ‚邱‚Æ‚ª‚í‚©‚éB ‚Ü‚½AfirstSectorNumbers ‚ª 0x00000020 ‚Å‚ ‚é‚̂ŁA‚±‚̃p[ƒeƒBƒVƒ‡ƒ“‚̏î•ñ‚ð 0x0020 ƒZƒNƒ^‚ÉŠi”[‚µ‚Ä‚¢‚邱‚Æ‚ª•ª‚©‚éB

‚È‚¨AŠg’£ƒp[ƒeƒBƒVƒ‡ƒ“‚̂悤‚ȏꍇAƒp[ƒeƒBƒVƒ‡ƒ“‚̐擪ƒZƒNƒ^ BPB ‚́AfirstPartitionSector ‚É‹L˜^‚µ‚Ä‚¢‚éB
firstPartitionSector[0] ‚ɁAƒp[ƒeƒBƒVƒ‡ƒ“‚̐擪ƒZƒNƒ^‚̃wƒbƒh”ԍ†‚ª‹L˜^‚³‚ê‚Ä‚¢‚éB
firstPartitionSector[1] ‚Ì bit 0 ` 5 ‚ɁAƒp[ƒeƒBƒVƒ‡ƒ“‚̐擪ƒZƒNƒ^‚Ì (1 ‚©‚çŽn‚Ü‚é) ƒZƒNƒ^”ԍ†‚ª‹L˜^‚³‚ê‚Ä‚¢‚éB
firstPartitionSector[1] ‚Ì bit 6, 7 bits (ãˆÊ 2 bits) ‚Æ firstPartitionSector[2] (‰ºˆÊ 8 bits) ‚Ì ‡Œv 10 bits ‚ɁAƒp[ƒeƒBƒVƒ‡ƒ“‚̐擪ƒZƒNƒ^‚̃gƒ‰ƒbƒN”ԍ†‚ª‹L˜^‚³‚ê‚Ä‚¢‚éB

(2) BPB (BIOS Parameter Block)

BPB ‚́AMBR ‚̃p[ƒeƒBƒVƒ‡ƒ“Eƒe[ƒuƒ‹’†‚É‹L˜^‚µ‚Ä‚¢‚éæ“ªƒZƒNƒ^‚É‘¶Ý‚·‚éB ‚»‚̃f[ƒ^\‘¢‚́Aƒp[ƒeƒBƒVƒ‡ƒ“‚̃pƒ‰ƒ[ƒ^‚ðŽŸ‚Ì‚æ‚¤‚È 512 Bytes ‚̃f[ƒ^‚Å•\‚µ‚Ä‚¢‚éB

typedef union BPBlock_t {
    /* FAT16 or FAT12 BPB */
    struct FAT16BPB_t {
        Byte    jmpOpeCode[3];          /* 0xeb ?? 0x90 */
        Byte    OEMName[8];
        /* FAT16 */
        Byte    bytesPerSector[2];      /* bytes/sector */
        Byte    sectorsPerCluster;      /* sectors/cluster */
        Byte    reservedSectors[2];     /* reserved sector, beginning with sector 0 */
        Byte    numberOfFATs;           /* file allocation table */
        Byte    rootEntries[2];         /* root entry (512) */
        Byte    totalSectors[2];        /* partion total secter */
        Byte    mediaDescriptor;        /* 0xf8: Hard Disk */
        Byte    sectorsPerFAT[2];       /* sector/FAT (FAT32 always zero: see bigSectorsPerFAT) */
        Byte    sectorsPerTrack[2];     /* sector/track (not use) */
        Byte    heads[2];               /* heads number (not use) */
        Byte    hiddenSectors[4];       /* hidden sector number */
        Byte    bigTotalSectors[4];     /* total sector number */
        /* info */
        Byte    driveNumber;
        Byte    unused;
        Byte    extBootSignature;
        Byte    serialNumber[4];
        Byte    volumeLabel[11];
        Byte    fileSystemType[8];      /* "FAT16   " */
        Byte    loadProgramCode[448];
        Byte    sig[2];                 /* 0x55, 0xaa */
    }    fat16;
    /* FAT32 BPB */
    struct FAT32BPB_t {
        Byte    jmpOpeCode[3];          /* 0xeb ?? 0x90 */
        Byte    OEMName[8];
        /* FAT32 */
        Byte    bytesPerSector[2];
        Byte    sectorsPerCluster;
        Byte    reservedSectors[2];
        Byte    numberOfFATs;
        Byte    rootEntries[2];
        Byte    totalSectors[2];
        Byte    mediaDescriptor;
        Byte    sectorsPerFAT[2];
        Byte    sectorsPerTrack[2];
        Byte    heads[2];
        Byte    hiddenSectors[4];
        Byte    bigTotalSectors[4];
        Byte    bigSectorsPerFAT[4];    /* sector/FAT for FAT32 */
        Byte    extFlags[2];            /* use index zero (follows) */
                                        /* bit 7      0: enable FAT mirroring, 1: disable mirroring */
                                        /* bit 0-3    active FAT number (bit 7 is 1) */
        Byte    FS_Version[2];
        Byte    rootDirStrtClus[4];     /* root directory cluster */
        Byte    FSInfoSec[2];           /* 0xffff: no FSINFO, other: FSINFO sector */
        Byte    bkUpBootSec[2];         /* 0xffff: no back-up, other: back up boot sector number */
        Byte    reserved[12];
        /* info */
        Byte    driveNumber;
        Byte    unused;
        Byte    extBootSignature;
        Byte    serialNumber[4];
        Byte    volumeLabel[11];
        Byte    fileSystemType[8];      /* "FAT32   " */
        Byte    loadProgramCode[420];
        Byte    sig[2];                 /* 0x55, 0xaa */
    }    fat32;
}   BPBlock;

‚±‚Ì BPB ‚Í FAT16 ‚Æ FAT32 ‚ňقȂéBFAT32 ‚́A68 ƒoƒCƒg–Ú‚©‚ç FAT16 ‚ðŠg’£‚µ‚½\‘¢‚Æ‚È‚Á‚Ä‚¢‚éB FAT32 ‚Ì BPB ‚́AsectorsPerFAT ‚ªƒ[ƒ‚ƂȂ邱‚Æ‚Å‹æ•Ê‚·‚邱‚Æ‚ª‰Â”\‚Å‚ ‚éB ‚Ü‚½AFAT12 ‚Í FAT16 ‚Æ“¯‚¶\‘¢‚Æ‚È‚Á‚Ä‚¢‚éB

‚±‚±‚ŏd—v‚ȃpƒ‰ƒ[ƒ^‚́AbytesPerSector, sectorsPerCluster, sectorsPerFAT (FAT32 ‚̏ꍇ bigSectorsPerFAT) ‚Å‚ ‚éB
bytesPerSector ‚́A‚PƒZƒNƒ^“–‚½‚è‚̃oƒCƒg”‚ð•\‚· (‚½‚¢‚Ä‚¢A‚±‚̃pƒ‰ƒ[ƒ^‚Í 512 ‚Å‚ ‚낤) B
sectorsPerCluster ‚́A‚PƒNƒ‰ƒXƒ^“–‚½‚è‚̃ZƒNƒ^”‚ð•\‚· (2 ‚Ì n@æŒÂ‚Æ‚È‚Á‚Ä‚¢‚é‚Í‚¸‚¾) B
sectorsPerFAT ‚́A‚P‚Â‚Ì FAT ‚ªè—L‚·‚éƒZƒNƒ^”‚ð•\‚·B

‚Ü‚½AnumberOfFATs ‚̓p[ƒeƒBƒVƒ‡ƒ“’†‚ÉŠÜ‚Ü‚ê‚é FAT ‚̐”‚ðŽ¦‚·BFAT16 ‚̏ꍇAnumberOfFATs ‚́Aí‚É‚Q‚Å‚ ‚èA‚Q‚Â‚Ì FAT ‚ðŽ‚Â‚±‚Æ‚ðŽ¦‚·B

reservedSectors (‚½‚¢‚Ä‚¢A‚±‚Ì’l‚Í 1 ‚Å‚ ‚낤) ‚́ABPB ƒZƒNƒ^‚ðŠÜ‚ß‚½—\–ñƒZƒNƒ^”‚ðŽ¦‚·B BPB —̈悪è‚ß‚éƒZƒNƒ^”‚ÆŽv‚Á‚Ä–â‘è–³‚¢B

‰º‚Ì‚P‚Uiƒ_ƒ“ƒv‚́ABPB ‚Ì“à—e‚̃_ƒ“ƒv—á‚Å‚ ‚éB

‚±‚Ì‚P‚Uiƒ_ƒ“ƒv‚́A32 MBytes ‚Ì MMC ‚Å FAT16 ƒtƒH[ƒ}ƒbƒg‚Ì—á‚Å‚ ‚éB

‚±‚Ì—á‚ł́AbytesPerSector ‚ª 0x0200 (512)AsectorsPerCluster ‚ª 0x04A sectorsPerFAT ‚ª 0x003d (61) ‚Æ‚È‚Á‚Ä‚¢‚éB
ÅŒã‚Ì 2 Bytes ‚Ì 0x55, 0xaa ŒÅ’èƒpƒ^[ƒ“‚ŁABPB ƒZƒNƒ^‚Å‚ ‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚éB

(3) FAT (File Allocation Table)

BPB ‚ÌŽŸ‚̃ZƒNƒ^‚©‚ç FAT ‚ªŽn‚Ü‚éB
‚±‚́AFAT —̈æ‚̃ZƒNƒ^”‚Í BPB ‚̃pƒ‰ƒ[ƒ^‚©‚ç sectorsPerFAT ~ numberOfFATs ‚ÅŽZo‚Å‚«‚éB

FAT16 ‚̏ꍇABPB ‚Ì numberOfFATs ‚Í 2 ‚ɌŒè‚Æ‚È‚Á‚Ä‚¢‚éB ‚±‚ê‚́A“¯‚¶“à—e‚ðŽ‚Â FAT ‚ð‚Q‚—pˆÓ‚µAFAT ‚ð“ñd‰»‚·‚邱‚ƂŁAM—Š«‚ðŒüã‚³‚¹‚é–Ú“I‚ðŽ‚ÂB ‚½‚¾‚µA‚±‚Ì“ñd‰»‚Í FAT ‚ª”j‰ó‚³‚ê‚Ä‚¢‚邱‚Æ‚µ‚©”»•Ê‚Å‚«‚È‚¢B‘‚«ž‚Ý/“ǂݏo‚µ•s—Ç‚É‚æ‚é FAT ‚Ì”j‰ó‚́A ‚½‚¢‚Ä‚¢ƒhƒ‰ƒCƒuŽ©‘Ì‚ªŽ‚ƒGƒ‰[ŒŸo/’ù³‹@”\‚É‚æ‚Á‚āA”»•Ê‰Â”\‚Å‚ ‚éB ‚»‚Ì‚½‚߁AŒ»Ý‚Å‚Í–³ˆÓ–¡‚È“ñd‰»‚Æ‚È‚Á‚Ä‚¢‚éB

FAT32 ‚̏ꍇABPB ‚Ì extFlags ƒpƒ‰ƒ[ƒ^‚É‚æ‚èA—LŒø‚È FAT ‚ðŽ¯•Ê‚·‚éB

FAT ‚Í File Allcation Table ‚Ì–¼‚Ì’Ê‚èAƒtƒ@ƒCƒ‹‚̃f[ƒ^‚ª”z’u‚³‚ê‚Ä‚¢‚邱‚Æ‚ðŽ¦‚·ƒe[ƒuƒ‹‚Å‚ ‚éB ‚±‚̃e[ƒuƒ‹‚Ì—v‘f‚ª 16 ƒrƒbƒg‚̃tƒH[ƒ}ƒbƒg‚ð FAT16 ‚ƌĂсA32 ƒrƒbƒg‚Ì‚à‚Ì‚ð FAT32 ‚ƌĂԁB
—Ⴆ‚Î FAT16 ‚̏ꍇABPB ‚̃pƒ‰ƒ[ƒ^‚©‚ç sectorsPerFAT ~ bytesPerSector € 2 ŒÂ‚Ì—v‘f (ƒNƒ‰ƒXƒ^) ‚ª‘¶Ý‚·‚邱‚Æ‚ª•ª‚©‚éB FAT ‚Ì n ”Ô–Ú‚Ì—v‘f‚́An ”Ԗڂ̃Nƒ‰ƒXƒ^‚Ì”z’uó‹µ‚ðŽ¦‚· (‚±‚ê‚ðƒNƒ‰ƒXƒ^”ԍ†‚ƌĂڂ¤) B ƒNƒ‰ƒXƒ^‚ª–¢Žg—p‚È‚ç 0x0000AŽŸ‚̃Nƒ‰ƒXƒ^‚Ö‚Æ‘±‚­‚Ȃ玟‚̃Nƒ‰ƒXƒ^”ԍ†AÅŒã‚̃Nƒ‰ƒXƒ^‚È‚ç 0xfff8 ` 0xffff ‚ª FAT —̈æ‚ɏ‘‚«ž‚Ü‚ê‚Ä‚¢‚éB
‚Ü‚½AƒNƒ‰ƒXƒ^”ԍ† 0x0001 ‚Í—\–ñ—̈æ‚Å‚ ‚邱‚Æ‚ðŽ¦‚·B (ƒNƒ‰ƒXƒ^”ԍ† 0x0000 ‚à—\–ñ—̈æ‚Æ‚È‚é)

FAT ‚É‹L˜^‚µ‚Ä‚¢‚éƒNƒ‰ƒXƒ^”ԍ†‚ðŽŸ‚Ì•\‚É‚Ü‚Æ‚ß‚éB

FAT12FAT16FAT32
–¢Žg—pƒNƒ‰ƒXƒ^0x0000x00000x00000000
—\–ñƒNƒ‰ƒXƒ^0x0010x00010x00000001
—LŒø‚ȃ†[ƒUEƒf[ƒ^EƒNƒ‰ƒXƒ^ 0x002 ` 0xfff60x0002 ` 0xffff60x00000002 ` 0x0ffffff6
•s—ǃNƒ‰ƒXƒ^0xff70xfff70x0ffffff7
ÅIƒNƒ‰ƒXƒ^ 0xff8 ` 0xfff0xfff8 ` 0xffff0x0ffffff8 ` 0x0fffffff

ã‚Ì•\‚̂悤‚É FAT32 ‚Æ‚¢‚Á‚Ä‚àA28 bits ‚µ‚©Žg—p‚µ‚Ä‚¢‚È‚¢BãˆÊ 4 bits ‚͏«—ˆ‚Ì‚½‚ß‚É—\–ñ‚³‚ê‚Ä‚¢‚éB FAT32 ‚ðŽg—p‚·‚éÛ‚́AãˆÊ 4 bits ‚ðƒ[ƒ‚ɃNƒŠƒA‚µ‚ÄŽg—p‚·‚ׂ«‚Å‚ ‚éB

‰º‚Ì‚P‚Uiƒ_ƒ“ƒv‚́AFAT ‚̐擪—̈æ‚̃_ƒ“ƒv—á‚Å‚ ‚éB

‚±‚Ì‚P‚Uiƒ_ƒ“ƒv‚́A—á‚É‚æ‚Á‚Ä 32 MBytes ‚Ì MMC ‚Å FAT16 ƒtƒH[ƒ}ƒbƒg‚Å‚ ‚éB

Å‰‚Ì 0xfff8 ‚́AƒNƒ‰ƒXƒ^ 0x0000 ‚ªÅIƒNƒ‰ƒXƒ^‚Å‚ ‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚éB(ŽÀÛ‚Í–¢Žg—pƒNƒ‰ƒXƒ^)
ŽŸ‚Ì 0xffff ‚́AƒNƒ‰ƒXƒ^ 0x0001 ‚àÅIƒNƒ‰ƒXƒ^‚Å‚ ‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚éB(ŽÀÛ‚Í–¢Žg—pƒNƒ‰ƒXƒ^)

‚»‚ÌŽŸ‚Ì 0x0003 ‚́AƒNƒ‰ƒXƒ^ 0x0002 ‚ÌŽŸ‚̃Nƒ‰ƒXƒ^‚ª 0x0003 ‚Å‚ ‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚éB ˆÈ‰º‡‚ɁAƒNƒ‰ƒXƒ^ 0x0004A0x0005 ‚Æ‘±‚«AƒNƒ‰ƒXƒ^ 0x0005 ‚É‚ ‚éÅIƒNƒ‰ƒXƒ^‚̃}[ƒN (0xffff) ‚ŁA ‚±‚̃tƒ@ƒCƒ‹‚̃Nƒ‰ƒXƒ^‚ªI—¹‚·‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚éB (ƒNƒ‰ƒXƒ^ 0x0002 ` 0x0005 ‚ª“¯‚¶ƒtƒ@ƒCƒ‹‚̃f[ƒ^‚Å‚ ‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚é)
‚±‚̂悤‚ɁAFAT —̈æ‚ÉŽŸ‚̃Nƒ‰ƒXƒ^î•ñ‚ð‹L˜^‚·‚邱‚ƂŁA ˜A‘±‚µ‚½ƒf[ƒ^—̈æ‚ðŽ¦‚·‚±‚Æ‚ðƒNƒ‰ƒXƒ^Eƒ`ƒFƒCƒ“‚ƌĂԁB

ƒNƒ‰ƒXƒ^ 0x0006 ˆÈ~‚Ì FAT —v‘f‚ª 0x0000 ‚Æ‚È‚Á‚Ä‚¢‚é‚̂́A‚±‚ê‚ç‚̃Nƒ‰ƒXƒ^‚Í–¢Žg—pó‘Ô‚Å‚ ‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚éB

(4) RDE (Root Directory Entry)

RDE ‚́Aƒ‹[ƒgEƒfƒBƒŒƒNƒgƒŠ‚̏î•ñ‚ð‹L˜^‚µ‚½”z—ñ‚Å‚ ‚èAFAT16 ‚̏ꍇ FAT ‚ÌŽŸ‚̃ZƒNƒ^‚©‚ç‹L˜^‚³‚ê‚éB
(FAT32 ‚̏ꍇABPB ‚Ì rootDirStrtClus ‚ÅŽ¦‚·ƒNƒ‰ƒXƒ^‚©‚ç‹L˜^‚³‚ê‚é)

FAT16 ‚̏ꍇAŠi”[‚³‚ê‚郋[ƒgEƒfƒBƒŒƒNƒgƒŠî•ñ‚̐”‚́ABPB ‚Ì rootEntries (‚±‚̌”‚Í 512 ŒÂ‚̌Œè‚Æ‚È‚Á‚Ä‚¢‚é) ‚É‹Lq‚µ‚Ä‚¢‚éB
(FAT32 ‚̏ꍇAƒNƒ‰ƒXƒ^Eƒ`ƒFƒCƒ“‚Å RDE ‚ðŽ¦‚µ‚Ä‚¢‚é‚̂ŁARDE ‚Ì‘å‚«‚³‚͉•ςł ‚é)
‚ЂƂ‚̃fƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚Í 32 Bytes ‚̃f[ƒ^’·‚ðŽ‚ÂBFAT16 ‚̏ꍇA‚±‚ꂪ 512 ŒÂ‚ ‚邽‚߁A RDE ‘S‘Ì‚Å‚Í 32 ~ 512 = 16384 Bytes (32 ƒZƒNƒ^) ‚̗̈æ‚ðè‚ß‚éB

‚ЂƂ‚̃fƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ÍŽŸ‚̂悤‚È 32 Bytes ‚̃f[ƒ^\‘¢‚ðŽ‚ÂB

typedef struct DirEntry_t {
    Byte    name[8];            /* file name */
    Byte    extension[3];       /* file name extension */
    Byte    attribute;          /* file attribute
                                     bit 4    directory flag
                                     bit 3    volume flag
                                     bit 2    hidden flag
                                     bit 1    system flag
                                     bit 0    read only flag */
    Byte    reserved;           /* use NT or same OS */
    Byte    createTimeMs;       /* VFAT ‚ÅŽg—p‚·‚éƒtƒ@ƒCƒ‹ì¬Žž‚Ì10ƒ~ƒŠ•b (0 ` 199) */
    Byte    createTime[2];      /* VFAT ‚ÅŽg—p‚·‚éƒtƒ@ƒCƒ‹ì¬ŽžŠÔ */
    Byte    createDate[2];      /* VFAT ‚ÅŽg—p‚·‚éƒtƒ@ƒCƒ‹ì¬“ú•t */
    Byte    accessDate[2];      /* VFAT ‚ÅŽg—p‚·‚éƒtƒ@ƒCƒ‹EƒAƒNƒZƒX“ú•t */
    Byte    clusterHighWord[2]; /* FAT32 ‚ÅŽg—p‚·‚éƒNƒ‰ƒXƒ^”ԍ†‚̏ãˆÊ 16 bits */
    Byte    updateTime[2];
    Byte    updateDate[2];
    Byte    cluster[2];         /* start cluster number */
    Byte    fileSize[4];        /* file size in bytes (directory is always zero) */
}   DirEntry;

name ‚¨‚æ‚Ñ extension

FAT ‚Ì 8.3 Œ`Ž®‚̃tƒ@ƒCƒ‹–¼‚ðŠi”[‚·‚éBƒtƒ@ƒCƒ‹–¼‚ÌðŒ‚ÍAæ“ª‚Ì‚P•¶Žš–Ú‚ª‰p”Žš‚ŁA . " / \ [ ] : ; | = , ˆÈŠO‚Ì•¶Žš‚ªŽg—p‰Â”\‚Å‚ ‚éB‘S‚Ẳp¬•¶Žš‚͉p‘啶Žš‚É•ÏŠ·‚µ‚Ä‹L‰¯‚·‚éB ‚Ü‚½ACON AUX COM1 COM2 COM3 COM4 LPT1 LPT2 LPT3 PRN NUL ‚Ì–¼‘O‚ÍŽg—p‚Å‚«‚È‚¢B

æ“ª‚Ì‚P•¶Žš–Ú‚É‚æ‚Á‚āAŽŸ‚̈Ӗ¡‚ª‚ ‚éB
0x00  ‹óƒGƒ“ƒgƒŠ‚Å‚ ‚éB
0x05  (0xe5 ‚ðŽQÆ)
0x2e  ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚̏ꍇ‚Ì‚ÝŽg—p‚Å‚«‚éB
      0x2e (.)          ƒJƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ
      0x2e, 0x2e (..)   eƒfƒBƒŒƒNƒgƒŠ
0xe5  íœ‚³‚ꂽƒGƒ“ƒgƒŠ (Žg—p‰Â”\)

attribute

‘®«ƒtƒ‰ƒO‚Å‚ ‚éB‚±‚Ì’l‚ª 0x0f ‚È‚ç‚΁ALNF (Long File Name) ‚ð•\‚·“Á•Ê‚ȃGƒ“ƒgƒŠ‚Æ‚È‚éB
bit 5    ƒA[ƒJƒCƒu‘®« (ƒtƒ@ƒCƒ‹ì¬E•ÏXŽž 1 ‚É‚·‚é)
bit 4    ƒfƒBƒŒƒNƒgƒŠ‘®«
bit 3    ƒ{ƒŠƒ…[ƒ€‘®«
bit 2    ‰B‚µ‘®«
bit 1    ƒVƒXƒeƒ€‘®«
bit 0    “Ç‚ÝŽæ‚èê—p‘®«

updateTime

ƒtƒ@ƒCƒ‹‚ªXV‚³‚ꂽŽžŠÔ‚ðŽ¦‚·BŽžŠÔ‚́AŽŸ‚̂悤‚É 16 bits ‚𕪊„‚µAŽž•ª•b‚Ì‚Q•b’PˆÊ‚Å•\‚·B
bit 15 ` 11       Žž
bit 10 `  5       •ª
bit  4 `  0       •b€‚Q

updateDate

ƒtƒ@ƒCƒ‹‚ªXV‚³‚ꂽ“ú•t‚ðŽ¦‚·B“ú•t‚́AŽŸ‚̂悤‚É 16 bits ‚𕪊„‚µA”NŒŽ“ú‚Å•\‚·B
bit 15 ` 9      ”N (1980”N‚ðƒ[ƒ”N‚Æ‚·‚é)
bit  8 ` 5      ŒŽ (1 ` 12)
bit  4 ` 0      “ú (1 ` 31)

cluster

‚±‚̃fƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ªŽw‚µŽ¦‚·ƒtƒ@ƒCƒ‹“à—e‚̐擪ƒNƒ‰ƒXƒ^”ԍ†
(FAT32 ‚̏ꍇA‰ºˆÊ 16 bits ‚ðŽ¦‚µAãˆÊ 16 bits ‚Í clusterHighWord ‚Å•\‚·)

fileSize

ƒtƒ@ƒCƒ‹‚Ì‘å‚«‚³‚ðƒoƒCƒg’PˆÊ‚Å•\‚·BƒGƒ“ƒgƒŠ‚ªƒfƒBƒŒƒNƒgƒŠ‘®«‚È‚ç‚΁A‚±‚̃tƒ@ƒCƒ‹EƒTƒCƒY‚̓[ƒ‚Æ‚È‚éB

‰º‚Ì‚P‚Uiƒ_ƒ“ƒv‚́ARDE ‚̐擪—̈æ‚̃_ƒ“ƒv—á‚Å‚ ‚éB

ã‹L—á‚́AH8MMC.MOT ‚Æ‚¢‚¤–¼‘O‚̃tƒ@ƒCƒ‹‚̃fƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ðŽ¦‚µ‚Ä‚¢‚éB
attribute ‚́AƒA[ƒJƒCƒu‘®«‚Æ‚È‚Á‚Ä‚¢‚éB
ƒtƒ@ƒCƒ‹ì¬Žž‚́A0xabf6 (10101b 011111b 10110b) ‚Ì 0x36 ms ‚Æ‚È‚Á‚Ä‚¢‚éB(21Žž31•ª44.54•b)
ƒtƒ@ƒCƒ‹ì¬“ú•t‚́A0x3099 (0011000b 0100b 11001b) ‚Æ‚È‚Á‚Ä‚¢‚éB(2004”N4ŒŽ25“ú)
ƒAƒNƒZƒX“ú•t‚ª 0x30a5 (2004”N5ŒŽ5“ú)Aƒtƒ@ƒCƒ‹XV‚ª 0x3099 (2004”N4ŒŽ25“ú) ‚Ì 0xa736 (20Žž57•ª44•b) B
æ“ªƒNƒ‰ƒXƒ^‚Í 0x00000002 ƒNƒ‰ƒXƒ^‚Æ‚È‚Á‚Ä‚¢‚éBƒtƒ@ƒCƒ‹EƒTƒCƒY‚́A0x00001a00 ƒoƒCƒg‚Å‚ ‚éB

(4) ƒ†[ƒUEƒf[ƒ^—̈æ

ƒ†[ƒUEƒf[ƒ^—̈æ‚́AŽÀÛ‚̃tƒ@ƒCƒ‹Eƒf[ƒ^‚âƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ð•Û‘¶‚·‚éB î•ñ‚́AƒNƒ‰ƒXƒ^’PˆÊ‚ÅŠÇ—‚³‚êAƒNƒ‰ƒXƒ^”ԍ†‚É‚æ‚Á‚ÄŽ¯•Ê‚³‚ê‚éB FAT16 ‚̏ꍇAƒ†[ƒUEƒf[ƒ^—̈æ‚́ARDE ‚ÌŽŸ‚̃ZƒNƒ^‚©‚çŽn‚Ü‚éB

‚±‚̃†[ƒUEƒf[ƒ^—̈æ‚ÌŠJŽnƒZƒNƒ^‚́AMBR ‚̃p[ƒeƒBƒVƒ‡ƒ“æ“ªƒZƒNƒ^‚Æ BPB ‚É‹L˜^‚³‚ê‚Ä‚¢‚éî•ñ‚©‚玟‚̂悤‚ÉŒvŽZ‚Å‚«‚éB

reservedSectors + numberOfFATs~sectorsPerFAT + rootEntries~32€bytesPerSector + [ƒp[ƒeƒBƒVƒ‡ƒ“æ“ªƒZƒNƒ^]
(FAT16 ‚Å‚Í rootEntries ‚ð 512AFAT32 ‚Å‚Í rootEntries ‚ðƒ[ƒ‚Æ‚µ‚ÄŒvŽZ‚·‚é)

ƒ†[ƒUEƒf[ƒ^—̈æ‚̃ZƒNƒ^”‚́ABPB ‚É‹L˜^‚³‚ê‚Ä‚¢‚éî•ñ‚©‚玟‚̂悤‚ÉŒvŽZ‚Å‚«‚éB

bigTotalSectors - reservedSectors - numberOfFATs~sectorsPerFAT - rootEntries~32€bytesPerSector
(FAT16 ‚Å‚Í rootEntries ‚ð 512AFAT32 ‚Å‚Í rootEntries ‚ðƒ[ƒ‚Æ‚µ‚ÄŒvŽZ‚·‚é)

ƒNƒ‰ƒXƒ^”ԍ† 0x0000 ‚Æ 0x0001 ‚Í—\–ñ‚³‚ê‚Ä‚¢‚é‚̂ŁAŽÀÛ‚Ƀf[ƒ^‚ªŠi”[‚³‚ê‚éƒNƒ‰ƒXƒ^”ԍ†‚Í 0x0002 ‚©‚çŽn‚Ü‚éB ‚»‚Ì‚½‚߁Aƒ†[ƒUEƒf[ƒ^—̈æ‚̐擪‚́AƒNƒ‰ƒXƒ^”ԍ† 0x0002 ‚Æ‚È‚éB
ƒNƒ‰ƒXƒ^”ԍ† n ‚ªŠi”[‚³‚ê‚Ä‚¢‚éƒZƒNƒ^‚́Aƒ†[ƒUEƒf[ƒ^—̈æ‚̐擪ƒZƒNƒ^‚©‚çA (n - 2) ~ sectorsPerCluster ‚¾‚¯—£‚ê‚Ä‚¢‚邱‚Æ‚É‚È‚éB

‚Ü‚½AŽqƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚̃f[ƒ^‚́AŽŸ‚Ì—á‚̂悤‚È“à—e‚ðŽ‚Âƒtƒ@ƒCƒ‹‚Æ‚µ‚Ä‹L˜^‚³‚ê‚éB

ã‚Ì—á‚ł́AƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ª‚Q‚ ‚èA‚»‚ꂼ‚ê‚̃tƒ@ƒCƒ‹–¼‚ª . ‚Æ .. ‚Æ‚È‚Á‚Ä‚¢‚éB ‚±‚̃tƒ@ƒCƒ‹–¼‚́AƒfƒBƒŒƒNƒgƒŠ‚ðŽ¦‚·B‚»‚Ì‚½‚߁A‘®«ƒtƒ‰ƒO‚àƒfƒBƒŒƒNƒgƒŠ‘®«‚ðŽ¦‚µ‚Ä‚¢‚é
ƒtƒ@ƒCƒ‹–¼ . (dot) ‚́AƒJƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚ðŽ¦‚µA‚»‚ÌŠJŽnƒNƒ‰ƒXƒ^”ԍ†‚Í 0x0006 ‚Æ‚È‚Á‚Ä‚¢‚éB ‚±‚Ì‚±‚ê‚́AƒJƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠî•ñ‚ªƒNƒ‰ƒXƒ^ 0x0006 ‚©‚ç‹L˜^‚³‚ê‚Ä‚¢‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚éB
“¯—l‚ɁAƒtƒ@ƒCƒ‹–¼ .. (dot-dot) ‚ÌŠJŽnƒNƒ‰ƒXƒ^”ԍ†‚ª 0x0cf7 ‚Æ‚È‚Á‚Ä‚¢‚é‚̂́A eƒfƒBƒŒƒNƒgƒŠî•ñ‚ªƒNƒ‰ƒXƒ^ 0x0cf7 ‚©‚çŠi”[‚³‚ê‚Ä‚¢‚邱‚Æ‚ðŽ¦‚·B ‚±‚̐eƒfƒBƒŒƒNƒgƒŠ‚ÌŠJŽnƒNƒ‰ƒXƒ^”ԍ†‚ª 0x0000 ‚È‚ç‚΁AeƒfƒBƒŒƒNƒgƒŠ‚̓‹[ƒgEƒfƒBƒŒƒNƒgƒŠ‚Å‚ ‚邱‚Æ‚ðŽ¦‚·B

3. VFAT

VFAT ‚́AˆÈ‘O‚Ƃ̌݊·«‚ðˆÛŽ‚µ‚È‚ª‚ç MS-DOS Žž‘ã‚Ì 8.3 Œ`Ž®‚̃tƒ@ƒCƒ‹–¼‚æ‚è’·‚¢ƒtƒ@ƒCƒ‹‚ðˆµ‚¤B ‚»‚Ì‚½‚߂ɁA]—ˆ‚Ì FAT ‚̃fƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ªŠg’£‚³‚ê‚Ä‚¢‚éB

(1) VFAT ‚̃fƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ

ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ɂ‚¢‚́A‘O‚Ì RDE ‚É‚Äà–¾‚µ‚Ä‚¢‚éB VFAT ‚̏ꍇA8.3 Œ`Ž®‚Ì MS-DOS ƒtƒ@ƒCƒ‹–¼‚̃fƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚Æ‚Æ‚à‚ɁA ŽŸ‚̂悤‚È 13 •¶Žš‚Ì Unicode ‚ð‹L˜^‚·‚é LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ð‹L˜^‚·‚éB
typedef struct LNFEntry_t {
    Byte    LFNSeqNumber;           /* LNF recode sequence number
                                         bit 7        íœ‚³‚ê‚é‚Æ 1 ‚É‚È‚é
                                         bit 6        0: LNF ‚Í‘±‚­A1: LNF ‚̍Ōã‚̃V[ƒPƒ“ƒX
                                         bit 5 ` 0   LNF ‚̏‡”Ô‚ð•\‚· (1 ` 63) */
    Byte    name1st[10];            /* Unicode 5 characters */
    Byte    attribute;              /* file attribute (always 0x0f) */
    Byte    reserved;               /* always 0x00 */
    Byte    checkCodeForShortName;  /* DOS –¼‚̃`ƒFƒbƒNEƒR[ƒh */
    Byte    name2nd[12];            /* Unicode 6 characters */
    Byte    cluster[2];             /* always 0x0000 */
    Byte    name3rd[4];             /* Unicode 2 characters */
}   LNFEntry;

’·‚¢ƒtƒ@ƒCƒ‹–¼‚ð 13 •¶Žš‚²‚Æ‚É•ªŠ„‚µ‚āA‚±‚Ì LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ð‹L˜^‚·‚éB

LFNSeqNumber13 •¶Žš‚²‚Æ‚É•ªŠ„‚µ‚½ LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚̏‡”Ô‚ðŽ¦‚·B
name1st13 •¶Žš’†‚̍ŏ‰‚Ì 1 ` 5 •¶Žš
attribute0x0f ‚Å LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚Å‚ ‚邱‚Æ‚ðŽ¦‚·B
reservedí‚É 0x00
checkCodeForShortName8.3 Œ`Ž®‚̃tƒ@ƒCƒ‹–¼‚̃`ƒFƒbƒNEƒR[ƒh
name2nd13 •¶Žš’†‚Ì 6 ` 11 •¶Žš
clusterí‚É 0x00
name3rd13 •¶Žš’†‚Ì 12, 13 •¶Žš

ŽÀÛ‚Ì—á‚ðŒ©‚Ä‚Ý‚æ‚¤B

‚±‚Ì—á‚ł́AObject.class ‚Æ‚¢‚¤–¼‘O‚̃fƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ðŽ¦‚µ‚Ä‚¢‚éB æ“ª‚Ì 32 Bytes ‚ª LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚Å‚ ‚éB ŽŸ‚Ì 32 Bytes ‚ª 8.3 Œ`Ž®‚Ì MS-DOS ŒÝŠ·ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚Å‚ ‚é (OBJECT~1.CLA ‚Æ‚¢‚¤–¼‘O‚Æ‚È‚Á‚Ä‚¢‚é)B
—á‚̂悤‚É LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ÌŒã‚É MS-DOS ŒÝŠ·ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ª‘±‚­B •¡”‚Ì LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ª•K—v‚ȏꍇ‚́AŒã‚ë‚Ì•¶Žš‚Ì•û‚©‚çƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ð‹L˜^‚·‚éB
(‚Q‚ˆȏã‚Ì LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ª•K—v‚ȏꍇ‚́A(2) ‚àŽQÆ‚·‚邱‚Æ)

LNF ƒGƒ“ƒgƒŠ‚Ì•”•ª‚́Aattribute ‚ª 0x0f ‚Å LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚Å‚ ‚邱‚Æ‚ðŽ¦‚µA æ“ª‚Ì LFNSeqNumber ‚ª 0x41 ‚Æ‚È‚Á‚Ä‚¢‚邱‚Æ‚©‚çAæ“ª‚Ì LNF ƒGƒ“ƒgƒŠ‚Å‚©‚ LNF ‚̏I‚í‚è‚Å‚ ‚邱‚Æ‚ðŽ¦‚µ‚Ä‚¢‚éB
‚Ü‚½AObject.class ‚ª 12 •¶Žš‚Æ 13 •¶Žš‚É–ž‚½‚È‚¢‚̂ŁA13 •¶Žš–Ú‚ð 0x0000 ‚Å–„‚ß‚Ä‚¢‚éB (‚Q•¶ŽšˆÈã‚̋󂪐¶‚¶‚éê‡A‚Q•¶ŽšˆÈ~ 0xffff ‚Å–„‚ß‚é)

checkCodeForShortName ‚Ì’l‚́A8.3 Œ`Ž®‚Ì MS-DOS –¼‚©‚狁‚ß‚éBŽZo•û–@‚́AŽŸ‚̂悤‚É‚È‚Á‚Ä‚¢‚éB ("OBJECT~1.CLA" ‚ðŒvŽZ‚·‚é‚ƁA0x76 ‚É‚È‚é)
int shortNameCheckCode(const DirEntry* dir) {
    unsigned char*  p = dir->name;
    unsigned char*  end = p + 11;
    int             ret = 0;
    while (p < end) ret = (((ret & 1) << 7) | ((ret & 0xfe) >> 1)) + *p++;
    return ret;
}

(2) ‚QƒoƒCƒgEƒR[ƒh (“ú–{Œêƒtƒ@ƒCƒ‹–¼)

‚QƒoƒCƒgEƒR[ƒh‚Ì LNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚Ì—á‚ð‰º‚ÉŽ¦‚·B(‚±‚ê‚́ALNF ‚ª‚QƒGƒ“ƒgƒŠˆÈã‚ ‚é—á‚É‚à‚È‚Á‚Ä‚¢‚é)

‚±‚Ì MS-DOS ƒtƒ@ƒCƒ‹–¼‚Í "“ú–{Œê~1.PDF" ‚Å‚ ‚éB
MS-DOS ŒÝŠ·ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚̃tƒ@ƒCƒ‹–¼‚́ASJIS ‚Å 0x93fa (“ú), 0x967b (–{), 0x8cea (Œê), ... ‚̂悤‚É‚È‚Á‚Ä‚¢‚éB
ˆê•ûALNF ƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚́AUnicode ‚Å 0x65e5 (“ú), 0x672c (–{), 0x8a9e (Œê), ... ‚Æ‚È‚éBSJIS ‚Æ Unicode ‚̃oƒCƒg•À‚т̈Ⴂ‚É’ˆÓ‚·‚é•K—v‚ª‚ ‚éB
(‚¿‚Ȃ݂ɁASJIS ƒR[ƒh‚Æ Unicode ‚Ì‘ŠŒÝ•ÏŠ·‚̓e[ƒuƒ‹ˆø‚«‚Å•ÏŠ·‚·‚é•û–@‚µ‚©‚È‚¢)

‚È‚¨AÅŒã‚Ì LNF ƒGƒ“ƒgƒŠ‚ª 11 •¶ŽšˆÈ“à‚̏ꍇ‚́A ÅŒã‚Ì•¶Žš‚ÌŒã‚É 0x0000 ‚̏I’[•¶Žš‚ðŠi”[‚µAŽc‚è‚Ì•¶Žš‚ð 0xffff ‚Å–„‚ß‚éB (ÅŒã‚Ì LNF ƒGƒ“ƒgƒŠ‚ª 12 •¶Žš‚È‚çAÅŒã‚Ì•¶Žš‚ð 0x0000 ‚Å–„‚ß‚é)

home