GPD

From Xenon Wiki
Revision as of 22:10, 19 April 2012 by imported>Experiment5X (→‎Title Entries)
Jump to navigation Jump to search

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 System.DateTime(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

Flags

       public enum AchievementTypes : byte
       {
           Completion = 1,//<AchievementType value="1">Completion</AchievementType>
           Leveling = 2,//<AchievementType value="2">Leveling</AchievementType>
           Unlock = 3,//<AchievementType value="3">Unlock</AchievementType>
           Event = 4,//<AchievementType value="4">Event</AchievementType>
           Tournament = 5,//<AchievementType value="5">Tournament</AchievementType>
           Checkpoint = 6,//<AchievementType value="6">Checkpoint</AchievementType>
           Other = 7,//<AchievementType value="7">Other</AchievementType>
       }
       public System.UInt32 Flags;
       public AchievementTypes AchievementType
       {
           get
           {
               return (AchievementTypes)(Flags & 7);
           }
           set
           {
               Flags ^= (System.UInt32)value ^ (Flags & 7);
           }
       }
       public System.Boolean AchievementShowUnachieved//!Sectet
       {
           get
           {
               return (Flags & 8) == 8;
           }
           set
           {
               Flags ^= 8;
           }
       }
       public System.Boolean AchievementEarnedOnline
       {
           get
           {
               return (Flags & 65536) == 65536;
           }
           set
           {
               Flags ^= 65536;
           }
       }
       public System.Boolean AchievementEarned
       {
           get
           {
               return (Flags & 131072) == 131072;
           }
           set
           {
               Flags ^= 131072;
           }
       }

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 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

There is only one flag that I know, sorry about that.

Value Description
0x1 Achievement Unlocked Offline, needs to be synced.
0x10 Avatar Award Unlocked, needs to be downloaded.

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 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 GUID.

       public System.String GUID()
       {
           return AssetID.ToString("x8") + "-" + Unknown1.ToString("x4") + "-" + GenderFlag.ToString("x4") + "-" + Unknown2.ToString("x4") + "-" + Unknown3.ToString("x4") + TitleID.ToString("x8");
       }

Then simply using the GUID

       public System.String LittleImageURL()
       {
           return "http://avatar.xboxlive.com/global/t." + TitleID.ToString("x8") + "/avataritem/" + GUID() + "/64";
       }
       public System.String BigImageURL()
       {
           return "http://avatar.xboxlive.com/global/t." + TitleID.ToString("x8") + "/avataritem/" + GUID() + "/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