mirror of
https://github.com/RGBCube/serenity
synced 2025-05-25 22:45:06 +00:00
Kernel: Move FAT structure definitions to Kernel/API
We need to be able to include these definitions from userspace as the upcoming mkfs.fat utility will depend on these.
This commit is contained in:
parent
f2503b2048
commit
8b77737f8e
2 changed files with 77 additions and 63 deletions
76
Kernel/API/FileSystem/FATStructures.h
Normal file
76
Kernel/API/FileSystem/FATStructures.h
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022, Undefine <undefine@undefine.pl>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/Types.h>
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
|
||||||
|
// This structure represents the DOS 3.31 BIOS Partition Block.
|
||||||
|
// While DOS 3.31 predates FAT verions 12/16/32 (the versions supported by this driver),
|
||||||
|
// the fields in this block are common with the DOS 4 and DOS 7 BIOS Parameter blocks.
|
||||||
|
// This structure will be followed by an "Extended BIOS Partition Block" (EBPB).
|
||||||
|
//
|
||||||
|
// The DOS 4 EBPB is *typically* used by FAT 12/16 file systems, while the DOS 7 EBPB
|
||||||
|
// is *typically* used by FAT 32. _However_, any combination is possible, as the FAT
|
||||||
|
// version is only determined by the number of clusters.
|
||||||
|
//
|
||||||
|
// Note that the DOS 4 and DOS 7 EBPB extensions are incompatible with each other
|
||||||
|
// (contain fields in different orders and of different lenghts) and do not contain
|
||||||
|
// an explicit indication to differentiate them.
|
||||||
|
// This driver uses heuristics to identify the EBPB version (based on the signature bytes
|
||||||
|
// and sector counts).
|
||||||
|
// FIXME: Consider also using the MBR parition type field in the future.
|
||||||
|
struct [[gnu::packed]] DOS3BIOSParameterBlock {
|
||||||
|
u8 boot_jump[3];
|
||||||
|
char oem_identifier[8];
|
||||||
|
u16 bytes_per_sector; // Offset 0x0B -- beginning of DOS 3.31 BPB.
|
||||||
|
u8 sectors_per_cluster;
|
||||||
|
u16 reserved_sector_count;
|
||||||
|
u8 fat_count;
|
||||||
|
u16 root_directory_entry_count;
|
||||||
|
u16 sector_count_16bit;
|
||||||
|
u8 media_descriptor_type;
|
||||||
|
u16 sectors_per_fat_16bit;
|
||||||
|
u16 sectors_per_track;
|
||||||
|
u16 head_count;
|
||||||
|
u32 hidden_sector_count;
|
||||||
|
u32 sector_count_32bit; // 0x020 -- end of DOS 3.31 BPB.
|
||||||
|
};
|
||||||
|
// 11 is the boot jump/OEM identifier prefix prior to the official BPB.
|
||||||
|
static_assert(AssertSize<DOS3BIOSParameterBlock, 11 + 25>());
|
||||||
|
|
||||||
|
struct [[gnu::packed]] DOS4BIOSParameterBlock {
|
||||||
|
// Begins at sector offset 0x024.
|
||||||
|
u8 drive_number; // 0x024
|
||||||
|
u8 flags;
|
||||||
|
u8 signature;
|
||||||
|
u32 volume_id;
|
||||||
|
char volume_label_string[11];
|
||||||
|
char file_system_type[8];
|
||||||
|
};
|
||||||
|
static_assert(AssertSize<DOS4BIOSParameterBlock, 26>());
|
||||||
|
|
||||||
|
struct [[gnu::packed]] DOS7BIOSParameterBlock {
|
||||||
|
// Begins at sector offset 0x024.
|
||||||
|
u32 sectors_per_fat_32bit; // 0x024
|
||||||
|
u16 flags;
|
||||||
|
u16 fat_version; // Expected value 0x2b2a.
|
||||||
|
u32 root_directory_cluster;
|
||||||
|
u16 fs_info_sector;
|
||||||
|
u16 backup_boot_sector;
|
||||||
|
u8 unused3[12];
|
||||||
|
u8 drive_number;
|
||||||
|
u8 unused4;
|
||||||
|
u8 signature;
|
||||||
|
u32 volume_id;
|
||||||
|
char volume_label_string[11];
|
||||||
|
char file_system_type[8];
|
||||||
|
};
|
||||||
|
static_assert(AssertSize<DOS7BIOSParameterBlock, 54>());
|
||||||
|
|
||||||
|
}
|
|
@ -9,73 +9,11 @@
|
||||||
#include <AK/DOSPackedTime.h>
|
#include <AK/DOSPackedTime.h>
|
||||||
#include <AK/EnumBits.h>
|
#include <AK/EnumBits.h>
|
||||||
#include <AK/Types.h>
|
#include <AK/Types.h>
|
||||||
|
#include <Kernel/API/FileSystem/FATStructures.h>
|
||||||
#include <Kernel/Library/KBuffer.h>
|
#include <Kernel/Library/KBuffer.h>
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
// This structure represents the DOS 3.31 BIOS Partition Block.
|
|
||||||
// While DOS 3.31 predates FAT verions 12/16/32 (the versions supported by this driver),
|
|
||||||
// the fields in this block are common with the DOS 4 and DOS 7 BIOS Parameter blocks.
|
|
||||||
// This structure will be followed by an "Extended BIOS Partition Block" (EBPB).
|
|
||||||
//
|
|
||||||
// The DOS 4 EBPB is *typically* used by FAT 12/16 file systems, while the DOS 7 EBPB
|
|
||||||
// is *typically* used by FAT 32. _However_, any combination is possible, as the FAT
|
|
||||||
// version is only determined by the number of clusters.
|
|
||||||
//
|
|
||||||
// Note that the DOS 4 and DOS 7 EBPB extensions are incompatible with each other
|
|
||||||
// (contain fields in different orders and of different lenghts) and do not contain
|
|
||||||
// an explicit indication to differentiate them.
|
|
||||||
// This driver uses heuristics to identify the EBPB version (based on the signature bytes
|
|
||||||
// and sector counts).
|
|
||||||
// FIXME: Consider also using the MBR parition type field in the future.
|
|
||||||
struct [[gnu::packed]] DOS3BIOSParameterBlock {
|
|
||||||
u8 boot_jump[3];
|
|
||||||
char oem_identifier[8];
|
|
||||||
u16 bytes_per_sector; // Offset 0x0B -- beginning of DOS 3.31 BPB.
|
|
||||||
u8 sectors_per_cluster;
|
|
||||||
u16 reserved_sector_count;
|
|
||||||
u8 fat_count;
|
|
||||||
u16 root_directory_entry_count;
|
|
||||||
u16 sector_count_16bit;
|
|
||||||
u8 media_descriptor_type;
|
|
||||||
u16 sectors_per_fat_16bit;
|
|
||||||
u16 sectors_per_track;
|
|
||||||
u16 head_count;
|
|
||||||
u32 hidden_sector_count;
|
|
||||||
u32 sector_count_32bit; // 0x020 -- end of DOS 3.31 BPB.
|
|
||||||
};
|
|
||||||
// 11 is the boot jump/OEM identifier prefix prior to the official BPB.
|
|
||||||
static_assert(AssertSize<DOS3BIOSParameterBlock, 11 + 25>());
|
|
||||||
|
|
||||||
struct [[gnu::packed]] DOS4BIOSParameterBlock {
|
|
||||||
// Begins at sector offset 0x024.
|
|
||||||
u8 drive_number; // 0x024
|
|
||||||
u8 flags;
|
|
||||||
u8 signature;
|
|
||||||
u32 volume_id;
|
|
||||||
char volume_label_string[11];
|
|
||||||
char file_system_type[8];
|
|
||||||
};
|
|
||||||
static_assert(AssertSize<DOS4BIOSParameterBlock, 26>());
|
|
||||||
|
|
||||||
struct [[gnu::packed]] DOS7BIOSParameterBlock {
|
|
||||||
// Begins at sector offset 0x024.
|
|
||||||
u32 sectors_per_fat_32bit; // 0x024
|
|
||||||
u16 flags;
|
|
||||||
u16 fat_version; // Expected value 0x2b2a.
|
|
||||||
u32 root_directory_cluster;
|
|
||||||
u16 fs_info_sector;
|
|
||||||
u16 backup_boot_sector;
|
|
||||||
u8 unused3[12];
|
|
||||||
u8 drive_number;
|
|
||||||
u8 unused4;
|
|
||||||
u8 signature;
|
|
||||||
u32 volume_id;
|
|
||||||
char volume_label_string[11];
|
|
||||||
char file_system_type[8];
|
|
||||||
};
|
|
||||||
static_assert(AssertSize<DOS7BIOSParameterBlock, 54>());
|
|
||||||
|
|
||||||
enum DOSBIOSParameterBlockVersion {
|
enum DOSBIOSParameterBlockVersion {
|
||||||
DOS_BPB_UNKNOWN,
|
DOS_BPB_UNKNOWN,
|
||||||
DOS_BPB_3, // Version 3.4.
|
DOS_BPB_3, // Version 3.4.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue