/// <summary> /// Initialize the common information about a Burn engine. /// </summary> /// <param name="reader">Binary reader open against a Burn engine.</param> /// <returns>True if initialized.</returns> protected bool Initialize(BinaryReader reader) { if (!GetWixburnSectionInfo(reader)) { return(false); } reader.BaseStream.Seek(this.wixburnDataOffset, SeekOrigin.Begin); byte[] bytes = reader.ReadBytes((int)BURN_SECTION_SIZE); UInt32 uint32 = 0; uint32 = BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_MAGIC); if (BURN_SECTION_MAGIC != uint32) { this.messageHandler.OnMessage(WixErrors.InvalidBundle(this.fileExe)); return(false); } this.Version = BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_VERSION); if (BURN_SECTION_VERSION != this.Version) { this.messageHandler.OnMessage(WixErrors.BundleTooNew(this.fileExe, this.Version)); return(false); } uint32 = BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_FORMAT); // We only know how to deal with CABs right now if (1 != uint32) { this.messageHandler.OnMessage(WixErrors.InvalidBundle(this.fileExe)); return(false); } this.StubSize = BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_STUBSIZE); this.OriginalChecksum = BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_ORIGINALCHECKSUM); this.OriginalSignatureOffset = BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_ORIGINALSIGNATUREOFFSET); this.OriginalSignatureSize = BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_ORIGINALSIGNATURESIZE); this.ContainerCount = BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_COUNT); this.UXAddress = this.StubSize; this.UXSize = BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_UXSIZE); // If there is an original signature use that to determine the engine size. if (0 < this.OriginalSignatureOffset) { this.EngineSize = this.OriginalSignatureOffset + this.OriginalSignatureSize; } else if (0 < this.SignatureOffset && 2 > this.ContainerCount) // if there is a signature and no attached containers, use the current signature. { this.EngineSize = this.SignatureOffset + this.SignatureSize; } else // just use the stub and UX container as the size of the engine. { this.EngineSize = this.StubSize + this.UXSize; } this.AttachedContainerAddress = this.ContainerCount > 1 ? this.EngineSize : 0; this.AttachedContainerSize = this.ContainerCount > 1 ? BurnCommon.ReadUInt32(bytes, BURN_SECTION_OFFSET_ATTACHEDCONTAINERSIZE) : 0; return(true); }