Multipurpose utility for managing Games for Windows - LIVE installs and content. (Mirrored from https://github.com/InvoxiPlayGames/GfWLUtility)
at master 6.3 kB view raw
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}