]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/GenBootSector/GetDrvNumOffset.c
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / C / GenBootSector / GetDrvNumOffset.c
1 /** @file
2
3 Get Drv Num offset from Fat file system.
4
5 Copyright (c) 2006 - 2018, 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
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