]>
Commit | Line | Data |
---|---|---|
3eb9473e | 1 | #include "fat.h"\r |
2 | #include <stdio.h>\r | |
3 | \r | |
4 | INTN\r | |
5 | GetDrvNumOffset (\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 |