⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uti.c

📁 常见卡(SD,NAND,XD,MS,ATA,CF)完整DRIVER
💻 C
📖 第 1 页 / 共 2 页
字号:

	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 + -