1 /** @file
2 
3   Get Drv Num offset from Fat file system.
4 
5 Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution.  The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #include <stdio.h>
17 #include "FatFormat.h"
18 
19 INTN
GetDrvNumOffset(IN VOID * BootSector)20 GetDrvNumOffset (
21   IN VOID *BootSector
22   )
23 {
24   FAT_BPB_STRUCT  *FatBpb;
25   UINTN           RootDirSectors;
26   UINTN           FATSz;
27   UINTN           TotSec;
28   UINTN           DataSec;
29   UINTN           CountOfClusters;
30 
31   FatBpb  = (FAT_BPB_STRUCT *) BootSector;
32 
33   //
34   // Check FAT type algorithm from FAT spec
35   //
36   RootDirSectors = ((FatBpb->Fat12_16.BPB_RootEntCnt * sizeof(FAT_DIRECTORY_ENTRY)) +
37                     (FatBpb->Fat12_16.BPB_BytsPerSec - 1)) / FatBpb->Fat12_16.BPB_BytsPerSec;
38 
39   if (FatBpb->Fat12_16.BPB_FATSz16 != 0) {
40     FATSz = FatBpb->Fat12_16.BPB_FATSz16;
41   } else {
42     FATSz = FatBpb->Fat32.BPB_FATSz32;
43   }
44   if (FATSz == 0) {
45     fprintf (stderr, "error E3003: FAT - BPB_FATSz16, BPB_FATSz32 - 0, expected: Non-Zero number\n");
46     return -1;
47   }
48 
49   if (FatBpb->Fat12_16.BPB_TotSec16 != 0) {
50     TotSec = FatBpb->Fat12_16.BPB_TotSec16;
51   } else {
52     TotSec = FatBpb->Fat12_16.BPB_TotSec32;
53   }
54   if (TotSec == 0) {
55     fprintf (stderr, "error E3003: FAT - BPB_TotSec16, BPB_TotSec32 - 0, expected: Non-Zero number\n");
56     return -1;
57   }
58 
59   DataSec = TotSec - (
60                       FatBpb->Fat12_16.BPB_RsvdSecCnt +
61                       FatBpb->Fat12_16.BPB_NumFATs * FATSz +
62                       RootDirSectors
63                      );
64 
65   CountOfClusters = DataSec / FatBpb->Fat12_16.BPB_SecPerClus;
66 
67   if (CountOfClusters < FAT_MAX_FAT16_CLUSTER) {
68     return (INTN) ((UINTN) &FatBpb->Fat12_16.BS_DrvNum - (UINTN) FatBpb);
69   } else {
70     return (INTN) ((UINTN) &FatBpb->Fat32.BS_DrvNum - (UINTN) FatBpb);
71   }
72 }
73 
74