Talk:Resource Container (RCO)

From PS3 Developer wiki
Jump to navigation Jump to search

RCO versions

All RCO files contains a version number, the version increases with bigger firmwares but not for every firmware and is not directly associated with it. The same versioning method is used in PSP and PS3 RCO's

It seems all the RCO's of a specific firmware shares the same version (verifyed for firmware 4.76) and seems to be the version of the "rco set", or the version of the "rco tool" used to compile the whole "rco set". RCOmage v1.1.1 (latest stable) identifyes the version with a list of hardcoded values

Code Sample

After extracting the contents of the RCO with RCOmage, the version is stored for rebuilding purposes in the RCOXML descriptor file as an attribute with the name minFirmwareVer

If the version is unknown is stored as unknownId0x%x using unknownId to specify the fact that is unknown + the real hex value 0x%x

Example... sysconf_plugin.rco from PS3 firmware 2.00 with version 0x106

Code Sample

Hashreports

PS3 all versions

all OFW 1.00-4.75 hashes: https://www.mirrorcreator.com/files/7KCMQKWQ/RCO-hashreport.7z_links <--- please someone convert this in a "human readable wiki table"

PSP 6.61

  • PSP 6.60 and 6.61 firmware contains 63 .rco files (same files for both firmwares). Two of them are specific for PSPgo model (bluetooth_plugin.rco, slide_plugin.rco)
  • Only 10 of them are compresed with ZLIB (dd_helper.rco, dnas_plugin.rco, htmlviewer_plugin.rco, lftv_rmc_univer3in1.rco, lftv_rmc_univer3in1_jp.rco, lftv_rmc_univertuner.rco, lftv_rmc_univertuner_jp.rco, lftv_tuner_jp_jp.rco, lftv_tuner_us_en.rco, oneseg_plugin.rco). All the others are compressed with RLZ (and RLZ decompression is not supported by rcomage, is needed to use Resurssiklunssi v0.3 to rebuild them)
  • Resurssiklunssi rebuilds the .rco files and allows for two rebuild modes:
    • TRIANGLE or CROSS - only rebuilds
      • The converted files will have minFirmwareVer="1.5" (the original value is lost in the conversion)
    • SQUARE or CIRCLE - rebuilds and recompress in ZLIB
      • The converted files will have minFirmwareVer="2.6" (the original value is lost in the conversion)
Code Sample
  • PSP 6.60 and 6.61 firmware. RCO hashes after resurssiklunssi rebuild (cross option)
Code Sample
  • PSP firmware 1.00 contains only 21 .rco files (all them uses ZLIB, none of them uses RLZ)
Code Sample

Examples

This is a temporal section for tests using rcomage to create frankensteins .rco files smallest as posible that could serve as an explain of his structure. Will contain the source xml file used to create the rco, a big table with ALL the values of the structure, and a sample in hexview of the created rco. Eventually one (or a couple) of this tables will be moved to front page but by now this is a shared notepad and experimentation to see how to make that tables intuitive, pretty, and smallest posible, feel free to add other examples

Also, i think rcomage has several problems (no offense intended is a great tool everybody loves) in how the areas of the structure are divided, some names that can be improved, some definition of lengths of partially known or unknown values, etc... the examples are going to look pretty similar to the examples i wrote at the bottom of CXML Containers page (the concept of how it works is the same)--Sandungas (talk) 18:48, 10 September 2016 (UTC)

ImageTree with 1 image

This is a basic example of how the files are stored inside the container, similar method is used for all files (images, models, sounds, and fonts ?)

The .xml below is the RCOXML source file used to create the .rco. The file image_test.gim is a dummy of 8 bytes filed with 8888888888888888

Code Sample

When compiled MD5: E4C203A3D4B0B6854C90CD576E028545

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000  46 52 50 00 00 00 01 30 00 00 00 00 00 00 00 00  FRP....0........
00000010  00 00 00 A4 FF FF FF FF FF FF FF FF FF FF FF FF  ...¤ÿÿÿÿÿÿÿÿÿÿÿÿ
00000020  FF FF FF FF 00 00 00 CC FF FF FF FF FF FF FF FF  ÿÿÿÿ...Ìÿÿÿÿÿÿÿÿ
00000030  FF FF FF FF FF FF FF FF 00 00 01 34 00 00 00 00  ÿÿÿÿÿÿÿÿ...4....
00000040  00 00 01 34 00 00 00 14 00 00 01 48 00 00 00 00  ...4.......H....
00000050  FF FF FF FF 00 00 00 00 00 00 01 2C 00 00 00 08  ÿÿÿÿ.......,....
00000060  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000070  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000080  00 00 01 48 00 00 00 08 FF FF FF FF 00 00 00 00  ...H....ÿÿÿÿ....
00000090  FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF  ÿÿÿÿ....ÿÿÿÿÿÿÿÿ
000000A0  FF FF FF FF 01 01 00 00 00 00 00 00 00 00 00 00  ÿÿÿÿ............
000000B0  00 00 00 28 00 00 00 01 00 00 00 00 00 00 00 00  ...(............
000000C0  00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00  ................
000000D0  FF FF FF FF 00 00 00 00 00 00 00 28 00 00 00 01  ÿÿÿÿ.......(....
000000E0  00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 00  ...........(....
000000F0  00 00 00 00 04 01 00 00 00 00 00 08 00 00 00 28  ...............(
00000100  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000110  00 00 00 28 00 00 00 00 00 00 00 00 00 05 01 00  ...(............
00000120  00 00 00 08 00 00 00 00 00 00 00 01 00 00 00 F4  ...............ô
00000130  00 00 00 00 74 65 73 74 00 00 00 00 69 6D 61 67  ....test....imag
00000140  65 5F 74 65 73 74 00 00 88 88 88 88 88 88 88 88  e_test..ˆˆˆˆˆˆˆˆ
Areas Offset Length Example Name Notes
Header
0x00 0x04 FRP magic FRP in big endian
0x04 0x04 00 00 01 30 version 0x130 = one of the firmwares for PS3
0x08 0x04 00 00 00 00 unknown
0x0C 0x04 00 00 00 00 compress_header 0x00 = uncompressed
0x10 0x04 00 00 00 A4 toc_maintree_absolute_offset MainTree at absolute offset 0xA4
0x14 0x04 FF FF FF FF toc_scripttree_absolute_offset
0x18 0x04 FF FF FF FF toc_languagetree_absolute_offset
0x1C 0x04 FF FF FF FF toc_soundtree_absolute_offset
0x20 0x04 FF FF FF FF toc_modeltree_absolute_offset
0x24 0x04 00 00 00 CC toc_imagetree_absolute_offset ImageTree at absolute offset 0xCC
0x28 0x04 FF FF FF FF toc_unknowntree_absolute_offset
0x2C 0x04 FF FF FF FF toc_fonttree_absolute_offset
0x30 0x04 FF FF FF FF toc_objecttree_absolute_offset
0x34 0x04 FF FF FF FF toc_animationtree_absolute_offset
0x38 0x04 00 00 01 34 strings_texts_absolute_offset strings texts table at absolute offset 0x134
0x3C 0x04 00 00 00 00 strings_texts_length strings texts table is empty
0x40 0x04 00 00 01 34 strings_labels_absolute_offset strings labels table at absolute offset 0x134
0x44 0x04 00 00 00 14 strings_labels_length strings labels size 0x14
0x48 0x04 00 00 01 48 strings_events_absolute_offset strings events table at absolute offset 0x148
0x4C 0x04 00 00 00 00 strings_events_length strings events table is empty
0x50 0x04 FF FF FF FF text_pointer_table_offset
0x54 0x04 00 00 00 00 text_pointer_table_length
0x58 0x04 00 00 01 2C image_pointer_table_offset
0x5C 0x04 00 00 00 00 image_pointer_table_length
0x60 0x04 FF FF FF FF model_pointer_table_offset
0x64 0x04 00 00 00 00 model_pointer_table_length
0x68 0x04 FF FF FF FF sound_pointer_table_offset
0x6C 0x04 00 00 00 00 sound_pointer_table_length
0x70 0x04 FF FF FF FF object_pointer_table_offset
0x74 0x04 00 00 00 00 object_pointer_table_length
0x78 0x04 FF FF FF FF anim_pointer_table_offset
0x7C 0x04 00 00 00 00 anim_pointer_table_length
0x80 0x04 00 00 01 48 image_data_section_offset
0x84 0x04 00 00 00 08 image_data_section_length
0x88 0x04 FF FF FF FF sound_data_section_offset
0x8C 0x04 00 00 00 00 sound_data_section_length
0x90 0x04 FF FF FF FF model_data_section_offset
0x94 0x04 00 00 00 00 model_data_section_length
0x98 0x04 FF FF FF FF unknown
0x9C 0x04 FF FF FF FF unknown
0xA0 0x04 FF FF FF FF unknown
TOC
0xA4 0x01 01 entry_type 0x1=MainTree
0xA5 0x01 01 hierarchy_depth
0xA6 0x02 00 00 unknown
0xA8 0x04 00 00 00 00 entry_label_offset test
0xAC 0x04 00 00 00 00 entry_header_size
0xB0 0x04 00 00 00 28 entry_size
0xB4 0x04 00 00 00 01 children_number
0xB8 0x04 00 00 00 00 next_entry_offset
0xBC 0x04 00 00 00 00 previous_entry_offset
0xC0 0x04 00 00 00 00 parent_offset
0xC4 0x04 00 00 00 00 unknown
0xC8 0x04 00 00 00 00 unknown
0xCC 0x01 04 entry_type 0x4=ImageTree
0xCD 0x01 00 hierarchy_depth
0xCE 0x02 00 00 unknown
0xD0 0x04 FF FF FF FF entry_label_offset no label
0xD4 0x04 00 00 00 00 entry_header_size
0xD8 0x04 00 00 00 28 entry_size
0xDC 0x04 00 00 00 01 children_number
0xE0 0x04 00 00 00 00 next_entry_offset
0xE4 0x04 00 00 00 00 previous_entry_offset
0xE8 0x04 00 00 00 28 parent_offset
0xEC 0x04 00 00 00 00 unknown
0xF0 0x04 00 00 00 00 unknown
0xF4 0x01 04 entry_type 0x4=ImageTree
0xF5 0x01 01 hierarchy_depth
0xF6 0x02 00 00 unknown
0xF8 0x04 00 00 00 08 entry_label_offset image_test
0xFC 0x04 00 00 00 28 entry_header_size
0x100 0x04 00 00 00 00 entry_size
0x104 0x04 00 00 00 00 children_number
0x108 0x04 00 00 00 00 next_entry_offset
0x10C 0x04 00 00 00 00 previous_entry_offset
0x110 0x04 00 00 00 28 parent_offset
0x114 0x04 00 00 00 00 unknown
0x118 0x04 00 00 00 00 unknown
0x11C 0x02 00 05 file_format 0x5=GIM
0x11E 0x01 01 unknown
0x11F 0x01 00 file_compression 0x0=NONE
0x120 0x04 00 00 00 08 file_size
0x124 0x04 00 00 00 00 file_offset
0x128 0x04 00 00 00 01 unknown
pointers
0x12C 0x04 00 00 00 F4
0x130 0x04 00 00 00 00
texts
0x134 0x00 text table is empty
labels
0x134 0x05 74 65 73 74 00 test (null terminated)
0x139 0x03 00 00 00 padding (aligned to 4 bytes boundary)
0x13C 0x0B 69 6D 61 67 65 5F 74 65 73 74 00 image_test (null terminated)
0x147 0x01 00 padding (aligned to 4 bytes boundary)
events
0x148 0x00 events table is empty
images
0x148 0x8 0x8888888888888888 image_test.gim

When compiled (with zlib header compression) MD5: E73D8E195D7A344294AB84A03E6662A1

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  46 52 50 00 00 00 01 30 00 00 00 00 00 00 00 10  FRP....0........
00000010  00 00 00 A4 FF FF FF FF FF FF FF FF FF FF FF FF  ...¤ÿÿÿÿÿÿÿÿÿÿÿÿ
00000020  FF FF FF FF 00 00 00 CC FF FF FF FF FF FF FF FF  ÿÿÿÿ...Ìÿÿÿÿÿÿÿÿ
00000030  FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00  ÿÿÿÿÿÿÿÿÿÿÿÿ....
00000040  00 00 01 34 00 00 00 14 00 00 01 48 00 00 00 00  ...4.......H....
00000050  FF FF FF FF 00 00 00 00 00 00 01 2C 00 00 00 08  ÿÿÿÿ.......,....
00000060  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000070  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000080  00 00 00 F4 00 00 00 08 FF FF FF FF 00 00 00 00  ...ô....ÿÿÿÿ....
00000090  FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF  ÿÿÿÿ....ÿÿÿÿÿÿÿÿ
000000A0  FF FF FF FF 00 00 00 44 00 00 00 A4 00 00 00 00  ÿÿÿÿ...D...¤....
000000B0  78 DA 75 8A C1 0A 00 10 10 44 6D 51 3E C5 5F C9  xÚuŠÁ....DmQ>Å_É
000000C0  61 93 83 13 9F EE CE 6E 53 28 79 35 ED CE 6B 88  a“ƒ.ŸîÎnS(y5íÎkˆ
000000D0  CC 4D 90 88 79 B1 92 29 7C 76 61 EF 60 3D DC C3  ÌM.ˆy±’)|vaï`=ÜÃ
000000E0  71 8E B0 03 5A 86 3E 9D 5B D7 5B 6A CA 1C D1 16  qŽ°.Z†>.[×[jÊ.Ñ.
000000F0  84 BD 0B BF 88 88 88 88 88 88 88 88              „½.¿ˆˆˆˆˆˆˆˆ
  • Changes
    • 10 the "compression header" setting with zlib (is not actually compressing the header, the term is not accurate)
    • FF FF FF FF weird
    • 00 00 00 F4 the offset where the image data starts, because the area before the image data has been compressed his position has been displaced
    • 00 00 00 44 00 00 00 A4 00 00 00 00 the info about the compressed area that comes next (composed by: lenPacked, lenUnpacked, and lenLongestText)
    • 78 DA ... the compressed area itself, includes the whole TOC, the pointers/references to the TOC, and all the strings tables (languages, labels, and events)

ImageTree with 2 images

This example is intended to replace the previous one (but by now i dont want to delete the previous one). It can help to see how the offsets are cummulated and the optional paddings to align to boundary The .xml below is the RCOXML source file used to create the .rco. The file image2_test.gim is a dummy of 2 bytes filed with 2222 and the file image3_test.gim is a dummy of 3 bytes filed with 333333

Code Sample

When compiled MD5: 4E69E7E88F0872C71D007A21478FA1D1

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  46 52 50 00 00 00 01 30 00 00 00 00 00 00 00 00  FRP....0........
00000010  00 00 00 A4 FF FF FF FF FF FF FF FF FF FF FF FF  ...¤ÿÿÿÿÿÿÿÿÿÿÿÿ
00000020  FF FF FF FF 00 00 00 CC FF FF FF FF FF FF FF FF  ÿÿÿÿ...Ìÿÿÿÿÿÿÿÿ
00000030  FF FF FF FF FF FF FF FF 00 00 01 70 00 00 00 00  ÿÿÿÿÿÿÿÿ...p....
00000040  00 00 01 70 00 00 00 20 00 00 01 90 00 00 00 00  ...p... ........
00000050  FF FF FF FF 00 00 00 00 00 00 01 68 00 00 00 08  ÿÿÿÿ.......h....
00000060  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000070  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000080  00 00 01 90 00 00 00 14 FF FF FF FF 00 00 00 00  ........ÿÿÿÿ....
00000090  FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF  ÿÿÿÿ....ÿÿÿÿÿÿÿÿ
000000A0  FF FF FF FF 01 01 00 00 00 00 00 00 00 00 00 00  ÿÿÿÿ............
000000B0  00 00 00 28 00 00 00 01 00 00 00 00 00 00 00 00  ...(............
000000C0  00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00  ................
000000D0  FF FF FF FF 00 00 00 00 00 00 00 28 00 00 00 02  ÿÿÿÿ.......(....
000000E0  00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 00  ...........(....
000000F0  00 00 00 00 04 01 00 00 00 00 00 08 00 00 00 28  ...............(
00000100  00 00 00 00 00 00 00 00 00 00 00 38 00 00 00 00  ...........8....
00000110  00 00 00 28 00 00 00 00 00 00 00 00 00 05 01 00  ...(............
00000120  00 00 00 02 00 00 00 00 00 00 00 01 04 01 00 00  ................
00000130  00 00 00 14 00 00 00 28 00 00 00 00 00 00 00 00  .......(........
00000140  00 00 00 00 00 00 00 38 00 00 00 60 00 00 00 00  .......8...`....
00000150  00 00 00 00 00 05 00 01 00 00 00 0E 00 00 00 04  ................
00000160  00 00 00 01 00 00 00 03 00 00 00 F4 00 00 01 2C  ...........ô...,
00000170  74 65 73 74 00 00 00 00 69 6D 61 67 65 32 5F 74  test....image2_t
00000180  65 73 74 00 69 6D 61 67 65 33 5F 74 65 73 74 00  est.image3_test.
00000190  22 22 00 00 78 DA 01 03 00 FC FF 33 33 33 01 35  ""..xÚ...üÿ333.5
000001A0  00 9A 00 00                                      .š..
Areas Offset Length Example Name Notes
Header
0x00 0x04 FRP magic FRP in big endian
0x04 0x04 00 00 01 30 version 0x130 = one of the firmwares for PS3
0x08 0x04 00 00 00 00 unknown
0x0C 0x04 00 00 00 00 compress_header 0x00 = uncompressed
0x10 0x04 00 00 00 A4 toc_maintree_absolute_offset MainTree at absolute offset 0xA4
0x14 0x04 FF FF FF FF toc_scripttree_absolute_offset
0x18 0x04 FF FF FF FF toc_languagetree_absolute_offset
0x1C 0x04 FF FF FF FF toc_soundtree_absolute_offset
0x20 0x04 FF FF FF FF toc_modeltree_absolute_offset
0x24 0x04 00 00 00 CC toc_imagetree_absolute_offset ImageTree at absolute offset 0xCC
0x28 0x04 FF FF FF FF toc_unknowntree_absolute_offset
0x2C 0x04 FF FF FF FF toc_fonttree_absolute_offset
0x30 0x04 FF FF FF FF toc_objecttree_absolute_offset
0x34 0x04 FF FF FF FF toc_animationtree_absolute_offset
0x38 0x04 00 00 01 70 strings_texts_absolute_offset strings texts table at absolute offset 0x170
0x3C 0x04 00 00 00 00 strings_texts_length strings texts table is empty
0x40 0x04 00 00 01 70 strings_labels_absolute_offset strings labels table at absolute offset 0x170
0x44 0x04 00 00 00 20 strings_labels_length strings labels size 0x20
0x48 0x04 00 00 01 90 strings_events_absolute_offset strings events table at absolute offset 0x190
0x4C 0x04 00 00 00 00 strings_events_length strings events table is empty
0x50 0x04 FF FF FF FF text_pointer_table_offset
0x54 0x04 00 00 00 00 text_pointer_table_length
0x58 0x04 00 00 01 68 image_pointer_table_offset
0x5C 0x04 00 00 00 08 image_pointer_table_length
0x60 0x04 FF FF FF FF model_pointer_table_offset
0x64 0x04 00 00 00 00 model_pointer_table_length
0x68 0x04 FF FF FF FF sound_pointer_table_offset
0x6C 0x04 00 00 00 00 sound_pointer_table_length
0x70 0x04 FF FF FF FF object_pointer_table_offset
0x74 0x04 00 00 00 00 object_pointer_table_length
0x78 0x04 FF FF FF FF anim_pointer_table_offset
0x7C 0x04 00 00 00 00 anim_pointer_table_length
0x80 0x04 00 00 01 90 image_data_section_offset
0x84 0x04 00 00 00 14 image_data_section_length
0x88 0x04 FF FF FF FF sound_data_section_offset
0x8C 0x04 00 00 00 00 sound_data_section_length
0x90 0x04 FF FF FF FF model_data_section_offset
0x94 0x04 00 00 00 00 model_data_section_length
0x98 0x04 FF FF FF FF unknown
0x9C 0x04 FF FF FF FF unknown
0xA0 0x04 FF FF FF FF unknown
TOC
0xA4 0x01 01 entry_type 0x1=MainTree
0xA5 0x01 01 hierarchy_depth
0xA6 0x02 00 00 unknown
0xA8 0x04 00 00 00 00 entry_label_offset test
0xAC 0x04 00 00 00 00 entry_header_size
0xB0 0x04 00 00 00 28 entry_size
0xB4 0x04 00 00 00 01 children_number
0xB8 0x04 00 00 00 00 next_entry_offset
0xBC 0x04 00 00 00 00 previous_entry_offset
0xC0 0x04 00 00 00 00 parent_offset
0xC4 0x04 00 00 00 00 unknown
0xC8 0x04 00 00 00 00 unknown
0xCC 0x01 04 entry_type 0x4=ImageTree
0xCD 0x01 00 hierarchy_depth
0xCE 0x02 00 00 unknown
0xD0 0x04 FF FF FF FF entry_label_offset no label
0xD4 0x04 00 00 00 00 entry_header_size
0xD8 0x04 00 00 00 28 entry_size
0xDC 0x04 00 00 00 02 children_number
0xE0 0x04 00 00 00 00 next_entry_offset
0xE4 0x04 00 00 00 00 previous_entry_offset
0xE8 0x04 00 00 00 28 parent_offset
0xEC 0x04 00 00 00 00 unknown
0xF0 0x04 00 00 00 00 unknown
0xF4 0x01 04 entry_type 0x4=ImageTree
0xF5 0x01 01 hierarchy_depth
0xF6 0x02 00 00 unknown
0xF8 0x04 00 00 00 08 entry_label_offset image2_test
0xFC 0x04 00 00 00 28 entry_header_size
0x100 0x04 00 00 00 00 entry_size
0x104 0x04 00 00 00 00 children_number
0x108 0x04 00 00 00 38 next_entry_offset
0x10C 0x04 00 00 00 00 previous_entry_offset
0x110 0x04 00 00 00 28 parent_offset
0x114 0x04 00 00 00 00 unknown
0x118 0x04 00 00 00 00 unknown
0x11C 0x02 00 05 file_format 0x5=GIM
0x11E 0x01 01 unknown
0x11F 0x01 00 file_compression 0x0=NONE
0x120 0x04 00 00 00 02 file_size
0x124 0x04 00 00 00 00 file_offset
0x128 0x04 00 00 00 01 unknown
0x12C 0x01 04 entry_type 0x4=ImageTree
0x12D 0x01 01 hierarchy_depth
0x12E 0x02 00 00 unknown
0x130 0x04 00 00 00 14 entry_label_offset image3_test
0x134 0x04 00 00 00 28 entry_header_size
0x138 0x04 00 00 00 00 entry_size
0x13C 0x04 00 00 00 00 children_number
0x140 0x04 00 00 00 00 next_entry_offset
0x144 0x04 00 00 00 38 previous_entry_offset
0x148 0x04 00 00 00 60 parent_offset
0x14C 0x04 00 00 00 00 unknown
0x150 0x04 00 00 00 00 unknown
0x154 0x02 00 05 file_format 0x5=GIM
0x156 0x01 00 unknown
0x157 0x01 01 file_compression 0x1=ZLIB
0x158 0x04 00 00 00 0E file_size
0x15C 0x04 00 00 00 04 file_offset
0x160 0x04 00 00 00 01 unknown
0x164 0x04 00 00 00 03 file_uncompressed_size
pointers
0x168 0x04 00 00 00 F4
0x16C 0x04 00 00 01 2C
texts
0x170 0x00 text table is empty
labels
0x170 0x05 74 65 73 74 00 test (null terminated)
0x175 0x03 00 00 00 padding (aligned to 4 bytes boundary)
0x178 0x0C 69 6D 61 67 65 32 5F 74 65 73 74 00 image2_test (null terminated)
0x184 0x0C 69 6D 61 67 65 33 5F 74 65 73 74 00 image3_test (null terminated)
events
0x190 0x00 events table is empty
images
0x190 0x02 22 22 image2_test.gim
0x192 0x02 00 00 padding (aligned to 4 bytes boundary)
0x194 0x0E 78 DA 01 03 00 FC FF 33 33 33 01 35 00 9A image3_test.gim (zlib compressed)
0x1A2 0x02 00 00 padding (aligned to 4 bytes boundary)

ObjectTree with 1 page and 1 plane

This is a basic example of how objecttree and animationtree (not files) stores his values inside the container. It can help to understand all the values related with the hierarchy relationship between parents/childrens/brothers, etc...

Code Sample

When compiled MD5: 8950DE68C7DD9BA5DD96F7F29D86EF17

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  46 52 50 00 00 00 01 30 00 00 00 00 00 00 00 00  FRP....0........
00000010  00 00 00 A4 FF FF FF FF FF FF FF FF FF FF FF FF  ...¤ÿÿÿÿÿÿÿÿÿÿÿÿ
00000020  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000030  00 00 00 CC FF FF FF FF 00 00 01 D4 00 00 00 00  ...Ìÿÿÿÿ...Ô....
00000040  00 00 01 D4 00 00 00 20 00 00 01 F4 00 00 00 04  ...Ô... ...ô....
00000050  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000060  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000070  00 00 01 CC 00 00 00 08 FF FF FF FF 00 00 00 00  ...Ì....ÿÿÿÿ....
00000080  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000090  FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF  ÿÿÿÿ....ÿÿÿÿÿÿÿÿ
000000A0  FF FF FF FF 01 01 00 00 00 00 00 00 00 00 00 00  ÿÿÿÿ............
000000B0  00 00 00 28 00 00 00 01 00 00 00 00 00 00 00 00  ...(............
000000C0  00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00  ................
000000D0  FF FF FF FF 00 00 00 00 00 00 00 28 00 00 00 01  ÿÿÿÿ.......(....
000000E0  00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 00  ...........(....
000000F0  00 00 00 00 08 01 00 00 00 00 00 08 00 00 00 28  ...............(
00000100  00 00 00 4C 00 00 00 01 00 00 00 00 00 00 00 00  ...L............
00000110  00 00 00 28 00 00 00 00 00 00 00 00 11 01 00 00  ...(............
00000120  FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF FF FF  ÿÿ..ÿÿÿÿÿÿ..ÿÿÿÿ
00000130  FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF FF FF  ÿÿ..ÿÿÿÿÿÿ..ÿÿÿÿ
00000140  08 02 00 00 00 00 00 14 00 00 00 28 00 00 00 00  ...........(....
00000150  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C  ...............L
00000160  00 00 00 00 00 00 00 00 3F 80 00 00 40 00 00 00  ........?€..@...
00000170  40 40 00 00 40 80 00 00 40 A0 00 00 40 C0 00 00  @@..@€..@ ..@À..
00000180  40 E0 00 00 41 00 00 00 41 10 00 00 41 20 00 00  @à..A...A...A ..
00000190  41 30 00 00 41 40 00 00 41 50 00 00 00 00 00 03  [email protected]......
000001A0  FF FF 00 00 FF FF FF FF 10 00 00 00 20 00 00 00  ÿÿ..ÿÿÿÿ.... ...
000001B0  30 00 00 00 40 00 00 00 50 00 00 00 60 00 00 00  [email protected]...`...
000001C0  FF FF 00 00 FF FF FF FF 00 00 00 06 00 00 00 F4  ÿÿ..ÿÿÿÿ.......ô
000001D0  00 00 01 40 74 65 73 74 00 00 00 00 70 61 67 65  [email protected]
000001E0  5F 74 65 73 74 00 00 00 70 6C 61 6E 65 5F 74 65  _test...plane_te
000001F0  73 74 00 00 00 00 00 00                          st......
Areas Offset Length Example Name Notes
Header
0x00 0x04 46 52 50 00 signature FRP in big endian
0x04 0x04 00 00 01 30 version 0x130 = one of the firmwares for PS3
0x08 0x04 00 00 00 00 unknown
0x0C 0x04 00 00 00 00 compress_toc_ref_txt 0x00 = uncompressed
0x10 0x04 00 00 00 A4 toc_maintree_absolute_offset MainTree at 0xA4
0x14 0x04 FF FF FF FF toc_scripttree_absolute_offset no
0x18 0x04 FF FF FF FF toc_languagetree_absolute_offset no
0x1C 0x04 FF FF FF FF toc_soundtree_absolute_offset no
0x20 0x04 FF FF FF FF toc_modeltree_absolute_offset no
0x24 0x04 FF FF FF FF toc_imagetree_absolute_offset no
0x28 0x04 FF FF FF FF toc_unknown no
0x2C 0x04 FF FF FF FF toc_fonttree_absolute_offset no
0x30 0x04 00 00 00 CC toc_objecttree_absolute_offset ObjectTree at 0xCC
0x34 0x04 FF FF FF FF toc_animationtree_absolute_offset no
0x38 0x04 00 00 01 D4 txt_language_table_absolute_offset languages at 0x1D4
0x3C 0x04 00 00 00 00 txt_language_table_length empty
0x40 0x04 00 00 01 D4 txt_label_table_absolute_offset labels at 0x1D4
0x44 0x04 00 00 00 20 txt_label_table_length length 0x20
0x48 0x04 00 00 01 F4 txt_event_table_absolute_offset events at 0x1F4
0x4C 0x04 00 00 00 04 txt_event_table_length length 0x4
0x50 0x04 FF FF FF FF ref_language_table_absolute_offset no
0x54 0x04 00 00 00 00 ref_language_table_length empty
0x58 0x04 FF FF FF FF ref_image_table_absolute_offset no
0x5C 0x04 00 00 00 00 ref_image_table_length empty
0x60 0x04 FF FF FF FF ref_model_table_absolute_offset no
0x64 0x04 00 00 00 00 ref_model_table_length empty
0x68 0x04 FF FF FF FF ref_sound_table_absolute_offset no
0x6C 0x04 00 00 00 00 ref_sound_table_length empty
0x70 0x04 00 00 01 CC ref_object_table_absolute_offset object pointers at 0x1CC
0x74 0x04 00 00 00 08 ref_object_table_length size 0x8
0x78 0x04 FF FF FF FF ref_animation_table_absolute_offset no
0x7C 0x04 00 00 00 00 ref_animation_table_length empty
0x80 0x04 FF FF FF FF dat_image_table_absolute_offset no
0x84 0x04 00 00 00 00 dat_image_table_length empty
0x88 0x04 FF FF FF FF dat_sound_table_absolute_offset no
0x8C 0x04 00 00 00 00 dat_sound_table_length empty
0x90 0x04 FF FF FF FF dat_model_table_absolute_offset no
0x94 0x04 00 00 00 00 dat_model_table_length empty
0x98 0x04 FF FF FF FF dat_unknown_1
0x9C 0x04 FF FF FF FF dat_unknown_2
0xA0 0x04 FF FF FF FF dat_unknown_3
TOC
0xA4 0x01 01 entry_type 0x1=MainTree
0xA5 0x01 01 hierarchy_depth
0xA6 0x02 00 00 unknown
0xA8 0x04 00 00 00 00 entry_label_offset test
0xAC 0x04 00 00 00 00 entry_header_size
0xB0 0x04 00 00 00 28 entry_size
0xB4 0x04 00 00 00 01 children_number
0xB8 0x04 00 00 00 00 next_entry_offset
0xBC 0x04 00 00 00 00 previous_entry_offset
0xC0 0x04 00 00 00 00 parent_offset no parent
0xC4 0x04 00 00 00 00 unknown
0xC8 0x04 00 00 00 00 unknown
0xCC 0x01 08 entry_type 0x8=ObjectTree
0xCD 0x01 00 hierarchy_depth 0x0=Root
0xCE 0x02 00 00 unknown
0xD0 0x04 FF FF FF FF entry_label_offset no label
0xD4 0x04 00 00 00 00 entry_header_size
0xD8 0x04 00 00 00 28 entry_size
0xDC 0x04 00 00 00 01 children_number
0xE0 0x04 00 00 00 00 next_entry_offset
0xE4 0x04 00 00 00 00 previous_entry_offset
0xE8 0x04 00 00 00 28 parent_offset 0xCC-0x28 = parent is at 0xA4 (MainTree)
0xEC 0x04 00 00 00 00 unknown
0xF0 0x04 00 00 00 00 unknown
0xF4 0x01 08 entry_type 0x8=ObjectTree
0xF5 0x01 01 hierarchy_depth 0x1=Page
0xF6 0x02 00 00 unknown
0xF8 0x04 00 00 00 08 entry_label_offset page_test
0xFC 0x04 00 00 00 28 entry_header_size
0x100 0x04 00 00 00 4C entry_size
0x104 0x04 00 00 00 01 children_number
0x108 0x04 00 00 00 00 next_entry_offset
0x10C 0x04 00 00 00 00 previous_entry_offset
0x110 0x04 00 00 00 28 parent_offset 0xF4-0x28 = parent is at 0xCC (ObjectTree)
0x114 0x04 00 00 00 00 unknown
0x118 0x04 00 00 00 00 unknown
0x11C 0x04 11 01 00 00 pageMode
0x120 0x08 FF FF 00 00 FF FF FF FF pageOnInit ?
0x128 0x08 FF FF 00 00 FF FF FF FF pageOnCancel ?
0x130 0x08 FF FF 00 00 FF FF FF FF pageOnContext ?
0x138 0x08 FF FF 00 00 FF FF FF FF pageOnActivate ?
0x140 0x01 08 entry_type 0x8=ObjectTree
0x141 0x01 02 hierarchy_depth 0x2=Plane
0x142 0x02 00 00 unknown
0x144 0x04 00 00 00 14 entry_label_offset plane_test
0x148 0x04 00 00 00 28 entry_header_size
0x14C 0x04 00 00 00 00 entry_size
0x150 0x04 00 00 00 00 children_number
0x154 0x04 00 00 00 00 next_entry_offset
0x158 0x04 00 00 00 00 previous_entry_offset
0x15C 0x04 00 00 00 4C parent_offset 0x140-0x4C = parent is at 0xF4 (Page)
0x160 0x04 00 00 00 00 unknown
0x164 0x04 00 00 00 00 unknown
0x168 0x04 3F 80 00 00 PositionX 1 after converted from float to decimal
0x16C 0x04 40 00 00 00 PositionY 2
0x170 0x04 40 40 00 00 PositionZ 3
0x174 0x04 40 80 00 00 ColorScaleR 4
0x178 0x04 40 A0 00 00 ColorScaleG 5
0x17C 0x04 40 C0 00 00 ColorScaleB 6
0x180 0x04 40 E0 00 00 ColorScaleA 7
0x184 0x04 41 00 00 00 SizeX 8
0x188 0x04 41 10 00 00 SizeY 9
0x18C 0x04 41 20 00 00 SizeZ 10
0x190 0x04 41 30 00 00 SizeScaleX 11
0x194 0x04 41 40 00 00 SizeScaleY 12
0x198 0x04 41 50 00 00 SizeScaleZ 13
0x19C 0x04 00 00 00 03 AnchorMode 0x3
0x1A0 0x08 FF FF 00 00 FF FF FF FF OnInit ?
0x1A8 0x04 10 00 00 00 PositionOverrideX 10
0x1AC 0x04 20 00 00 00 PositionOverrideY 20
0x1B0 0x04 30 00 00 00 PositionOverrideZ 30
0x1B4 0x04 40 00 00 00 SizeOverrideX 40
0x1B8 0x04 50 00 00 00 SizeOverrideY 50
0x1BC 0x04 60 00 00 00 SizeOverrideZ 60
0x1C0 0x04 FF FF 00 00 FF FF FF FF planeImage ?
0x1C8 0x04 00 00 00 06 planeResizeMode 0x6
object
pointers
0x1CC 0x04 00 00 00 F4 First object (Page) at 0xF4
0x1D0 0x04 00 00 01 40 Second object (Plane) at 0x140
languages
0x1D4 0x00 empty
labels
0x1D4 0x05 74 65 73 74 00 test (null terminated)
0x1D9 0x03 00 00 00 padding (aligned to 4 bytes boundary)
0x1DC 0x0A 70 61 67 65 5F 74 65 73 74 00 page_test (null terminated)
0x1E6 0x02 00 00 padding (aligned to 4 bytes boundary)
0x1E8 0x0B 70 6C 61 6E 65 5F 74 65 73 74 00 plane_test (null terminated)
0x1F3 0x01 00 padding (aligned to 4 bytes boundary)
events
0x1F4 0x04 00 00 00 00 dummy event ?

When compiled (with zlib header compression) MD5: E83B073FD14180A635A63D202EFBFBA3

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  46 52 50 00 00 00 01 30 00 00 00 00 00 00 00 10  FRP....0........
00000010  00 00 00 A4 FF FF FF FF FF FF FF FF FF FF FF FF  ...¤ÿÿÿÿÿÿÿÿÿÿÿÿ
00000020  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000030  00 00 00 CC FF FF FF FF FF FF FF FF 00 00 00 00  ...Ìÿÿÿÿÿÿÿÿ....
00000040  00 00 01 D4 00 00 00 20 00 00 01 F4 00 00 00 04  ...Ô... ...ô....
00000050  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000060  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000070  00 00 01 CC 00 00 00 08 FF FF FF FF 00 00 00 00  ...Ì....ÿÿÿÿ....
00000080  FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00  ÿÿÿÿ....ÿÿÿÿ....
00000090  FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF  ÿÿÿÿ....ÿÿÿÿÿÿÿÿ
000000A0  FF FF FF FF 00 00 00 8B 00 00 01 54 00 00 00 00  ÿÿÿÿ...‹...T....
000000B0  78 DA 75 CD 31 0A 83 30 14 87 F1 FF 6B A1 38 B6  xÚuÍ1.ƒ0.‡ñÿk¡8¶
000000C0  D0 03 38 66 F4 06 7D DD 1D BC 41 EB 20 5D 8A 08  Ð.8fô.}Ý.¼Aë ]Š.
000000D0  7A 00 8F D2 A3 F4 28 3D 84 BB 7E 83 86 82 E4 83  z..Ò£ô(=„»~ƒ†‚äƒ
000000E0  1F 49 C8 23 31 D3 7F 01 86 5D 19 66 4A CC 85 38  .IÈ#1Ó..†].fJÌ…8
000000F0  67 71 3C A0 4C CD 5D 4C BC 07 4A AD D9 41 A2 2B  gq< LÍ]L¼.J­ÙA¢+
00000100  82 F6 95 5A BB 8D 92 0B 8E 11 1F 7C F1 93 EE C2  ‚ö•Z».’.Ž..|ñ“îÂ
00000110  19 39 0A 38 2A 89 8E DB 3F 5C 2B 47 01 47 85 27  .9.8*‰ŽÛ?\+G.G…'
00000120  B6 7B B6 27 4C 92 F9 D0 F4 83 A8 AB 5F CD 63 3D  ¶{¶'L’ùÐôƒ¨«_Íc=
00000130  74 EF BA 8D 07 5A 00 16 DA 3D 9D 00              tïº..Z..Ú=..
  • Changes
    • 10 the "compression header" setting with zlib (is not actually compressing the header, the term is not accurate)
    • FF FF FF FF weird
    • 00 00 00 8B 00 00 01 54 00 00 00 00 the info about the compressed area that comes next (composed by: lenPacked, lenUnpacked, and lenLongestText)
    • 78 DA ... the compressed area itself, includes the whole TOC, the pointers/references to the TOC, and all the strings tables (languages, labels, and events)

PSP system_plugin.rco firmware 0.6.5

PSP firmware 0.6.5 uses a primitive version of the rco format, this is an example of the rco header (first 0x94 bytes), most notable change is the header is smaller (so is missing some areas for features that was not implemented yet). I dont plan to look for all the changes but this little example hopefully will show what areas are missing to have an overall idea of the order of how features was implemented in the rco format. This version of the rco format is not compatible with rcomage... but it should by deleting the "unknowns" in the definitions of the source code (lines 51 and 76 of rcofile.h) then compile it (not tested, other errors can happen but this should work)

Original header (remember PSP uses little endian so some bytes are swapped)

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  00 50 52 46 55 00 00 00 00 00 00 00 00 00 00 00  .PRFU...........
00000010  94 00 00 00 FF FF FF FF 7C 0A 00 00 34 08 00 00  ”...ÿÿÿÿ|...4...
00000020  FF FF FF FF BC 00 00 00 FF FF FF FF 7C 0B 00 00  ÿÿÿÿ¼...ÿÿÿÿ|...
00000030  FF FF FF FF E0 0C 00 00 68 00 00 00 48 0D 00 00  ÿÿÿÿà...h...H...
00000040  9C 04 00 00 E4 11 00 00 04 00 00 00 F0 0B 00 00  œ...ä.......ð...
00000050  28 00 00 00 18 0C 00 00 94 00 00 00 FF FF FF FF  (.......”...ÿÿÿÿ
00000060  00 00 00 00 AC 0C 00 00 2C 00 00 00 D8 0C 00 00  ....¬...,...Ø...
00000070  08 00 00 00 FF FF FF FF 00 00 00 00 E8 11 00 00  ....ÿÿÿÿ....è...
00000080  40 DF 01 00 28 F1 01 00 F0 58 02 00 FF FF FF FF  @ß..(ñ..ðX..ÿÿÿÿ
00000090  00 00 00 00                                      ....
Areas Offset Length Example Name Notes
Header
0x00 0x04 PRF magic PRF in little endian
0x04 0x04 55 00 00 00 version 0x55 = one of the firmwares for PSP
0x08 0x04 00 00 00 00 unknown
0x0C 0x04 00 00 00 00 compress_header 0x00 = uncompressed
0x10 0x04 94 00 00 00 toc_maintree_absolute_offset MainTree at absolute offset 0x94
0x14 0x04 FF FF FF FF toc_scripttree_absolute_offset
0x18 0x04 7C 0A 00 00 toc_languagetree_absolute_offset TextTree at absolute offset 0xA7C
0x1C 0x04 34 08 00 00 toc_soundtree_absolute_offset SoundTree at absolute offset 0x834
0x20 0x04 FF FF FF FF toc_modeltree_absolute_offset
0x24 0x04 BC 00 00 00 toc_imagetree_absolute_offset ImageTree at absolute offset 0xBC
0x28 0x04 FF FF FF FF toc_unknowntree_absolute_offset or toc_fonttree_absolute_offset
0x2C 0x04 7C 0B 00 00 toc_objecttree_absolute_offset ObjectTree at absolute offset 0xB7C
0x30 0x04 FF FF FF FF toc_animationtree_absolute_offset
0x34 0x04 E0 0C 00 00 strings_texts_absolute_offset strings texts table at absolute offset 0xCE0
0x38 0x04 68 00 00 00 strings_texts_length strings texts table size 0x68
0x3C 0x04 48 0D 00 00 strings_labels_absolute_offset strings labels table at absolute offset 0xD48
0x40 0x04 9C 04 00 00 strings_labels_length strings labels size 0x49C
0x44 0x04 E4 11 00 00 strings_events_absolute_offset strings events table at absolute offset 0x11E4
0x48 0x04 04 00 00 00 strings_events_length strings events size 0x4
0x4C 0x04 F0 0B 00 00 text_pointer_table_offset
0x50 0x04 28 00 00 00 text_pointer_table_length
0x54 0x04 18 0C 00 00 image_pointer_table_offset
0x58 0x04 94 00 00 00 image_pointer_table_length
0x5C 0x04 FF FF FF FF model_pointer_table_offset
0x60 0x04 00 00 00 00 model_pointer_table_length
0x64 0x04 AC 0C 00 00 sound_pointer_table_offset
0x68 0x04 2C 00 00 00 sound_pointer_table_length
0x6C 0x04 D8 0C 00 00 object_pointer_table_offset
0x70 0x04 08 00 00 00 object_pointer_table_length
0x74 0x04 FF FF FF FF anim_pointer_table_offset
0x78 0x04 00 00 00 00 anim_pointer_table_length
0x7C 0x04 E8 11 00 00 image_data_section_offset
0x80 0x04 40 DF 01 00 image_data_section_length
0x84 0x04 28 F1 01 00 sound_data_section_offset
0x88 0x04 F0 58 02 00 sound_data_section_length
0x8C 0x04 FF FF FF FF model_data_section_offset
0x90 0x04 00 00 00 00 model_data_section_length
12 bytes of unknowns 0xFF's was added here for newer versions of the rco format

Tests

minitable for entry types

RCOXML TOC entry types
second byte wiki pages related
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F
first
byte
0x01 ? MainTree RCOXML Coding
0x02 ScriptTree RCOXML Script
0x03 TextTree TextLang RCOXML Texts
0x04 ImageTree Image RCOXML Images
0x05 ModelTree Model RCOXML Models
0x06 SoundTree Sound RCOXML Sounds
0x07 FontTree FontStyle RCOXML Fonts
0x08 ObjectTree Page Plane Button XMenu XMList XList Progress Scroll MList MItem unk XItem Text ModelObject Spin Action ItemSpin Group LList LItem Edit Clock IList IItem Icon UButton unk CheckboxGroup CheckboxItem Meter EditBox RCOXML Objects
0x09 AnimTree Animation MoveTo Recolour Rotate Resize Fade Delay FireEvent Lock Unlock SlideOut RCOXML Animations