📄 dosformt.c
字号:
0xBF, 0x00, 0x06, 0xB9, 0x00, 0x01, 0xF2, 0xA5,
0xEA, 0x1D, 0x06, 0x00, 0x00, 0xBE, 0xBE, 0x07,
0xB3, 0x04, 0x80, 0x3C, 0x80, 0x74, 0x0E, 0x80,
0x3C, 0x00, 0x75, 0x1C, 0x83, 0xC6, 0x10, 0xFE,
0xCB, 0x75, 0xEF, 0xCD, 0x18, 0x8B, 0x14, 0x8B,
0x4C, 0x02, 0x8B, 0xEE, 0x83, 0xC6, 0x10, 0xFE,
0xCB, 0x74, 0x1A, 0x80, 0x3C, 0x00, 0x74, 0xF4,
0xBE, 0x8B, 0x06, 0xAC, 0x3C, 0x00, 0x74, 0x0B,
0x56, 0xBB, 0x07, 0x00, 0xB4, 0x0E, 0xCD, 0x10,
0x5E, 0xEB, 0xF0, 0xEB, 0xFE, 0xBF, 0x05, 0x00,
0xBB, 0x00, 0x7C, 0xB8, 0x01, 0x02, 0x57, 0xCD,
0x13, 0x5F, 0x73, 0x0C, 0x33, 0xC0, 0xCD, 0x13,
0x4F, 0x75, 0xED, 0xBE, 0xA3, 0x06, 0xEB, 0xD3,
0xBE, 0xC2, 0x06, 0xBF, 0xFE, 0x7D, 0x81, 0x3D,
0x55, 0xAA, 0x75, 0xC7, 0x8B, 0xF5, 0xEA, 0x00,
0x7C, 0x00, 0x00, 0x49, 0x6E, 0x76, 0x61, 0x6C,
0x69, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69,
0x74, 0x69, 0x6F, 0x6E, 0x20, 0x74, 0x61, 0x62,
0x6C, 0x65, 0x00, 0x45, 0x72, 0x72, 0x6F, 0x72,
0x20, 0x6C, 0x6F, 0x61, 0x64, 0x69, 0x6E, 0x67,
0x20, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
0x6E, 0x67, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65,
0x6D, 0x00, 0x4D, 0x69, 0x73, 0x73, 0x69, 0x6E,
0x67, 0x20, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74,
0x69, 0x6E, 0x67, 0x20, 0x73, 0x79, 0x73, 0x74,
0x65, 0x6D};
/* create partition table */
PartitionTable partitionTable;
Partition* ptEntry;
tffsset(&partitionTable,0,sizeof partitionTable);
tffscpy(&partitionTable,bootCode,sizeof bootCode);
ptEntry = partitionTable.ptEntry;
ptEntry->activeFlag = 0x80; /* bootable */
if (LE2(bpb->noOfHeads) > 1) {
ptEntry->startingHead = 1;
toLE2(ptEntry->startingCylinderSector,CYLINDER_SECTOR(0,1));
}
else {
ptEntry->startingHead = 0;
toLE2(ptEntry->startingCylinderSector,CYLINDER_SECTOR(1,1));
}
ptEntry->type = FAT12bit ? 1 : 4;
ptEntry->endingHead = LE2(bpb->noOfHeads) - 1;
toLE2(ptEntry->endingCylinderSector,
(FLWord)CYLINDER_SECTOR((cylinders - 1),LE2(bpb->sectorsPerTrack)));
toUNAL4(ptEntry->startingSectorOfPartition,LE2(bpb->sectorsPerTrack));
toUNAL4(ptEntry->sectorsInPartition,LE4(bpb->totalSectorsInVolume));
toLE2(partitionTable.signature,PARTITION_SIGNATURE);
return vol.writeSector(vol.rec,0,&partitionTable);
}
/*----------------------------------------------------------------------*/
/* c r e a t e D O S B o o t S e c t o r */
/* */
/* Creates the DOS boot sector */
/* */
/* Parameters: */
/* vol : Pointer identifying drive */
/* bpb : volume BIOS parameter block */
/* volumeId : 32-bit volume id */
/* volumeLabel : volume label */
/* */
/* Returns: */
/* FLStatus : 0 on success, failed otherwise */
/*----------------------------------------------------------------------*/
static FLStatus createDOSbootSector(TL vol,
BPB *bpb,
const FLByte FAR1 *volumeId,
const FLByte FAR1 *volumeLabel)
{
DOSBootSector bootSector;
tffsset(&bootSector,0,sizeof bootSector);
bootSector.physicalDriveNo = 0x80;
bootSector.extendedBootSignature = 0x29;
tffscpy(bootSector.volumeId,volumeId,sizeof bootSector.volumeId);
tffsset(bootSector.volumeLabel,' ',sizeof bootSector.volumeLabel);
if (volumeLabel)
tffscpy(bootSector.volumeLabel,volumeLabel,sizeof bootSector.volumeLabel);
tffscpy(bootSector.systemId,
FAT12bit ? "FAT12 " : "FAT16 ",
sizeof bootSector.systemId);
bootSector.bpb = *bpb;
bootSector.bpb.jumpInstruction[0] = 0xe9;
tffscpy(bootSector.bpb.OEMname,"MSystems",sizeof bootSector.bpb.OEMname);
toLE2(bootSector.signature,PARTITION_SIGNATURE);
return vol.writeSector(vol.rec,(SectorNo) LE4(bpb->noOfHiddenSectors),&bootSector);
}
/*----------------------------------------------------------------------*/
/* c r e a t e F A T s */
/* */
/* Creates the FAT's */
/* */
/* Parameters: */
/* vol : Pointer identifying drive */
/* bpb : volume BIOS parameter block */
/* */
/* Returns: */
/* FLStatus : 0 on success, failed otherwise */
/*----------------------------------------------------------------------*/
static FLStatus createFATs(TL vol, BPB *bpb)
{
FLWord iFAT;
SectorNo sectorNo = (SectorNo) (LE4(bpb->noOfHiddenSectors) +
LE2(bpb->reservedSectors));
/* create the FATs */
for (iFAT = 0; iFAT < bpb->noOfFATS; iFAT++) {
FLDword iSector;
FLByte FATEntry[FL_SECTOR_SIZE];
for (iSector = 0; iSector < LE2(bpb->sectorsPerFAT); iSector++) {
tffsset(FATEntry,0,FL_SECTOR_SIZE);
if (iSector == 0) { /* write the reserved FAT entries */
FATEntry[0] = bpb->mediaDescriptor;
FATEntry[1] = 0xff;
FATEntry[2] = 0xff;
if (!FAT12bit)
FATEntry[3] = 0xff;
}
checkStatus(vol.writeSector(vol.rec,sectorNo++,FATEntry));
}
}
return flOK;
}
/*----------------------------------------------------------------------*/
/* c r e a t e R o o t D i r e c t o r y */
/* */
/* Creates the root directory */
/* */
/* Parameters: */
/* vol : Pointer identifying drive */
/* bpb : volume BIOS parameter block */
/* volumeLabel : volume label */
/* */
/* Returns: */
/* FLStatus : 0 on success, failed otherwise */
/*----------------------------------------------------------------------*/
static FLStatus createRootDirectory(TL vol,
BPB *bpb,
const FLByte FAR1 *volumeLabel)
{
int iEntry;
SectorNo sectorNo = (SectorNo) (LE4(bpb->noOfHiddenSectors) +
LE2(bpb->reservedSectors) +
bpb->noOfFATS * LE2(bpb->sectorsPerFAT));
/* create the root directory */
for (iEntry = 0; iEntry < UNAL2(bpb->rootDirectoryEntries);
iEntry += (FL_SECTOR_SIZE / sizeof(DirectoryEntry))) {
DirectoryEntry rootDirectorySector[FL_SECTOR_SIZE / sizeof(DirectoryEntry)];
tffsset(rootDirectorySector,0,FL_SECTOR_SIZE);
if (iEntry == 0 && volumeLabel) {
tffsset(rootDirectorySector[0].name,' ',sizeof rootDirectorySector[0].name);
tffscpy(rootDirectorySector[0].name,volumeLabel,sizeof rootDirectorySector[0].name);
rootDirectorySector[0].attributes = 0x28; /* VOL + ARC */
toLE2(rootDirectorySector[0].updateTime,0);
toLE2(rootDirectorySector[0].updateDate,0x21); /* 1/1/80 */
}
checkStatus(vol.writeSector(vol.rec,sectorNo++,rootDirectorySector));
}
return flOK;
}
/*----------------------------------------------------------------------*/
/* f l D o s F o r m a t */
/* */
/* Writes a DOS-FAT file system on the Flash volume */
/* */
/* Parameters: */
/* vol : Pointer identifying drive */
/* formatParams : Address of FormatParams structure to use */
/* */
/* Returns: */
/* FLStatus : 0 on success, failed otherwise */
/*----------------------------------------------------------------------*/
FLStatus flDosFormat(TL vol, BDTLPartitionFormatParams FAR1 *formatParams)
{
FLDword cylinders;
BPB bpb;
tffsset (&bpb, 0, sizeof(bpb));
noOfClusters = 0; /* Not re-entrant */
getDriveGeometry(&vol,&bpb,&cylinders,formatParams->noOfFATcopies,
(formatParams->flags & TL_OLD_FORMAT) ? TRUE : FALSE);
checkStatus(createMasterBootRecord(&vol,&bpb,cylinders));
checkStatus(createDOSbootSector(&vol,&bpb,formatParams->volumeId,formatParams->volumeLabel));
checkStatus(createFATs(&vol,&bpb));
checkStatus(createRootDirectory(&vol,&bpb,formatParams->volumeLabel));
return flOK;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -