mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-24 11:45:27 +01:00
225 lines
4.5 KiB
C
225 lines
4.5 KiB
C
|
/* $Id: fsw_hfs.h 29125 2010-05-06 09:43:05Z vboxsync $ */
|
||
|
/** @file
|
||
|
* fsw_hfs.h - HFS file system driver header.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Copyright (C) 2010 Oracle Corporation
|
||
|
*
|
||
|
* This file is part of VirtualBox Open Source Edition (OSE), as
|
||
|
* available from http://www.virtualbox.org. This file is free software;
|
||
|
* you can redistribute it and/or modify it under the terms of the GNU
|
||
|
* General Public License (GPL) as published by the Free Software
|
||
|
* Foundation, in version 2 as it comes in the "COPYING" file of the
|
||
|
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
|
||
|
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
|
||
|
*/
|
||
|
|
||
|
#ifndef _FSW_HFS_H_
|
||
|
#define _FSW_HFS_H_
|
||
|
|
||
|
#define VOLSTRUCTNAME fsw_hfs_volume
|
||
|
#define DNODESTRUCTNAME fsw_hfs_dnode
|
||
|
|
||
|
#include "fsw_core.h"
|
||
|
|
||
|
|
||
|
//! Block size for HFS volumes.
|
||
|
#define HFS_BLOCKSIZE 512
|
||
|
|
||
|
//! Block number where the HFS superblock resides.
|
||
|
#define HFS_SUPERBLOCK_BLOCKNO 2
|
||
|
|
||
|
/* Make world look Applish enough for the system header describing HFS layout */
|
||
|
#define __APPLE_API_PRIVATE
|
||
|
#define __APPLE_API_UNSTABLE
|
||
|
|
||
|
#define u_int8_t fsw_u8
|
||
|
#define u_int16_t fsw_u16
|
||
|
#define u_int32_t fsw_u32
|
||
|
#define u_int64_t fsw_u64
|
||
|
#define int8_t fsw_s8
|
||
|
#define int16_t fsw_s16
|
||
|
#define int32_t fsw_s32
|
||
|
#define int64_t fsw_s64
|
||
|
|
||
|
#include "hfs_format.h"
|
||
|
|
||
|
#undef u_int8_t
|
||
|
#undef u_int16_t
|
||
|
#undef u_int32_t
|
||
|
#undef u_int64_t
|
||
|
#undef int8_t
|
||
|
#undef int16_t
|
||
|
#undef int32_t
|
||
|
#undef int64_t
|
||
|
|
||
|
#pragma pack(1)
|
||
|
#ifdef _MSC_VER
|
||
|
/* vasily: disable warning for non-standard anonymous struct/union
|
||
|
* declarations
|
||
|
*/
|
||
|
# pragma warning (disable:4201)
|
||
|
# define inline __inline
|
||
|
#endif
|
||
|
|
||
|
struct hfs_dirrec {
|
||
|
fsw_u8 _dummy;
|
||
|
};
|
||
|
|
||
|
#pragma pack(2)
|
||
|
|
||
|
struct fsw_hfs_key
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
struct HFSPlusExtentKey ext_key;
|
||
|
struct HFSPlusCatalogKey cat_key;
|
||
|
fsw_u16 key_len; /* Length is at the beginning of all keys */
|
||
|
};
|
||
|
};
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
typedef enum {
|
||
|
/* Regular HFS */
|
||
|
FSW_HFS_PLAIN = 0,
|
||
|
/* HFS+ */
|
||
|
FSW_HFS_PLUS,
|
||
|
/* HFS+ embedded to HFS */
|
||
|
FSW_HFS_PLUS_EMB
|
||
|
} fsw_hfs_kind;
|
||
|
|
||
|
/**
|
||
|
* HFS: Dnode structure with HFS-specific data.
|
||
|
*/
|
||
|
|
||
|
struct fsw_hfs_dnode
|
||
|
{
|
||
|
struct fsw_dnode g; //!< Generic dnode structure
|
||
|
HFSPlusExtentRecord extents;
|
||
|
fsw_u32 ctime;
|
||
|
fsw_u32 mtime;
|
||
|
fsw_u64 used_bytes;
|
||
|
/* link file stuff */
|
||
|
fsw_u32 creator;
|
||
|
fsw_u32 crtype;
|
||
|
/* hardlinks stuff */
|
||
|
fsw_u32 ilink;
|
||
|
fsw_u32 isDirLink;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* HFS: In-memory B-tree structure.
|
||
|
*/
|
||
|
struct fsw_hfs_btree
|
||
|
{
|
||
|
fsw_u32 root_node;
|
||
|
fsw_u32 node_size;
|
||
|
struct fsw_hfs_dnode* file;
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
* HFS: In-memory volume structure with HFS-specific data.
|
||
|
*/
|
||
|
|
||
|
struct fsw_hfs_volume
|
||
|
{
|
||
|
struct fsw_volume g; //!< Generic volume structure
|
||
|
|
||
|
struct HFSPlusVolumeHeader *primary_voldesc; //!< Volume Descriptor
|
||
|
struct fsw_hfs_btree catalog_tree; // Catalog tree
|
||
|
struct fsw_hfs_btree extents_tree; // Extents overflow tree
|
||
|
struct fsw_hfs_dnode root_file;
|
||
|
int case_sensitive;
|
||
|
fsw_u32 block_size_shift;
|
||
|
fsw_hfs_kind hfs_kind;
|
||
|
fsw_u32 emb_block_off;
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
fsw_u32 id;
|
||
|
fsw_u32 type;
|
||
|
fsw_u32 creator;
|
||
|
fsw_u32 crtype;
|
||
|
fsw_u32 ilink;
|
||
|
fsw_u32 isdirlink;
|
||
|
fsw_u32 isfilelink;
|
||
|
struct fsw_string *name;
|
||
|
fsw_u64 size;
|
||
|
fsw_u64 used;
|
||
|
fsw_u32 ctime;
|
||
|
fsw_u32 mtime;
|
||
|
fsw_u32 fileMode;
|
||
|
HFSPlusExtentRecord extents;
|
||
|
} file_info_t;
|
||
|
|
||
|
|
||
|
/* Endianess swappers */
|
||
|
static __inline fsw_u16
|
||
|
swab16(fsw_u16 x)
|
||
|
{
|
||
|
return SwapBytes16(x);
|
||
|
}
|
||
|
|
||
|
static __inline fsw_u32
|
||
|
swab32(fsw_u32 x)
|
||
|
{
|
||
|
return SwapBytes32(x);
|
||
|
}
|
||
|
|
||
|
|
||
|
static __inline fsw_u64
|
||
|
swab64(fsw_u64 x)
|
||
|
{
|
||
|
return SwapBytes64(x);
|
||
|
}
|
||
|
|
||
|
static __inline fsw_u16
|
||
|
be16_to_cpu(fsw_u16 x)
|
||
|
{
|
||
|
return swab16(x);
|
||
|
}
|
||
|
|
||
|
static __inline fsw_u16
|
||
|
cpu_to_be16(fsw_u16 x)
|
||
|
{
|
||
|
return swab16(x);
|
||
|
}
|
||
|
|
||
|
|
||
|
static __inline fsw_u32
|
||
|
cpu_to_be32(fsw_u32 x)
|
||
|
{
|
||
|
return swab32(x);
|
||
|
}
|
||
|
|
||
|
static __inline fsw_u32
|
||
|
be32_to_cpu(fsw_u32 x)
|
||
|
{
|
||
|
return swab32(x);
|
||
|
}
|
||
|
|
||
|
static __inline fsw_u64
|
||
|
be64_to_cpu(fsw_u64 x)
|
||
|
{
|
||
|
return swab64(x);
|
||
|
}
|
||
|
//Unaligned access
|
||
|
static __inline fsw_u32
|
||
|
be32_to_cpu_ua(fsw_u32 *x)
|
||
|
{
|
||
|
return swab32(ReadUnaligned32(x));
|
||
|
}
|
||
|
|
||
|
static __inline fsw_u64
|
||
|
be64_to_cpu_ua(fsw_u64 *x)
|
||
|
{
|
||
|
return swab64(ReadUnaligned64(x));
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif
|