/// <summary> /// Appends a container to the exe and updates the ".wixburn" section data to point to it. /// </summary> /// <param name="containerStream">File stream to append to the current exe.</param> /// <param name="burnSectionOffsetSize">Offset of size field for this container in ".wixburn" section data.</param> /// <returns>true if the container data is successfully appended; false otherwise</returns> private bool AppendContainer(Stream containerStream, UInt32 containerSize, UInt32 burnSectionOffsetSize, UInt32 burnSectionCount) { if (this.invalidBundle) { return(false); } // Update the ".wixburn" section data this.WriteToBurnSectionOffset(BURN_SECTION_OFFSET_COUNT, burnSectionCount); this.WriteToBurnSectionOffset(burnSectionOffsetSize, containerSize); // Append the container to the end of the existing bits. this.binaryWriter.BaseStream.Seek(0, SeekOrigin.End); BurnCommon.CopyStream(containerStream, this.binaryWriter.BaseStream, (int)containerSize); this.binaryWriter.BaseStream.Flush(); return(true); }
/// <summary> /// Gets the attached container from the exe and extracts its contents to the output directory. /// </summary> /// <param name="outputDirectory">Directory to write extracted files to.</param> /// <returns>True if successful, false otherwise</returns> public bool ExtractAttachedContainer(string outputDirectory, string tempDirectory) { // No attached container to extract if (this.AttachedContainerAddress == 0 || this.AttachedContainerSize == 0) { return(false); } if (this.invalidBundle) { return(false); } Directory.CreateDirectory(outputDirectory); string tempCabPath = Path.Combine(tempDirectory, "attached.cab"); this.binaryReader.BaseStream.Seek(this.AttachedContainerAddress, SeekOrigin.Begin); using (Stream tempCab = File.Open(tempCabPath, FileMode.Create, FileAccess.Write)) { BurnCommon.CopyStream(this.binaryReader.BaseStream, tempCab, (int)this.AttachedContainerSize); } using (WixExtractCab extract = new WixExtractCab()) { extract.Extract(tempCabPath, outputDirectory); } foreach (DictionaryEntry entry in this.attachedContainerPayloadNames) { string sourcePath = Path.Combine(outputDirectory, (string)entry.Key); string destinationPath = Path.Combine(outputDirectory, (string)entry.Value); Directory.CreateDirectory(Path.GetDirectoryName(destinationPath)); File.Delete(destinationPath); File.Move(sourcePath, destinationPath); } return(true); }
/// <summary> /// Gets the UX container from the exe and extracts its contents to the output directory. /// </summary> /// <param name="outputDirectory">Directory to write extracted files to.</param> /// <returns>True if successful, false otherwise</returns> public bool ExtractUXContainer(string outputDirectory, string tempDirectory) { // No UX container to extract if (this.UXAddress == 0 || this.UXSize == 0) { return(false); } if (this.invalidBundle) { return(false); } Directory.CreateDirectory(outputDirectory); string tempCabPath = Path.Combine(tempDirectory, "ux.cab"); string manifestOriginalPath = Path.Combine(outputDirectory, "0"); string manifestPath = Path.Combine(outputDirectory, "manifest.xml"); this.binaryReader.BaseStream.Seek(this.UXAddress, SeekOrigin.Begin); using (Stream tempCab = File.Open(tempCabPath, FileMode.Create, FileAccess.Write)) { BurnCommon.CopyStream(this.binaryReader.BaseStream, tempCab, (int)this.UXSize); } using (WixExtractCab extract = new WixExtractCab()) { extract.Extract(tempCabPath, outputDirectory); } Directory.CreateDirectory(Path.GetDirectoryName(manifestPath)); File.Delete(manifestPath); File.Move(manifestOriginalPath, manifestPath); XmlDocument document = new XmlDocument(); document.Load(manifestPath); XmlNamespaceManager namespaceManager = new XmlNamespaceManager(document.NameTable); namespaceManager.AddNamespace("burn", BurnCommon.BurnNamespace); XmlNodeList uxPayloads = document.SelectNodes("/burn:BurnManifest/burn:UX/burn:Payload", namespaceManager); XmlNodeList payloads = document.SelectNodes("/burn:BurnManifest/burn:Payload", namespaceManager); foreach (XmlNode uxPayload in uxPayloads) { XmlNode sourcePathNode = uxPayload.Attributes.GetNamedItem("SourcePath"); XmlNode filePathNode = uxPayload.Attributes.GetNamedItem("FilePath"); string sourcePath = Path.Combine(outputDirectory, sourcePathNode.Value); string destinationPath = Path.Combine(outputDirectory, filePathNode.Value); Directory.CreateDirectory(Path.GetDirectoryName(destinationPath)); File.Delete(destinationPath); File.Move(sourcePath, destinationPath); } foreach (XmlNode payload in payloads) { XmlNode sourcePathNode = payload.Attributes.GetNamedItem("SourcePath"); XmlNode filePathNode = payload.Attributes.GetNamedItem("FilePath"); XmlNode packagingNode = payload.Attributes.GetNamedItem("Packaging"); string sourcePath = sourcePathNode.Value; string destinationPath = filePathNode.Value; string packaging = packagingNode.Value; if (packaging.Equals("embedded", StringComparison.OrdinalIgnoreCase)) { this.attachedContainerPayloadNames.Add(new DictionaryEntry(sourcePath, destinationPath)); } } return(true); }