www.pudn.com > fat32.c51.rar > FATMOUNTVOLUMEID.C


#ifndef _FAT_DEFINE 
 #include "FAT.c" 
#endif 
 
BYTE FATMountVolumeID(BYTE Partition); 
 
BYTE FATMountVolumeID(BYTE Partition) 
{ 
	pdata DWORD TotSec,DataSec,CountofCluster; 
	 
	if (Partition>=StorageMedia.TotalPartitions) return(FAT_ERR_PARTITION_NOT_FOUND);	//没找到指定扇区 
 
	StorageMedia.ReadSector(sDPT[Partition].LBABegin,DiskBuffer);		//读FAT VolumeID扇区 
 
	//检查VolumeID扇区标记 
 	if (DiskBuffer[510] != 0x55||DiskBuffer[511] != 0xaa) 
		return(FAT_ERR_MBR_FLAG);			//不正常的引导扇区标志 
 
	//检查分区类型 
	StorageMedia.CurrentPartition = Partition;					//当前分区号 
	BOOTSEC->BPB_RsvdSecCnt=MEMSwap16(BOOTSEC->BPB_RsvdSecCnt); 
	BOOTSEC->BPB_RootEntCnt=MEMSwap16(BOOTSEC->BPB_RootEntCnt); 
	BOOTSEC->FAT.F32.BPB_RootClus=MEMSwap32(BOOTSEC->FAT.F32.BPB_RootClus); 
	BOOTSEC->FAT.F32.BPB_FSInfo=MEMSwap16(BOOTSEC->FAT.F32.BPB_FSInfo); 
	BOOTSEC->BPB_TotSec16=MEMSwap16(BOOTSEC->BPB_TotSec16); 
	BOOTSEC->BPB_FATSz16=MEMSwap16(BOOTSEC->BPB_FATSz16); 
	BOOTSEC->BPB_TotSec32=MEMSwap32(BOOTSEC->BPB_TotSec32); 
	BOOTSEC->FAT.F32.BPB_FATSz32=MEMSwap32(BOOTSEC->FAT.F32.BPB_FATSz32); 
 
	FAT.RootSectors = (BOOTSEC->BPB_RootEntCnt * 32) / 512; 
	if (BOOTSEC->BPB_FATSz16!=0) 
		FAT.FATSz = BOOTSEC->BPB_FATSz16; 
	else 
		FAT.FATSz = BOOTSEC->FAT.F32.BPB_FATSz32; 
 
	if (BOOTSEC->BPB_TotSec16!=0) 
		TotSec = BOOTSEC->BPB_TotSec16; 
	else 
		TotSec = BOOTSEC->BPB_TotSec32; 
 
	DataSec = TotSec - (BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * FAT.FATSz) + FAT.RootSectors); 
 
	CountofCluster = DataSec / (DWORD)(BOOTSEC->BPB_SecPerClus); 
	if (CountofCluster<4085) 
	{ 
		sDPT[Partition].FATType=FAT_TYPE_FAT12; 
		FAT.RootClus = BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * BOOTSEC->BPB_FATSz16); 
	} 
	else if (CountofCluster<65525) 
	{ 
		sDPT[Partition].FATType=FAT_TYPE_FAT16; 
		FAT.RootClus = sDPT[StorageMedia.CurrentPartition].LBABegin + BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * BOOTSEC->BPB_FATSz16); 
	} 
	else 
	{ 
		sDPT[Partition].FATType=FAT_TYPE_FAT32; 
		FAT.RootClus = BOOTSEC->FAT.F32.BPB_RootClus;				//根目录簇号 
	} 
	FAT.SecPerClus = BOOTSEC->BPB_SecPerClus;					//每簇扇区数 
	FAT.CurrentDirectory = FAT.RootClus;					//当前目录入口(簇号) 
	FAT.FATSec = sDPT[StorageMedia.CurrentPartition].LBABegin + BOOTSEC->BPB_RsvdSecCnt;		//FAT表开始的扇区号 
	FAT.ClusSec = sDPT[StorageMedia.CurrentPartition].LBABegin + BOOTSEC->BPB_RsvdSecCnt + (BOOTSEC->BPB_NumFATs * FAT.FATSz) + FAT.RootSectors;		//簇开始的扇区 
	FAT.FSISec = BOOTSEC->FAT.F32.BPB_FSInfo + sDPT[Partition].LBABegin;		//FAT32扩展信息扇区号 
	//加载第一个FAT表 
	StorageMedia.ReadSector(FAT.FATSec,FATTable.FAT.F12); 
	FATTable.Sector=0; 
	return(0); 
}