Multipurpose utility for managing Games for Windows - LIVE installs and content. (Mirrored from https://github.com/InvoxiPlayGames/GfWLUtility)
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Diagnostics;
6using System.Drawing;
7using System.IO;
8using System.Linq;
9using System.Text;
10using System.Windows.Forms;
11
12namespace GfWLUtility
13{
14 public partial class ExportForm : Form
15 {
16 public ExportForm()
17 {
18 InitializeComponent();
19 }
20
21 public void ExportPCInfo(string filename)
22 {
23 if (File.Exists(filename))
24 File.Delete(filename);
25 FileStream fs = new FileStream(filename, FileMode.Create);
26
27 SavedPCInfo savedPCInfo = new SavedPCInfo();
28 savedPCInfo.PCID = GfWLRegistry.GetPCID();
29 // shit way to enumerate through every title to put it in the XML
30 savedPCInfo.Titles = new SavedPCInfoTitle[TitleManager.KnownTitles.Count];
31 int i_title = 0;
32 foreach (KnownTitle title in TitleManager.KnownTitles.Values)
33 {
34 savedPCInfo.Titles[i_title] = new SavedPCInfoTitle();
35 savedPCInfo.Titles[i_title].ID = title.TitleID.ToString("X8");
36
37 if (productKeyCheckbox.Checked)
38 {
39 string productKey = TitleManager.GetTitleProductKey(title.TitleID);
40 if (productKey != null)
41 savedPCInfo.Titles[i_title].Key = productKey;
42 }
43
44 // i really don't like this
45 List<SavedPCInfoTitleSector> sectors = new List<SavedPCInfoTitleSector>();
46 for (int i = 0; i < 0x14; i++)
47 {
48 byte[] sectorData = TitleManager.GetConfigSector(title.TitleID, i);
49 if (sectorData != null)
50 {
51 // because it's big and unweildy and these are *mostly* null bytes, trim ending nulls
52 // this makes the mostly unused config sector basically invisible, and the account sector much smaller
53 int sectorTrailingNulls = UtilityFuncs.CountTrailingNulls(sectorData);
54 sectorData = sectorData.Take(sectorTrailingNulls + 1).ToArray();
55 SavedPCInfoTitleSector sec = new SavedPCInfoTitleSector()
56 {
57 ID = "0x" + i.ToString("X"),
58 Value = Convert.ToBase64String(sectorData)
59 };
60 sectors.Add(sec);
61 }
62 }
63 savedPCInfo.Titles[i_title].Sector = sectors.ToArray();
64 i_title++;
65 }
66 savedPCInfo.Version = "1";
67 savedPCInfo.CreatedBy = "GfWLUtility-" + Application.ProductVersion;
68 savedPCInfo.CreatedAt = DateTime.Now.ToString();
69 System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(savedPCInfo.GetType());
70 x.Serialize(fs, savedPCInfo);
71
72 fs.Close();
73 }
74
75 public void ExportProductKeys(string filename)
76 {
77 if (File.Exists(filename))
78 File.Delete(filename);
79 List<string> productKeyStrings = new List<string>();
80 productKeyStrings.Add("GfWL Utility Exported Product Keys:");
81 productKeyStrings.Add("-----------------------------------");
82 foreach (KnownTitle title in TitleManager.KnownTitles.Values)
83 {
84 string productKey = TitleManager.GetTitleProductKey(title.TitleID);
85 if (productKey != null)
86 productKeyStrings.Add($"{title} : {productKey}");
87 }
88 productKeyStrings.Add("-----------------------------------");
89 productKeyStrings.Add($"Generated at {DateTime.Now}");
90 File.WriteAllLines(filename, productKeyStrings.ToArray());
91 }
92
93 public void CopyContent(string directory)
94 {
95 if (Directory.Exists(directory + @"\Content"))
96 Directory.Delete(directory + @"\Content", true);
97 if (Directory.Exists(directory + @"\DLC"))
98 Directory.Delete(directory + @"\DLC", true);
99
100 string xliveDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Microsoft\Xlive");
101
102 if (Directory.Exists(xliveDir + @"\Content"))
103 {
104 Directory.CreateDirectory(directory + @"\Content");
105 DirectoryInfo contentSourceInfo = new DirectoryInfo(xliveDir + @"\Content");
106 DirectoryInfo contentTargetInfo = new DirectoryInfo(directory + @"\Content");
107 UtilityFuncs.CopyFilesRecursively(contentSourceInfo, contentTargetInfo);
108 }
109
110 if (Directory.Exists(xliveDir + @"\DLC"))
111 {
112 Directory.CreateDirectory(directory + @"\DLC");
113 DirectoryInfo dlcSourceInfo = new DirectoryInfo(xliveDir + @"\DLC");
114 DirectoryInfo dlcTargetInfo = new DirectoryInfo(directory + @"\DLC");
115 UtilityFuncs.CopyFilesRecursively(dlcSourceInfo, dlcTargetInfo);
116 }
117 }
118
119 private void exportButton_Click(object sender, EventArgs e)
120 {
121 UseWaitCursor = true;
122 Application.DoEvents();
123
124 if (Directory.Exists("GfWL_Export"))
125 Directory.Delete("GfWL_Export", true);
126
127 Directory.CreateDirectory("GfWL_Export");
128 if (pcInfoCheckbox.Checked)
129 ExportPCInfo("GfWL_Export\\SavedPCInfo.xml");
130 if (productKeyCheckbox.Checked)
131 ExportProductKeys("GfWL_Export\\GfWL_ProductKeys.txt");
132 if (userProfileCheckbox.Checked)
133 CopyContent("GfWL_Export");
134
135 UseWaitCursor = false;
136 Application.DoEvents();
137
138 DialogResult dr =
139 MessageBox.Show("Export created in 'GfWL_Export' folder. Open this folder now?", "GfWL Utility Export",
140 MessageBoxButtons.YesNo, MessageBoxIcon.Information);
141
142 if (dr == DialogResult.Yes)
143 Process.Start("GfWL_Export");
144
145 Close();
146 }
147
148 private void cancelButton_Click(object sender, EventArgs e)
149 {
150 Close();
151 }
152 }
153}