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 8: | Line 6: | ||
[https://github.com/cfwprpht/Simply_Vita_RCO_Extractor Simply Vita RCO Extractor] | [https://github.com/cfwprpht/Simply_Vita_RCO_Extractor Simply Vita RCO Extractor] | ||
[ | [https://anonfiles.com/file/d333453b707746c83a11e696b6b1ca51 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 65: | Line 59: | ||
|- | |- | ||
|} | |} | ||
==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=== | ||
===Attribute=== | |||
{| class="wikitable | {| class="wikitable" | ||
|+ | |+ Attribute types structure | ||
! Offset !! Length !! | ! rowspan=2 | Offset !! rowspan=2 | Length !! rowspan=2 | Name !! colspan=12 | Attribute type | ||
|- | |- | ||
! 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 248: | ||
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 260: | ||
|- | |- | ||
| 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 278: | ||
**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 285: | ||
'''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 315: | ||
| 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 332: | ||
|- | |- | ||
|} | |} | ||
* 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 | ||