GPD: Difference between revisions
imported>Experiment5X |
imported>Godzcheater (Page clean up) |
||
(10 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
'''GPD''' ( | '''GPD''' ('''G'''ame '''P'''rofile '''D'''ata) files are used by the Xbox 360 to store information inside a profile. They are based on the [[XDBF]] format. Profiles are composed of many of these files, each named under their respective titles id (e.g. 4D5307E6.gpd for Halo 3). The dashboard GPD (FFFE07D1.gpd) contains information and sync information about all the titles. | ||
= Entry Table = | = Entry Table = | ||
== Entry Namespaces == | == Entry Namespaces == | ||
{| border=1 | {| border=1 | ||
Line 33: | Line 27: | ||
|- | |- | ||
| 6 | | 6 | ||
| Avatar Award (360 only, this is only stored with in the [[PEC]] version | | Avatar Award (360 only, this is only stored with in the [[PEC]] version only) | ||
|} | |} | ||
== Entry IDs == | == Entry IDs == | ||
An ID of 0x100000000 indicates that the entry is a Sync List, an ID of 0x200000000 means its a Sync Data entry. In '''PEC''' ('''P'''rofile '''E'''mbedded '''C'''ontent) files these are changed to 1 and 2. | |||
The Settings, Achievements, Title and Assets namespaces each have their own Sync List and Sync Data entries. | |||
An ID of 0x8000 is reserved for title information, in the string and image namespaces. For achievements and images the entry id must match the id enclosed in the entry data. | |||
{| border=1 | {| border=1 | ||
|- | |- | ||
! Description | |||
! Value | ! Value | ||
|- | |- | ||
| | |Sync List | ||
| | |0x100000000 | ||
|- | |||
|Sync Data | |||
|0x200000000 | |||
|- | |||
|Sync List ([[PEC]]) | |||
|0x1 | |||
|- | |||
|Sync Data ([[PEC]]) | |||
|0x2 | |||
|- | |||
|Option Controller Vibration | |||
|0x10040003 | |||
|- | |||
|Title Specific 1 | |||
|0x63E83FFF | |||
|- | |||
|Title Specific 2 | |||
|0x63E83FFE | |||
|- | |||
|Title Specific 3 | |||
|0x63E83FFD | |||
|- | |||
|Gamer Yaxis Inversion | |||
|0x10040002 | |||
|- | |||
|Gamercard Zone | |||
|0x10040004 | |||
|- | |||
|Gamercard Region | |||
|0x10040005 | |||
|- | |||
|Gamercard Cred | |||
|0x10040006 | |||
|- | |||
|Gamercard Rep | |||
|0x50040011 | |||
|- | |||
|Option Voice Muted | |||
|0x10040012 | |||
|- | |||
|Option Voice Thru Speakers | |||
|0x10040013 | |||
|- | |||
|Option Voice Thru Speakers Raw | |||
|0x10040063 | |||
|- | |||
|Option Voice Volume | |||
|0x10040014 | |||
|- | |||
|Gamercard Titles Played | |||
|0x10040018 | |||
|- | |||
|Gamercard Achievements Earned | |||
|0x10040019 | |||
|- | |||
|Gamer Difficulty | |||
|0x10040021 | |||
|- | |||
|Gamer Control Sensitivity | |||
|0x10040024 | |||
|- | |||
|Gamer Preferred Color First | |||
|0x10040029 | |||
|- | |||
|Gamer Preferred Color Second | |||
|0x10040030 | |||
|- | |||
|Gamer Action Auto Aim | |||
|0x10040034 | |||
|- | |||
|Gamer Action Auto Center | |||
|0x10040035 | |||
|- | |||
|Gamer Action Movement Control | |||
|0x10040036 | |||
|- | |||
|Gamer Race Transmission | |||
|0x10040038 | |||
|- | |||
|Gamer Race Camera Location | |||
|0x10040039 | |||
|- | |||
|Gamer Race Brake Control | |||
|0x10040040 | |||
|- | |||
|Gamer Race Accelerator Control | |||
|0x10040041 | |||
|- | |||
|Gamercard Title Cred Earned | |||
|0x10040056 | |||
|- | |||
|Gamercard Title Achievements Earned | |||
|0x10040057 | |||
|- | |||
|Avatar Metadata | |||
|0x63E80068 | |||
|- | |||
|Gamercard Picture Key | |||
|0x4064000F | |||
|- | |||
|Gamercard Motto | |||
|0x402C0011 | |||
|- | |||
|Title Information | |||
|0x8000 | |||
|- | |- | ||
| | |Gamer Name | ||
| | |0x41040040 | ||
|- | |- | ||
| | |Gamer Location | ||
| | |0x40520041 | ||
|- | |- | ||
| | |Avatar Information | ||
| | |0x63e80044 | ||
|- | |- | ||
| | |Avatar Image | ||
| | |0x8007 | ||
|} | |} | ||
Setting IDs are largely deterministic, based on there type max length see [http://pastebin.com/mW3fmvpG sample code] | |||
= Entry Structures = | = Entry Structures = | ||
Line 108: | Line 211: | ||
| null terminated | | null terminated | ||
| unicode string | | unicode string | ||
| | | Unlocked Description | ||
|- | |- | ||
| 0x18 + '''Name''' length + '''Locked Description''' length | | 0x18 + '''Name''' length + '''Locked Description''' length | ||
| null terminated | | null terminated | ||
| unicode string | | unicode string | ||
| | | Locked Description | ||
|} | |} | ||
Line 120: | Line 223: | ||
public enum AchievementTypes : byte | public enum AchievementTypes : byte | ||
{ | { | ||
Completion = 1, | Completion = 1, | ||
Leveling = 2, | Leveling = 2, | ||
Unlock = 3, | Unlock = 3, | ||
Event = 4, | Event = 4, | ||
Tournament = 5, | Tournament = 5, | ||
Checkpoint = 6, | Checkpoint = 6, | ||
Other = 7, | Other = 7, | ||
} | } | ||
Line 138: | Line 241: | ||
set | set | ||
{ | { | ||
if ((System.Byte)value > 7) // to may bits in use :O | |||
throw new Exceptions.InvalidAchievement(new System.Exception("Invalid Type")); | |||
if (value != Type) | |||
{ | |||
Flags ^= 4294967288; // Null the 3 bits | |||
Flags ^= (System.Byte)Type; // set the new | |||
} | |||
} | } | ||
} | } | ||
public System.Boolean AchievementShowUnachieved//!Sectet | public System.Boolean AchievementShowUnachieved // !Sectet | ||
{ | { | ||
get | get | ||
Line 149: | Line 258: | ||
set | set | ||
{ | { | ||
Flags ^= 8; | if (value != ShowUnachieved) | ||
Flags ^= 8; | |||
} | } | ||
} | } | ||
Line 160: | Line 270: | ||
set | set | ||
{ | { | ||
Flags ^= 65536; | if (value != AchievementEarnedOnline) | ||
Flags ^= 65536; | |||
} | } | ||
} | } | ||
Line 171: | Line 282: | ||
set | set | ||
{ | { | ||
Flags ^= 131072; | if (value != Achieved) | ||
Flags ^= 131072; | |||
} | |||
} | |||
public System.Boolean Edited //? | |||
{ | |||
get | |||
{ | |||
return (Flags & 1048576) == 1048576; | |||
} | |||
set | |||
{ | |||
if (value != Edited) | |||
{ | |||
Flags ^= 1048576; | |||
} | |||
} | } | ||
} | } | ||
Line 187: | Line 313: | ||
| 4 | | 4 | ||
| Int32 | | Int32 | ||
| SettingID | | SettingID | ||
|- | |- | ||
| 4 | | 4 | ||
| | | 2 | ||
| | | UInt16 | ||
| | | DOS Time(Last edited?) | ||
|- | |||
| 6 | |||
| 2 | |||
| UInt16 | |||
| Unknown | |||
|- | |- | ||
| 8 | | 8 | ||
Line 202: | Line 333: | ||
| 7 | | 7 | ||
| Byte[] | | Byte[] | ||
| Unknown | | Unknown (always null?) | ||
|- | |- | ||
| 16 | | 16 | ||
Line 212: | Line 343: | ||
{| border=1 | {| border=1 | ||
|- | |- | ||
! | ! Description | ||
! Value | |||
|- | |- | ||
| Context | | Context | ||
| 0 | |||
|- | |- | ||
| Int32 | | Int32 | ||
| 1 | |||
|- | |- | ||
| Int64 | | Int64 | ||
| 2 | |||
|- | |- | ||
| Double | | Double | ||
| 3 | |||
|- | |- | ||
| String | | (UNI)String | ||
| 4 | |||
|- | |- | ||
| Float | | Float | ||
| 5 | |||
|- | |- | ||
| Binary | | Binary | ||
| 6 | |||
|- | |- | ||
| DateTime | | DateTime | ||
| 7 | |||
|- | |||
| Null | |||
| 0xFF | |||
|} | |} | ||
With data type string and binary there is a leading Int32 with the length in the data blob. | |||
== Image Entries == | == Image Entries == | ||
Image entries are | Image entries are PNG images. example code: | ||
public System.Byte[] Data | public System.Byte[] Data | ||
{ | { | ||
Line 255: | Line 395: | ||
TempStream.Close(); | TempStream.Close(); | ||
} | } | ||
} | |||
== Title Entries == | == Title Entries == | ||
These entries are located in the FFFE07D1 | These entries are only located in the FFFE07D1 gpd. To get to them, the id for the XDBF entry is the title ID of the game, and the XDBF entry type is String. | ||
For more information | For more information see [[XDBF]] | ||
{| border=1 | {| border=1 | ||
|- | |- | ||
Line 348: | Line 489: | ||
These are not all the flags, it's just | These are not all the flags, it's just that I don't know the rest. | ||
{| border=1 | {| border=1 | ||
Line 363: | Line 504: | ||
| 0x10 | | 0x10 | ||
| Avatar Award Unlocked, needs to be downloaded. | | Avatar Award Unlocked, needs to be downloaded. | ||
|- | |||
| 0x20 | |||
| ? | |||
|} | |} | ||
Title images are also available online: | |||
IconURL<br> | |||
"http://image.xboxlive.com/global/t." + ID.ToString("x8") + "/icon/0/8000" | |||
LargeBoxArtURL<br> | |||
"http://tiles.xbox.com/consoleAssets/" + ID.ToString("x8") + "/en-GB/largeboxart.jpg" | |||
SmallBoxArtURL<br> | |||
"http://tiles.xbox.com/consoleAssets/" + ID.ToString("x8") + "/en-GB/smallboxart.jpg" | |||
BannerURL<br> | |||
"http://avatar.xboxlive.com/global/t." + ID.ToString("x8") + "/marketplace/0/1" | |||
MarketplaceURL<br> | |||
"http://marketplace.xbox.com/en-US/Title/" + ID | |||
== Avatar Award Entries == | == Avatar Award Entries == | ||
Line 379: | Line 539: | ||
| 0 | | 0 | ||
| 4 | | 4 | ||
| | | int32 | ||
| Struct size (0x2C) | | Struct size (0x2C) | ||
|- | |- | ||
| 4 | | 4 | ||
| 16 | | 16 | ||
| | | System.Guid | ||
| | | ID | ||
|- | |- | ||
| 20 | | 20 | ||
Line 419: | Line 554: | ||
| 24 | | 24 | ||
| 4 | | 4 | ||
| | | UInt32 | ||
| Flags(Same as achievement) | | Flags(Same as achievement) | ||
|- | |- | ||
| 28 | | 28 | ||
| 8 | | 8 | ||
| | | filetime | ||
| Unlock Time | | Unlock Time | ||
|- | |- | ||
| 36 | | 36 | ||
| 4 | | 4 | ||
| | | Int32 | ||
| | | Subcategory | ||
|- | |- | ||
| 40 | | 40 | ||
| 4 | | 4 | ||
| | | UInt32 | ||
| | | Unknown | ||
|- | |- | ||
| 44 | | 44 | ||
| | | Null Terminated | ||
| | | Unicode | ||
| Name | | Name | ||
|- | |- | ||
| 44 + '''Name''' length | | 44 + '''Name''' length | ||
| | | Null Terminated | ||
| | | Unicode | ||
| | | Unlocked Description | ||
|- | |- | ||
| 44 + '''Name''' length + '''Locked Description''' length | | 44 + '''Name''' length + '''Locked Description''' length | ||
| | | Null Terminated | ||
| | | Unicode | ||
| | | Locked Description | ||
|} | |} | ||
=== Image === | === Image === | ||
The Image stored in the GPD is stored in the normal GPD however you can grab the image from the server, | The Image stored in the GPD is stored in the normal GPD however you can grab the image from the server, using the GUID. | ||
"http://download.xboxlive.com/content/4d530914/thumbnails/" + size + "/" + ID.ToString() + ".png"); // size 64 128 300<br> | |||
"http://avatar.xboxlive.com/global/t." + TitleID + "/avataritem/" + ID.ToString() + "/" + size // 64 or 128 | |||
<br> | |||
== String Entries == | == String Entries == | ||
String entries are simply a unicode string | String entries are simply a unicode, null terminated string the length could be derived from the entry length. | ||
== Sync Lists == | == Sync Lists == | ||
Line 492: | Line 615: | ||
| 0 | | 0 | ||
| 8 | | 8 | ||
| | | unsigned long | ||
| EntryID | | EntryID | ||
|- | |- | ||
| 8 | | 8 | ||
| 8 | | 8 | ||
| | | unsigned long | ||
| SyncID | | SyncID | ||
|} | |} | ||
== Sync Data == | == Sync Data == | ||
Line 527: | Line 648: | ||
|} | |} | ||
IDs in Sync List between last and next are pushed<br> | |||
//confirm? | |||
[[Category: | [[Category:Xbox360_System_Software]] |
Latest revision as of 22:08, 9 September 2017
GPD (Game Profile Data) files are used by the Xbox 360 to store information inside a profile. They are based on the XDBF format. Profiles are composed of many of these files, each named under their respective titles id (e.g. 4D5307E6.gpd for Halo 3). The dashboard GPD (FFFE07D1.gpd) contains information and sync information about all the titles.
Entry Table
Entry Namespaces
Value | Description |
---|---|
1 | Achievement |
2 | Image |
3 | Setting |
4 | Title |
5 | String |
6 | Achievement Security (created by GFWL for offline unlocked achievements?) |
6 | Avatar Award (360 only, this is only stored with in the PEC version only) |
Entry IDs
An ID of 0x100000000 indicates that the entry is a Sync List, an ID of 0x200000000 means its a Sync Data entry. In PEC (Profile Embedded Content) files these are changed to 1 and 2.
The Settings, Achievements, Title and Assets namespaces each have their own Sync List and Sync Data entries.
An ID of 0x8000 is reserved for title information, in the string and image namespaces. For achievements and images the entry id must match the id enclosed in the entry data.
Description | Value |
---|---|
Sync List | 0x100000000 |
Sync Data | 0x200000000 |
Sync List (PEC) | 0x1 |
Sync Data (PEC) | 0x2 |
Option Controller Vibration | 0x10040003 |
Title Specific 1 | 0x63E83FFF |
Title Specific 2 | 0x63E83FFE |
Title Specific 3 | 0x63E83FFD |
Gamer Yaxis Inversion | 0x10040002 |
Gamercard Zone | 0x10040004 |
Gamercard Region | 0x10040005 |
Gamercard Cred | 0x10040006 |
Gamercard Rep | 0x50040011 |
Option Voice Muted | 0x10040012 |
Option Voice Thru Speakers | 0x10040013 |
Option Voice Thru Speakers Raw | 0x10040063 |
Option Voice Volume | 0x10040014 |
Gamercard Titles Played | 0x10040018 |
Gamercard Achievements Earned | 0x10040019 |
Gamer Difficulty | 0x10040021 |
Gamer Control Sensitivity | 0x10040024 |
Gamer Preferred Color First | 0x10040029 |
Gamer Preferred Color Second | 0x10040030 |
Gamer Action Auto Aim | 0x10040034 |
Gamer Action Auto Center | 0x10040035 |
Gamer Action Movement Control | 0x10040036 |
Gamer Race Transmission | 0x10040038 |
Gamer Race Camera Location | 0x10040039 |
Gamer Race Brake Control | 0x10040040 |
Gamer Race Accelerator Control | 0x10040041 |
Gamercard Title Cred Earned | 0x10040056 |
Gamercard Title Achievements Earned | 0x10040057 |
Avatar Metadata | 0x63E80068 |
Gamercard Picture Key | 0x4064000F |
Gamercard Motto | 0x402C0011 |
Title Information | 0x8000 |
Gamer Name | 0x41040040 |
Gamer Location | 0x40520041 |
Avatar Information | 0x63e80044 |
Avatar Image | 0x8007 |
Setting IDs are largely deterministic, based on there type max length see sample code
Entry Structures
Achievement Entries
Offset | Length | Type | Information |
---|---|---|---|
0x0 | 0x4 | unsigned int | Struct size (0x1C) |
0x4 | 0x4 | unsigned int | Achievement ID |
0x8 | 0x4 | unsigned int | Image ID |
0xC | 0x4 | signed int | Gamerscore |
0x10 | 0x4 | unsigned int | Flags (see below) |
0x14 | 0x8 | System.DateTime(signed long) | Unlock Time |
0x18 | null terminated | unicode string | Name |
0x18 + Name length | null terminated | unicode string | Unlocked Description |
0x18 + Name length + Locked Description length | null terminated | unicode string | Locked Description |
Flags
public enum AchievementTypes : byte { Completion = 1, Leveling = 2, Unlock = 3, Event = 4, Tournament = 5, Checkpoint = 6, Other = 7, }
public System.UInt32 Flags; public AchievementTypes AchievementType { get { return (AchievementTypes)(Flags & 7); } set { if ((System.Byte)value > 7) // to may bits in use :O throw new Exceptions.InvalidAchievement(new System.Exception("Invalid Type")); if (value != Type) { Flags ^= 4294967288; // Null the 3 bits Flags ^= (System.Byte)Type; // set the new } } } public System.Boolean AchievementShowUnachieved // !Sectet { get { return (Flags & 8) == 8; } set { if (value != ShowUnachieved) Flags ^= 8; } } public System.Boolean AchievementEarnedOnline { get { return (Flags & 65536) == 65536; } set { if (value != AchievementEarnedOnline) Flags ^= 65536; } } public System.Boolean AchievementEarned { get { return (Flags & 131072) == 131072; } set { if (value != Achieved) Flags ^= 131072; } } public System.Boolean Edited //? { get { return (Flags & 1048576) == 1048576; } set { if (value != Edited) { Flags ^= 1048576; } } }
Setting Entries
Offset | Length | Type | Information |
---|---|---|---|
0 | 4 | Int32 | SettingID |
4 | 2 | UInt16 | DOS Time(Last edited?) |
6 | 2 | UInt16 | Unknown |
8 | 1 | Byte | DataType (see Below) |
9 | 7 | Byte[] | Unknown (always null?) |
16 | *depends on DataType* | *depends on DataType* | Data |
Description | Value |
---|---|
Context | 0 |
Int32 | 1 |
Int64 | 2 |
Double | 3 |
(UNI)String | 4 |
Float | 5 |
Binary | 6 |
DateTime | 7 |
Null | 0xFF |
With data type string and binary there is a leading Int32 with the length in the data blob.
Image Entries
Image entries are PNG images. example code:
public System.Byte[] Data { get { System.Byte[] TempData; System.IO.MemoryStream TempStream = new System.IO.MemoryStream(); Img.Save(TempStream, System.Drawing.Imaging.ImageFormat.Png); TempData = TempStream.ToArray(); TempStream.Close(); return TempData; } set { System.IO.MemoryStream TempStream = new System.IO.MemoryStream(value); Img = System.Drawing.Image.FromStream(TempStream); TempStream.Close(); } }
Title Entries
These entries are only located in the FFFE07D1 gpd. To get to them, the id for the XDBF entry is the title ID of the game, and the XDBF entry type is String. For more information see XDBF
Offset | Length | Type | Information |
---|---|---|---|
0x0 | 0x4 | unsigned int | Title ID |
0x4 | 0x4 | signed int | Achievement Count |
0x8 | 0x4 | signed int | Achievement Unlocked Count |
0xC | 0x4 | signed int | Gamerscore Total |
0x10 | 0x4 | signed int | Gamerscore Unlocked |
0x14 | 0x1 | unsigned byte | Unknown |
0x15 | 0x1 | unsigned byte | Achievement Unlocked Online Count |
0x16 | 0x01 | byte | Avatar Assets Earned |
0x17 | 0x01 | byte | Avatar Assets Max |
0x18 | 0x01 | byte | Male Avatar Assets Earned |
0x19 | 0x01 | byte | Male Avatar Assets Max |
0x1A | 0x01 | byte | Female Avatar Assets Earned |
0x1B | 0x01 | byte | Female Avatar Assets Max |
0x1C | 0x4 | unsigned int | Flags (see below) |
0x20 | 0x8 | signed long | Last Played Time |
0x28 | null terminated | unicode string | Title Name |
These are not all the flags, it's just that I don't know the rest.
Value | Description |
---|---|
0x1 | Achievement Unlocked Offline, needs to be synced. |
0x2 | Achievement Unlocked, image needs to be downloaded. |
0x10 | Avatar Award Unlocked, needs to be downloaded. |
0x20 | ? |
Title images are also available online:
IconURL
"http://image.xboxlive.com/global/t." + ID.ToString("x8") + "/icon/0/8000"
LargeBoxArtURL
"http://tiles.xbox.com/consoleAssets/" + ID.ToString("x8") + "/en-GB/largeboxart.jpg"
SmallBoxArtURL
"http://tiles.xbox.com/consoleAssets/" + ID.ToString("x8") + "/en-GB/smallboxart.jpg"
BannerURL
"http://avatar.xboxlive.com/global/t." + ID.ToString("x8") + "/marketplace/0/1"
MarketplaceURL
"http://marketplace.xbox.com/en-US/Title/" + ID
Avatar Award Entries
The entries are only supported within the PEC version of the GPD. The images for the avatar awards, are stored in the game GPD for that game.
Offset | Length | Type | Information |
---|---|---|---|
0 | 4 | int32 | Struct size (0x2C) |
4 | 16 | System.Guid | ID |
20 | 4 | UInt32 | ImageID |
24 | 4 | UInt32 | Flags(Same as achievement) |
28 | 8 | filetime | Unlock Time |
36 | 4 | Int32 | Subcategory |
40 | 4 | UInt32 | Unknown |
44 | Null Terminated | Unicode | Name |
44 + Name length | Null Terminated | Unicode | Unlocked Description |
44 + Name length + Locked Description length | Null Terminated | Unicode | Locked Description |
Image
The Image stored in the GPD is stored in the normal GPD however you can grab the image from the server, using the GUID.
"http://download.xboxlive.com/content/4d530914/thumbnails/" + size + "/" + ID.ToString() + ".png"); // size 64 128 300
"http://avatar.xboxlive.com/global/t." + TitleID + "/avataritem/" + ID.ToString() + "/" + size // 64 or 128
String Entries
String entries are simply a unicode, null terminated string the length could be derived from the entry length.
Sync Lists
This is a list of "Sync Items".
You can find the total sync items by,
((SyncList.Length / 16) - 1)
Sync Item
Offset | Length | Type | Information |
---|---|---|---|
0 | 8 | unsigned long | EntryID |
8 | 8 | unsigned long | SyncID |
Sync Data
Offset | Length | Type | Information |
---|---|---|---|
0x0 | 0x8 | unsigned long | Next Sync ID |
0x8 | 0x8 | unsigned long | Last Synced ID |
0x10 | 0x8 | signed long | Last Synced Time |
IDs in Sync List between last and next are pushed
//confirm?