CloverBootloader/FileSystems/VBoxFsDxe/fsw_hfs.h

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