usbloadergx/source/libs/libwbfs/libwbfs.h

236 lines
8.9 KiB
C
Raw Normal View History

2009-12-19 16:47:12 +01:00
// Modified by oggzee
#ifndef LIBWBFS_H
#define LIBWBFS_H
#include "libwbfs_os.h" // this file is provided by the project wanting to compile libwbfs
#include "wiidisc.h"
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
2010-09-24 02:48:03 +02:00
enum
{
WBFS_DEVICE_USB = 1, /* USB device */
WBFS_DEVICE_SDHC
/* SDHC device */
};
typedef u32 be32_t;
typedef u16 be16_t;
typedef struct wbfs_head
{
2010-09-24 02:48:03 +02:00
be32_t magic;
// parameters copied in the partition for easy dumping, and bug reports
be32_t n_hd_sec; // total number of hd_sec in this partition
u8 hd_sec_sz_s; // sector size in this partition
u8 wbfs_sec_sz_s; // size of a wbfs sec
u8 padding3[2];
u8 disc_table[0]; // size depends on hd sector size
}__attribute( ( packed ) ) wbfs_head_t;
typedef struct wbfs_disc_info
{
2010-09-24 02:48:03 +02:00
u8 disc_header_copy[0x100];
be16_t wlba_table[0];
} wbfs_disc_info_t;
2010-09-24 02:48:03 +02:00
// WBFS first wbfs_sector structure:
//
// -----------
// | wbfs_head | (hd_sec_sz)
// -----------
// | |
// | disc_info |
// | |
// -----------
// | |
// | disc_info |
// | |
// -----------
// | |
// | ... |
// | |
// -----------
// | |
// | disc_info |
// | |
// -----------
// | |
// |freeblk_tbl|
// | |
// -----------
//
// callback definition. Return 1 on fatal error (callback is supposed to make retries until no hopes..)
typedef int (*rw_sector_callback_t)(void*fp, u32 lba, u32 count, void*iobuf);
typedef void (*progress_callback_t)(s64 status, s64 total);
typedef struct wbfs_s
{
2010-09-24 02:48:03 +02:00
wbfs_head_t *head;
2010-09-24 02:48:03 +02:00
/* hdsectors, the size of the sector provided by the hosting hard drive */
u32 hd_sec_sz;
u8 hd_sec_sz_s; // the power of two of the last number
u32 n_hd_sec; // the number of hd sector in the wbfs partition
2010-09-24 02:48:03 +02:00
/* standard wii sector (0x8000 bytes) */
u32 wii_sec_sz;
u8 wii_sec_sz_s;
u32 n_wii_sec;
u32 n_wii_sec_per_disc;
2010-09-24 02:48:03 +02:00
/* The size of a wbfs sector */
u32 wbfs_sec_sz;
u32 wbfs_sec_sz_s;
u16 n_wbfs_sec; // this must fit in 16 bit!
u16 n_wbfs_sec_per_disc; // size of the lookup table
2010-09-24 02:48:03 +02:00
u32 part_lba;
/* virtual methods to read write the partition */
rw_sector_callback_t read_hdsector;
rw_sector_callback_t write_hdsector;
void *callback_data;
2010-09-24 02:48:03 +02:00
u16 max_disc;
u32 freeblks_lba;
u32 *freeblks;
u16 disc_info_sz;
2010-09-24 02:48:03 +02:00
u8 *tmp_buffer; // pre-allocated buffer for unaligned read
2010-09-24 02:48:03 +02:00
u32 n_disc_open;
} wbfs_t;
typedef struct wbfs_disc_s
{
2010-09-24 02:48:03 +02:00
wbfs_t *p;
wbfs_disc_info_t *header; // pointer to wii header
int i; // disc index in the wbfs header (disc_table)
} wbfs_disc_t;
#define WBFS_MAGIC (('W'<<24)|('B'<<16)|('F'<<8)|('S'))
/*! @brief open a MSDOS partitionned harddrive. This tries to find a wbfs partition into the harddrive
2010-09-24 02:48:03 +02:00
@param read_hdsector,write_hdsector: accessors to a harddrive
@hd_sector_size: size of the hd sector. Can be set to zero if the partition in already initialized
@num_hd_sector: number of sectors in this disc. Can be set to zero if the partition in already initialized
@reset: not implemented, This will format the whole harddrive with one wbfs partition that fits the whole disk.
calls wbfs_error() to have textual meaning of errors
@return NULL in case of error
*/
wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector, rw_sector_callback_t write_hdsector, void *callback_data,
int hd_sector_size, int num_hd_sector, int reset);
/*! @brief open a wbfs partition
2010-09-24 02:48:03 +02:00
@param read_hdsector,write_hdsector: accessors to the partition
@hd_sector_size: size of the hd sector. Can be set to zero if the partition in already initialized
@num_hd_sector: number of sectors in this partition. Can be set to zero if the partition in already initialized
@partition_lba: The partitio offset if you provided accessors to the whole disc.
@reset: initialize the partition with an empty wbfs.
calls wbfs_error() to have textual meaning of errors
@return NULL in case of error
*/
wbfs_t*wbfs_open_partition(rw_sector_callback_t read_hdsector, rw_sector_callback_t write_hdsector,
void *callback_data, int hd_sector_size, int num_hd_sector, u32 partition_lba, int reset);
/*! @brief close a wbfs partition, and sync the metadatas to the disc */
2010-09-24 02:48:03 +02:00
void wbfs_close(wbfs_t*);
/*! @brief open a disc inside a wbfs partition use a 6 char discid+vendorid
2010-09-24 02:48:03 +02:00
@return NULL if discid is not present
*/
wbfs_disc_t *wbfs_open_disc(wbfs_t* p, u8 *diskid);
/*! @brief close a already open disc inside a wbfs partition */
2010-09-24 02:48:03 +02:00
void wbfs_close_disc(wbfs_disc_t*d);
2010-09-24 02:48:03 +02:00
u32 wbfs_sector_used(wbfs_t *p, wbfs_disc_info_t *di);
u32 wbfs_sector_used2(wbfs_t *p, wbfs_disc_info_t *di, u32 *last_blk);
/*! @brief accessor to the wii disc
2010-09-24 02:48:03 +02:00
@param d: a pointer to already open disc
@param offset: an offset inside the disc, *points 32bit words*, allowing to access 16GB data
@param len: The length of the data to fetch, in *bytes*
*/
2010-09-24 02:48:03 +02:00
// offset is pointing 32bit words to address the whole dvd, although len is in bytes
int wbfs_disc_read(wbfs_disc_t*d, u32 offset, u32 len, u8 *data);
/*! @return the number of discs inside the partition */
2010-09-24 02:48:03 +02:00
u32 wbfs_count_discs(wbfs_t*p);
/*! get the disc info of ith disc inside the partition. It correspond to the first 0x100 bytes of the wiidvd
2010-09-24 02:48:03 +02:00
http://www.wiibrew.org/wiki/Wiidisc#Header
@param i: index of the disc inside the partition
@param header: pointer to 0x100 bytes to write the header
@size: optional pointer to a 32bit word that will get the size in 32bit words of the DVD taken on the partition.
*/
u32 wbfs_get_disc_info(wbfs_t*p, u32 i, u8 *header, int header_size, u32 *size);
/*! get the number of used block of the partition.
2010-09-24 02:48:03 +02:00
to be multiplied by p->wbfs_sec_sz (use 64bit multiplication) to have the number in bytes
*/
u32 wbfs_count_usedblocks(wbfs_t*p);
/******************* write access ******************/
/*! add a wii dvd inside the partition
2010-09-24 02:48:03 +02:00
@param read_src_wii_disc: a callback to access the wii dvd. offsets are in 32bit, len in bytes!
@callback_data: private data passed to the callback
@spinner: a pointer to a function that is regulary called to update a progress bar.
@sel: selects which partitions to copy.
@copy_1_1: makes a 1:1 copy, whenever a game would not use the wii disc format, and some data is hidden outside the filesystem.
*/
s32 wbfs_add_disc(wbfs_t*p, read_wiidisc_callback_t read_src_wii_disc, void *callback_data,
2010-09-24 02:48:03 +02:00
progress_callback_t spinner, partition_selector_t sel, int copy_1_1);
/*! remove a wiidvd inside a partition */
2010-09-24 02:48:03 +02:00
u32 wbfs_rm_disc(wbfs_t*p, u8* discid);
/*! rename a game */
2010-09-24 02:48:03 +02:00
u32 wbfs_ren_disc(wbfs_t*p, u8* discid, u8* newname);
/* change ID of a game*/
2010-09-24 02:48:03 +02:00
u32 wbfs_rID_disc(wbfs_t*p, u8* discid, u8* newID);
/*! trim the file-system to its minimum size
2010-09-24 02:48:03 +02:00
This allows to use wbfs as a wiidisc container
*/
2010-09-24 02:48:03 +02:00
u32 wbfs_trim(wbfs_t*p);
/*! extract a disc from the wbfs, unused sectors are just untouched, allowing descent filesystem to only really usefull space to store the disc.
2010-09-24 02:48:03 +02:00
Even if the filesize is 4.7GB, the disc usage will be less.
*/
2010-09-24 02:48:03 +02:00
u32 wbfs_extract_disc(wbfs_disc_t*d, rw_sector_callback_t write_dst_wii_sector, void *callback_data,
progress_callback_t spinner);
/*! extract a file from the wii disc filesystem.
2010-09-24 02:48:03 +02:00
E.G. Allows to extract the opening.bnr to install a game as a system menu channel
*/
2010-09-24 02:48:03 +02:00
int wbfs_extract_file(wbfs_disc_t*d, char *path, void **data);
2010-09-24 02:48:03 +02:00
// remove some sanity checks
void wbfs_set_force_mode(int force);
2010-09-24 02:48:03 +02:00
float wbfs_estimate_disc(wbfs_t *p, read_wiidisc_callback_t read_src_wii_disc, void *callback_data,
partition_selector_t sel);
// compressed and real size
u32 wbfs_size_disc(wbfs_t*p, read_wiidisc_callback_t read_src_wii_disc, void *callback_data,
partition_selector_t sel, u32 *comp_size, u32 *real_size);
2010-09-24 02:48:03 +02:00
typedef int (*_frag_append_t)(void *ff, u32 offset, u32 sector, u32 count);
int wbfs_get_fragments(wbfs_disc_t *d, _frag_append_t append_fragment, void *callback_data);
extern wbfs_t wbfs_iso_file;
2010-09-24 02:48:03 +02:00
u32 wbfs_disc_sector_used(wbfs_disc_t *d, u32 *num_blk);
int wbfs_iso_file_read(wbfs_disc_t*d, u32 offset, u8 *data, u32 len);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif