Resource Container CXML (RCO, QRC, Theme Files, RAF, CXML): Difference between revisions
Cfwprophet (talk | contribs) |
Cfwprophet (talk | contribs) |
||
Line 492: | Line 492: | ||
'''000000A0''' 02 00 00 00 49 00 00 00 09 00 00 00 00 00 00 00 ....I........... | '''000000A0''' 02 00 00 00 49 00 00 00 09 00 00 00 00 00 00 00 ....I........... | ||
'''000000B0''' 00 00 00 00 29 00 00 00 04 00 00 00 3C 00 00 00 ....).......<... | '''000000B0''' 00 00 00 00 29 00 00 00 04 00 00 00 3C 00 00 00 ....).......<... | ||
====String Table==== | |||
This area is composed by a consecutive list of all the tags (elements or attributes) from the xml that was used to create the container. Are stored "from-top-to-bottom" in the exact same order that they was ordered in the xml (althougth it looks in some cases the theme compiler reorders them to his convenience). This list doesn't makes differences of the "directory hierarchy" of the tags neither is specified if the tag is an element or an attribute (this parent-child hierarchy is defined in other place of the container by making references to this area by using "byte counters" to locate a tag) | |||
'''Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F''' | |||
'''00000000''' <span style="background:#ffff66;">72 65 73 6F 75 72 63 65 00 76 65 72 73 69 6F 6E</span> resource.version | |||
'''00000010''' <span style="background:#ffff66;">00 74 79 70 65 00 6E 6F 72 6D 61 6C 00 73 74 72</span> .type.normal.str | |||
'''00000020''' <span style="background:#ffff66;">69 6E 67 74 61 62 6C 65 00 6C 6F 63 61 6C 65 00</span> ingtable.locale. | |||
'''00000030''' <span style="background:#ffff66;">6F 72 69 67 73 69 7A 65 00 73 72 63 00 63 6F 6D</span> origsize.src.com | |||
'''00000040''' <span style="background:#ffff66;">70 72 65 73 73 00 6F 6E 00 69 64 00 74 65 78 74</span> press.on.id.text | |||
'''00000050''' <span style="background:#ffff66;">75 72 65 74 61 62 6C 65 00 74 65 78 74 75 72 65</span> uretable.texture | |||
'''00000060''' <span style="background:#ffff66;">00 74 65 78 74 75 72 65 2F 67 69 6D 00 64 69 76</span> .texture/gim.div | |||
'''00000070''' <span style="background:#ffff66;">5F 72 61 74 69 6F 5F 68 00 6D 61 72 67 69 6E 5F</span> _ratio_h.margin_ | |||
'''00000080''' <span style="background:#ffff66;">76 00 6D 61 72 67 69 6E 5F 68 00 64 69 76 5F 6D</span> v.margin_h.div_m | |||
'''00000090''' <span style="background:#ffff66;">6F 64 65 00 33 78 31 00 73 74 79 6C 65 74 61 62</span> ode.3x1.staletab | |||
'''000000A0''' <span style="background:#ffff66;">6C 65 00 73 74 79 6C 65 5F 62 75 74 74 6F 6E 00</span> le.style_button. | |||
'''000000B0''' <span style="background:#ffff66;">62 67 5F 6F 62 6A 00 67 6C 6F 77 5F 6F 62 6A 00</span> bg_ogj.glow_obj. | |||
'''000000C0''' <span style="background:#ffff66;">70 6C 61 6E 65 6F 62 6A 00 74 65 78 74 75 72 65</span> planeobj.texture | |||
'''000000D0''' <span style="background:#ffff66;">30 00 62 6C 65 6E 64 00 73 74 79 6C 65 5F 74 65</span> 0.blend.style_te | |||
'''000000E0''' <span style="background:#ffff66;">78 74 00 74 65 78 74 6F 62 6A 00 66 6F 6E 74 5F</span> xt.textobj.font_ | |||
'''000000F0''' <span style="background:#ffff66;">73 69 7A 65 00 62 6F 6C 64 00 63 6F 6C 6F 72 00</span> size.bold.color. | |||
'''00000100''' <span style="background:#ffff66;">6D 61 78 5F 6C 69 6E 65 5F 63 6F 75 6E 74 00 6C</span> max_line_count.l | |||
'''00000110''' <span style="background:#ffff66;">69 6E 65 5F 70 69 74 63 68 00 77 6F 72 64 5F 77</span> ine_pitch.word_w | |||
'''00000120''' <span style="background:#ffff66;">72 61 70 00 65 6C 6C 69 70 73 69 73 00 73 74 79</span> rap.ellipsis.sty | |||
'''00000130''' <span style="background:#ffff66;">6C 65 5F 70 6C 61 6E 65 00 70 61 67 65 74 61 62</span> le_plane.pagetab | |||
'''00000140''' <span style="background:#ffff66;">6C 65 00 74 65 6D 70 6C 61 74 65 74 61 62 6C 65</span> le.templatetable | |||
'''00000150''' <span style="background:#ffff66;">00 74 65 6D 70 6C 61 74 65 00 66 69 6C 65 5F 6C</span> .template.file_l | |||
'''00000160''' <span style="background:#ffff66;">69 73 74 00 73 74 79 6C 65 00 6C 61 79 6F 75 74</span> ist.style.layout | |||
'''00000170''' <span style="background:#ffff66;">5F 68 69 6E 74 00 61 6C 69 67 6E 00 73 69 7A 65</span> hint.align.size. | |||
'''00000180''' <span style="background:#ffff66;">00 70 6F 73 00 66 61 73 74 5F 6F 70 65 6E 00 6C</span> .pos.fast_open.l | |||
'''00000190''' <span style="background:#ffff66;">69 73 74 5F 69 74 65 6D 00 74 65 78 74 00 61 64</span> ist_item.text.ad | |||
'''000001A0''' <span style="background:#ffff66;">6A 75 73 74 00 70 6C 61 6E 65 00 61 6C 70 68 61</span> just.plane.alpha | |||
'''000001B0''' <span style="background:#ffff66;">00 61 6E 63 68 6F 72 00 63 68 65 63 6B 5F 62 6F</span> .anchor.check_bo | |||
'''000001C0''' <span style="background:#ffff66;">78 00 66 6F 63 75 73 5F 68 69 6E 74 00 66 6F 63</span> x.focus_hint.foc | |||
'''000001D0''' <span style="background:#ffff66;">75 73 5F 73 68 61 70 65 00 66 6F 63 75 73 5F 73</span> us_shape.focus_s | |||
'''000001E0''' <span style="background:#ffff66;">69 7A 65 00 62 75 74 74 6F 6E 00 73 6F 75 6E 64</span> ize.button.sound | |||
'''000001F0''' <span style="background:#ff6666;">00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span> | |||
*Notes: | |||
**yellow: used bytes | |||
**red: padding to align to 0x10 bytes | |||
**The integer values and text strings of some attributes tags from the xml (e.g: "themename=mytheme", or "fontcolor=2") are stored in this area too at the right of his tag, the presence of an integer value displaces the next tag (this only happens in themes and rafs, not in QRC, RCO files so is added here as a note but is very important for the structure of the other containers when using "byte counters" to locate the tags) |
Revision as of 21:05, 13 December 2014
RCO
- In PSvita the RCO's uses a cxml structure, with a header size of 0x50 and the magic identifyer RCOF
- RCOF header is 0x10 bytes bigger than any cxml header in PS3 (this means there are 2 new tables added for the new cxml variant used in vita rco's). And endianess changed
- Some of the extracted files (after cropped and zlib decompressed) are another variant of a cxml structure with identifyer RCSF. After a second extraction (with a cxml decompiler tool) the resulting file is a .xml containing only text strings (this double cxml method is used for .xml files that stores language translations)
Offset | Size | Example | Name | Notes |
---|---|---|---|---|
CXML Header | ||||
0x00 | 0x04 | RCOF | Magic | |
0x04 | 0x04 | 10 01 00 00 | Version | |
0x08 | 0x04 | 50 00 00 00 | Tree absolute start offset, also header size | in PS3 = Tree absolute start offset |
0x0C | 0x04 | 2C 15 00 00 | Tree size | in PS3 = Tree size |
0x10 | 0x04 | 80 15 00 00 | ID STR table absolute start offset | in PS3 = ID table absolute start offset |
0x14 | 0x04 | B0 00 00 00 | ID STR table size | in PS3 = ID table size |
0x18 | 0x04 | 30 16 00 00 | ID INT table absolute start offset | in PS3 = Strings table absolute start offset |
0x1C | 0x04 | 98 00 00 00 | ID INT table size | in PS3 = Strings table size |
0x20 | 0x04 | D0 16 00 00 | Strings table absolute start offset | in PS3 = Integer array absolute start offset |
0x24 | 0x04 | F1 01 00 00 | Strings table size | in PS3 = Integer array size |
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 |
0x2C | 0x04 | 00 00 00 00 | empty | in PS3 = Float array size |
0x30 | 0x04 | D0 18 00 00 | Styles ID INT table absolute start offset | in PS3 = File table absolute start offset |
0x34 | 0x04 | 34 00 00 00 | Styles ID INT table size | in PS3 = File table size |
0x38 | 0x04 | 10 19 00 00 | Integer array absolute start offset | in PS3 = Unknown area absolute start offset |
0x3C | 0x04 | 2C 00 00 00 | Integer array size | in PS3 = Unknown area size |
0x40 | 0x04 | 40 19 00 00 | Float array absolute start offset | in PS3 = Not present |
0x44 | 0x04 | 8C 00 00 00 | Float array size | in PS3 = Not present |
0x48 | 0x04 | D0 19 00 00 | File table absolute start offset | in PS3 = Not present |
0x4C | 0x04 | 60 89 00 00 | File table size | in PS3 = Not present |
Tables | ||||
0x50 | Tree starts here |
XML implicit structure Overview
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 ChildElementBin { int name; int attr_num; int parent; int prev; int next; int first_child; int last_child; }; struct BrotherElementBin { int name; int attr_num; int parent; int prev; int next; }; 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
Offset | Length | usage |
---|---|---|
0x00 | 0x04 | Element name relative offset in TAGS Table |
0x04 | 0x04 | Number of attributes in TOC |
0x08 | 0x04 | Parent relative offset in TOC |
0x0C | 0x04 | Previous Brother relative offset in TOC |
0x10 | 0x04 | Next Brother relative offset in TOC |
0x14 | 0x04 | First child relative offset in TOC |
0x18 | 0x04 | Last child relative offset in TOC |
Offset | Length | usage |
---|---|---|
0x00 | 0x04 | Root Element name relative offset in TAGS Table |
0x04 | 0x04 | Number of attributes in TOC |
0x08 | 0x04 | Parent relative offset in TOC |
0x1C | 0x04 | Previous Brother relative offset in TOC |
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. The Root (so offset 0x00) of any SonyPlaystation Resource file always start's with a Child element to read.
Attribute
Offset | Length | Name | 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 | ________________________________________________________________________ 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 |
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
RCO
ZLIB Compressed level 9 (only container)
RCOF
RCOF (Resources Container Flat?)
- Example from FW?? notification_settings_plugin.rco:
Offset(h) 00 01 02 03 04 05 06 07 00000000 52 43 4F 46 10 01 00 00 RCOF....
Name | Offset | Size | Example | Remark |
---|---|---|---|---|
Magic | 0x00 | 0x04 | 52 43 4F 46 | 'RCOF' |
Version | 0x04 | 0x04 | 00 00 01 10* | CXML version '1.10' |
* reversed little endian
byte index | bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|---|---|---|
[0] CMF | Compression info
|
Compression method
| ||||||
[1] FLG | FLEVEL
|
FDICT
(Preset dictionary) If set, a DICT dictionary identifier is present immediately after the FLG byte. The dictionary is a sequence of bytes which are initially fed to the compressor without producing any compressed output. DICT is the Adler-32 checksum of this sequence of bytes (see the definition of ADLER32 below). The decompressor can use this identifier to determine which dictionary has been used by the compressor. |
FCHECK
value must be such that CMF and FLG, when viewed as a 16-bit unsigned integer stored in MSB order (CMF *256 + FLG), is a multiple of 31. |
About Data Compression:
Main Header
The header contains an identifier of the container (magic), his version, and allows to store the "absolute start offset" and "size" of 9 tables (or areas)
When a "not used table" is placed before a "used table"... the start offset of the "not used table" and his size (as zero) are stored in the main header to preserve his position in the structure. The "used table" that comes later starts in the same offset than the previously "not used table" (an intuitive way to think in this is imagining are overlapped because starts in the same position but only the one at the top is used)
- The container format is generic (used also by PS3 files like .RAF, .QRC and .P3T with some variations) so the usage of this tables can vary, in this example there is 1 "not used table":
- 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 00000000 52 43 4F 46 10 01 00 00 50 00 00 00 2C 15 00 00 RCOF....P...,... 00000010 80 15 00 00 B0 00 00 00 30 16 00 00 98 00 00 00 €...°...0...˜... 00000020 D0 16 00 00 F1 01 00 00 D0 18 00 00 00 00 00 00 Ð...ñ...Ð....... 00000030 D0 18 00 00 34 00 00 00 10 19 00 00 2C 00 00 00 Ð...4.......,... 00000040 40 19 00 00 8C 00 00 00 D0 19 00 00 60 89 00 00 @...Œ...Ð...`‰..
Name | Offset | Size | Example | Remark |
---|---|---|---|---|
Magic | 0x00 | 0x04 | 52 43 4F 46 | 'RCOF' |
Version | 0x04 | 0x04 | 00 00 01 10* | CXML version '1.10' |
Tree Table Offset | 0x08 | 0x04 | 00 00 00 50* | |
Tree Table Size | 0x0C | 0x04 | 00 00 15 2C* | |
ID String Table Offset | 0x10 | 0x04 | 00 00 15 80* | |
ID String Table Size | 0x14 | 0x04 | 00 00 00 B0* | |
ID Integer Table Offset | 0x18 | 0x04 | 00 00 16 30* | |
ID Integer Table Size | 0x1C | 0x04 | 00 00 00 98* | |
String Table Offset | 0x20 | 0x04 | 00 00 16 D0* | |
String Table size | 0x24 | 0x04 | 00 00 01 F1* | |
overlapped | 0x28 | 0x04 | 00 00 18 D0* | Overlapped |
empty | 0x2C | 0x04 | 00 00 00 00 | Not used |
Styles ID Integer Table Offset | 0x30 | 0x04 | 00 00 18 D0* | |
Styles ID Integer Table Size | 0x34 | 0x04 | 00 00 00 34* | |
Integer Array Table Offset | 0x38 | 0x04 | 00 00 19 10* | |
Integer Array Table Size | 0x3C | 0x04 | 00 00 00 2C* | |
Float Array Table Offset | 0x38 | 0x04 | 00 00 19 40* | |
Float Array Table Size | 0x3C | 0x04 | 00 00 00 8C* | |
File Table Offset | 0x38 | 0x04 | 00 00 19 D0* | |
File Table Size | 0x3C | 0x04 | 00 00 89 60* |
* reversed little endian
- Notes
- The sizes doesn't includes the (possible) padding at the end of all tables
Tree Table
from notification_settings_plugin.rco FW??
Offset | Size | Example | Remark |
---|---|---|---|
0x00 | 0x04 | 00 00 00 00 | Root Element (Offset within String Table, in this case it will be <resource>) |
0x04 | 0x04 | 00 00 00 02 | Attribute Counter |
0x08 | 0x04 | FF FF FF FF | Parent |
0x0C | 0x04 | FF FF FF FF | Previous Brother |
0x10 | 0x04 | FF FF FF FF | Next Brother |
0x14 | 0x04 | 00 00 00 3C | First Child within the root Element <resource> (which will also our Next Child Element to read) |
0x18 | 0x04 | 00 00 0D 74 | Last Child within the root Element <resource> (which will also our Next Child Element to read) |
0x1C | 0x04 | 00 00 00 09 | String Pointer (Offset within String Table, in this case it will be "version") |
0x20 | 0x04 | 00 00 00 02 | Type descriptor (2 == Float) |
0x24 | 0x04 | 3D CC CC CD | Float value (0.1) [version="0.1"] |
0x28 | 0x04 | 00 00 00 00 | empty value |
0x2C | 0x04 | 00 00 00 11 | String Pointer (in this case "type") |
0x30 | 0x04 | 00 00 00 03 | Type descriptor (3 == String) |
0x34 | 0x04 | 00 00 00 16 | Offset within String Table of String to read |
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 <stringtable>) |
0x40 | 0x04 | 00 00 00 00 | Attribute Count |
0x44 | 0x04 | 00 00 00 00 | Parent (Offset within XML Table, pointing to Root Element) |
0x48 | 0x04 | FF FF FF FF | Previous Brother |
0x4C | 0x04 | 00 00 07 88 | Next Brother |
0x50 | 0x04 | 00 00 00 58 | First Child |
0x54 | 0x04 | 00 00 07 2C | Last Child |
0x58 | 0x04 | 00 00 00 29 | String Pointer (in this case <local>) |
0x5C | 0x04 | 00 00 00 04 | Attribute Count |
0x60 | 0x04 | 00 00 00 3C | Parrent <stringtable> |
0x64 | 0x04 | FF FF FF FF | Previous Brother |
0x68 | 0x04 | 00 00 00 B4 | Next Brother |
0x6C | 0x04 | FF FF FF FF | First Child |
0x70 | 0x04 | FF FF FF FF | Last Child |
0x74 | 0x04 | 00 00 00 30 | String Pointer (in this case origsize="") |
0x78 | 0x04 | 00 00 00 01 | Attribute identifyer (in this case 1 so a integer value) |
0x7C | 0x04 | 00 00 04 10 | Hex integer size (1040 bytes when converted so origsize="1045") |
0x80 | 0x04 | 00 00 00 00 | empty value |
0x84 | 0x04 | 00 00 00 39 | String Pointer (in this case src="") |
0x88 | 0x04 | 00 00 00 08 | Attribute identifyer (in this case 8 so a file) |
0x8C | 0x04 | 00 00 00 00 | Offset within File Table |
0x90 | 0x04 | 00 00 01 BA | Size of file to read |
0x94 | 0x04 | 00 00 00 3D | String Pointer (in this case compress="") |
0x98 | 0x04 | 00 00 00 03 | Attribute identifyer (in this case 3 so a string) |
0x9C | 0x04 | 00 00 00 46 | Offset of the string to read within String Table |
0xA0 | 0x04 | 00 00 00 02 | Size of the string to read (in this case will be 'on' so compress="on") |
0xA4 | 0x04 | 00 00 00 49 | String Pointer (in this case id="") |
0xA8 | 0x04 | 00 00 00 09 | Attribute identifyer (in this case 9 so a ID String with Loopback offset) |
0xAC | 0x04 | 00 00 00 00 | Offset of the id to read within ID String Table (in this case 'ja' so id="ja" and after the loopback src="/xmls/ja.xml") |
0xB0 | 0x04 | 00 00 00 00 | empty value |
- Note: the folder string within the src="" Attribute is a custom one which need to be handled by the app or which is dependend to the developer who will write the CXML Tool (so me)
- Note2: All values are reversed little endian
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 00 00 00 00 02 00 00 00 FF FF FF FF FF FF FF FF ........ÿÿÿÿÿÿÿÿ 00000010 FF FF FF FF 3C 00 00 00 74 0D 00 00 09 00 00 00 ÿÿÿÿ<...t....... 00000020 02 00 00 00 CD CC CC 3D 00 00 00 00 11 00 00 00 ....ÍÌÌ=........ 00000030 03 00 00 00 16 00 00 00 06 00 00 00 1D 00 00 00 ................ 00000040 00 00 00 00 00 00 00 00 FF FF FF FF 88 07 00 00 ........ÿÿÿÿˆ... 00000050 58 00 00 00 2C 07 00 00 29 00 00 00 04 00 00 00 X...,...)....... 00000060 3C 00 00 00 FF FF FF FF B4 00 00 00 FF FF FF FF <...ÿÿÿÿ´...ÿÿÿÿ 00000070 FF FF FF FF 30 00 00 00 01 00 00 00 10 04 00 00 ÿÿÿÿ0........... 00000080 00 00 00 00 39 00 00 00 08 00 00 00 00 00 00 00 ....9........... 00000090 BA 01 00 00 3D 00 00 00 03 00 00 00 46 00 00 00 º...=.......F... 000000A0 02 00 00 00 49 00 00 00 09 00 00 00 00 00 00 00 ....I........... 000000B0 00 00 00 00 29 00 00 00 04 00 00 00 3C 00 00 00 ....).......<...
String Table
This area is composed by a consecutive list of all the tags (elements or attributes) from the xml that was used to create the container. Are stored "from-top-to-bottom" in the exact same order that they was ordered in the xml (althougth it looks in some cases the theme compiler reorders them to his convenience). This list doesn't makes differences of the "directory hierarchy" of the tags neither is specified if the tag is an element or an attribute (this parent-child hierarchy is defined in other place of the container by making references to this area by using "byte counters" to locate a tag)
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 72 65 73 6F 75 72 63 65 00 76 65 72 73 69 6F 6E resource.version 00000010 00 74 79 70 65 00 6E 6F 72 6D 61 6C 00 73 74 72 .type.normal.str 00000020 69 6E 67 74 61 62 6C 65 00 6C 6F 63 61 6C 65 00 ingtable.locale. 00000030 6F 72 69 67 73 69 7A 65 00 73 72 63 00 63 6F 6D origsize.src.com 00000040 70 72 65 73 73 00 6F 6E 00 69 64 00 74 65 78 74 press.on.id.text 00000050 75 72 65 74 61 62 6C 65 00 74 65 78 74 75 72 65 uretable.texture 00000060 00 74 65 78 74 75 72 65 2F 67 69 6D 00 64 69 76 .texture/gim.div 00000070 5F 72 61 74 69 6F 5F 68 00 6D 61 72 67 69 6E 5F _ratio_h.margin_ 00000080 76 00 6D 61 72 67 69 6E 5F 68 00 64 69 76 5F 6D v.margin_h.div_m 00000090 6F 64 65 00 33 78 31 00 73 74 79 6C 65 74 61 62 ode.3x1.staletab 000000A0 6C 65 00 73 74 79 6C 65 5F 62 75 74 74 6F 6E 00 le.style_button. 000000B0 62 67 5F 6F 62 6A 00 67 6C 6F 77 5F 6F 62 6A 00 bg_ogj.glow_obj. 000000C0 70 6C 61 6E 65 6F 62 6A 00 74 65 78 74 75 72 65 planeobj.texture 000000D0 30 00 62 6C 65 6E 64 00 73 74 79 6C 65 5F 74 65 0.blend.style_te 000000E0 78 74 00 74 65 78 74 6F 62 6A 00 66 6F 6E 74 5F xt.textobj.font_ 000000F0 73 69 7A 65 00 62 6F 6C 64 00 63 6F 6C 6F 72 00 size.bold.color. 00000100 6D 61 78 5F 6C 69 6E 65 5F 63 6F 75 6E 74 00 6C max_line_count.l 00000110 69 6E 65 5F 70 69 74 63 68 00 77 6F 72 64 5F 77 ine_pitch.word_w 00000120 72 61 70 00 65 6C 6C 69 70 73 69 73 00 73 74 79 rap.ellipsis.sty 00000130 6C 65 5F 70 6C 61 6E 65 00 70 61 67 65 74 61 62 le_plane.pagetab 00000140 6C 65 00 74 65 6D 70 6C 61 74 65 74 61 62 6C 65 le.templatetable 00000150 00 74 65 6D 70 6C 61 74 65 00 66 69 6C 65 5F 6C .template.file_l 00000160 69 73 74 00 73 74 79 6C 65 00 6C 61 79 6F 75 74 ist.style.layout 00000170 5F 68 69 6E 74 00 61 6C 69 67 6E 00 73 69 7A 65 hint.align.size. 00000180 00 70 6F 73 00 66 61 73 74 5F 6F 70 65 6E 00 6C .pos.fast_open.l 00000190 69 73 74 5F 69 74 65 6D 00 74 65 78 74 00 61 64 ist_item.text.ad 000001A0 6A 75 73 74 00 70 6C 61 6E 65 00 61 6C 70 68 61 just.plane.alpha 000001B0 00 61 6E 63 68 6F 72 00 63 68 65 63 6B 5F 62 6F .anchor.check_bo 000001C0 78 00 66 6F 63 75 73 5F 68 69 6E 74 00 66 6F 63 x.focus_hint.foc 000001D0 75 73 5F 73 68 61 70 65 00 66 6F 63 75 73 5F 73 us_shape.focus_s 000001E0 69 7A 65 00 62 75 74 74 6F 6E 00 73 6F 75 6E 64 ize.button.sound 000001F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- Notes:
- yellow: used bytes
- red: padding to align to 0x10 bytes
- The integer values and text strings of some attributes tags from the xml (e.g: "themename=mytheme", or "fontcolor=2") are stored in this area too at the right of his tag, the presence of an integer value displaces the next tag (this only happens in themes and rafs, not in QRC, RCO files so is added here as a note but is very important for the structure of the other containers when using "byte counters" to locate the tags)