void bwCreateWad_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bwCreateWad = sender as BackgroundWorker; Stopwatch creationTimer = new Stopwatch(); creationTimer.Start(); try { WadCreationInfo wadInfo = (WadCreationInfo)e.Argument; disableControls(); //Check Startup IOS if (wadInfo.startupIos < 0 || wadInfo.startupIos > 255) { throw new Exception("Startup IOS must be between 0 and 255!"); } wadInfo.success = false; wadInfo.sendWadReady = false; wadCreationInfo = wadInfo; //Make TPLs transparent makeBannerTplsTransparent(); makeIconTplsTransparent(); //Pack icon.bin bwCreateWad.ReportProgress(0, "Packing icon.bin..."); if (string.IsNullOrEmpty(replacedIcon)) { iconBin.AddHeaderImd5(); iconBin.Lz77Compress = wadInfo.lz77; for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++) { if (sourceWad.BannerApp.StringTable[i].ToLower() == "icon.bin") { sourceWad.BannerApp.ReplaceFile(i, iconBin.ToByteArray()); break; } } } else { newIconBin.AddHeaderImd5(); newIconBin.Lz77Compress = wadInfo.lz77; for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++) { if (sourceWad.BannerApp.StringTable[i].ToLower() == "icon.bin") { sourceWad.BannerApp.ReplaceFile(i, newIconBin.ToByteArray()); break; } } } //Pack banner.bin bwCreateWad.ReportProgress(20, "Packing banner.bin..."); if (string.IsNullOrEmpty(replacedBanner)) { bannerBin.AddHeaderImd5(); bannerBin.Lz77Compress = wadInfo.lz77; for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++) { if (sourceWad.BannerApp.StringTable[i].ToLower() == "banner.bin") { sourceWad.BannerApp.ReplaceFile(i, bannerBin.ToByteArray()); break; } } } else { newBannerBin.AddHeaderImd5(); bannerBin.Lz77Compress = wadInfo.lz77; for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++) { if (sourceWad.BannerApp.StringTable[i].ToLower() == "banner.bin") { sourceWad.BannerApp.ReplaceFile(i, newBannerBin.ToByteArray()); break; } } } //Pack sound.bin bwCreateWad.ReportProgress(40, "Packing sound.bin..."); if (!string.IsNullOrEmpty(replacedSound) || !string.IsNullOrEmpty(wadInfo.sound)) { for (int i = 0; i < sourceWad.BannerApp.NumOfNodes; i++) { if (sourceWad.BannerApp.StringTable[i].ToLower() == "sound.bin") { sourceWad.BannerApp.ReplaceFile(i, newSoundBin); break; } } } //Insert new dol if (!string.IsNullOrEmpty(wadInfo.dol)) { bwCreateWad.ReportProgress(50, "Inserting DOL..."); sourceWad.RemoveAllContents(); if (wadInfo.nandLoader == WadCreationInfo.NandLoader.comex) { sourceWad.AddContent(Properties.Resources.comex, 1, 1, ContentType.Normal); if (wadInfo.dol.StartsWith("Simple Forwarder:")) { sourceWad.AddContent(createForwarderSimple(), 2, 2, ContentType.Normal); } else if (wadInfo.dol.StartsWith("Complex Forwarder")) { bwCreateWad.ReportProgress(55, "Compiling Forwarder..."); sourceWad.AddContent(createForwarderComplex(), 2, 2, ContentType.Normal); } else { sourceWad.AddContent(newDol, 2, 2, ContentType.Normal); } sourceWad.BootIndex = 1; } else { sourceWad.AddContent(Properties.Resources.Waninkoko, 2, 2, ContentType.Normal); if (wadInfo.dol.StartsWith("Simple Forwarder:")) { sourceWad.AddContent(createForwarderSimple(), 1, 1, ContentType.Normal); } else if (wadInfo.dol.StartsWith("Complex Forwarder")) { bwCreateWad.ReportProgress(55, "Compiling Forwarder..."); sourceWad.AddContent(createForwarderComplex(), 1, 1, ContentType.Normal); } else { sourceWad.AddContent(newDol, 1, 1, ContentType.Normal); } sourceWad.BootIndex = 2; } } //Change channel information for (int i = 0; i < wadInfo.titles.Length; i++) { if (string.IsNullOrEmpty(wadInfo.titles[i])) { wadInfo.titles[i] = wadInfo.allLangTitle; } } bwCreateWad.ReportProgress(75, "Updating Channel Information..."); sourceWad.ChangeStartupIOS(wadInfo.startupIos); sourceWad.ChangeChannelTitles(wadInfo.titles); if (!string.IsNullOrEmpty(wadInfo.titleId)) { sourceWad.ChangeTitleID(LowerTitleID.Channel, wadInfo.titleId); } sourceWad.FakeSign = true; sourceWad.ChangeTitleKey("GottaGetSomeBeer"); //Pack WAD bwCreateWad.ReportProgress(80, "Packing WAD..."); if (!wadInfo.sendToWii) { sourceWad.Save(wadInfo.outFile); } else { wadInfo.wadFile = sourceWad.ToByteArray(); } bwCreateWad.ReportProgress(100, " "); creationTimer.Stop(); if (!wadInfo.sendToWii) { FileInfo fi = new FileInfo(wadInfo.outFile); double fileSize = Math.Round(fi.Length * 0.0009765625 * 0.0009765625, 2); infoBox(string.Format("Successfully created custom channel!\nTime elapsed: {0} ms\nFilesize: {1} MB\nApprox. Blocks: {2}", creationTimer.ElapsedMilliseconds, fileSize, sourceWad.NandBlocks)); } else { wadInfo.sendWadReady = true; } wadCreationInfo = wadInfo; wadCreationInfo.success = true; } catch (Exception ex) { wadCreationInfo.sendWadReady = false; creationTimer.Stop(); enableControls(); errorBox(ex.Message); } }