Editing Resource Container CXML (RCO, QRC, Theme Files, RAF, CXML)
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
== RCO == | == RCO == | ||
*In PSvita the RCO's uses a cxml structure, with a header size of 0x50 and the magic identifyer '''RCOF''' | *In PSvita the RCO's uses a cxml structure, with a header size of 0x50 and the magic identifyer '''RCOF''' | ||
Line 9: | Line 7: | ||
[http://www.file-upload.net/download-9992747/Desktop.rar.html Some RCO as Reference] | [http://www.file-upload.net/download-9992747/Desktop.rar.html Some RCO as Reference] | ||
{| class="wikitable" style="font-size:x-small;" | {| class="wikitable" style="font-size:x-small;" | ||
Line 40: | Line 34: | ||
| 0x24 || 0x04 || F1 01 00 00 || Strings table size || in PS3 = Integer array size | | 0x24 || 0x04 || F1 01 00 00 || Strings table size || in PS3 = Integer array size | ||
|- bgcolor="#ffeebb" | |- bgcolor="#ffeebb" | ||
| 0x28 || 0x04 || D0 18 00 00 || | | 0x28 || 0x04 || D0 18 00 00 || overlapped (not used, but present in the header to keep the structure standards) || in PS3 = Float array absolute start offset | ||
|- bgcolor="#ffeebb" | |- bgcolor="#ffeebb" | ||
| 0x2C || 0x04 || 00 00 00 00 || | | 0x2C || 0x04 || 00 00 00 00 || empty || in PS3 = Float array size | ||
|- bgcolor="#ffee99" | |- bgcolor="#ffee99" | ||
| 0x30 || 0x04 || D0 18 00 00 || | | 0x30 || 0x04 || D0 18 00 00 || Styles ID INT table absolute start offset || in PS3 = File table absolute start offset | ||
|- bgcolor="#ffee99" | |- bgcolor="#ffee99" | ||
| 0x34 || 0x04 || 34 00 00 00 || | | 0x34 || 0x04 || 34 00 00 00 || Styles ID INT table size || in PS3 = File table size | ||
|- bgcolor="#ffee77" | |- bgcolor="#ffee77" | ||
| 0x38 || 0x04 || 10 19 00 00 || Integer array absolute start offset || in PS3 = Unknown area absolute start offset | | 0x38 || 0x04 || 10 19 00 00 || Integer array absolute start offset || in PS3 = Unknown area absolute start offset | ||
Line 68: | Line 62: | ||
==XML implicit structure Overview== | ==XML implicit structure Overview== | ||
namespace cxml | namespace cxml | ||
{ | |||
struct Header { /*header of a cxml document*/ | |||
char magic[4]; | |||
int version; | |||
int tree_offset; | |||
int tree_size; | |||
int idstrtable_offset; | |||
int idstrtable_size; | |||
int idinttable_offset; | |||
int idinttable_size; | |||
int stringtable_offset; | |||
int stringtable_size; | |||
int styleidtable_offset; | |||
int styleidtable_size; | |||
int intarraytable_offset; | |||
int intarraytable_size; | |||
int floatarraytable_offset; | |||
int floatarraytable_size; | |||
int filetable_offset; | |||
int filetable_size; | |||
}; | |||
struct ElementBin | |||
{ | |||
int name; | |||
int attr_num; | |||
int parent; | |||
int prev; | |||
int next; | |||
int first_child; | |||
int last_child; | |||
}; | |||
struct AttributeBin | |||
{ | |||
int INTEGER = 1; | |||
int FLOAT = 2; | |||
int STRING = 3; | |||
int unk = 4; | |||
int STYLE_ID = 5; | |||
int INTEGER_ARRAY = 6; | |||
int FLOAT_ARRAY = 7; | |||
int DATA = 8; | |||
int ID_STR_REF = 9; | |||
int ID_STR_NO_REF = 10; | |||
int ID_INT_REF = 11; | |||
int ID_INT_NO_REF = 12; | |||
int name; | |||
int type; | |||
struct StringData | |||
{ | |||
int offset; | |||
int len; | |||
}; | |||
struct IntArrayData | |||
{ | |||
int offset; | |||
int num; | |||
}; | |||
struct FloatArrayData | |||
{ | |||
int offset; | |||
int num; | |||
}; | |||
struct FileData | |||
{ | |||
int offset; | |||
int size; | |||
}; | |||
union | |||
{ | |||
int i; | |||
float f; | |||
StringData s; | |||
IntArrayData ia; | |||
FloatArrayData fa; | |||
FileData file; | |||
int id; | |||
int idref; | |||
}; | |||
}; | |||
struct IDBin | |||
{ | |||
int entity_offset; | |||
char id[0]; | |||
}; | |||
enum AllocationType | |||
{ | |||
AllocationType_Alloc_Tree, | |||
AllocationType_Alloc_IDSTRTable, | |||
AllocationType_Alloc_IDINTTable, | |||
AllocationType_Alloc_StringTable, | |||
AllocationType_Alloc_IntArrayTable, | |||
AllocationType_Alloc_FloatArrayTable, | |||
AllocationType_Alloc_FileTable, | |||
AllocationType_Alloc_StyleIDTable, | |||
AllocationType_Free_Tree, | |||
AllocationType_Free_IDSTRTable, | |||
AllocationType_Free_IDINTTable, | |||
AllocationType_Free_StringTable, | |||
AllocationType_Free_IntArrayTable, | |||
AllocationType_Free_FloatArrayTable, | |||
AllocationType_Free_FileTable, | |||
AllocationType_AFree_StyleIDTable, | |||
}; | |||
enum AccessMode | |||
{ | |||
AccessMode_ReadWrite, | |||
AccessMode_ReadOnly_File, | |||
AccessMode_ReadOnly_Memory, | |||
}; | |||
class Document { | |||
public: | |||
typedef void (*Allocator)( AllocationType type, void * userdata, void * old_addr, unsigned int required_size, void ** addr, unsigned int * size ); | |||
private: | |||
AccessMode access_mode; | |||
Header header; | |||
char * tree; | |||
unsigned int tree_capacity; | |||
char * idstrtable; | |||
unsigned int idstrtable_capacity; | |||
char * idinttable; | |||
unsigned int idinttable_capacity; | |||
char * stringtable; | |||
unsigned int stringtable_capacity; | |||
int * intarraytable; | |||
unsigned int intarraytable_capacity; | |||
float * floatarraytable; | |||
unsigned int floatarraytable_capacity; | |||
char * filetable; | |||
unsigned int filetable_capacity; | |||
char * styleidtable; | |||
unsigned int styleidtable_capacity; | |||
Allocator allocator; | |||
void * allocator_userdata; | |||
}; | |||
class Element { | |||
private: | |||
Document * doc; | |||
int offset; | |||
}; | |||
class Attribute { | |||
private: | |||
Document * doc; | |||
int element_offset; | |||
int offset; | |||
}; | |||
}; | }; | ||
===Element=== | ===Element=== | ||
{| class="wikitable" style="text-align:center;" | {| class="wikitable" style="text-align:center;" | ||
|+ CXML | |+ CXML Element Base definition | ||
! Offset !! Length !! usage | ! Offset !! Length !! usage | ||
|- | |- | ||
Line 282: | Line 236: | ||
| 0x08 || 0x04 || Parent relative offset in '''TOC''' | | 0x08 || 0x04 || Parent relative offset in '''TOC''' | ||
|- | |- | ||
| 0x0C || 0x04 || Previous | | 0x0C || 0x04 || Previous Brother relative offset in '''TOC''' | ||
|- | |- | ||
| 0x10 || 0x04 || Next | | 0x10 || 0x04 || Next Brother relative offset in '''TOC''' | ||
|- | |- | ||
| 0x14 || 0x04 || First child relative offset in '''TOC''' | | 0x14 || 0x04 || First child relative offset in '''TOC''' | ||
Line 290: | Line 244: | ||
| 0x18 || 0x04 || Last child relative offset in '''TOC''' | | 0x18 || 0x04 || Last child relative offset in '''TOC''' | ||
|} | |} | ||
{| class="wikitable" style="text-align:center;" | {| class="wikitable" style="text-align:center;" | ||
|+ CXML | |+ CXML Element Root definition | ||
! Offset !! Length !! usage | ! Offset !! Length !! usage | ||
|- | |- | ||
| 0x00 || 0x04 || Element name relative offset in '''TAGS Table''' | | 0x00 || 0x04 || Root Element name relative offset in '''TAGS Table''' | ||
|- | |- | ||
| 0x04 || 0x04 || Number of attributes in '''TOC''' | | 0x04 || 0x04 || Number of attributes in '''TOC''' | ||
Line 303: | Line 255: | ||
| 0x08 || 0x04 || Parent relative offset in '''TOC''' | | 0x08 || 0x04 || Parent relative offset in '''TOC''' | ||
|- | |- | ||
| | | 0x1C || 0x04 || Previous Brother relative offset in '''TOC''' | ||
|- | |- | ||
| 0x10 || 0x04 || Next | | 0x10 || 0x04 || Next Brother relative offset in '''TOC''' | ||
|} | |} | ||
*NOTE: The '''Child Element''' defination describe the Child Element and his Attributes where the '''Brother Element''' describe the Brother Element and his Attributes. | |||
So the full order to read will be '''Child Element''' >>> '''Attributes''', '''Brother Element''' >>> '''Attributes'''. | |||
NOTE: | |||
===Attribute=== | ===Attribute=== | ||
{| class="wikitable" | |||
{| class="wikitable | |+ Attribute types structure | ||
|+ | ! rowspan=2 | Offset !! rowspan=2 | Length !! rowspan=2 | Name !! colspan=12 | Attribute type | ||
! | |- | ||
| colspan=12 | Attribute | ! Integer !! Float !! String !! analysing... !! Style ID INT !! Integer Array !! Float Array !! File !! Ref ID STR || ID STR || Ref ID INT || ID INT | ||
|- | |- | ||
| 0x0 || 0x4 || Attribute name offset || colspan=12 {{cellcolors|lightgrey}} '''________________________________________________________________________ xml tag string from the "strings table" __________________________________________________________________''' | |||
|-_____ | |||
| 0x4 || 0x4 || Attribute type || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C | |||
|- | |- | ||
| 0x8 || 0x4 || variable 1 || Integer value || Float value || String Offset || analysing... || Style ID INT offset || Integer offset || Float offset || File offset || Ref ID STR offset || ID STR offset || Ref ID INT offset || ID INT offset | |||
| Integer value || Float value || | |||
|- | |- | ||
| 0xC || 0x4 || variable 2 || unknown (usually 0) || unknown (usually 0) || String Length || analysing... || ID count (usually 4) || Integer count || Float count || File size || unknown (usually 0) || unknown (usually 0) || unknown (usually 0) || unknown (usually 0) | |||
| | |||
|} | |} | ||
==Container Common Structure== | ==Container Common Structure== | ||
Line 335: | Line 282: | ||
ZLIB Compressed level 9 (only container) | ZLIB Compressed level 9 (only container) | ||
==== RCOF | ==== RCOF ==== | ||
RCOF ('''R'''esources '''C'''ontainer | RCOF ('''R'''esources '''C'''ontainer '''F'''lat?) | ||
*Example from FW?? notification_settings_plugin.rco: | *Example from FW?? notification_settings_plugin.rco: | ||
Line 348: | Line 294: | ||
|- | |- | ||
| Magic || 0x00 || 0x04 || {{cellcolors|#666666|#ffffff}} 52 43 4F 46 || 'RCOF' | | Magic || 0x00 || 0x04 || {{cellcolors|#666666|#ffffff}} 52 43 4F 46 || 'RCOF' | ||
|- | |- | ||
| Version || 0x04 || 0x04 || {{cellcolors|#888888|#ffffff}} 00 00 01 10* || CXML version '1.10' | | Version || 0x04 || 0x04 || {{cellcolors|#888888|#ffffff}} 00 00 01 10* || CXML version '1.10' | ||
Line 380: | Line 312: | ||
**one of the "not used table" (at offset 0x18D0 with a size of 0) is placed before an used table (also at offset 0x18D0 but with a size of 0x34) | **one of the "not used table" (at offset 0x18D0 with a size of 0) is placed before an used table (also at offset 0x18D0 but with a size of 0x34) | ||
'''Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F''' | '''Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F''' | ||
'''00000000''' <span style="background:#666666;">52 43 4F 46</span> <span style="background:#666666;">10 01 00 00</span> <span style="background:#ff8888;">50 00 00 00</span> <span style="background:#ff8888;">2C 15 00 00</span> RCOF....P...,... | '''00000000''' <span style="background:#666666;">52 43 4F 46</span> <span style="background:#666666;">10 01 00 00</span> <span style="background:#ff8888;">50 00 00 00</span> <span style="background:#ff8888;">2C 15 00 00</span> RCOF....P...,... | ||
Line 387: | Line 319: | ||
'''00000030''' <span style="background:#ffee99;">D0 18 00 00</span> <span style="background:#ffee99;">34 00 00 00</span> <span style="background:#ffee77;">10 19 00 00</span> <span style="background:#ffee77;">2C 00 00 00</span> Ð...4.......,... | '''00000030''' <span style="background:#ffee99;">D0 18 00 00</span> <span style="background:#ffee99;">34 00 00 00</span> <span style="background:#ffee77;">10 19 00 00</span> <span style="background:#ffee77;">2C 00 00 00</span> Ð...4.......,... | ||
'''00000040''' <span style="background:#ffee55;">40 19 00 00</span> <span style="background:#ffee55;">8C 00 00 00</span> <span style="background:#ffee33;">D0 19 00 00</span> <span style="background:#ffee33;">60 89 00 00</span> @...Œ...Ð...`‰.. | '''00000040''' <span style="background:#ffee55;">40 19 00 00</span> <span style="background:#ffee55;">8C 00 00 00</span> <span style="background:#ffee33;">D0 19 00 00</span> <span style="background:#ffee33;">60 89 00 00</span> @...Œ...Ð...`‰.. | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 416: | Line 349: | ||
| empty || 0x2C || 0x04 || {{cellcolors|#ffeebb}} 00 00 00 00 || Not used | | empty || 0x2C || 0x04 || {{cellcolors|#ffeebb}} 00 00 00 00 || Not used | ||
|- | |- | ||
| | | Styles ID Integer Table Offset || 0x30 || 0x04 || {{cellcolors|#ffee99}} 00 00 18 D0* || | ||
|- | |- | ||
| | | Styles ID Integer Table Size || 0x34 || 0x04 || {{cellcolors|#ffee99}} 00 00 00 34* || | ||
|- | |- | ||
| Integer Array Table Offset || 0x38 || 0x04 || {{cellcolors|#ffee77}} 00 00 19 10* || | | Integer Array Table Offset || 0x38 || 0x04 || {{cellcolors|#ffee77}} 00 00 19 10* || | ||
Line 433: | Line 366: | ||
|- | |- | ||
|} | |} | ||
* reversed little endian | * reversed little endian | ||
*Notes | *Notes | ||
**The sizes doesn't includes the (possible) padding at the end of all tables | **The sizes doesn't includes the (possible) padding at the end of all tables | ||
===Tree Table=== | ===Tree Table=== | ||
Line 503: | Line 382: | ||
| 0x08 || 0x04 || FF FF FF FF || Parent | | 0x08 || 0x04 || FF FF FF FF || Parent | ||
|- | |- | ||
| 0x0C || 0x04 || FF FF FF FF || Previous | | 0x0C || 0x04 || FF FF FF FF || Previous Brother | ||
|- | |- | ||
| 0x10 || 0x04 || FF FF FF FF || Next | | 0x10 || 0x04 || FF FF FF FF || Next Brother | ||
|- | |- | ||
| 0x14 || 0x04 || 00 00 00 3C || First Child within the root Element <resource> | | 0x14 || 0x04 || 00 00 00 3C || First Child within the root Element <resource> | ||
|- | |- | ||
| 0x18 || 0x04 || 00 00 0D 74 || Last Child within the root Element <resource> (which will also our Next ''' | | 0x18 || 0x04 || 00 00 0D 74 || Last Child within the root Element <resource> (which will also our Next '''Base Element''' to read) | ||
|- | |- | ||
| 0x1C || 0x04 || 00 00 00 09 || String Pointer (Offset within '''String Table''', in this case it will be "version") | | 0x1C || 0x04 || 00 00 00 09 || String Pointer (Offset within '''String Table''', in this case it will be "version") | ||
Line 515: | Line 394: | ||
| 0x20 || 0x04 || 00 00 00 02 || Type descriptor (2 == Float) | | 0x20 || 0x04 || 00 00 00 02 || Type descriptor (2 == Float) | ||
|- | |- | ||
| 0x24 || 0x04 || | | 0x24 || 0x04 || CD CC CC 3D || Float value (0.1) [version="0.1"] | ||
|- | |- | ||
| 0x28 || 0x04 || 00 00 00 00 || empty value | | 0x28 || 0x04 || 00 00 00 00 || empty value | ||
Line 527: | Line 406: | ||
| 0x38 || 0x04 || 00 00 00 06 || Length of String to read (0x06 == "normal") [type="normal"] | | 0x38 || 0x04 || 00 00 00 06 || Length of String to read (0x06 == "normal") [type="normal"] | ||
|- | |- | ||
| 0x3C || 0x04 || 00 00 00 1D || Next Element (Offset within '''String Table''', in this case it will be < | | 0x3C || 0x04 || 00 00 00 1D || Next Element (Offset within '''String Table''', in this case it will be <filetable>) | ||
|- | |- | ||
| 0x40 || 0x04 || 00 00 00 00 || Attribute Count | | 0x40 || 0x04 || 00 00 00 00 || Attribute Count | ||
Line 533: | Line 412: | ||
| 0x44 || 0x04 || 00 00 00 00 || Parent (Offset within XML Table, pointing to Root Element) | | 0x44 || 0x04 || 00 00 00 00 || Parent (Offset within XML Table, pointing to Root Element) | ||
|- | |- | ||
| 0x48 || 0x04 || FF FF FF FF || Previous | | 0x48 || 0x04 || FF FF FF FF || Previous Brother | ||
|- | |- | ||
| | | 0x4C || 0x04 || 00 00 07 88 || Next Brother | ||
|- | |- | ||
| | | 0x50 || 0x04 || 00 00 00 58 || Last Child | ||
|- | |- | ||
| | | 0x54 || 0x04 || 00 00 00 00 || empty value | ||
|- | |- | ||
| | | 0x58 || 0x04 || 00 00 00 1D || String Pointer (in this case <light_num>) | ||
|- | |- | ||
| | | 0x5C || 0x04 || 00 00 00 01 || Type descriptor (1 == Integer) | ||
|- | |- | ||
| | | 0x60 || 0x04 || 00 00 00 01 || Integer value | ||
|- | |- | ||
| | | 0x64 || 0x04 || 00 00 00 00 || empty value | ||
|- | |- | ||
| | | 0x68 || 0x04 || 00 00 00 27 || String Pointer (in this case <script_num>) | ||
|- | |- | ||
| | | 0x6C || 0x04 || 00 00 00 01 || Type descriptor (1 == Integer) | ||
|- | |- | ||
| | | 0x70 || 0x04 || 00 00 00 01 || Integer value | ||
|- | |- | ||
| | | 0x74 || 0x04 || 00 00 00 00 || empty value | ||
|- | |- | ||
| | | 0x78 || 0x04 || 00 00 00 32 || String Pointer (in this case <actor_num>) | ||
|- | |- | ||
| | | 0x7C || 0x04 || 00 00 00 01 || Type descriptor (1 == Integer) | ||
|- | |- | ||
| | | 0x80 || 0x04 || 00 00 00 48 || Integer value | ||
|- | |- | ||
| | | 0x84 || 0x04 || 00 00 00 00 || empty value | ||
|- | |- | ||
| | | 0x88 || 0x04 || 00 00 00 3C || String Pointer (in this case <actor>) | ||
|- | |- | ||
| | | 0x8C || 0x04 || 00 00 00 0C || Attribute Counter (0x0C == 12) | ||
|- | |- | ||
| 0x90 || 0x04 || 00 00 00 2C || Parent | |||
|- | |- | ||
| | | 0x94 || 0x04 || FF FF FF FF || Previous Element | ||
|- | |- | ||
| | | 0x98 || 0x04 || 00 00 01 64 || Next Element | ||
|- | |- | ||
| | | 0x9C || 0x04 || FF FF FF FF || Firs Entry | ||
|- | |- | ||
| | | 0xA0 || 0x04 || FF FF FF FF || Last Entry | ||
|- | |- | ||
|} | |} | ||