<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://codresearch.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Red-EyeX32</id>
	<title>COD Engine Research - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://codresearch.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Red-EyeX32"/>
	<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php/Special:Contributions/Red-EyeX32"/>
	<updated>2026-07-28T09:22:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1036</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1036"/>
		<updated>2024-12-16T04:15:46Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: Undo revision 1035 by Red-EyeX32 (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the TripleDES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this TripleDES layer it is then plaintext in Black Ops and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code. On Black Ops II in the other hand, it has hard-coded dvars that has a structure stored in the DDL asset.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| safeareaVertical&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedsp&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedmp&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedso&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletesp&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletemp&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
|-&lt;br /&gt;
| percentcompleteso&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MainMenu&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SP&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SO&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MP&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
|-&lt;br /&gt;
| canSkipOffensiveMissions&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
|-&lt;br /&gt;
| rumble&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
|-&lt;br /&gt;
| gpadButtonsConfig&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
|-&lt;br /&gt;
| gpadSticksConfig&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
|-&lt;br /&gt;
| viewedPatchNotesVersion&lt;br /&gt;
| N/A&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1035</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1035"/>
		<updated>2024-12-16T04:15:20Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the TripleDES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this TripleDES layer it is then plaintext in Black Ops and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code. On Black Ops II in the other hand, it has hard-coded dvars that has a structure stored in the DDL asset.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| safeareaVertical&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedsp&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedmp&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedso&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletesp&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletemp&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
|-&lt;br /&gt;
| percentcompleteso&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MainMenu&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SP&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SO&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MP&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
|-&lt;br /&gt;
| canSkipOffensiveMissions&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
|-&lt;br /&gt;
| rumble&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
|-&lt;br /&gt;
| gpadButtonsConfig&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
|-&lt;br /&gt;
| gpadSticksConfig&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
|-&lt;br /&gt;
| viewedPatchNotesVersion&lt;br /&gt;
| N/A&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1034</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1034"/>
		<updated>2024-12-16T03:32:23Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the TripleDES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this TripleDES layer it is then plaintext in Black Ops and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code. On Black Ops II in the other hand, it has hard-coded dvars that has a structure stored in the DDL asset.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| safeareaVertical&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedsp&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedmp&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedso&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletesp&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletemp&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
|-&lt;br /&gt;
| percentcompleteso&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MainMenu&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SP&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SO&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MP&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
|-&lt;br /&gt;
| canSkipOffensiveMissions&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
|-&lt;br /&gt;
| rumble&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
|-&lt;br /&gt;
| gpadButtonsConfig&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
|-&lt;br /&gt;
| gpadSticksConfig&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
|-&lt;br /&gt;
| viewedPatchNotesVersion&lt;br /&gt;
| N/A&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1033</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1033"/>
		<updated>2024-12-16T01:22:06Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the TripleDES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this TripleDES layer it is then plaintext in Black Ops and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code. On Black Ops II in the other hand, it has hard-coded dvars that has a structure stored in the DDL asset.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| safeareaVertical&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedsp&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedmp&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedso&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletesp&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletemp&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
|-&lt;br /&gt;
| percentcompleteso&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MainMenu&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SP&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SO&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MP&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
|-&lt;br /&gt;
| canSkipOffensiveMissions&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
|-&lt;br /&gt;
| rumble&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
|-&lt;br /&gt;
| gpadButtonsConfig&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
|-&lt;br /&gt;
| gpadSticksConfig&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
|-&lt;br /&gt;
| viewedPatchNotesVersion&lt;br /&gt;
| N/A&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1032</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1032"/>
		<updated>2024-12-15T05:58:23Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the TripleDES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this TripleDES layer it is then plaintext in Black Ops and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code. On Black Ops II in the other hand, it has hard-coded dvars that has a structure stored in the DDL asset.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| safeareaVertical&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedsp&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedmp&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedso&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletesp&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletemp&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
|-&lt;br /&gt;
| percentcompleteso&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MainMenu&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SP&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SO&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MP&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
|-&lt;br /&gt;
| canSkipOffensiveMissions&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
|-&lt;br /&gt;
| rumble&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
|-&lt;br /&gt;
| gpadButtonsConfig&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
|-&lt;br /&gt;
| gpadSticksConfig&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
|-&lt;br /&gt;
| viewedPatchNotesVersion&lt;br /&gt;
| N/A&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1031</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=1031"/>
		<updated>2024-12-15T05:57:22Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the TripleDES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this TripleDES layer it is then plaintext in Black Ops and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code. On Black Ops II in the other hand, it has hard-coded dvars that has a structure stored in the DDL asset.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| safeareaVertical&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedsp&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedmp&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedso&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletesp&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletemp&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
|-&lt;br /&gt;
| percentcompleteso&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MainMenu&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SP&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SO&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MP&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
|-&lt;br /&gt;
| canSkipOffensiveMissions&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
|-&lt;br /&gt;
| rumble&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
|-&lt;br /&gt;
| gpadButtonsConfig&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
|-&lt;br /&gt;
| gpadSticksConfig&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
|-&lt;br /&gt;
| viewedPatchNotesVersion&lt;br /&gt;
| N/A&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Main_Page&amp;diff=1028</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Main_Page&amp;diff=1028"/>
		<updated>2024-12-15T00:45:59Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Call of Duty Engine research wiki. The goal of this site is to organize information on any Call of Duty file system, structure system, functions, etc. Hopefully this table will help you browse our site effectively.&lt;br /&gt;
&lt;br /&gt;
Never edited a wiki before? Check out the [//meta.wikimedia.org/wiki/Help:Contents User&#039;s Guide] and then come back. ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;NOTE: Editing has been disabled by normal and anonymous users until admins are finished.&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For those who&#039;d like to make an edit but do not have permissions to do so, you may contact me by direct messaging me on discord: redeyex32&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Research==&lt;br /&gt;
* [[:Category:Utilities|Basic Utilities]]&lt;br /&gt;
* [[:Category:FastFiles|FastFiles and Zones]]&lt;br /&gt;
* [[:Category:PAK Files|PAK Files]]&lt;br /&gt;
* [[:Category:Assets|Assets]]&lt;br /&gt;
* [[:Category:Save Data|Save Data]]&lt;br /&gt;
* [[:Category:Game Structures|Game Structures]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; width=&amp;quot;15%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Infinity Ward Games==&lt;br /&gt;
* [[:Category:CoD4|Modern Warfare]]&lt;br /&gt;
* [[:Category:MW2|Modern Warfare 2]]&lt;br /&gt;
* [[:Category:MW3|Modern Warfare 3]]&lt;br /&gt;
* [[:Category:Ghosts|Ghosts]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; width=&amp;quot;15%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
==Treyarch Games==&lt;br /&gt;
* [[:Category:WaW|World at War]]&lt;br /&gt;
* [[:Category:BO1|Black Ops]]&lt;br /&gt;
* [[:Category:BO2|Black Ops 2]]&lt;br /&gt;
* [[:Category:BO3|Black Ops 3]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; width=&amp;quot;15%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sledgehammer Games==&lt;br /&gt;
* [[:Category:AW|Advanced Warfare]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Editing Basics ==&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Main_Page&amp;diff=1027</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Main_Page&amp;diff=1027"/>
		<updated>2024-12-03T06:05:47Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Call of Duty Engine research wiki. The goal of this site is to organize information on any Call of Duty file system, structure system, functions, etc. Hopefully this table will help you browse our site effectively.&lt;br /&gt;
&lt;br /&gt;
Never edited a wiki before? Check out the [//meta.wikimedia.org/wiki/Help:Contents User&#039;s Guide] and then come back. ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;NOTE: Editing has been disabled by normal and anonymous users until admins are finished.&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For those who&#039;d like to make an edit but do not have permissions to do so, you may contact me by direct messaging me on discord: redeyex32&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039; &#039;&#039;Our Youtube: https://www.youtube.com/channel/UCfyLyPN59pbJD4qXpuBttvA&#039;&#039; &#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;10&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; width=&amp;quot;50%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Research==&lt;br /&gt;
* [[:Category:Utilities|Basic Utilities]]&lt;br /&gt;
* [[:Category:FastFiles|FastFiles and Zones]]&lt;br /&gt;
* [[:Category:PAK Files|PAK Files]]&lt;br /&gt;
* [[:Category:Assets|Assets]]&lt;br /&gt;
* [[:Category:Save Data|Save Data]]&lt;br /&gt;
* [[:Category:Game Structures|Game Structures]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; width=&amp;quot;15%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Infinity Ward Games==&lt;br /&gt;
* [[:Category:CoD4|Modern Warfare]]&lt;br /&gt;
* [[:Category:MW2|Modern Warfare 2]]&lt;br /&gt;
* [[:Category:MW3|Modern Warfare 3]]&lt;br /&gt;
* [[:Category:Ghosts|Ghosts]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; width=&amp;quot;15%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
==Treyarch Games==&lt;br /&gt;
* [[:Category:WaW|World at War]]&lt;br /&gt;
* [[:Category:BO1|Black Ops]]&lt;br /&gt;
* [[:Category:BO2|Black Ops 2]]&lt;br /&gt;
* [[:Category:BO3|Black Ops 3]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; width=&amp;quot;15%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sledgehammer Games==&lt;br /&gt;
* [[:Category:AW|Advanced Warfare]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Editing Basics ==&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1021</id>
		<title>FastFiles and Zone files (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1021"/>
		<updated>2015-11-09T22:56:23Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Signed Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
&lt;br /&gt;
== Main FastFile Structure ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 //Note, on PS3 all values are &amp;lt;&amp;lt; 1&lt;br /&gt;
 enum language_t&lt;br /&gt;
 {&lt;br /&gt;
   LANGUAGE_ENGLISH = 0x1,&lt;br /&gt;
   LANGUAGE_FRENCH = 0x2,&lt;br /&gt;
   LANGUAGE_GERMAN = 0x3,&lt;br /&gt;
   LANGUAGE_ITALIAN = 0x4,&lt;br /&gt;
   LANGUAGE_SPANISH = 0x5,&lt;br /&gt;
   LANGUAGE_BRITISH = 0x6,&lt;br /&gt;
   LANGUAGE_RUSSIAN = 0x7,&lt;br /&gt;
   LANGUAGE_POLISH = 0x8,&lt;br /&gt;
   LANGUAGE_KOREAN = 0x9,&lt;br /&gt;
   LANGUAGE_TAIWANESE = 0xA,&lt;br /&gt;
   LANGUAGE_JAPANESE = 0xB,&lt;br /&gt;
   LANGUAGE_CHINESE = 0xC,&lt;br /&gt;
   LANGUAGE_THAI = 0xD,&lt;br /&gt;
   LANGUAGE_LEET = 0xE,&lt;br /&gt;
   LANGUAGE_CZECH = 0xF,&lt;br /&gt;
   MAX_LANGUAGES&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Entry point for the FF.&lt;br /&gt;
 struct DB_Header&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int version;&lt;br /&gt;
   bool allowOnlineUpdate;&lt;br /&gt;
   unsigned __int64 fileCreationTime;&lt;br /&gt;
   language_t region;&lt;br /&gt;
   int entryCount;&lt;br /&gt;
   Entry entries[];&lt;br /&gt;
   int fileSize;&lt;br /&gt;
   int maxFileSize;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;IWff0100&amp;quot; or &amp;quot;IWffu100&amp;quot;. It indicates what is read after maxFileSize. If it is &amp;quot;IWff0100&amp;quot; then this FF is signed. If it is &amp;quot;IWffu100&amp;quot;, then this FF is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the FF, so Modern Warfare 3 FastFiles cannot be loaded on Modern Warfare 2. The Modern Warfare 2 version is 0x10D for console systems and 0x114 for PC.&lt;br /&gt;
 if (version &amp;gt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
 else if (version &amp;lt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
=== AllowOnlineUpdate ===&lt;br /&gt;
Whether or not assets in this FF may be replaced by an FF loaded at a later time.&lt;br /&gt;
=== Entries ===&lt;br /&gt;
These are still not entirely understood. Most FF systems simply parse past them.&lt;br /&gt;
==== Xbox 360 ====&lt;br /&gt;
 for (int32 i = 0; i &amp;lt; 0x0f; i++)&lt;br /&gt;
 {&lt;br /&gt;
   if (((1 &amp;lt;&amp;lt; i) &amp;amp; language) == 0)&lt;br /&gt;
     continue;&lt;br /&gt;
   else&lt;br /&gt;
     ReadBytes(((entryCount &amp;lt;&amp;lt; 1) + entryCount) &amp;lt;&amp;lt; 2);&lt;br /&gt;
 }&lt;br /&gt;
==== PS3 ====&lt;br /&gt;
 readBytes(entryCount * 0x14);&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The fileSize is the size of the FF, everything included. The maxFileSize is the highest number that fileSize can be, and in most FFs they are equal.&lt;br /&gt;
&lt;br /&gt;
== Subheader ==&lt;br /&gt;
The rest of the FF is read depending on what the main FF magic was. If the magic was &amp;quot;IWff0100&amp;quot; then the FF is signed. If it was &amp;quot;IWffu100&amp;quot;, the FF is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
PS3 only supports unsigned fastfiles. For Xbox 360, only single player FastFiles are unsigned. Unsigned FastFiles are very simple. The only data remaining is compressed zlib data. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSubheader&lt;br /&gt;
 {&lt;br /&gt;
   char fastfileName[32];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthXBlock&lt;br /&gt;
 {&lt;br /&gt;
 #ifdef XBOX&lt;br /&gt;
   DB_AuthHash blockSignature[0x100];&lt;br /&gt;
   char blockData[0x200000];&lt;br /&gt;
 #elif defined PS3&lt;br /&gt;
   char blockData[0x10000];&lt;br /&gt;
 #endif&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Sub DB_AuthHeader, continuation on the earlier.&lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   DB_AuthSubHeader subheader;&lt;br /&gt;
   DB_AuthXBlock xBlocks[];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the FastFile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures. &lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;IWffs100&amp;quot;.&lt;br /&gt;
==== XBlocks ====&lt;br /&gt;
XBlocks are used until they are no longer needed. If the compressed data can fit into 1, then only 1 will exist.&lt;br /&gt;
&lt;br /&gt;
== Compression ==&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes, the last block being padded with zeroes if not 0x10000 bytes long. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
&lt;br /&gt;
=== Xbox 360 ===&lt;br /&gt;
Once the zone file is created, the entire zone is compressed using default zlib compression. If the FastFile is unsigned (single player) then the data is simply concatenated to the header. Signed files split the data up into 0x200000 byte XBlocks, each with a 0x2000 byte hash block.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF. &lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The XFile header is loaded first. It contains XBlock sizes to be allocated for g_streamBlocks.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
 XFILE_BLOCK_TEMP	= 0,&lt;br /&gt;
 XFILE_BLOCK_PHYSICAL	= 1,&lt;br /&gt;
 XFILE_BLOCK_RUNTIME	= 2,&lt;br /&gt;
 XFILE_BLOCK_VIRTUAL	= 3,&lt;br /&gt;
 XFILE_BLOCK_LARGE	= 4,&lt;br /&gt;
 XFILE_BLOCK_CALLBACK	= 5,&lt;br /&gt;
#if defined(PC) || defined(PS3)&lt;br /&gt;
 XFILE_BLOCK_VERTEX	= 6,&lt;br /&gt;
 #ifdef PC&lt;br /&gt;
 XFILE_BLOCK_INDEX	= 7,&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
 MAX_XFILE_COUNT&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  int size;&lt;br /&gt;
  int externalSize;&lt;br /&gt;
  int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
After the XFile header is the asset list. The asset list contains a list of script strings and a list of assets. The fastfile compiler creates a rawfile as the last asset which contains any compiler errors (as seen in french code_post_gfx_mp.ff).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type; //See enum below&lt;br /&gt;
  XAssetHeader * header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  int scriptStringCount;&lt;br /&gt;
  const char * * scriptStrings;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== General [[:Category:Assets|Asset]] Information ==&lt;br /&gt;
=== Asset Types ===&lt;br /&gt;
The types of assets loaded are determined by this enum.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; class=&amp;quot;article-table&amp;quot; style=&amp;quot;font-size:13px;line-height:21px;width:500px;height:500px;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Type&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Xbox ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PS3 ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PC ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Is Used&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Max Count&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Size (PC)&lt;br /&gt;
|-&lt;br /&gt;
|physpreset&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|phys_collmap&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x48&lt;br /&gt;
|-&lt;br /&gt;
|xanim&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x58&lt;br /&gt;
|-&lt;br /&gt;
|xmodelsurfs&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x24&lt;br /&gt;
|-&lt;br /&gt;
|xmodel&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|True&lt;br /&gt;
|0x600&lt;br /&gt;
|0x130&lt;br /&gt;
|-&lt;br /&gt;
|material&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x60&lt;br /&gt;
|-&lt;br /&gt;
|pixelshader&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|True&lt;br /&gt;
|0x1FA0&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexshader&lt;br /&gt;
|N/A&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexdecl&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|0x08&lt;br /&gt;
|True&lt;br /&gt;
|0x30&lt;br /&gt;
|0x64&lt;br /&gt;
|-&lt;br /&gt;
|techset&lt;br /&gt;
|0x07&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|True&lt;br /&gt;
|0x300&lt;br /&gt;
|0xCC&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|True&lt;br /&gt;
|0xE00&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|sound&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|True&lt;br /&gt;
|0x3E80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|sndcurve&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x88&lt;br /&gt;
|-&lt;br /&gt;
|loaded_sound&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|True&lt;br /&gt;
|0x546&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|col_map_sp&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|col_map_mp&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|com_map&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|game_map_sp&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x38&lt;br /&gt;
|-&lt;br /&gt;
|game_map_mp&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|map_ents&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|True&lt;br /&gt;
|2&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|fx_map&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x74&lt;br /&gt;
|-&lt;br /&gt;
|gfx_map&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x274&lt;br /&gt;
|-&lt;br /&gt;
|lightdef&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|ui_map&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|font&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|True&lt;br /&gt;
|0x10&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|menufile&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|menu&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|True&lt;br /&gt;
|0x264&lt;br /&gt;
|0x190&lt;br /&gt;
|-&lt;br /&gt;
|localize&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|True&lt;br /&gt;
|0x1B58&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|weapon&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|True&lt;br /&gt;
|0x578&lt;br /&gt;
|0x684&lt;br /&gt;
|-&lt;br /&gt;
|snddriverglobals&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|fx&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|True&lt;br /&gt;
|0x258&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|impactfx&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|True&lt;br /&gt;
|4&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|aitype&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|mptype&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|character&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|xmodelalias&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|rawfile&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|stringtable&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|True&lt;br /&gt;
|0x190&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|leaderboarddef&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|True&lt;br /&gt;
|0x64&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|structureddatadef&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|True&lt;br /&gt;
|0x18&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|tracer&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x70&lt;br /&gt;
|-&lt;br /&gt;
|vehicle&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x2D0&lt;br /&gt;
|-&lt;br /&gt;
|addon_map_ents&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|0x2A&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x24&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1020</id>
		<title>FastFiles and Zone files (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1020"/>
		<updated>2015-11-09T22:55:30Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Main FastFile Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
&lt;br /&gt;
== Main FastFile Structure ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 //Note, on PS3 all values are &amp;lt;&amp;lt; 1&lt;br /&gt;
 enum language_t&lt;br /&gt;
 {&lt;br /&gt;
   LANGUAGE_ENGLISH = 0x1,&lt;br /&gt;
   LANGUAGE_FRENCH = 0x2,&lt;br /&gt;
   LANGUAGE_GERMAN = 0x3,&lt;br /&gt;
   LANGUAGE_ITALIAN = 0x4,&lt;br /&gt;
   LANGUAGE_SPANISH = 0x5,&lt;br /&gt;
   LANGUAGE_BRITISH = 0x6,&lt;br /&gt;
   LANGUAGE_RUSSIAN = 0x7,&lt;br /&gt;
   LANGUAGE_POLISH = 0x8,&lt;br /&gt;
   LANGUAGE_KOREAN = 0x9,&lt;br /&gt;
   LANGUAGE_TAIWANESE = 0xA,&lt;br /&gt;
   LANGUAGE_JAPANESE = 0xB,&lt;br /&gt;
   LANGUAGE_CHINESE = 0xC,&lt;br /&gt;
   LANGUAGE_THAI = 0xD,&lt;br /&gt;
   LANGUAGE_LEET = 0xE,&lt;br /&gt;
   LANGUAGE_CZECH = 0xF,&lt;br /&gt;
   MAX_LANGUAGES&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Entry point for the FF.&lt;br /&gt;
 struct DB_Header&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int version;&lt;br /&gt;
   bool allowOnlineUpdate;&lt;br /&gt;
   unsigned __int64 fileCreationTime;&lt;br /&gt;
   language_t region;&lt;br /&gt;
   int entryCount;&lt;br /&gt;
   Entry entries[];&lt;br /&gt;
   int fileSize;&lt;br /&gt;
   int maxFileSize;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;IWff0100&amp;quot; or &amp;quot;IWffu100&amp;quot;. It indicates what is read after maxFileSize. If it is &amp;quot;IWff0100&amp;quot; then this FF is signed. If it is &amp;quot;IWffu100&amp;quot;, then this FF is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the FF, so Modern Warfare 3 FastFiles cannot be loaded on Modern Warfare 2. The Modern Warfare 2 version is 0x10D for console systems and 0x114 for PC.&lt;br /&gt;
 if (version &amp;gt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
 else if (version &amp;lt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
=== AllowOnlineUpdate ===&lt;br /&gt;
Whether or not assets in this FF may be replaced by an FF loaded at a later time.&lt;br /&gt;
=== Entries ===&lt;br /&gt;
These are still not entirely understood. Most FF systems simply parse past them.&lt;br /&gt;
==== Xbox 360 ====&lt;br /&gt;
 for (int32 i = 0; i &amp;lt; 0x0f; i++)&lt;br /&gt;
 {&lt;br /&gt;
   if (((1 &amp;lt;&amp;lt; i) &amp;amp; language) == 0)&lt;br /&gt;
     continue;&lt;br /&gt;
   else&lt;br /&gt;
     ReadBytes(((entryCount &amp;lt;&amp;lt; 1) + entryCount) &amp;lt;&amp;lt; 2);&lt;br /&gt;
 }&lt;br /&gt;
==== PS3 ====&lt;br /&gt;
 readBytes(entryCount * 0x14);&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The fileSize is the size of the FF, everything included. The maxFileSize is the highest number that fileSize can be, and in most FFs they are equal.&lt;br /&gt;
&lt;br /&gt;
== Subheader ==&lt;br /&gt;
The rest of the FF is read depending on what the main FF magic was. If the magic was &amp;quot;IWff0100&amp;quot; then the FF is signed. If it was &amp;quot;IWffu100&amp;quot;, the FF is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
PS3 only supports unsigned fastfiles. For Xbox 360, only single player FastFiles are unsigned. Unsigned FastFiles are very simple. The only data remaining is compressed zlib data. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSubheader&lt;br /&gt;
 {&lt;br /&gt;
   char fastfileName[32];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthXBlock&lt;br /&gt;
 {&lt;br /&gt;
 #ifdef XBOX&lt;br /&gt;
   DB_AuthHash blockSignature[0x100];&lt;br /&gt;
   char blockData[0x200000];&lt;br /&gt;
 #elif defined PS3&lt;br /&gt;
   char blockData[0x10000];&lt;br /&gt;
 #endif&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Sub DB_AuthHeader, continuation on the earlier.&lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   DB_AuthSubHeader subheader;&lt;br /&gt;
   DB_AuthXBlock xBlocks[];&lt;br /&gt;
 };&lt;br /&gt;
The signatures on the XBlocks are checked as the FastFile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures. &lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;IWffs100&amp;quot;.&lt;br /&gt;
==== XBlocks ====&lt;br /&gt;
XBlocks are used until they are no longer needed. If the compressed data can fit into 1, then only 1 will exist.&lt;br /&gt;
== Compression ==&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes, the last block being padded with zeroes if not 0x10000 bytes long. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
&lt;br /&gt;
=== Xbox 360 ===&lt;br /&gt;
Once the zone file is created, the entire zone is compressed using default zlib compression. If the FastFile is unsigned (single player) then the data is simply concatenated to the header. Signed files split the data up into 0x200000 byte XBlocks, each with a 0x2000 byte hash block.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF. &lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The XFile header is loaded first. It contains XBlock sizes to be allocated for g_streamBlocks.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
 XFILE_BLOCK_TEMP	= 0,&lt;br /&gt;
 XFILE_BLOCK_PHYSICAL	= 1,&lt;br /&gt;
 XFILE_BLOCK_RUNTIME	= 2,&lt;br /&gt;
 XFILE_BLOCK_VIRTUAL	= 3,&lt;br /&gt;
 XFILE_BLOCK_LARGE	= 4,&lt;br /&gt;
 XFILE_BLOCK_CALLBACK	= 5,&lt;br /&gt;
#if defined(PC) || defined(PS3)&lt;br /&gt;
 XFILE_BLOCK_VERTEX	= 6,&lt;br /&gt;
 #ifdef PC&lt;br /&gt;
 XFILE_BLOCK_INDEX	= 7,&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
 MAX_XFILE_COUNT&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  int size;&lt;br /&gt;
  int externalSize;&lt;br /&gt;
  int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
After the XFile header is the asset list. The asset list contains a list of script strings and a list of assets. The fastfile compiler creates a rawfile as the last asset which contains any compiler errors (as seen in french code_post_gfx_mp.ff).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type; //See enum below&lt;br /&gt;
  XAssetHeader * header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  int scriptStringCount;&lt;br /&gt;
  const char * * scriptStrings;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== General [[:Category:Assets|Asset]] Information ==&lt;br /&gt;
=== Asset Types ===&lt;br /&gt;
The types of assets loaded are determined by this enum.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; class=&amp;quot;article-table&amp;quot; style=&amp;quot;font-size:13px;line-height:21px;width:500px;height:500px;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Type&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Xbox ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PS3 ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PC ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Is Used&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Max Count&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Size (PC)&lt;br /&gt;
|-&lt;br /&gt;
|physpreset&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|phys_collmap&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x48&lt;br /&gt;
|-&lt;br /&gt;
|xanim&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x58&lt;br /&gt;
|-&lt;br /&gt;
|xmodelsurfs&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x24&lt;br /&gt;
|-&lt;br /&gt;
|xmodel&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|True&lt;br /&gt;
|0x600&lt;br /&gt;
|0x130&lt;br /&gt;
|-&lt;br /&gt;
|material&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x60&lt;br /&gt;
|-&lt;br /&gt;
|pixelshader&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|True&lt;br /&gt;
|0x1FA0&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexshader&lt;br /&gt;
|N/A&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexdecl&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|0x08&lt;br /&gt;
|True&lt;br /&gt;
|0x30&lt;br /&gt;
|0x64&lt;br /&gt;
|-&lt;br /&gt;
|techset&lt;br /&gt;
|0x07&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|True&lt;br /&gt;
|0x300&lt;br /&gt;
|0xCC&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|True&lt;br /&gt;
|0xE00&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|sound&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|True&lt;br /&gt;
|0x3E80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|sndcurve&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x88&lt;br /&gt;
|-&lt;br /&gt;
|loaded_sound&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|True&lt;br /&gt;
|0x546&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|col_map_sp&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|col_map_mp&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|com_map&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|game_map_sp&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x38&lt;br /&gt;
|-&lt;br /&gt;
|game_map_mp&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|map_ents&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|True&lt;br /&gt;
|2&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|fx_map&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x74&lt;br /&gt;
|-&lt;br /&gt;
|gfx_map&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x274&lt;br /&gt;
|-&lt;br /&gt;
|lightdef&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|ui_map&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|font&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|True&lt;br /&gt;
|0x10&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|menufile&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|menu&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|True&lt;br /&gt;
|0x264&lt;br /&gt;
|0x190&lt;br /&gt;
|-&lt;br /&gt;
|localize&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|True&lt;br /&gt;
|0x1B58&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|weapon&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|True&lt;br /&gt;
|0x578&lt;br /&gt;
|0x684&lt;br /&gt;
|-&lt;br /&gt;
|snddriverglobals&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|fx&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|True&lt;br /&gt;
|0x258&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|impactfx&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|True&lt;br /&gt;
|4&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|aitype&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|mptype&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|character&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|xmodelalias&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|rawfile&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|stringtable&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|True&lt;br /&gt;
|0x190&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|leaderboarddef&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|True&lt;br /&gt;
|0x64&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|structureddatadef&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|True&lt;br /&gt;
|0x18&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|tracer&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x70&lt;br /&gt;
|-&lt;br /&gt;
|vehicle&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x2D0&lt;br /&gt;
|-&lt;br /&gt;
|addon_map_ents&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|0x2A&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x24&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1005</id>
		<title>Category:FastFiles</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1005"/>
		<updated>2015-11-01T03:47:12Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FastFiles are the CoD engine&#039;s way of storing Zone files. FastFiles (FFs) almost always have some sort of RSA2048 signature, a zlib compression along the way, and then on later CoDs some encryption. The Zones are a library of [[:Category:Assets|assets]]. Every FF in every CoD game starts the same way...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || char[8] || &amp;quot;IWffu100&amp;quot; for unsigned fastfiles, &amp;quot;IWff0100&amp;quot; for signed fastfiles, &amp;quot;TAff0100&amp;quot; for treyarch&#039;s Black Ops 2 fastfile, and &amp;quot;S1ff0100&amp;quot; for Sledgehammer Advanced Warfare fastfiles.&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x8 || int || See below.&lt;br /&gt;
|}&lt;br /&gt;
So by reading the version of the input FF, you can tell what system and game the FF is from. Note that pre-alpha versions of Call of Duty 4 are missing the version integer, and must be handled specially. Also keep in mind that the Quantum of Solace FFs are missing the magic in the struct above. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| XFILE_VERSION || &#039;&#039;&#039;007:QoS&#039;&#039;&#039; ||&#039;&#039;&#039;CoD4&#039;&#039;&#039;||&#039;&#039;&#039;WaW&#039;&#039;&#039;||&#039;&#039;&#039;MW2&#039;&#039;&#039;||&#039;&#039;&#039;BO1&#039;&#039;&#039;||&#039;&#039;&#039;MW3&#039;&#039;&#039;||&#039;&#039;&#039;BO2&#039;&#039;&#039;||&#039;&#039;&#039;Ghosts&#039;&#039;&#039;||&#039;&#039;&#039;CoD: Online&#039;&#039;&#039;||&#039;&#039;&#039;Advanced Warfare&#039;&#039;&#039;||&#039;&#039;&#039;BO3 Beta&#039;&#039;&#039;||&#039;&#039;&#039;BO3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x253&lt;br /&gt;
|-&lt;br /&gt;
|Playstation 3||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x25E&lt;br /&gt;
|-&lt;br /&gt;
|Wii/Wii-U||0x1D2||0x1A2||0x19B||n/a||0x1DD||0x6B||0x94||0x22E||n/a||n/a||n/a||n/a&lt;br /&gt;
|-&lt;br /&gt;
|PC||0x1D6||0x5||0x183||0x114||0x1D9||0x1||0x93||0x135||0x13C||0x72E||0x1FB||n/a&lt;br /&gt;
|}&lt;br /&gt;
== Pointers in Zone Files ==&lt;br /&gt;
Infinity Ward implemented their own way of loading data that can already be found earlier in the zone file. What should be an address in memory is instead stored either as -1, -2, or as an offset. If the pointer is -1 or -2, than the data follows the header, typically in order. If the pointer is not -1 or -2, the first 4 bits (or 3 bits in BO2) are extracted and used as an index for the g_streamBlocks array. The other bits are the offset and is added to the data pointer in g_streamBlocks. The offset is only correct after the zone file has been loaded in memory. This is because some data is relocated (aligned) which changes the size of the zone. Some differences:&lt;br /&gt;
* strings are aligned by 4 bytes&lt;br /&gt;
* asset headers are stored in pools&lt;br /&gt;
* sound, image, and shader programs are stored in pools&lt;br /&gt;
* zone header is removed&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=952</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=952"/>
		<updated>2015-10-03T21:26:14Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Black Ops &amp;amp; Black Ops II */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the TripleDES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this TripleDES layer it is then plaintext in Black Ops and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code. On Black Ops II in the other hand, it has hard-coded dvars that has a structure stored in the DDL asset.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| safeareaVertical&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedsp&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedmp&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedso&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletesp&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletemp&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
|-&lt;br /&gt;
| percentcompleteso&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MainMenu&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SP&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SO&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MP&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
|-&lt;br /&gt;
| canSkipOffensiveMissions&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
|-&lt;br /&gt;
| rumble&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
|-&lt;br /&gt;
| gpadButtonsConfig&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
|-&lt;br /&gt;
| gpadSticksConfig&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
|-&lt;br /&gt;
| viewedPatchNotesVersion&lt;br /&gt;
| N/A&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=951</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=951"/>
		<updated>2015-10-03T20:54:04Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Black Ops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the 3DES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| safeareaVertical&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedsp&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedmp&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedso&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletesp&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletemp&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
|-&lt;br /&gt;
| percentcompleteso&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MainMenu&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SP&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SO&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MP&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
|-&lt;br /&gt;
| canSkipOffensiveMissions&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
|-&lt;br /&gt;
| rumble&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
|-&lt;br /&gt;
| gpadButtonsConfig&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
|-&lt;br /&gt;
| gpadSticksConfig&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
|-&lt;br /&gt;
| viewedPatchNotesVersion&lt;br /&gt;
| N/A&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=DDL_Asset&amp;diff=950</id>
		<title>DDL Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=DDL_Asset&amp;diff=950"/>
		<updated>2015-09-30T04:42:04Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Source Format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
The DDL asset is Treyarch&#039;s equivalent to IW&#039;s structureddatadef asset and is used to store structure information. As such it only appears in Black Ops 1 and Black Ops 2. The acronym that &amp;quot;ddl&amp;quot; represents (Data Definition Language most likely, Data Definition Library, Dynamic Data Library?) is currently unknown.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum ddlPrimitiveTypes_e : unsigned int&lt;br /&gt;
{&lt;br /&gt;
  DDL_INVALID_TYPE = 0xFFFFFFFF,&lt;br /&gt;
  DDL_BYTE_TYPE = 0x0,&lt;br /&gt;
  DDL_SHORT_TYPE = 0x1,&lt;br /&gt;
  DDL_UINT_TYPE = 0x2,&lt;br /&gt;
  DDL_INT_TYPE = 0x3,&lt;br /&gt;
  DDL_INT64_TYPE = 0x4,&lt;br /&gt;
  DDL_FLOAT_TYPE = 0x5,&lt;br /&gt;
  DDL_FIXEDPOINT_TYPE = 0x6,&lt;br /&gt;
  DDL_STRING_TYPE = 0x7,&lt;br /&gt;
  DDL_STRUCT_TYPE = 0x8,&lt;br /&gt;
  DDL_ENUM_TYPE = 0x9&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ddlHash_t&lt;br /&gt;
{&lt;br /&gt;
  int hash;&lt;br /&gt;
  int index;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ddlEnumDef_t&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  int memberCount;&lt;br /&gt;
  const char **members;&lt;br /&gt;
#ifdef BO2&lt;br /&gt;
  ddlHash_t *hashTable;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ddlMemberDef_t&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  int size;&lt;br /&gt;
  int offset;&lt;br /&gt;
  ddlPrimitiveTypes_e type;&lt;br /&gt;
  int externalIndex;&lt;br /&gt;
  unsigned int rangeLimit;&lt;br /&gt;
  unsigned int serverDelta;&lt;br /&gt;
  unsigned int clientDelta;&lt;br /&gt;
  int arraySize;&lt;br /&gt;
  int enumIndex;&lt;br /&gt;
  int permission;&lt;br /&gt;
#ifdef BO1&lt;br /&gt;
  int unknown3;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ddlStructDef_t&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  int size;&lt;br /&gt;
  int memberCount;&lt;br /&gt;
  ddlMemberDef_t *members;&lt;br /&gt;
#ifdef BO2&lt;br /&gt;
  ddlHash_t *hashTable;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ddlDef_t&lt;br /&gt;
{&lt;br /&gt;
  int version;&lt;br /&gt;
  int size;&lt;br /&gt;
  ddlStructDef_t *structList;&lt;br /&gt;
  int structCount;&lt;br /&gt;
  ddlEnumDef_t *enumList;&lt;br /&gt;
  int enumCount;&lt;br /&gt;
  ddlDef_t *next;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ddlRoot_t&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  ddlDef_t *ddlDef;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Source Format ==&lt;br /&gt;
The current public source format for DDLs is no good for the modding scene. It is similar to a string table with the name of the entries and their maximum and minimum values. A more useful format would be similar to the structureddatadefs with a structure and enums. DDLs are defined at &amp;quot;ddl/&amp;quot; for SP and shared DDLs, and at &amp;quot;ddl_mp/&amp;quot; for MP DDLs.&lt;br /&gt;
&lt;br /&gt;
First enums must be dumped. These are very simple with each EnumEntry an individual enum and having a single string in the entries for each member of the enum.&lt;br /&gt;
&lt;br /&gt;
Structures are the second and last item to be dumped. Each StructEntry is a structure to be used, and each MemberEntry is an item in the structure. Keep in mind that while IW&#039;s structureddatadef used normal lengths and byte offsets, the DDL uses bit offset/lengths and aligns almost nothing. Dumping the DDL should be fairly obvious when compared to the structureddatadef.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=936</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=936"/>
		<updated>2015-07-05T18:56:24Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntryHash&lt;br /&gt;
{&lt;br /&gt;
	char hash[16]; // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;SndAssetBankEntryHash[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
        char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned int SND_AssetBankGetFrameRate(SndAssetBankEntry *entry) {&lt;br /&gt;
        int frameRate;&lt;br /&gt;
&lt;br /&gt;
        if (!entry)&lt;br /&gt;
            break;&lt;br /&gt;
        &lt;br /&gt;
        switch (entry-&amp;gt;frameRateIndex) {&lt;br /&gt;
                case 0: frameRate = 8000; break;&lt;br /&gt;
                case 1: frameRate = 12000; break;&lt;br /&gt;
                case 2: frameRate = 16000; break;&lt;br /&gt;
                case 3: frameRate = 24000; break;&lt;br /&gt;
                case 4: frameRate = 32000; break;&lt;br /&gt;
                case 5: frameRate = 44100; break;&lt;br /&gt;
                case 6: frameRate = 48000; break;&lt;br /&gt;
                case 7: frameRate = 96000; break;&lt;br /&gt;
                case 8: frameRate = 192000; break;&lt;br /&gt;
                default:&lt;br /&gt;
                  frameRate = 0;&lt;br /&gt;
                  break;&lt;br /&gt;
        }&lt;br /&gt;
        return frameRate;&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
unsigned int SND_AssetBankGetLengthMs(SndAssetBankEntry *entry) {&lt;br /&gt;
        if (!entry)&lt;br /&gt;
            break;&lt;br /&gt;
        &lt;br /&gt;
        return 1000 * entry-&amp;gt;frameCount / SND_AssetBankGetFrameRate(entry);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=933</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=933"/>
		<updated>2015-07-03T22:15:21Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntryHash&lt;br /&gt;
{&lt;br /&gt;
	char hash[16]; // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;SndAssetBankEntryHash[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
        char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned int SND_AssetBankGetFrameRate(SndAssetBankEntry *entry) {&lt;br /&gt;
        int frameRate;&lt;br /&gt;
&lt;br /&gt;
        if (!entry)&lt;br /&gt;
            break;&lt;br /&gt;
        &lt;br /&gt;
        switch (entry-&amp;gt;frameRateIndex) {&lt;br /&gt;
                case 0: frameRate = 8000; break;&lt;br /&gt;
                case 1: frameRate = 12000; break;&lt;br /&gt;
                case 2: frameRate = 16000; break;&lt;br /&gt;
                case 3: frameRate = 24000; break;&lt;br /&gt;
                case 4: frameRate = 32000; break;&lt;br /&gt;
                case 5: frameRate = 44100; break;&lt;br /&gt;
                case 6: frameRate = 48000; break;&lt;br /&gt;
                case 7: frameRate = 96000; break;&lt;br /&gt;
                case 8: frameRate = 192000; break;&lt;br /&gt;
                default:&lt;br /&gt;
                  frameRate = 0;&lt;br /&gt;
                  break;&lt;br /&gt;
        }&lt;br /&gt;
        return frameRate&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
unsigned int SND_AssetBankGetLengthMs(SndAssetBankEntry *entry) {&lt;br /&gt;
        if (!entry)&lt;br /&gt;
            break;&lt;br /&gt;
        &lt;br /&gt;
        return 1000 * entry-&amp;gt;frameCount / SND_AssetBankGetFrameRate(entry)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=932</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=932"/>
		<updated>2015-07-03T22:13:45Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntryHash&lt;br /&gt;
{&lt;br /&gt;
	char hash[16]; // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;SndAssetBankEntryHash[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
        char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned int SND_AssetbankGetFrameRate(SndAssetBankEntry *entry) {&lt;br /&gt;
        int frameRate;&lt;br /&gt;
&lt;br /&gt;
        if (!entry)&lt;br /&gt;
            break;&lt;br /&gt;
        &lt;br /&gt;
        switch (entry-&amp;gt;frameRateIndex) {&lt;br /&gt;
                case 0: frameRate = 8000; break;&lt;br /&gt;
                case 1: frameRate = 12000; break;&lt;br /&gt;
                case 2: frameRate = 16000; break;&lt;br /&gt;
                case 3: frameRate = 24000; break;&lt;br /&gt;
                case 4: frameRate = 32000; break;&lt;br /&gt;
                case 5: frameRate = 44100; break;&lt;br /&gt;
                case 6: frameRate = 48000; break;&lt;br /&gt;
                case 7: frameRate = 96000; break;&lt;br /&gt;
                case 8: frameRate = 192000; break;&lt;br /&gt;
                default:&lt;br /&gt;
                  frameRate = 0;&lt;br /&gt;
                  break;&lt;br /&gt;
        }&lt;br /&gt;
        return frameRate&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
unsigned int SND_AssetBankGetLengthMs(SndAssetBankEntry *entry) {&lt;br /&gt;
        if (!entry)&lt;br /&gt;
            break;&lt;br /&gt;
        &lt;br /&gt;
        return 1000 * entry-&amp;gt;frameCount / SND_AssetBankGetFrameRate(entry)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=931</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=931"/>
		<updated>2015-07-03T22:12:51Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntryHash&lt;br /&gt;
{&lt;br /&gt;
	char hash[16]; // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;SndAssetBankEntryHash[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
        char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned int SND_AssetbankGetFrameRate(SndAssetBankEntry *entry) {&lt;br /&gt;
        int frameRate;&lt;br /&gt;
&lt;br /&gt;
        if (!entry)&lt;br /&gt;
            break;&lt;br /&gt;
        &lt;br /&gt;
        switch (entry-&amp;gt;frameRateIndex) {&lt;br /&gt;
                case 0: frameRate = 8000; break;&lt;br /&gt;
                case 1: frameRate = 12000; break;&lt;br /&gt;
                case 2: frameRate = 16000; break;&lt;br /&gt;
                case 3: frameRate = 24000; break;&lt;br /&gt;
                case 4: frameRate = 32000; break;&lt;br /&gt;
                case 5: frameRate = 44100; break;&lt;br /&gt;
                case 6: frameRate = 48000; break;&lt;br /&gt;
                case 7: frameRate = 96000; break;&lt;br /&gt;
                case 8: frameRate = 192000; break;&lt;br /&gt;
                default:&lt;br /&gt;
                  frameRate = 0;&lt;br /&gt;
                  break;&lt;br /&gt;
        }&lt;br /&gt;
        return frameRate&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
unsigned int SND_AssetBankGetLengthMs(SndAssetBankEntry *entry) {&lt;br /&gt;
        if (!entry)&lt;br /&gt;
            break;&lt;br /&gt;
        &lt;br /&gt;
        return 1000 * entry-&amp;gt;frameCount / SND_AssetBankGetFrameRate(entry)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&lt;br /&gt;
Note that &amp;quot;frameRate&amp;quot; is the actual frame rate value from the table and not the index/flag value from the structure.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=930</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=930"/>
		<updated>2015-07-03T21:58:02Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static const int frame_rate_table[] = { &lt;br /&gt;
  0, 8000, 12000, 16000, 24000,&lt;br /&gt;
  32000, 44100, 48000, 96000, 192000 &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntryHash&lt;br /&gt;
{&lt;br /&gt;
	char hash[16]; // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;SndAssetBankEntryHash[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
	char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
 durationInMilliseconds = 1000 * frameCount / frameRate;&lt;br /&gt;
Note that &amp;quot;frameRate&amp;quot; is the actual frame rate value from the table and not the index/flag value from the structure.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=929</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=929"/>
		<updated>2015-07-03T18:51:10Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Common */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the 3DES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
| safeareaVertical&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
| 0x8&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedsp&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
| 0x9&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedmp&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
| 0xA&lt;br /&gt;
|-&lt;br /&gt;
| timeplayedso&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
| 0xB&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletesp&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
| 0xC&lt;br /&gt;
|-&lt;br /&gt;
| percentcompletemp&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
| 0xD&lt;br /&gt;
|-&lt;br /&gt;
| percentcompleteso&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
| 0xE&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MainMenu&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
| 0xF&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SP&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_SO&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
| 0x11&lt;br /&gt;
|-&lt;br /&gt;
| hasEverPlayed_MP&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
| 0x12&lt;br /&gt;
|-&lt;br /&gt;
| canSkipOffensiveMissions&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
| 0x13&lt;br /&gt;
|-&lt;br /&gt;
| rumble&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
| 0x14&lt;br /&gt;
|-&lt;br /&gt;
| gpadButtonsConfig&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
| 0x16&lt;br /&gt;
|-&lt;br /&gt;
| gpadSticksConfig&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
| 0x17&lt;br /&gt;
|-&lt;br /&gt;
| viewedPatchNotesVersion&lt;br /&gt;
| N/A&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
| 0x18&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=927</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=927"/>
		<updated>2015-06-25T05:33:18Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static const int frame_rate_table[] = { &lt;br /&gt;
  8000, &lt;br /&gt;
  12000,&lt;br /&gt;
  16000,&lt;br /&gt;
  24000,&lt;br /&gt;
  32000,&lt;br /&gt;
  44100,&lt;br /&gt;
  48000,&lt;br /&gt;
  96000,&lt;br /&gt;
  192000 &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntryHash&lt;br /&gt;
{&lt;br /&gt;
	char hash[16]; // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;SndAssetBankEntryHash[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
	char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
 durationInMilliseconds = 1000 * frameCount / frameRate;&lt;br /&gt;
Note that &amp;quot;frameRate&amp;quot; is the actual frame rate value from the table and not the index/flag value from the structure.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=926</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=926"/>
		<updated>2015-06-25T05:17:58Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static const int frame_rate_table[] = { &lt;br /&gt;
  8000, &lt;br /&gt;
  12000,&lt;br /&gt;
  16000,&lt;br /&gt;
  24000,&lt;br /&gt;
  32000,&lt;br /&gt;
  44100,&lt;br /&gt;
  48000,&lt;br /&gt;
  96000,&lt;br /&gt;
  192000 &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntryHash&lt;br /&gt;
{&lt;br /&gt;
	char hash[16]; // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;hash_entry_t[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
	char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
 durationInMilliseconds = 1000 * frameCount / frameRate;&lt;br /&gt;
Note that &amp;quot;frameRate&amp;quot; is the actual frame rate value from the table and not the index/flag value from the structure.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=925</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=925"/>
		<updated>2015-06-25T05:17:18Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static const int frame_rate_table[] = { &lt;br /&gt;
  8000, &lt;br /&gt;
  12000,&lt;br /&gt;
  16000,&lt;br /&gt;
  24000,&lt;br /&gt;
  32000,&lt;br /&gt;
  44100,&lt;br /&gt;
  48000,&lt;br /&gt;
  96000,&lt;br /&gt;
  192000 &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntryHash&lt;br /&gt;
{&lt;br /&gt;
	u8 hash[16]; // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;hash_entry_t[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
	char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
 durationInMilliseconds = 1000 * frameCount / frameRate;&lt;br /&gt;
Note that &amp;quot;frameRate&amp;quot; is the actual frame rate value from the table and not the index/flag value from the structure.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=924</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=924"/>
		<updated>2015-06-25T04:37:39Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct hash_entry_t&lt;br /&gt;
{&lt;br /&gt;
	u8 md5[0x10];                   // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_CHANNEL_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static const int frame_rate_table[] = { &lt;br /&gt;
  8000, &lt;br /&gt;
  12000,&lt;br /&gt;
  16000,&lt;br /&gt;
  24000,&lt;br /&gt;
  32000,&lt;br /&gt;
  44100,&lt;br /&gt;
  48000,&lt;br /&gt;
  96000,&lt;br /&gt;
  192000 &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;hash_entry_t[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
	char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
 durationInMilliseconds = 1000 * frameCount / frameRate;&lt;br /&gt;
Note that &amp;quot;frameRate&amp;quot; is the actual frame rate value from the table and not the index/flag value from the structure.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=923</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=923"/>
		<updated>2015-06-25T04:36:51Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct hash_entry_t&lt;br /&gt;
{&lt;br /&gt;
	u8 md5[0x10];                   // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_channel_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static const int frame_rate_table[] = { &lt;br /&gt;
  8000, &lt;br /&gt;
  12000,&lt;br /&gt;
  16000,&lt;br /&gt;
  24000,&lt;br /&gt;
  32000,&lt;br /&gt;
  44100,&lt;br /&gt;
  48000,&lt;br /&gt;
  96000,&lt;br /&gt;
  192000 &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	             // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	             // see frame_rate_table&lt;br /&gt;
	snd_asset_channel_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;hash_entry_t[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
	char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
 durationInMilliseconds = 1000 * frameCount / frameRate;&lt;br /&gt;
Note that &amp;quot;frameRate&amp;quot; is the actual frame rate value from the table and not the index/flag value from the structure.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=922</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=922"/>
		<updated>2015-06-25T04:18:26Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct hash_entry_t&lt;br /&gt;
{&lt;br /&gt;
	u8 md5[0x10];                   // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_mode&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_MODE_MONO = 0x1,&lt;br /&gt;
  SND_ASSET_MODE_DUAL = 0x2,&lt;br /&gt;
  // Could be more modes ex: (&amp;quot;Joint Stereo&amp;quot; and &amp;quot;Stereo&amp;quot;)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static const int frame_rate_table[] = { &lt;br /&gt;
  8000, &lt;br /&gt;
  12000,&lt;br /&gt;
  16000,&lt;br /&gt;
  24000,&lt;br /&gt;
  32000,&lt;br /&gt;
  44100,&lt;br /&gt;
  48000,&lt;br /&gt;
  96000,&lt;br /&gt;
  192000 &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 	     // this is a hash of the name. Name Found in SndBank asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 	     // see frame_rate_table&lt;br /&gt;
	snd_asset_mode channelCount; // enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 	      // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version;         // 0x0E&lt;br /&gt;
	unsigned int entrySize;       // 0x14&lt;br /&gt;
	unsigned int checksumSize;    // 0x10&lt;br /&gt;
	unsigned int dependencySize;  // 0x40&lt;br /&gt;
	unsigned int entryCount;      // Amount of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; // Always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 	      // Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 	      // &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset;       // &amp;amp;hash_entry_t[0]&lt;br /&gt;
	char checksumChecksum[16];    // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
	char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
 durationInMilliseconds = 1000 * frameCount / frameRate;&lt;br /&gt;
Note that &amp;quot;frameRate&amp;quot; is the actual frame rate value from the table and not the index/flag value from the structure.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=921</id>
		<title>SABS &amp; SABL Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=SABS_%26_SABL_Files&amp;diff=921"/>
		<updated>2015-06-25T03:39:04Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
SAB(Stream) and SAB(Load). The B is most likely &amp;quot;bank&amp;quot; as the game code refers to a &amp;quot;sound bank&amp;quot; when loading SABL/SABS files. &lt;br /&gt;
&lt;br /&gt;
* SABS = Snd Asset Bank Stream&lt;br /&gt;
* SABL = Snd Asset Bank Load&lt;br /&gt;
== Structure ==&lt;br /&gt;
Thanks to Jakes625, Red-EyeX32, master131, and kokole.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct hash_entry_t&lt;br /&gt;
{&lt;br /&gt;
	u8 md5[0x10];                   // md5 of the audio file&lt;br /&gt;
}; // 0x10&lt;br /&gt;
&lt;br /&gt;
enum snd_asset_format&lt;br /&gt;
{&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS16 = 0x0,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS24 = 0x1,&lt;br /&gt;
  SND_ASSET_FORMAT_PCMS32 = 0x2,&lt;br /&gt;
  SND_ASSET_FORMAT_IEEE = 0x3,&lt;br /&gt;
  SND_ASSET_FORMAT_XMA4 = 0x4,&lt;br /&gt;
  SND_ASSET_FORMAT_MP3 = 0x5,&lt;br /&gt;
  SND_ASSET_FORMAT_MSADPCM = 0x6,&lt;br /&gt;
  SND_ASSET_FORMAT_WMA = 0x7,&lt;br /&gt;
  SND_ASSET_FORMAT_FLAC = 0x8,&lt;br /&gt;
  SND_ASSET_FORMAT_WIIUADPCM = 0x9,&lt;br /&gt;
  SND_ASSET_FORMAT_MPC = 0xA,&lt;br /&gt;
  SND_ASSET_FORMAT_COUNT = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
frameRateTable = { 8000, 12000, 16000, 24000, 32000, 44100, 48000, 96000, 192000 };&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankEntry&lt;br /&gt;
{&lt;br /&gt;
	unsigned int id; 			// this is a hash of the name. Name Found in SndAlias asset in ff&lt;br /&gt;
        unsigned int size;&lt;br /&gt;
	unsigned int offset;&lt;br /&gt;
	unsigned int frameCount; &lt;br /&gt;
	char frameRateIndex; 			// see frameRateTable&lt;br /&gt;
	char channelCount; 		// enum 0x1 = mono 0x2 = dual&lt;br /&gt;
	char looping;&lt;br /&gt;
	snd_asset_format format;&lt;br /&gt;
}; // 0x14&lt;br /&gt;
&lt;br /&gt;
struct SndAssetBankHeader&lt;br /&gt;
{&lt;br /&gt;
	unsigned int magic; 		        // &amp;quot;2UX#&amp;quot;&lt;br /&gt;
	unsigned int version; 		        // 0x0E&lt;br /&gt;
	unsigned int entrySize;           // 0x14&lt;br /&gt;
	unsigned int checksumSize;            // 0x10&lt;br /&gt;
	unsigned int dependencySize;          // 0x40&lt;br /&gt;
	unsigned int entryCount; 		// number of sound entries NOT NAME ENTRIES&lt;br /&gt;
	unsigned int dependencyCount; 			// always 0x8 for some reason, might be the size of the next 3 fields&lt;br /&gt;
	unsigned int pad32;&lt;br /&gt;
	__int64 fileSize; 		// Size of the whole file&lt;br /&gt;
	__int64 entryOffset; 			// &amp;amp;SndAssetBankEntry[0]&lt;br /&gt;
	__int64 checksumOffset; 			// &amp;amp;hash_entry_t[0]&lt;br /&gt;
	char checksumChecksum[16];         // 16 bytes which are associated between sabs + 0x38 and soundasset + 0x830 (can be &amp;gt; 0x830)&lt;br /&gt;
	char dependencies[512];&lt;br /&gt;
	char padding[1464];&lt;br /&gt;
}; // 0x800&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To calculate the duration of an audio entry:&lt;br /&gt;
 durationInMilliseconds = 1000 * frameCount / frameRate;&lt;br /&gt;
Note that &amp;quot;frameRate&amp;quot; is the actual frame rate value from the table and not the index/flag value from the structure.&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=906</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=906"/>
		<updated>2015-05-05T04:34:17Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Call of Duty: Classic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the 3DES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=904</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=904"/>
		<updated>2015-05-04T00:52:02Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Common */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the 3DES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;!-- TODO: finish this later, after all id&#039;s have been found.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Settings&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW2&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|MW3&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Ghosts&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|AW&lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
!ID&lt;br /&gt;
|-&lt;br /&gt;
| invertPitch&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0&lt;br /&gt;
|-&lt;br /&gt;
| autoAim&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
| 0x1&lt;br /&gt;
|-&lt;br /&gt;
| viewSensitivity&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
| 0x2&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaHorz&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
| 0x3&lt;br /&gt;
|-&lt;br /&gt;
| safeAreaVert&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
| 0x4&lt;br /&gt;
|-&lt;br /&gt;
| blacklevel&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
| 0x5&lt;br /&gt;
|-&lt;br /&gt;
| volume&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
| 0x6&lt;br /&gt;
|-&lt;br /&gt;
| safeareaHorizontal&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
| 0x7&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLenLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=903</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=903"/>
		<updated>2015-05-04T00:00:34Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Singleplayer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the 3DES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheat_points = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  cg_subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  sv_lastSaveGame = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLenLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=902</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=902"/>
		<updated>2015-05-03T22:47:01Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the 3DES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc... &lt;br /&gt;
&lt;br /&gt;
For each entry, first a 32 bit integer is stored as an id. After that, the value is stored. The values are stored like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The id&#039;s are listed below.&lt;br /&gt;
==== Ghosts ====&lt;br /&gt;
&amp;lt;!-- TODO: redo as table (each console may be different) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Actually both consoles are the same --&amp;gt;&lt;br /&gt;
===== Common =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileCommonSettings&lt;br /&gt;
{&lt;br /&gt;
  invertPitch = 0x0,&lt;br /&gt;
  autoAim = 0x1,&lt;br /&gt;
  viewSensitivity = 0x2,&lt;br /&gt;
  safeAreaHorz = 0x3,&lt;br /&gt;
  safeAreaVert = 0x4,&lt;br /&gt;
  blacklevel = 0x5,&lt;br /&gt;
  volume = 0x6,&lt;br /&gt;
  safeareaHorizontal = 0x7,&lt;br /&gt;
  safeareaVertical = 0x8,&lt;br /&gt;
  timeplayedsp = 0x9,&lt;br /&gt;
  timeplayedmp = 0xA,&lt;br /&gt;
  timeplayedso = 0xB,&lt;br /&gt;
  percentcompletesp = 0xC,&lt;br /&gt;
  percentcompletemp = 0xD,&lt;br /&gt;
  percentcompleteso = 0xE,&lt;br /&gt;
  hasEverPlayed_MainMenu = 0xF,&lt;br /&gt;
  hasEverPlayed_SP = 0x10,&lt;br /&gt;
  hasEverPlayed_SO = 0x11,&lt;br /&gt;
  hasEverPlayed_MP = 0x12,&lt;br /&gt;
  canSkipOffensiveMissions = 0x13,&lt;br /&gt;
  rumble = 0x14,&lt;br /&gt;
  // unused&lt;br /&gt;
  gpadButtonsConfig = 0x16,&lt;br /&gt;
  gpadSticksConfig = 0x17,&lt;br /&gt;
  viewedPatchNotesVersion = 0x18,&lt;br /&gt;
  viewedGameInfosVersion = 0x19,&lt;br /&gt;
  cardIcon = 0x1A,&lt;br /&gt;
  cardTitle = 0x1B,&lt;br /&gt;
  experience_MP = 0x1C,&lt;br /&gt;
  experience_Aliens = 0x1D,&lt;br /&gt;
  prestige_MP = 0x1E,&lt;br /&gt;
  prestige_Aliens = 0x1F,&lt;br /&gt;
  iconUnlocked = 0x20,&lt;br /&gt;
  titleUnlocked = 0x21,&lt;br /&gt;
  iconNew = 0x22,&lt;br /&gt;
  titleNew = 0x23,&lt;br /&gt;
  unlock = 0x24,&lt;br /&gt;
  unlockNew = 0x25,&lt;br /&gt;
  clanPrefix = 0x26,&lt;br /&gt;
  leanEnabled = 0x27,&lt;br /&gt;
  useEliteClanTag = 0x28,&lt;br /&gt;
  eliteClanTagText = 0x29,&lt;br /&gt;
  eliteClanLevel = 0x2A,&lt;br /&gt;
  initialGameMode = 0x2B,&lt;br /&gt;
  // unknown&lt;br /&gt;
  facebook = 0x2D,&lt;br /&gt;
  unlockedAliens = 0x2E,&lt;br /&gt;
  renderColorBlind = 0x2F,&lt;br /&gt;
  // unused&lt;br /&gt;
  // unused&lt;br /&gt;
  firstTimePlayedSPTime = 0x32,&lt;br /&gt;
  knowsAboutAliens = 0x33,&lt;br /&gt;
  speechReduced = 0x34,&lt;br /&gt;
  COMMON_SETTINGS_TOTAL_COUNT = 0x35,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Multiplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // MP&lt;br /&gt;
{&lt;br /&gt;
  playlist = 0x0,&lt;br /&gt;
  voiceSpeakerGain = 0x1,&lt;br /&gt;
  spareBool0 = 0x2,&lt;br /&gt;
  spareBool1 = 0x3,&lt;br /&gt;
  spareBool2 = 0x4,&lt;br /&gt;
  spareBool3 = 0x5,&lt;br /&gt;
  spareBool4 = 0x6,&lt;br /&gt;
  spareBool5 = 0x7,&lt;br /&gt;
  spareBool6 = 0x8,&lt;br /&gt;
  spareBool7 = 0x9,&lt;br /&gt;
  spareBool8 = 0xA,&lt;br /&gt;
  spareBool9 = 0xB,&lt;br /&gt;
  spareBool10 = 0xC,&lt;br /&gt;
  spareBool11 = 0xD,&lt;br /&gt;
  spareBool12 = 0xE,&lt;br /&gt;
  spareBool13 = 0xF,&lt;br /&gt;
  spareBool14 = 0x10,&lt;br /&gt;
  spareBool15 = 0x11,&lt;br /&gt;
  motd = 0x12,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Singleplayer =====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileExeSettings // SP&lt;br /&gt;
{&lt;br /&gt;
  difficulty = 0x0,&lt;br /&gt;
  takeCoverWarnings = 0x1,&lt;br /&gt;
  cheatPoints = 0x2,&lt;br /&gt;
  intelp1 = 0x3,&lt;br /&gt;
  intelp2 = 0x4,&lt;br /&gt;
  subtitles = 0x5,&lt;br /&gt;
  highestMission = 0x6,&lt;br /&gt;
  missionspecops = 0x7,&lt;br /&gt;
  // 0x20 array of unknown (unused?) ints&lt;br /&gt;
  motd = 0x28,&lt;br /&gt;
  missionhighestdifficulty = 0x29,&lt;br /&gt;
  missionsohighestdifficulty = 0x2A,&lt;br /&gt;
  savefile = 0x2B,&lt;br /&gt;
  EXE_SETTINGS_TOTAL_COUNT = 0x2C,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLenLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=898</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=898"/>
		<updated>2015-04-01T05:40:23Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Black Ops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the 3DES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
3DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLenLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=897</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=897"/>
		<updated>2015-04-01T05:39:56Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Black Ops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the 3DES-CBC algorithm.&lt;br /&gt;
&lt;br /&gt;
Triple DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triple DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLenLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(AW)&amp;diff=896</id>
		<title>FastFiles and Zone files (AW)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(AW)&amp;diff=896"/>
		<updated>2015-03-31T04:40:40Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Signed Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:AW]]&lt;br /&gt;
&lt;br /&gt;
== FastFile Structure ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum DB_CompressorType&lt;br /&gt;
{&lt;br /&gt;
  DB_COMPRESSOR_INVALID = 0xFFFFFFFF,&lt;br /&gt;
  DB_COMPRESSOR_ZLIB = 0x1,&lt;br /&gt;
  DB_COMPRESSOR_LZX = 0x2,&lt;br /&gt;
  DB_COMPRESSOR_PASSTHROUGH = 0x3,&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct GfxImageStreamData&lt;br /&gt;
{&lt;br /&gt;
  int unknown[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct FF_Header&lt;br /&gt;
{&lt;br /&gt;
  char magic[8]; // S1ff0100&lt;br /&gt;
  int version;&lt;br /&gt;
  bool compress;&lt;br /&gt;
  DB_CompressorType compressType;&lt;br /&gt;
  char sizeOfPointer;&lt;br /&gt;
  char sizeOfLong;&lt;br /&gt;
  int fileTimeHigh;&lt;br /&gt;
  int fileTimeLow;&lt;br /&gt;
  int imageCount;&lt;br /&gt;
  GfxImageStreamData imageData[imageCount];&lt;br /&gt;
  int baseFileLen;&lt;br /&gt;
  int totalFileLen;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;S1ff0100&amp;quot; or &amp;quot;S1ffu100&amp;quot;. It        indicates what is read after maxFileSize. If it is &amp;quot;S1ff0100&amp;quot; then this fastfile is signed. If it is &amp;quot;S1ffu100&amp;quot;, then this fastfile is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the fastfile, so Ghosts fastfiles cannot be loaded on Advanced Warfare. The Advanced Warfare version is 0x72E for the Playstation 3 and Xbox 360 consoles, and the same for PC.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 if (version &amp;gt; 0x72E)&lt;br /&gt;
  Com_Error(ERR_DROP, &amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, filename, version, 0x72E);&lt;br /&gt;
 else if (version &amp;lt; 0x72E)&lt;br /&gt;
  Com_Error(ERR_DROP, &amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, filename, version, 0x72E);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Compress ===&lt;br /&gt;
Whether or not the zone is compressed inside the fastfile.&lt;br /&gt;
=== Image Data ===&lt;br /&gt;
These are still not entirely understood.&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The baseFileLen is the size of the fastfile, everything included. The totalFileLen is the highest number that baseFileLen can be, and in most fastfiles they are equal.&lt;br /&gt;
== Sub Header ==&lt;br /&gt;
The rest of the fastfile is read depending on what the main fastfile magic was. If the magic was &amp;quot;S1ff0100&amp;quot; then the fastfile is signed. If it was &amp;quot;S1ffu100&amp;quot;, the fastfile is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
The only data remaining is compressed data, depending on the enum in the header of the fastfile. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignature&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8]; // S1ffS100&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignature signedSubheaderHash;&lt;br /&gt;
   struct &lt;br /&gt;
   { &lt;br /&gt;
     char fastfileName[32];&lt;br /&gt;
     int reserved;&lt;br /&gt;
     DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
   } subheader;&lt;br /&gt;
   char signatureBlock[0x1E030];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the fastfile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures.&lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;S1ffS100&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF.&lt;br /&gt;
=== Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define XFILE_BLOCK_TEMP 0x0&lt;br /&gt;
#define XFILE_BLOCK_PHYSICAL 0x1&lt;br /&gt;
#define XFILE_BLOCK_RUNTIME 0x2&lt;br /&gt;
#define XFILE_BLOCK_VIRTUAL 0x3&lt;br /&gt;
#define XFILE_BLOCK_LARGE 0x4&lt;br /&gt;
#define XFILE_BLOCK_CALLBACK 0x5&lt;br /&gt;
#define XFILE_BLOCK_SCRIPT 0x6&lt;br /&gt;
#define MAX_XFILE_COUNT 0x7&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
  #define MAX_XFILE_COUNT 0x8&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  unsigned int size;&lt;br /&gt;
  unsigned int externalSize;&lt;br /&gt;
  unsigned int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type;&lt;br /&gt;
  XAssetHeader header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ScriptStringList&lt;br /&gt;
{&lt;br /&gt;
  int count;&lt;br /&gt;
  const char **strings;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  ScriptStringList stringList;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
  XGlobals *globals;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(AW)&amp;diff=895</id>
		<title>FastFiles and Zone files (AW)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(AW)&amp;diff=895"/>
		<updated>2015-03-31T04:39:41Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Signed Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:AW]]&lt;br /&gt;
&lt;br /&gt;
== FastFile Structure ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum DB_CompressorType&lt;br /&gt;
{&lt;br /&gt;
  DB_COMPRESSOR_INVALID = 0xFFFFFFFF,&lt;br /&gt;
  DB_COMPRESSOR_ZLIB = 0x1,&lt;br /&gt;
  DB_COMPRESSOR_LZX = 0x2,&lt;br /&gt;
  DB_COMPRESSOR_PASSTHROUGH = 0x3,&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct GfxImageStreamData&lt;br /&gt;
{&lt;br /&gt;
  int unknown[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct FF_Header&lt;br /&gt;
{&lt;br /&gt;
  char magic[8]; // S1ff0100&lt;br /&gt;
  int version;&lt;br /&gt;
  bool compress;&lt;br /&gt;
  DB_CompressorType compressType;&lt;br /&gt;
  char sizeOfPointer;&lt;br /&gt;
  char sizeOfLong;&lt;br /&gt;
  int fileTimeHigh;&lt;br /&gt;
  int fileTimeLow;&lt;br /&gt;
  int imageCount;&lt;br /&gt;
  GfxImageStreamData imageData[imageCount];&lt;br /&gt;
  int baseFileLen;&lt;br /&gt;
  int totalFileLen;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;S1ff0100&amp;quot; or &amp;quot;S1ffu100&amp;quot;. It        indicates what is read after maxFileSize. If it is &amp;quot;S1ff0100&amp;quot; then this fastfile is signed. If it is &amp;quot;S1ffu100&amp;quot;, then this fastfile is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the fastfile, so Ghosts fastfiles cannot be loaded on Advanced Warfare. The Advanced Warfare version is 0x72E for the Playstation 3 and Xbox 360 consoles, and the same for PC.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 if (version &amp;gt; 0x72E)&lt;br /&gt;
  Com_Error(ERR_DROP, &amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, filename, version, 0x72E);&lt;br /&gt;
 else if (version &amp;lt; 0x72E)&lt;br /&gt;
  Com_Error(ERR_DROP, &amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, filename, version, 0x72E);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Compress ===&lt;br /&gt;
Whether or not the zone is compressed inside the fastfile.&lt;br /&gt;
=== Image Data ===&lt;br /&gt;
These are still not entirely understood.&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The baseFileLen is the size of the fastfile, everything included. The totalFileLen is the highest number that baseFileLen can be, and in most fastfiles they are equal.&lt;br /&gt;
== Sub Header ==&lt;br /&gt;
The rest of the fastfile is read depending on what the main fastfile magic was. If the magic was &amp;quot;S1ff0100&amp;quot; then the fastfile is signed. If it was &amp;quot;S1ffu100&amp;quot;, the fastfile is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
The only data remaining is compressed data, depending on the enum in the header of the fastfile. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignature&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8]; // S1ffS100&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   struct &lt;br /&gt;
   { &lt;br /&gt;
     char fastfileName[32];&lt;br /&gt;
     int reserved;&lt;br /&gt;
     DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
   } subheader;&lt;br /&gt;
   char signatureBlock[0x1E030];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the fastfile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures.&lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;S1ffS100&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF.&lt;br /&gt;
=== Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define XFILE_BLOCK_TEMP 0x0&lt;br /&gt;
#define XFILE_BLOCK_PHYSICAL 0x1&lt;br /&gt;
#define XFILE_BLOCK_RUNTIME 0x2&lt;br /&gt;
#define XFILE_BLOCK_VIRTUAL 0x3&lt;br /&gt;
#define XFILE_BLOCK_LARGE 0x4&lt;br /&gt;
#define XFILE_BLOCK_CALLBACK 0x5&lt;br /&gt;
#define XFILE_BLOCK_SCRIPT 0x6&lt;br /&gt;
#define MAX_XFILE_COUNT 0x7&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
  #define MAX_XFILE_COUNT 0x8&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  unsigned int size;&lt;br /&gt;
  unsigned int externalSize;&lt;br /&gt;
  unsigned int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type;&lt;br /&gt;
  XAssetHeader header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ScriptStringList&lt;br /&gt;
{&lt;br /&gt;
  int count;&lt;br /&gt;
  const char **strings;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  ScriptStringList stringList;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
  XGlobals *globals;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=894</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=894"/>
		<updated>2015-03-29T23:51:54Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* GPADX.PRF Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, and GPADX_SP.PRF, &amp;quot;X&amp;quot; being the controller number) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the Triple DES algorithm.&lt;br /&gt;
&lt;br /&gt;
Triple DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triple DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
Ever since Modern Warfare 2, Infinity Ward started compiling the saves because of people taking advantage of cfg code in Call of Duty 4. They are hard-coded dvars that can only mod in-game settings like sensivity, in-game volume, and button configurations etc...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLenLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=893</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=893"/>
		<updated>2015-03-27T23:09:36Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the Triple DES algorithm.&lt;br /&gt;
&lt;br /&gt;
Triple DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triple DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
#if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FILE.SVG ==&lt;br /&gt;
=== Call of Duty: Classic ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  char mapNameLen;&lt;br /&gt;
  char mapName[mapNameLen];&lt;br /&gt;
  char buildNumberLen;&lt;br /&gt;
  char buildNumber[buildNumberLen];&lt;br /&gt;
  char unknown1[20];&lt;br /&gt;
  char campaignLen;&lt;br /&gt;
  char campaign[campaignLen];&lt;br /&gt;
  char screenShotNameLen;&lt;br /&gt;
  char screenShotName[screenShotNameLen];&lt;br /&gt;
  int unknown2;&lt;br /&gt;
  char descriptionLen;&lt;br /&gt;
  char description[descriptionLenLen];&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=891</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=891"/>
		<updated>2015-03-22T05:37:01Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the Triple DES algorithm.&lt;br /&gt;
&lt;br /&gt;
Triple DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triple DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
 #if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts, or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=890</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=890"/>
		<updated>2015-03-22T05:36:26Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the Triple DES algorithm.&lt;br /&gt;
&lt;br /&gt;
Triple DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triple DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
 #if defined(IW5) || defined(IW6) || defined(S1) // If it is Modern Warfare 3, Ghosts or Advanced Warfare...&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(AW)&amp;diff=884</id>
		<title>FastFiles and Zone files (AW)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(AW)&amp;diff=884"/>
		<updated>2015-02-24T14:39:33Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* FastFile Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:AW]]&lt;br /&gt;
&lt;br /&gt;
== FastFile Structure ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum DB_CompressorType&lt;br /&gt;
{&lt;br /&gt;
  DB_COMPRESSOR_INVALID = 0xFFFFFFFF,&lt;br /&gt;
  DB_COMPRESSOR_ZLIB = 0x1,&lt;br /&gt;
  DB_COMPRESSOR_LZX = 0x2,&lt;br /&gt;
  DB_COMPRESSOR_PASSTHROUGH = 0x3,&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct GfxImageStreamData&lt;br /&gt;
{&lt;br /&gt;
  unsigned _int16 width;&lt;br /&gt;
  unsigned _int16 height;&lt;br /&gt;
  unsigned int pixelSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct FF_Header&lt;br /&gt;
{&lt;br /&gt;
  char magic[8]; // S1ff0100&lt;br /&gt;
  int version;&lt;br /&gt;
  bool compress;&lt;br /&gt;
  DB_CompressorType compressType;&lt;br /&gt;
  char sizeOfPointer;&lt;br /&gt;
  char sizeOfLong;&lt;br /&gt;
  int fileTimeHigh;&lt;br /&gt;
  int fileTimeLow;&lt;br /&gt;
  int imageCount;&lt;br /&gt;
  GfxImageStreamData imageData[imageCount];&lt;br /&gt;
  int baseFileLen;&lt;br /&gt;
  int totalFileLen;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;S1ff0100&amp;quot; or &amp;quot;S1ffu100&amp;quot;. It        indicates what is read after maxFileSize. If it is &amp;quot;S1ff0100&amp;quot; then this fastfile is signed. If it is &amp;quot;S1ffu100&amp;quot;, then this fastfile is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the fastfile, so Ghosts fastfiles cannot be loaded on Advanced Warfare. The Advanced Warfare version is 0x72E for the Playstation 3 and Xbox 360 consoles, and the same for PC.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 if (version &amp;gt; 0x72E)&lt;br /&gt;
  Com_Error(ERR_DROP, &amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, filename, version, 0x72E);&lt;br /&gt;
 else if (version &amp;lt; 0x72E)&lt;br /&gt;
  Com_Error(ERR_DROP, &amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, filename, version, 0x72E);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Compress ===&lt;br /&gt;
Whether or not the zone is compressed inside the fastfile.&lt;br /&gt;
=== Image Data ===&lt;br /&gt;
These are still not entirely understood.&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The baseFileLen is the size of the fastfile, everything included. The totalFileLen is the highest number that baseFileLen can be, and in most fastfiles they are equal.&lt;br /&gt;
&lt;br /&gt;
== Sub Header ==&lt;br /&gt;
The rest of the fastfile is read depending on what the main fastfile magic was. If the magic was &amp;quot;S1ff0100&amp;quot; then the fastfile is signed. If it was &amp;quot;S1ffu100&amp;quot;, the fastfile is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
The only data remaining is compressed data, depending on the enum in the header of the fastfile. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8]; // S1ffS100&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   struct &lt;br /&gt;
   { &lt;br /&gt;
     char fastfileName[32];&lt;br /&gt;
     int reserved;&lt;br /&gt;
     DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
   } subheader;&lt;br /&gt;
   char signatureBlock[0x1E030];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the fastfile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures.&lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;S1ffS100&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF.&lt;br /&gt;
=== Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define XFILE_BLOCK_TEMP 0x0&lt;br /&gt;
#define XFILE_BLOCK_PHYSICAL 0x1&lt;br /&gt;
#define XFILE_BLOCK_RUNTIME 0x2&lt;br /&gt;
#define XFILE_BLOCK_VIRTUAL 0x3&lt;br /&gt;
#define XFILE_BLOCK_LARGE 0x4&lt;br /&gt;
#define XFILE_BLOCK_CALLBACK 0x5&lt;br /&gt;
#define XFILE_BLOCK_SCRIPT 0x6&lt;br /&gt;
#define MAX_XFILE_COUNT 0x7&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
  #define MAX_XFILE_COUNT 0x8&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  unsigned int size;&lt;br /&gt;
  unsigned int externalSize;&lt;br /&gt;
  unsigned int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type;&lt;br /&gt;
  XAssetHeader header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ScriptStringList&lt;br /&gt;
{&lt;br /&gt;
  int count;&lt;br /&gt;
  const char **strings;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  ScriptStringList stringList;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
  XGlobals *globals;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(AW)&amp;diff=883</id>
		<title>FastFiles and Zone files (AW)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(AW)&amp;diff=883"/>
		<updated>2015-02-24T14:36:04Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* FastFile Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:AW]]&lt;br /&gt;
&lt;br /&gt;
== FastFile Structure ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum DB_CompressorType&lt;br /&gt;
{&lt;br /&gt;
  DB_COMPRESSOR_INVALID = 0xFFFFFFFF,&lt;br /&gt;
  DB_COMPRESSOR_ZLIB = 0x1,&lt;br /&gt;
  DB_COMPRESSOR_LZX = 0x2,&lt;br /&gt;
  DB_COMPRESSOR_PASSTHROUGH = 0x3,&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct GfxImageStreamData&lt;br /&gt;
{&lt;br /&gt;
  unsigned int width;&lt;br /&gt;
  unsigned int height;&lt;br /&gt;
  unsigned int pixelSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct FF_Header&lt;br /&gt;
{&lt;br /&gt;
  char magic[8]; // S1ff0100&lt;br /&gt;
  int version;&lt;br /&gt;
  bool compress;&lt;br /&gt;
  DB_CompressorType compressType;&lt;br /&gt;
  char sizeOfPointer;&lt;br /&gt;
  char sizeOfLong;&lt;br /&gt;
  int fileTimeHigh;&lt;br /&gt;
  int fileTimeLow;&lt;br /&gt;
  int imageCount;&lt;br /&gt;
  GfxImageStreamData imageData[imageCount];&lt;br /&gt;
  int baseFileLen;&lt;br /&gt;
  int totalFileLen;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;S1ff0100&amp;quot; or &amp;quot;S1ffu100&amp;quot;. It        indicates what is read after maxFileSize. If it is &amp;quot;S1ff0100&amp;quot; then this fastfile is signed. If it is &amp;quot;S1ffu100&amp;quot;, then this fastfile is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the fastfile, so Ghosts fastfiles cannot be loaded on Advanced Warfare. The Advanced Warfare version is 0x72E for the Playstation 3 and Xbox 360 consoles, and the same for PC.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 if (version &amp;gt; 0x72E)&lt;br /&gt;
  Com_Error(ERR_DROP, &amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, filename, version, 0x72E);&lt;br /&gt;
 else if (version &amp;lt; 0x72E)&lt;br /&gt;
  Com_Error(ERR_DROP, &amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, filename, version, 0x72E);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Compress ===&lt;br /&gt;
Whether or not the zone is compressed inside the fastfile.&lt;br /&gt;
=== Image Data ===&lt;br /&gt;
These are still not entirely understood.&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The baseFileLen is the size of the fastfile, everything included. The totalFileLen is the highest number that baseFileLen can be, and in most fastfiles they are equal.&lt;br /&gt;
&lt;br /&gt;
== Sub Header ==&lt;br /&gt;
The rest of the fastfile is read depending on what the main fastfile magic was. If the magic was &amp;quot;S1ff0100&amp;quot; then the fastfile is signed. If it was &amp;quot;S1ffu100&amp;quot;, the fastfile is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
The only data remaining is compressed data, depending on the enum in the header of the fastfile. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8]; // S1ffS100&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   struct &lt;br /&gt;
   { &lt;br /&gt;
     char fastfileName[32];&lt;br /&gt;
     int reserved;&lt;br /&gt;
     DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
   } subheader;&lt;br /&gt;
   char signatureBlock[0x1E030];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the fastfile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures.&lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;S1ffS100&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF.&lt;br /&gt;
=== Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define XFILE_BLOCK_TEMP 0x0&lt;br /&gt;
#define XFILE_BLOCK_PHYSICAL 0x1&lt;br /&gt;
#define XFILE_BLOCK_RUNTIME 0x2&lt;br /&gt;
#define XFILE_BLOCK_VIRTUAL 0x3&lt;br /&gt;
#define XFILE_BLOCK_LARGE 0x4&lt;br /&gt;
#define XFILE_BLOCK_CALLBACK 0x5&lt;br /&gt;
#define XFILE_BLOCK_SCRIPT 0x6&lt;br /&gt;
#define MAX_XFILE_COUNT 0x7&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
  #define MAX_XFILE_COUNT 0x8&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  unsigned int size;&lt;br /&gt;
  unsigned int externalSize;&lt;br /&gt;
  unsigned int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type;&lt;br /&gt;
  XAssetHeader header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ScriptStringList&lt;br /&gt;
{&lt;br /&gt;
  int count;&lt;br /&gt;
  const char **strings;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  ScriptStringList stringList;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
  XGlobals *globals;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=882</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=882"/>
		<updated>2015-02-23T22:56:37Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Black Ops II */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the Triple DES algorithm.&lt;br /&gt;
&lt;br /&gt;
Triple DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triple DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops &amp;amp; Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=DVARs_(BO1)&amp;diff=881</id>
		<title>DVARs (BO1)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=DVARs_(BO1)&amp;diff=881"/>
		<updated>2015-02-23T22:53:27Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Game Structures]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/* dvar-&amp;gt;flags */&lt;br /&gt;
#define DVAR_ARCHIVE		(1 &amp;lt;&amp;lt; 0)	// 0x0001&lt;br /&gt;
#define DVAR_USERINFO		(1 &amp;lt;&amp;lt; 1)	// 0x0002&lt;br /&gt;
#define DVAR_SERVERINFO		(1 &amp;lt;&amp;lt; 2)	// 0x0004&lt;br /&gt;
#define DVAR_SYSTEMINFO		(1 &amp;lt;&amp;lt; 3)	// 0x0008&lt;br /&gt;
#define DVAR_INIT		(1 &amp;lt;&amp;lt; 4)	// 0x0010&lt;br /&gt;
#define DVAR_LATCH		(1 &amp;lt;&amp;lt; 5)	// 0x0020&lt;br /&gt;
#define DVAR_ROM		(1 &amp;lt;&amp;lt; 6)	// 0x0040&lt;br /&gt;
#define DVAR_CHEAT		(1 &amp;lt;&amp;lt; 7)	// 0x0080&lt;br /&gt;
#define DVAR_DEVELOPER		(1 &amp;lt;&amp;lt; 8)	// 0x0100&lt;br /&gt;
#define DVAR_SAVED		(1 &amp;lt;&amp;lt; 9)	// 0x0200&lt;br /&gt;
#define DVAR_NORESTART		(1 &amp;lt;&amp;lt; 10)	// 0x0400&lt;br /&gt;
#define DVAR_CHANGEABLE_RESET	(1 &amp;lt;&amp;lt; 12)	// 0x1000&lt;br /&gt;
#define DVAR_EXTERNAL		(1 &amp;lt;&amp;lt; 14)	// 0x4000&lt;br /&gt;
#define DVAR_AUTOEXEC		(1 &amp;lt;&amp;lt; 15)	// 0x8000&lt;br /&gt;
&lt;br /&gt;
enum dvarType_t&lt;br /&gt;
{&lt;br /&gt;
  DVAR_TYPE_BOOL = 0x0,&lt;br /&gt;
  DVAR_TYPE_FLOAT = 0x1,&lt;br /&gt;
  DVAR_TYPE_FLOAT_2 = 0x2,&lt;br /&gt;
  DVAR_TYPE_FLOAT_3 = 0x3,&lt;br /&gt;
  DVAR_TYPE_FLOAT_4 = 0x4,&lt;br /&gt;
  DVAR_TYPE_INT = 0x5,&lt;br /&gt;
  DVAR_TYPE_ENUM = 0x6,&lt;br /&gt;
  DVAR_TYPE_STRING = 0x7,&lt;br /&gt;
  DVAR_TYPE_COLOR = 0x8,&lt;br /&gt;
  DVAR_TYPE_INT64 = 0x9,&lt;br /&gt;
  DVAR_TYPE_LINEAR_COLOR_RGB = 0xA,&lt;br /&gt;
  DVAR_TYPE_COLOR_XYZ = 0xB,&lt;br /&gt;
  DVAR_TYPE_COUNT = 0xC,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union DvarLimits&lt;br /&gt;
{&lt;br /&gt;
	struct {&lt;br /&gt;
		int stringCount;&lt;br /&gt;
		const char **strings;&lt;br /&gt;
	} enumeration;&lt;br /&gt;
&lt;br /&gt;
	struct {&lt;br /&gt;
		int min;&lt;br /&gt;
		int max;&lt;br /&gt;
	} integer;&lt;br /&gt;
&lt;br /&gt;
	struct {&lt;br /&gt;
		unsigned long long min;&lt;br /&gt;
		unsigned long long max;&lt;br /&gt;
	} integer64;&lt;br /&gt;
&lt;br /&gt;
	struct {&lt;br /&gt;
		float min;&lt;br /&gt;
		float max;&lt;br /&gt;
	} value, vector;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union DvarValue&lt;br /&gt;
{&lt;br /&gt;
	bool enabled;&lt;br /&gt;
	int integer;&lt;br /&gt;
	unsigned int unsignedInt;&lt;br /&gt;
	unsigned long long integer64;&lt;br /&gt;
	float value;&lt;br /&gt;
	float vector[4];&lt;br /&gt;
	const char *string;&lt;br /&gt;
	char color[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct dvar_s&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	const char *description;&lt;br /&gt;
	unsigned int hash;&lt;br /&gt;
	unsigned int flags;&lt;br /&gt;
	dvarType_t type;&lt;br /&gt;
	bool modified;&lt;br /&gt;
	bool loadedFromSaveGame;&lt;br /&gt;
	DvarValue current;&lt;br /&gt;
	DvarValue latched;&lt;br /&gt;
	DvarValue reset;&lt;br /&gt;
	DvarValue saved;&lt;br /&gt;
	DvarLimits domain;&lt;br /&gt;
	dvar_s *hashNext;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=880</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=880"/>
		<updated>2015-02-21T05:34:58Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the Triple DES algorithm.&lt;br /&gt;
&lt;br /&gt;
Triple DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triple DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=879</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=879"/>
		<updated>2015-02-21T05:33:11Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Black Ops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the Triple DES algorithm.&lt;br /&gt;
&lt;br /&gt;
Tripple DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tripple DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=878</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=878"/>
		<updated>2015-02-21T05:24:14Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Black Ops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the DES algorithm.&lt;br /&gt;
&lt;br /&gt;
DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your liking, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=877</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=877"/>
		<updated>2015-02-21T05:23:49Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* Black Ops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the DES algorithm.&lt;br /&gt;
&lt;br /&gt;
DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[24] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your likin, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=876</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=876"/>
		<updated>2015-02-21T05:22:59Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* GPADX.PRF Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Black Ops ===&lt;br /&gt;
Treyarch has added additional protection on the save data. It is first encrypted using Sony&#039;s AES algorithm, after decrypting that layer it is additionally encrypted using the DES algorithm.&lt;br /&gt;
&lt;br /&gt;
DES key:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_key[24] = &amp;quot;Md8ea20lPcftYwsl496q63x9&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DES IV (Initialization Vector)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
unsigned char black_ops_3des_iv[8] = &amp;quot;0Peyx825J4S2ndpr54rW312z&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After decrypting this DES layer it is then plaintext and you are able to edit the file to your likin, allowing you to edit dvars and .cfg code.&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=875</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=875"/>
		<updated>2015-02-21T05:11:19Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* GPADX.PRF Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=874</id>
		<title>Category:Save Data</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:Save_Data&amp;diff=874"/>
		<updated>2015-02-21T05:10:34Z</updated>

		<summary type="html">&lt;p&gt;Red-EyeX32: /* GPADX.PRF Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GPADX.PRF Files ==&lt;br /&gt;
These files (GPADX_MP.PRF, GPADX_CM.PRF, GPADX_SP.PRF) contain variables related to game settings.&lt;br /&gt;
&lt;br /&gt;
=== Call of Duty 4: Modern Warfare, World at War ===&lt;br /&gt;
Call of Duty 4 stores the GPAD files in plaintext. The max size the file can be is 1000 bytes. It was then later patched by Infinity Ward because users started to edit the files to exploit the game.&lt;br /&gt;
&lt;br /&gt;
World at War in the other hand, is encrypted using Sony&#039;s AES encryption algorithm. After decrypting that layer the GPAD&#039;s is going to be plaintext just like Call of Duty 4. Treyarch hasn&#039;t bothered in patching the files, which allows modifications on the game.&lt;br /&gt;
&lt;br /&gt;
Both games use .cfg codes, which is easy to manipulate dvars (Developer Vars).&lt;br /&gt;
&lt;br /&gt;
=== Modern Warfare 2, Modern Warfare 3, Ghosts, Advanced Warfare ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum GamerProfileDataType&lt;br /&gt;
{&lt;br /&gt;
  TYPE_INVALID = 0x0,&lt;br /&gt;
  TYPE_BYTE = 0x1,&lt;br /&gt;
  TYPE_BOOL = 0x2,&lt;br /&gt;
  TYPE_SHORT = 0x3,&lt;br /&gt;
  TYPE_INT = 0x4,&lt;br /&gt;
  TYPE_FLOAT = 0x5,&lt;br /&gt;
  TYPE_STRING = 0x6,&lt;br /&gt;
  TYPE_BITFIELD = 0x7,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GamerProfileDataUnion&lt;br /&gt;
{&lt;br /&gt;
  char byteVal;&lt;br /&gt;
  bool boolVal;&lt;br /&gt;
  __int16 shortVal;&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  const char *stringVal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GamerProfileData&lt;br /&gt;
{&lt;br /&gt;
  GamerProfileDataType type;&lt;br /&gt;
  GamerProfileDataUnion u;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[GPAD0 COD(4,5,7)|COD4, COD5, COD7]]&lt;br /&gt;
&lt;br /&gt;
== SAVEGAME.SVG ==&lt;br /&gt;
=== World at War ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
 int saveVersion;&lt;br /&gt;
 int gameCheckSum;&lt;br /&gt;
 int saveCheckSum;&lt;br /&gt;
 int saveId;&lt;br /&gt;
 bool isUsingScriptChecksum;&lt;br /&gt;
 int scrCheckSum[3];&lt;br /&gt;
 char mapName[256];&lt;br /&gt;
 char buildNumber[128];&lt;br /&gt;
 char campaign[256];&lt;br /&gt;
 char screenShotName[64];&lt;br /&gt;
 char description[256];&lt;br /&gt;
 char filename[64];&lt;br /&gt;
 int health;&lt;br /&gt;
 int skill;&lt;br /&gt;
 bool internalSave;&lt;br /&gt;
 qtime_s time;&lt;br /&gt;
 int server_bodySize;&lt;br /&gt;
 int client_bodySize;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Black Ops II ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  char gametype[256];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[8];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ghosts ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum SaveType&lt;br /&gt;
{&lt;br /&gt;
  SAVE_TYPE_INTERNAL = 0x0,&lt;br /&gt;
  SAVE_TYPE_AUTOSAVE = 0x1,&lt;br /&gt;
  SAVE_TYPE_CONSOLE = 0x2,&lt;br /&gt;
  SAVE_TYPESCOUNT = 0x3,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct qtime_s&lt;br /&gt;
{&lt;br /&gt;
  int tm_sec;&lt;br /&gt;
  int tm_min;&lt;br /&gt;
  int tm_hour;&lt;br /&gt;
  int tm_mday;&lt;br /&gt;
  int tm_mon;&lt;br /&gt;
  int tm_year;&lt;br /&gt;
  int tm_wday;&lt;br /&gt;
  int tm_yday;&lt;br /&gt;
  int tm_isdst;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SaveHeader&lt;br /&gt;
{&lt;br /&gt;
  int saveVersion;&lt;br /&gt;
  int gameCheckSum;&lt;br /&gt;
  int saveCheckSum;&lt;br /&gt;
  int saveId;&lt;br /&gt;
  bool demoPlayback;&lt;br /&gt;
  bool splitscreen;&lt;br /&gt;
  int scrCheckSum[3];&lt;br /&gt;
  char mapName[256];&lt;br /&gt;
  char buildNumber[128];&lt;br /&gt;
  unsigned int omnvarPerGameCount;&lt;br /&gt;
  unsigned int omnvarPerClientCount;&lt;br /&gt;
  char gametype[128];&lt;br /&gt;
  char buildVersionSuffix[16];&lt;br /&gt;
  unsigned int networkProtocol;&lt;br /&gt;
  char screenShotName[64];&lt;br /&gt;
  char description[256];&lt;br /&gt;
  char filename[64];&lt;br /&gt;
  SaveType saveType;&lt;br /&gt;
  qtime_s time;&lt;br /&gt;
  int bodySize;&lt;br /&gt;
  unsigned int pad[6];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red-EyeX32</name></author>
	</entry>
</feed>