📄 uti.c
字号:
if ((pbBuffer[MBR_ADDR] != 0x80) && (pbBuffer[MBR_ADDR] != 0x00))
{
return FAIL;
}
sDiskParam->dwLogStartSector = pbBuffer[MBR_RELATIVE_ADDR]
+ (pbBuffer[MBR_RELATIVE_ADDR + 1] << 8)
+ (pbBuffer[MBR_RELATIVE_ADDR + 2] << 16) + (pbBuffer[MBR_RELATIVE_ADDR + 3] << 24);
sDiskParam->dwLogTotalSectors = pbBuffer[MBR_LOGICAL__ADDR]
+ (pbBuffer[MBR_LOGICAL__ADDR + 1] << 8)
+ (pbBuffer[MBR_LOGICAL__ADDR + 2] << 16) + (pbBuffer[MBR_LOGICAL__ADDR + 3] << 24);
sDiskParam->dwLogEndSector = sDiskParam->dwLogStartSector + sDiskParam->dwLogTotalSectors;
return PASS;
}
void McardMakePbr(ST_DISK_PARAMETER * sDiskParam, BYTE * pbBuffer)
{
DWORD i;
//jump command (bp 0 to 2)
/*pbBuffer[0] = 0xE9;//Lighter 4/13: fat 16 bug fixed
pbBuffer[1] = 0x00;
pbBuffer[2] = 0x00;*/
pbBuffer[0] = 0xEB;//Lighter 4/13: fat 16 bug fixed
pbBuffer[1] = 0x58;
pbBuffer[2] = 0x90;
//create system identifier (bp 3 to 10)
for (i = 0; i < 8; i++)
{
pbBuffer[3 + i] = bSystemID[i];
}
//sector size (bp 11 and 12)
pbBuffer[11] = (sDiskParam->wSectorSize & 0x00ff);
pbBuffer[12] = ((sDiskParam->wSectorSize & 0xff00) >> 8);
//sectors per cluseter (bp 13)
pbBuffer[13] = sDiskParam->wClusterSize;
//reserverd sector count (bp 14 and 15)
pbBuffer[14] = (sDiskParam->wReserveSectors & 0x00ff);
pbBuffer[15] = ((sDiskParam->wReserveSectors & 0xff00) >> 8);
//number of fats (bp 16)
pbBuffer[16] = sDiskParam->bNumFats = 0x2;
//number of root-directory entries (bp 17 and 18)
if (sDiskParam->bFatType != 32) //Fat 16
{//Lighter 4/13: fat 16 bug fixed
pbBuffer[17] = (sDiskParam->wRootEntries & 0x00ff);
pbBuffer[18] = ((sDiskParam->wRootEntries & 0xff00) >> 8);
}
else //fat 32
{//Lighter 4/13: fat 16 bug fixed
pbBuffer[17] = 0x00;
pbBuffer[18] = 0x00;
}
//total sectors (bp 19 and 20) ---- total sectors (bp 32 to 35)
if (sDiskParam->dwLogTotalSectors >= 0x10000) // Huge mode,partiton total Sectors >= 65536
{
pbBuffer[19] = 0x00;
pbBuffer[20] = 0x00;
pbBuffer[32] = (sDiskParam->dwLogTotalSectors & 0x000000ff);
pbBuffer[33] = ((sDiskParam->dwLogTotalSectors & 0x0000ff00) >> 8);
pbBuffer[34] = ((sDiskParam->dwLogTotalSectors & 0x00ff0000) >> 16);
pbBuffer[35] = ((sDiskParam->dwLogTotalSectors & 0xff000000) >> 24);
}
else
{
pbBuffer[19] = (sDiskParam->dwLogTotalSectors & 0x000000ff);
pbBuffer[20] = ((sDiskParam->dwLogTotalSectors & 0x0000ff00) >> 8);
pbBuffer[32] = 0x00;
pbBuffer[33] = 0x00;
pbBuffer[34] = 0x00;
pbBuffer[35] = 0x00;
}
//medium identifier (bp 21)
pbBuffer[21] = 0xf8;
//sectors per fat (bp 22 and 23)
if (sDiskParam->bFatType != 32) //Fat 12/Fat 16
{//Lighter 4/13: fat 16 bug fixed
pbBuffer[22] = (sDiskParam->wNumFatSectors & 0x00ff);
pbBuffer[23] = ((sDiskParam->wNumFatSectors & 0xff00) >> 8);
}
else
{//Lighter 4/13: fat 16 bug fixed
pbBuffer[22] = 0x00;
pbBuffer[23] = 0x00;
}
//sectors per track (bp 24 and 25)
pbBuffer[24] = (sDiskParam->wTrackSectors & 0x00ff);
pbBuffer[25] = ((sDiskParam->wTrackSectors & 0xff00) >> 8);
//number of sides (bp 26 and 27)
pbBuffer[26] = (sDiskParam->wNumHeads & 0x00ff);
pbBuffer[27] = ((sDiskParam->wNumHeads & 0xff00) >> 8);
//number of hidden sectors (bp 28 to 31)
pbBuffer[28] = (sDiskParam->dwHiddenSectors & 0x000000ff);
pbBuffer[29] = ((sDiskParam->dwHiddenSectors & 0x0000ff00) >> 8);
pbBuffer[30] = ((sDiskParam->dwHiddenSectors & 0x00ff0000) >> 16);
pbBuffer[31] = ((sDiskParam->dwHiddenSectors & 0xff000000) >> 24);
if (sDiskParam->bFatType != 32) //Fat 16
{ //Lighter 4/13: fat 16 bug fixed
//physical disk number (bp 36)
//pbBuffer[36] = 0x80;
pbBuffer[36] = 0x00;//Lighter 4/13: fat 16 bug fixed
//reserved (bp 37)
pbBuffer[37] = 0x00;
//extended boot record signature (bp 38)
pbBuffer[38] = 0x29;
//volume ID number (bp 39 to 42)
pbBuffer[39] = 0x00;
pbBuffer[40] = 0x00;
pbBuffer[41] = 0x00;
pbBuffer[42] = 0x00;
//volume label (bp 43 to 53)
for (i = 0; i < 11; i++)
{
pbBuffer[43 + i] = bVolumeLabel[i];
}
//file system type (bp 54 to 61)
if (sDiskParam->bFatType == 16)
{//Lighter 4/13: fat 16 bug fixed
bFileSystemType[3] = 0x31;
bFileSystemType[4] = 0x36;
}
for (i = 0; i < 8; i++)
{
pbBuffer[54 + i] = bFileSystemType[i];
}
}
else //Fat 32
{//Lighter 4/13: fat 16 bug fixed
//FATSz32
pbBuffer[36] = (sDiskParam->wNumFatSectors & 0x00ff);
pbBuffer[37] = ((sDiskParam->wNumFatSectors & 0xff00) >> 8);
pbBuffer[38] = 0x00;
pbBuffer[39] = 0x00;
//ExtFlags
pbBuffer[40] = 0x00;
pbBuffer[41] = 0x00;
//FSVer
pbBuffer[42] = 0x00;
pbBuffer[43] = 0x00;
//RootClus
pbBuffer[44] = 0x02;
pbBuffer[45] = 0x00;
pbBuffer[46] = 0x00;
pbBuffer[47] = 0x00;
//FSInfo
pbBuffer[48] = 0x01;
pbBuffer[49] = 0x00;
//BKBootSec
pbBuffer[50] = (sDiskParam->wBackupBootSecter& 0x00ff);
pbBuffer[51] = ((sDiskParam->wBackupBootSecter & 0xff00) >> 8);
//Reserved
for (i = 0; i < 12; i++)
{
pbBuffer[52 + i] = 0x00;
}
//DrvNum
pbBuffer[64] = 0x80;
//Reserved1
pbBuffer[65] = 0x00;
//BootSig
pbBuffer[66] = 0x29;
//VolID
pbBuffer[67] = 0x00;
pbBuffer[68] = 0x00;
pbBuffer[69] = 0x00;
pbBuffer[70] = 0x00;
//volume label
for (i = 0; i < 11; i++)
{
pbBuffer[71 + i] = bVolumeLabel[i];
}
//file system type
bFileSystemType[3] = 0x33;//3
bFileSystemType[4] = 0x32;
for (i = 0; i < 8; i++)
{
pbBuffer[82 + i] = bFileSystemType[i];
}
}
//signature word
pbBuffer[510] = 0x55;
pbBuffer[511] = 0xaa;
}
SWORD McardCheckPbr(ST_DISK_PARAMETER * sDiskParam, BYTE * pbBuffer)
{
DWORD TotalSectors;
// jump command
//if (pbBuffer[0] != 0xe9)
if (pbBuffer[0] != 0xEB)
{//Lighter 4/13: fat 16 bug fixed
return FAIL;
}
// sector size
if (sDiskParam->wSectorSize != ((pbBuffer[12] << 8) | (pbBuffer[11])))
{
return FAIL;
}
// number of fat
if (sDiskParam->bNumFats != pbBuffer[16])
{
return FAIL;
}
// medium identifier
if (pbBuffer[21] != 0xf8)
{
return FAIL;
}
//reserve sectors
if (sDiskParam->wReserveSectors != (((pbBuffer[15] << 8) & 0xff00) | (pbBuffer[14] & 0x00ff)))
{
return FAIL;
}
//number of root-directory entries
if(sDiskParam->bFatType != 32)
{ //Lighter 4/13: fat 16 bug fixed
if (sDiskParam->wRootEntries != (((pbBuffer[18] << 8) & 0xff00) | (pbBuffer[17] & 0x00ff)))
return FAIL;
}
else
{//Lighter 4/13: fat 16 bug fixed
if ((((pbBuffer[18] << 8) & 0xff00) | (pbBuffer[17] & 0x00ff)) != 0)
return FAIL;
}
TotalSectors = (((pbBuffer[20] << 8) & 0xff00) | (pbBuffer[19] & 0x00ff));
if (TotalSectors != 0)
{
if (sDiskParam->dwLogTotalSectors != TotalSectors)
{
return FAIL;
}
}
else
{
TotalSectors = (((pbBuffer[35] << 24) & 0xff000000) | ((pbBuffer[34] << 16) & 0x00ff0000)
| ((pbBuffer[33] << 8) & 0x0000ff00) | pbBuffer[32]);
if (sDiskParam->dwLogTotalSectors != TotalSectors)
{
return FAIL;
}
}
if(sDiskParam->bFatType != 32)
{//Lighter 4/13: fat 16 bug fixed
if (sDiskParam->wNumFatSectors != (((pbBuffer[23] << 8) & 0xff00) | (pbBuffer[22] & 0x00ff)))
return FAIL;//Lighter 4/13: fat 16 bug fixed
}
else
{//Lighter 4/13: fat 16 bug fixed
if ((((pbBuffer[23] << 8) & 0xff00) | (pbBuffer[22] & 0x00ff)) != 0)
return FAIL;
if (sDiskParam->wNumFatSectors != (((pbBuffer[37] << 8) & 0xff00) | (pbBuffer[36] & 0x00ff)))
return FAIL;
}
if ((pbBuffer[510] != 0x55) && (pbBuffer[511] != 0xaa))
{
return FAIL;
}
return PASS;
}
/*
// Definition of local functions
*/
static DWORD Rem(DWORD dwNumerator, DWORD dwDenominator)
{
if (dwDenominator == 0)
{
return 0;
}
while (dwNumerator >= dwDenominator)
{
dwNumerator -= dwDenominator;
}
return dwNumerator;
}
static DWORD Ip(DWORD dwNumerator, DWORD dwDenominator)
{
DWORD i;
if (dwDenominator == 0)
{
return 0;
}
i = 0;
while (dwNumerator >= dwDenominator)
{
dwNumerator -= dwDenominator;
i++;
}
return i;
}
static DWORD Ceil(DWORD dwNumerator, DWORD dwDenominator)
{
DWORD i;
if (dwDenominator == 0)
{
return 0;
}
i = 0;
while (dwNumerator >= dwDenominator)
{
dwNumerator -= dwDenominator;
i++;
}
return (i + 1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -