GPD
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.
Entry Table
An ID of 0x100000000 indicates that the entry is a Sync List, an ID of 0x200000000 means its a Sync Data entry.
The Settings, Achievement and Title namespaces each have their own Sync List and Sync Data entries.
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
Title Entrys have the ID of there corresponding TitleID.
Avatar Awards ID's seem to be the TitleID then something to (identify the xbox.com image)?
Value | Description |
---|---|
1676148804 | AvatarSetting(stores avatar clothing and colours) |
1080295439 | GamerPicKey(string defining the users GamerPic) |
32768 | TitleInfo(such as Title Image or Title Name) |
8589934592 | SyncData(http://free60.org/GPD#Sync_Data) |
4294967296 | SyncList(http://free60.org/GPD#Sync_Lists) |
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 | signed long | Unlock Time |
0x18 | null terminated | unicode string | Name |
0x18 + Name length | null terminated | unicode string | Locked Description |
0x18 + Name length + Locked Description length | null terminated | unicode string | Unlocked Description |
Setting Entries
Offset | Length | Type | Information |
---|---|---|---|
0 | 4 | Int32 | SettingID(entry ID) |
4 | 4 | Int32 | Null/unused |
8 | 1 | Byte | DataType (see Below) |
9 | 7 | Byte[] | Unknown |
16 | *depends on DataType* | *depends on DataType* | Data |
DataType |
---|
Context |
Int32 |
Int64 |
Double |
String |
Float |
Binary |
DateTime |
Reading the SettingEntry might be a little tricky, depending on the DataType. Gonna write down later how to.
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 byte[] Data { get { 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 | 0x2 | short | Unknown |
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 | signed int | Unknown/Reserved |
0x20 | 0x8 | signed long | Last Played Time |
0x28 | null terminated | unicode string | Title Name |
Avatar Award Entries
The entries are only supported within the PEC version of the GPD. The images for the avatar awards however, are stored in the game GPD for that game.
Offset | Length | Type | Information |
---|---|---|---|
0 | 4 | uint32 | Struct size (0x2C) |
4 | 4 | UInt32 | AssetID |
8 | 2 | UInt16 | Unknown1 |
10 | 2 | UInt16 | GenderFlag |
12 | 2 | UInt16 | Unknown2 |
14 | 2 | UInt16 | Unknown3 |
16 | 4 | UInt32 | TitleID |
20 | 4 | UInt32 | ImageID |
24 | 4 | uInt32 | Flags(Same as achievement) |
28 | 8 | Int64 | Unlock Time |
36 | 4 | u/Int32 | Unknown4 |
40 | 4 | u/Int32 | Unknown5 |
44 | Till Null | UniCode | Name |
44 + Name length | Till Null | UniCode | Locked Description |
44 + Name length + Locked Description length | Till Null | UniCode | Unlocked 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 UUID.
public System.String UUID() { return AssetID.ToString("x8") + "-" + Unknown1.ToString("x4") + "-" + GenderFlag.ToString("x4") + "-" + Unknown2.ToString("x4") + "-" + Unknown3.ToString("x4") + TitleID.ToString("x8"); }
Then simply using the UUID
public System.String LittleImageURL() { return "http://avatar.xboxlive.com/global/t." + TitleID.ToString("x8") + "/avataritem/" + UUID() + "/64"; } public System.String BigImageURL() { return "http://avatar.xboxlive.com/global/t." + TitleID.ToString("x8") + "/avataritem/" + UUID() + "/128"; }
String Entries
String entries are simply a unicode string, to the length specified by the entry.
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 |
I don't know much about the second id, however I believe it to have something to do with the SyncData's "Next Sync ID".
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 |