Qt Resource Container (QRC)
location: /dev_flash/vsh/resource/qgl
General format
QGL (Qt Graphics Library) based in Qt framework and OpenGL
QRCC
QRCC (Qt Resources Container Compressed)
QRC file ZLIB Compressed level 9.
- Example from 3.55 rhm.qrc:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 51 52 43 43 00 00 28 00 QRCC..z`
Name | Offset | Size | Example | Remark |
Magic header | 0x00 | 0x04 | 51 52 43 43 | 'QRCC' |
size of ZLIB unpacked (QRCF) file | 0x04 | 0x04 | 00 00 28 00 |
QRCF
QRCF (Qt Resources Container F?)
QRC "container" with an structure similar than themes .p3t
Main Header
- Example from fw 3.55 rhm.qrc:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000000 51 52 43 46 00 00 01 10 00 00 00 40 00 00 02 CC QRCF.......@..%| 00000010 00 00 03 10 00 00 01 2B 00 00 04 40 00 00 00 1B ..%À......9Ð.... 00000020 00 00 04 60 00 00 00 00 00 00 04 60 00 00 00 00 ..9ð......9ð.... 00000030 00 00 04 60 00 00 23 A0 00 00 00 00 00 00 00 00..9ð..@p........
Name | Offset | Size | Example | Remark |
Magic | 0x00 | 0x04 | 51 52 43 46 | 'QRCF' |
Version | 0x04 | 0x04 | 00 00 01 10 | |
Data table start offset | 0x08 | 0x04 | 00 00 00 40 | |
Data table size | 0x0C | 0x04 | 00 00 02 CC | |
Filename table start offset | 0x10 | 0x04 | 00 00 03 10 | |
Filename table size | 0x14 | 0x04 | 00 00 01 2B | without the padding at the end |
File table header start offset | 0x18 | 0x04 | 00 00 04 40 | |
File table header size | 0x1C | 0x04 | 00 00 00 1B | without the padding at the end |
File table start offset | 0x20 | 0x04 | 00 00 04 60 | |
Not used | 0x24 | 0x04 | 00 00 00 00 | |
File table start offset | 0x28 | 0x04 | 00 00 04 60 | |
Not used | 0x2C | 0x04 | 00 00 00 00 | |
File table start offset | 0x30 | 0x04 | 00 00 04 60 | |
File table size | 0x34 | 0x04 | 00 00 23 A0 | |
Not used | 0x38 | 0x04 | 00 00 00 00 | |
Not used | 0x3C | 0x04 | 00 00 00 00 |
Data Table
Default entry size is 60 bytes (0x3C) but the first and last entries has a different size
Offset (without the 0x40 header in all qrc files) http://666kb.com/i/cib5c7q4y7rpcx9x1.gif
Offset | Size | Example | Remark |
0x00 | 0x08 | 00 00 00 00 00 00 00 00 | similar all qrc files |
0x08 | 0x08 | FF FF FF FF FF FF FF FF | similar all qrc files |
0x10 | 0x04 | FF FF FF FF | similar all qrc files |
0x14 | 0x04 | 00 00 00 1C | similar all qrc files |
0x18 | 0x04 | 00 00 00 1C | similar all qrc files |
0x1C | 0x04 | 00 00 00 04 | similar all qrc files |
0x20 | 0x08 | 00 00 00 00 00 00 00 00 | similar all qrc files |
0x28 | 0x08 | FF FF FF FF FF FF FF FF | similar all qrc files |
0x30 | 0x04 | 00 00 00 38 | similar all qrc files: first entrance? |
0x34 | 0x04 | 00 00 02 90 | size body data table |
0x38 | 0x04 | 00 00 00 0F | similar all qrc files |
0x3F | 0x04 | 00 00 00 02 | 00 00 00 03 on icontex.qrc |
0x40 | 0x04 | 00 00 00 1C | similar all qrc files |
0x44 | 0x04 | FF FF FF FF | similar all qrc files |
0x48 | 0x04 | 00 00 00 74 | 00 00 00 84 on icontex.qrc: : second entrance? |
0x4C | 0x08 | FF FF FF FF FF FF FF FF | similar all qrc files |
0x54 | 0x04 | 00 00 00 14 | similar all qrc files |
0x58 | 0x04 | 00 00 00 06 | similar all qrc files |
0x5C | 0x04 | 00 00 00 00 | similar all qrc files |
0x5C | 0x04 | 00 00 00 00 | similar all qrc files |
0x60 | 0x04 | 00 00 01 50 | size of first file without padding |
0x64 | 0x04 | 00 00 00 18 | similar all qrc files |
0x68 | 0x04 | 00 00 00 07 | similar all qrc files |
0x6C | 0x08 | 00 00 00 00 00 00 00 00 | similar all qrc files |
0x74 | 0x04 | 00 00 00 0F | 00 00 00 1B on icontex.qrc |
0x78 | 0x04 | 00 00 00 02 | 00 00 00 01 on icontex.qrc |
0x7C | 0x04 | 00 00 00 1C | 00 01 55 D4 on icontex.qrc (size of .dds uncompressed) |
Filename Table
Each entry is composed by:
Offset | Length | Example | Name | Notes |
---|---|---|---|---|
0x0 | 0x4 | 00000038 | Data Table entry offset | Same value than in the Data Table |
0x4 | variable | lib/rhm/Clear.fpo | File name | |
variable | 0x1 | 00 | NULL byte |
- The end of the table has a padding to align to 0x10 bytes
File Table
The table starts with 0x20 bytes, are always present in all the .qrc files
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00000440 71 72 63 00 66 69 6C 65 2D 74 61 62 6C 65 00 66 qrc.file-table.f 00000450 69 6C 65 00 73 72 63 00 69 64 00 00 00 00 00 00 ile.src.id......
- Marked in red: padding to align to 0x10 bytes
After this, the files are concatenated in the same order than in the Filename Table
QRC files
Container Name | File contents | Firmware changes | Notes |
---|---|---|---|
canyon.qrc | ? | ? | ? |
earth.qrc | ? | ? | ? |
icons.qrc | MNU (22) DDS (1) BMP (1) FPO (33) VPO (3) |
? | ? |
icontex.qrc | DDS (71) | ? | ? |
lines.qrc | ELF (2) FPO (47) VPO (11) MNU (69) DDS (24) TGA (6) |
? | ? |
raf.qrc | BIN (1) FPO (20) VPO (2) |
? | ? |
rhm.qrc | FPO (8) VPO (3) |
? | ? |
store.qrc | FPO (41) VPO (13) MNU (20) DDS (5) GTF (1) |
? | ? |
- File formats:
- ELF (Executable and Linkable Format)
- BIN (Binary)
- MNU ?
- FPO (Fragment program objects)
- VPO (Vertex program objects)
- PATH (Camera path)
- DUMP ?
- TXT ?
- INI ?
- DDS (Direct darw surface)
- BMP (Bitmap)
- TGA (Targa)
- JPG (Joint Photographic Experts Group)
Tools
ZLIB archivers
QRC files are compressed in ZLIB, and has 8 bytes added at the start of the file. To be able to use a generic zlib archiver is needed to remove this 8 bytes (and is needed to add them in the last step when rebuilding the QRC file)
SimplyZip
Windows archiver able to extract and create zlib files. http://www.paehl.de/cms/simplyzip
- Usage:
- Open the program and click in the tab at top: [External progs] ---> [ZLIB (pack/unpack)]
- A window opens where you can select the file
- Choose [Decompress] or [Compress], then click in [Start]
QGL converter
This tool can decompress a QRCC to QRCF and compress a QRCF to QRCC (it crops/generates the first 8 bytes and manages the zlib decompression/compression)
https://raw.github.com/wargio/ps3tools/master/QGL.c (just run make to compile it)
QRC Extractors
After the ZLIB decompression (needed for all .qrc files except icontex.qrc) the contents can be extracted individually using different tools
- Notes
- Some of the images are inverted vertically (only .dds?)
P3Textractor
Is posible to use a theme extractor to extract the contents from .qrc files, but first is needed to replace the characters / by _ of the text strings inside the Name table with a hexeditor (e.g: the string override/black/ICONS.mnu needs to be replaced by override_black_ICONS.mnu) This patching of the text strings can be automated by selecting the whole Name table in hexeditor and the function "replace string" (replacing the text string / by _ automatically only in the selected area)
P3Textractor manual: http://www.psdevwiki.com/ps3/Themes_(.p3t)#P3Textractor
- Notes
- P3Textractor renames .dds file extensions to .gim in the extraction process... so is needed to change back the file extensions manually to .dds for further edits in other programs
- This same trick with P3Textractor can be used with .raf files
Raw extractors
Generic Tiny little extractor
Theses generic tiny little tools extract blindly & embedded files and are means to be tiny and independent. Heavily based on an MPO splitter by Christian Steinruecken. Formats supported DDS/MNU/JPG/MPO/PNG (and virtually any other by modifying the source code)
http://rghost.net/49340892 (include Code-Compile-Credit. Drag and drop your file into them) & mirror links: http://mir.cr/0R78ED3U
QRC Compilers
There are no compilers for .qrc files, the commonly used method consist in patching settings values in text strings (or to inject the modded files) with a hexeditor over the original .qrc file
This limits the mods to patches than never exceeeds the size of the original data... in the case of patching an area with an smaller patch is recommended to fill the original "trash" data with zeroes
Patching strings in hexeditor
Mostly used with the settings inside .mnu files
First extract the files with some of the extractor tool, open the .mnu files in notepad++ to be able to read the settings in a easy way
Select the string you want to modify and "copy" his name
Open the .qrc file in hexeditor (after ZLIB decompression if needed) and use the search funtion to locate the string you copyed previously
- Notes
- Most of the settings inside .mnu files are repeated several times inside the .qrc file because are used in several .mnu files... be sure to patch the correct .mnu file by comparing the rest of the data at his side
Injecting files in hexeditor
Similar than patching a text string, but with a bigger chunk of data