]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Sample/Tools/Source/GenBootsector/GetDrvNumOffset.c
1) Sync EdkCompatibilityPkg with EDK 1.04. The changes includes:
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / GenBootsector / GetDrvNumOffset.c
CommitLineData
3eb9473e 1#include "fat.h"\r
2#include <stdio.h>\r
3\r
4INTN\r
5GetDrvNumOffset (\r
6 IN VOID *BootSector\r
7 )\r
8{\r
9 FAT_BPB_STRUCT *FatBpb;\r
10 UINTN RootDirSectors;\r
11 UINTN FATSz;\r
12 UINTN TotSec;\r
13 UINTN DataSec;\r
14 UINTN CountOfClusters;\r
15\r
16 FatBpb = (FAT_BPB_STRUCT *) BootSector;\r
17\r
18 //\r
19 // Check FAT type algorithm from FAT spec\r
20 //\r
21 RootDirSectors = ((FatBpb->Fat12_16.BPB_RootEntCnt * sizeof(FAT_DIRECTORY_ENTRY)) +\r
22 (FatBpb->Fat12_16.BPB_BytsPerSec - 1)) / FatBpb->Fat12_16.BPB_BytsPerSec;\r
23\r
24 if (FatBpb->Fat12_16.BPB_FATSz16 != 0) {\r
25 FATSz = FatBpb->Fat12_16.BPB_FATSz16;\r
26 } else {\r
27 FATSz = FatBpb->Fat32.BPB_FATSz32;\r
28 }\r
29 if (FATSz == 0) {\r
30 fprintf (stderr, "ERROR: FAT: BPB_FATSz16, BPB_FATSz32 - 0, expected - Non-Zero\n");\r
31 return -1;\r
32 }\r
33\r
34 if (FatBpb->Fat12_16.BPB_TotSec16 != 0) {\r
35 TotSec = FatBpb->Fat12_16.BPB_TotSec16;\r
36 } else {\r
37 TotSec = FatBpb->Fat12_16.BPB_TotSec32;\r
38 }\r
39 if (TotSec == 0) {\r
40 fprintf (stderr, "ERROR: FAT: BPB_TotSec16, BPB_TotSec32 - 0, expected - Non-Zero\n");\r
41 return -1;\r
42 }\r
43\r
44 DataSec = TotSec - (\r
45 FatBpb->Fat12_16.BPB_RsvdSecCnt +\r
46 FatBpb->Fat12_16.BPB_NumFATs * FATSz +\r
47 RootDirSectors\r
48 );\r
49\r
50 CountOfClusters = DataSec / FatBpb->Fat12_16.BPB_SecPerClus;\r
51\r
52 if (CountOfClusters < FAT_MAX_FAT16_CLUSTER) {\r
53 return (INTN) ((UINTN) &FatBpb->Fat12_16.BS_DrvNum - (UINTN) FatBpb);\r
54 } else {\r
55 return (INTN) ((UINTN) &FatBpb->Fat32.BS_DrvNum - (UINTN) FatBpb);\r
56 }\r
57}\r
58\r