Hacking CISO file format

Wiimm

Developer
OP
Member
Joined
Aug 11, 2009
Messages
2,292
Trophies
1
Location
Germany
Website
wiimmfi.de
XP
1,519
Country
Germany
CISO file format

I have analyzed the CISO format by studying the source code of uLoader. Here I will explain the results and hope that anyone can confirm them.

Data Structure

Code:
enum // some constants
{
CISO_HEAD_SIZE	   = 0x8000,			 // total header size
CISO_MAP_SIZE		= CISO_HEAD_SIZE - 8, // map size
CISO_MIN_BLOCK_SIZE  = WII_SECTOR_SIZE,	// minimal allowed block size
};

typedef struct CISO_Head_t
{
u8  magic[4];			// "CISO"
u32 block_size;		  // stored as litte endian (not network byte order)
u8  map[CISO_MAP_SIZE];  // 0=unused, 1=used, others=invalid

} __attribute__ ((packed)) CISO_Head_t;

Each CISO file has a header with 32 KiB (32768 bytes). The first 4 bytes are the magic "CISO". The next 4 bytes are a 4 byte integer stored in little endian (intel format but not network byte order).


The MAP

The map uses the rest of the head (32760 bytes). Each byte represents a ISO block with given block size. A '1' means that the block is stored in the file, a '0' means that it is not stored (and is logical filled with zeros).

If reading from a CISO it is good to transform the map into a other map:

CODE typedef u16 CISO_Map_t;
const CISO_Map_t CISO_UNUSED_BLOCK = (CISO_Map_t)~0;

CISO_Head_t * head = ...
CISO_Map_t ciso_map[CISO_MAP_SIZE];
CISO_Map_t count = 0;
int idx;
for ( idx = 0; idx < CISO_MAP_SIZE; idx++ )
ciso_map[idx] = head->map[idx] ? count++ : CISO_UNUSED_BLOCK;

Reading a byte from the CISO file looks like this:
Code:
u8 ReadByteCISO ( ... file, CISO_Map_t * ciso_map, u32 block_size, off_t iso_off )
{
const u32 block = iso_off/block_size;
if ( block >= CISO_MAP_SIZE || ciso_map[block] == CISO_UNUSED_BLOCK )
return 0;

// calcualte the base address
u32 file_off = ciso_map[block] * (u64)block_size + CISO_UNUSED_BLOCK;

// add the offset inside the block
file_off += iso_off - block * (u64)block_size;

return ReadByte(file,file_off);
}


Good block_size


It seems that block_size must be a multiple of WII_SECTOR_SIZE (= 32 KiB = 32768).

To store a complete Wii disc with 4 699 979 776 bytes the block size must be at least 5*32=160 KiB and for double layer 320 KiB.

When extracting a disc from WBFS the uLoader software uses the WBFS sector size (multiple of 2 MiB) as CISO block size. The 'isotociso' tool (part of uLoader source) uses a fixed block size of 4 MiB. These block sizes are much larger and the ciso files grow a litle bit.

My Questions:
  • Is the block size always a multiple of 32768 (32 KiB)?
  • Must the block size be a power 2?
  • Is there a importand minimal CISO block size?
  • Does a USB loader need a max block limitation to limit the size of the internal mapping table?

wwt + wit


I have implemented CISO support into my WWT tools.

If writing the block size is at least 1 MiB, but the maximum used block number never exceeds 8192.

If reading a CISO plausibility checks are done to verify a valid CISO:
  • The magic must be "CISO".
  • The block size must be a multiple of 32 KiB.
  • No other values than 0 and 1 are allowed for the map.
  • The filesize must be correspondent to the number of used blocks.
My Question:
  • Are other values than 0 and 1 allowed for the map?
 

smf

Well-Known Member
Member
Joined
Feb 23, 2009
Messages
6,651
Trophies
2
XP
5,912
Country
United Kingdom
Wiimm said:
Nobody out there who knows about CISO?

I supported it in ooWii, I used 0 means not used & anything else means used.
No idea why it doesn't just use one bit per block.
 

Wiimm

Developer
OP
Member
Joined
Aug 11, 2009
Messages
2,292
Trophies
1
Location
Germany
Website
wiimmfi.de
XP
1,519
Country
Germany
I have a little discussion with user Satur9. We found out that the block size should be a power of 2. I have changed this in WWT.

btw:
I'm sad that none of the CISO developers will talk with me
frown.gif


I think that CISO with some limitations (block size and maximal used blocks) could be the right format for USB loaders. And handling is better than for sparse files (on non wii systems).
 

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
  • No one is chatting at the moment.
  • K3Nv2 @ K3Nv2:
    why
  • Xdqwerty @ Xdqwerty:
    @K3Nv2, it's not funny
  • K3Nv2 @ K3Nv2:
    ok
  • BigOnYa @ BigOnYa:
    Wut?
  • K3Nv2 @ K3Nv2:
    That's not funny
    +2
  • Psionic Roshambo @ Psionic Roshambo:
    So two cannibals where eating a clown and one says to the other. Hey does this taste funny to you?
    +2
  • K3Nv2 @ K3Nv2:
    What do you call a slow car? Retired
    +1
  • Psionic Roshambo @ Psionic Roshambo:
    Did you hear about the police car that someone stole the wheels off of? The police are working tirelessly to find the thieves.
    +2
  • K3Nv2 @ K3Nv2:
    A firefighter got arrested for assault his main claim was what I was told he was on fire
    +2
  • BigOnYa @ BigOnYa:
    What do you call a hooker with a runny nose? Full
    +2
  • Psionic Roshambo @ Psionic Roshambo:
    What do you tell a woman with two black eyes? Nothing you already told her twice!
  • K3Nv2 @ K3Nv2:
    Diddy also works
  • K3Nv2 @ K3Nv2:
    A scientist heard the word batman so he put a naked lady in a cage with a bat
  • Psionic Roshambo @ Psionic Roshambo:
    Chuck Norris won a staring contest, with the sun.
  • K3Nv2 @ K3Nv2:
    A vampires favorite thing to do is moon you
  • BigOnYa @ BigOnYa:
    What's the difference between an airplane, and Ken's mom? Not everyone has been in an airplane.
  • K3Nv2 @ K3Nv2:
    What's the difference between @BigOnYa and his wife? Nothing both want to bone me
    +3
  • RedColoredStars @ RedColoredStars:
    How much wood could a wood chuck chuck if a wood chuck could chuck norris
    +1
  • BakerMan @ BakerMan:
    how do i know? you're a guy, and he wants to bone every guy on this site (maybe, idk)
    +1
  • K3Nv2 @ K3Nv2:
    He wants to bone anything with a dick
    +1
  • Xdqwerty @ Xdqwerty:
    Good night
    +1
  • BigOnYa @ BigOnYa:
    Nighty night, big day tomorrow. Congrats.
    K3Nv2 @ K3Nv2: https://www.instagram.com/reel/C7iLZ35NrQt/?igsh=MWd2Z3U0dmNlMmNxcw==