GPD: Difference between revisions
imported>Godzcheater mNo edit summary |
imported>Godzcheater (Edits here and there) |
||
Line 1: | Line 1: | ||
'''GPD''' (Gamer 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 executable's title id (e.g. 4D5307E6.gpd for Halo 3). The dashboard GPD (FFFE07D1.gpd) contains information and sync information about the titles. | '''GPD''' (Gamer Profile Data)//Game Progress 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 executable's title id (e.g. 4D5307E6.gpd for Halo 3). The dashboard GPD (FFFE07D1.gpd) contains information and sync information about the titles. | ||
= Entry Table = | = Entry Table = | ||
An ID of 0x100000000 indicates that the entry is a Sync List, an ID of 0x200000000 means its a Sync Data entry. | An ID of 0x100000000 indicates that the entry is a Sync List, an ID of 0x200000000 means its a Sync Data entry.<br> | ||
In PEC based GPD's these are changed to 1 and 2. | |||
The Settings, Achievement and Title namespaces each have their own Sync List and Sync Data entries. | The Settings, Achievement and Title namespaces each have their own Sync List and Sync Data entries.<br> | ||
And assets. | |||
An ID of 0x8000 usually indicates that entry is information to do with the title (image/name). | An ID of 0x8000 usually indicates that entry is information to do with the title (image/name). | ||
Line 37: | Line 39: | ||
== Entry IDs == | == Entry IDs == | ||
Achievement IDs = Achievement.ID<br> | |||
<br> | Image ID is just the Image ID -.-<br> | ||
Settings = Setting.ID(As below) | |||
{| border=1 | {| border=1 | ||
|- | |- | ||
Line 158: | Line 161: | ||
|0x8007 | |0x8007 | ||
|} | |} | ||
http://pastebin.com/mW3fmvpG | http://pastebin.com/mW3fmvpG<br> | ||
Title Entrys have the ID of there corresponding TitleID.<br> | |||
Strings are just there ID.<br> | |||
Avatar Awards ID's seem to be the TitleID then //TODO<br> | |||
= Entry Structures = | = Entry Structures = | ||
Line 208: | Line 214: | ||
| 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 220: | Line 226: | ||
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 238: | Line 244: | ||
set | set | ||
{ | { | ||
Flags ^= (System. | 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 | |||
if (Changed != null) | |||
Changed(this); | |||
} | |||
} | } | ||
} | } | ||
Line 249: | Line 263: | ||
set | set | ||
{ | { | ||
if (value != ShowUnachieved) | |||
Flags ^= 8; | Flags ^= 8; | ||
} | } | ||
Line 260: | Line 275: | ||
set | set | ||
{ | { | ||
if (value != AchievementEarnedOnline) | |||
Flags ^= 65536; | Flags ^= 65536; | ||
} | } | ||
Line 271: | Line 287: | ||
set | set | ||
{ | { | ||
if (value != Achieved) | |||
Flags ^= 131072; | Flags ^= 131072; | ||
} | |||
} | |||
public System.Boolean Edited//? | |||
{ | |||
get | |||
{ | |||
return (Flags & 1048576) == 1048576; | |||
} | |||
set | |||
{ | |||
if (value != Edited) | |||
{ | |||
Flags ^= 1048576; | |||
if (Changed != null) | |||
Changed(this); | |||
} | |||
} | } | ||
} | } | ||
Line 292: | Line 325: | ||
| 4 | | 4 | ||
| Int32 | | Int32 | ||
| | | Unknown | ||
|- | |- | ||
| 8 | | 8 | ||
Line 346: | Line 379: | ||
Int32 Length<br> | Int32 Length<br> | ||
Int32 0<br> | Int32 0<br> | ||
String Value<br><br> | String[Length] Value<br><br> | ||
Binary<br> | Binary<br> | ||
Int32 Length<br> | Int32 Length<br> | ||
Int32 0<br> | Int32 0<br> | ||
Byte[] Value<br> | Byte[Length] Value<br> | ||
== Image Entries == | == Image Entries == | ||
Line 483: | Line 516: | ||
| Avatar Award Unlocked, needs to be downloaded. | | Avatar Award Unlocked, needs to be downloaded. | ||
|} | |} | ||
//32 = ? | |||
<br> | |||
IconURL<br> | |||
"http://image.xboxlive.com/global/t." + ID.ToString("x8") + "/icon/0/8000"<br> | |||
LargeBoxArtURL<br> | |||
"http://tiles.xbox.com/consoleAssets/" + ID.ToString("x8") + "/en-GB/largeboxart.jpg"<br> | |||
SmallBoxArtURL<br> | |||
"http://tiles.xbox.com/consoleAssets/" + ID.ToString("x8") + "/en-GB/smallboxart.jpg"<br> | |||
BannerURL<br> | |||
"http://avatar.xboxlive.com/global/t." + ID.ToString("x8") + "/marketplace/0/1"<br> | |||
MarketplaceURL<br> | |||
"http://marketplace.xbox.com/en-US/Title/" + ID<br> | |||
== Avatar Award Entries == | == Avatar Award Entries == | ||
Line 498: | Line 543: | ||
| 0 | | 0 | ||
| 4 | | 4 | ||
| | | int32 | ||
| Struct size (0x2C) | | Struct size (0x2C) | ||
|- | |- | ||
| 4 | | 4 | ||
| 16 | | 16 | ||
| | | System.Guid | ||
| | | ID | ||
|- | |- | ||
| 20 | | 20 | ||
Line 543: | Line 563: | ||
| 28 | | 28 | ||
| 8 | | 8 | ||
| | | filetime | ||
| Unlock Time | | Unlock Time | ||
|- | |- | ||
| 36 | | 36 | ||
| 4 | | 4 | ||
| | | Int32 | ||
| | | Subcategory | ||
|- | |- | ||
| 40 | | 40 | ||
| 4 | | 4 | ||
| u/Int32 | | u/Int32 | ||
| | | Unknown | ||
|- | |- | ||
| 44 | | 44 | ||
Line 564: | Line 584: | ||
| Till Null | | Till Null | ||
| UniCode | | UniCode | ||
| | | Unlocked Description | ||
|- | |- | ||
| 44 + '''Name''' length + '''Locked Description''' length | | 44 + '''Name''' length + '''Locked Description''' length | ||
| Till Null | | Till Null | ||
| UniCode | | 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, Using the GUID. | The Image stored in the GPD is stored in the normal GPD however you can grab the image from the server, Using the GUID. | ||
<br> | <br> | ||
public System.String | public System.String ImageURL() | ||
{ | { | ||
return "http:// | //if bits, something or something//TODO | ||
//return "http://download.xboxlive.com/content/4d530914/thumbnails/" + size + "/" + ID.ToString() + ".png");//size 64 128 300 | |||
return "http://avatar.xboxlive.com/global/t." + TitleID + "/avataritem/" + ID.ToString() + "/" + size//64 or 128 | |||
} | } | ||
== String Entries == | == String Entries == | ||
String entries are simply a unicode string, to the length specified by the entry. | String entries are simply a unicode string, to the length specified by the entry. + null char | ||
== Sync Lists == | == Sync Lists == | ||
Line 619: | Line 631: | ||
| SyncID | | SyncID | ||
|} | |} | ||
== Sync Data == | == Sync Data == | ||
Line 646: | Line 656: | ||
|} | |} | ||
IDs in Sync List between last and next are pushed<br> | |||
//confirm? | |||
[[Category:File formats]] | [[Category:File formats]] |
Revision as of 00:36, 17 September 2012
GPD (Gamer Profile Data)//Game Progress 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 executable's title id (e.g. 4D5307E6.gpd for Halo 3). The dashboard GPD (FFFE07D1.gpd) contains information and sync information about the titles.
Entry Table
An ID of 0x100000000 indicates that the entry is a Sync List, an ID of 0x200000000 means its a Sync Data entry.
In PEC based GPD's these are changed to 1 and 2.
The Settings, Achievement and Title namespaces each have their own Sync List and Sync Data entries.
And assets.
An ID of 0x8000 usually indicates that entry is information to do with the title (image/name).
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 of the GPD) |
Entry IDs
Achievement IDs = Achievement.ID
Image ID is just the Image ID -.-
Settings = Setting.ID(As below)
Description | Value |
---|---|
Sync List | 0x100000000 |
Sync Data | 0x200000000 |
Option Controller Vibration | 0x10040003 |
Title Specific1 | 0x63E83FFF |
Title Specific2 | 0x63E83FFE |
Title Specific3 | 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 |
http://pastebin.com/mW3fmvpG
Title Entrys have the ID of there corresponding TitleID.
Strings are just there ID.
Avatar Awards ID's seem to be the TitleID then //TODO
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 if (Changed != null) Changed(this); } } } 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; if (Changed != null) Changed(this); } } }
Setting Entries
Offset | Length | Type | Information |
---|---|---|---|
0 | 4 | Int32 | SettingID(entry ID) |
4 | 4 | Int32 | Unknown |
8 | 1 | Byte | DataType (see Below) |
9 | 7 | Byte[] | Unknown |
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 |
UNICODE
Int32 Length
Int32 0
String[Length] Value
Binary
Int32 Length
Int32 0
Byte[Length] Value
Image Entries
Image entries are composed of a PNG image.
To Read and write this its probable best to use memory streams, I do it like
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 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 about XDBF go to http://www.free60.org/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. |
//32 = ?
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 | u/Int32 | Unknown |
44 | Till Null | UniCode | Name |
44 + Name length | Till Null | UniCode | Unlocked Description |
44 + Name length + Locked Description length | Till Null | 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.
public System.String ImageURL() {
//if bits, something or something//TODO
//return "http://download.xboxlive.com/content/4d530914/thumbnails/" + size + "/" + ID.ToString() + ".png");//size 64 128 300
return "http://avatar.xboxlive.com/global/t." + TitleID + "/avataritem/" + ID.ToString() + "/" + size//64 or 128
}
String Entries
String entries are simply a unicode string, to the length specified by the entry. + null char
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 | Int64 | EntryID |
8 | 8 | Int64 | 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?