private static List <ModuleDataBlock> GetBlockList(ModuleEntryStruct data, ModuleStruct module) { var blocks = new List <ModuleDataBlock>(data.BlockCount); if (data.TotalCompressedSize == 0) { return(blocks); } if ((data.Flags & ModuleEntryFlags.HasBlocks) != 0) { for (var i = 0; i < data.BlockCount; i++) { var block = module.DataBlocks[data.FirstBlockIndex + i]; blocks.Add(new ModuleDataBlock(block)); } } else { // If an entry has 0 blocks, then make one var blockStruct = new ModuleDataBlockStruct { Checksum = data.AssetChecksum, CompressedOffset = 0, CompressedSize = data.TotalCompressedSize, Compression = (data.Flags & ModuleEntryFlags.Compressed) != 0 ? 1 : 0, UncompressedOffset = 0, UncompressedSize = data.TotalUncompressedSize, }; blocks.Add(new ModuleDataBlock(blockStruct)); } return(blocks); }
internal ModuleEntry(int index, ModuleEntryStruct data, ModuleStruct module) { Index = index; Name = module.StringTable.GetStringAtOffset((int)data.NameOffset); ParentIndex = data.ParentFileIndex; Resources = _resources.AsReadOnly(); Blocks = GetBlockList(data, module).AsReadOnly(); DataOffset = data.DataOffset; TotalCompressedSize = data.TotalCompressedSize; TotalUncompressedSize = data.TotalUncompressedSize; HeaderAlignment = data.HeaderAlignment; TagDataAlignment = data.TagDataAlignment; ResourceDataAlignment = data.ResourceDataAlignment; IsRawFile = (data.Flags & ModuleEntryFlags.RawFile) != 0; GlobalId = data.GlobalId; AssetId = data.AssetId; AssetChecksum = data.AssetChecksum; GroupTag = data.GroupTag; UncompressedHeaderSize = data.UncompressedHeaderSize; UncompressedTagDataSize = data.UncompressedTagDataSize; UncompressedResourceDataSize = data.UncompressedResourceDataSize; HeaderBlockCount = data.HeaderBlockCount; TagDataBlockCount = data.TagDataBlockCount; ResourceBlockCount = data.ResourceBlockCount; }
internal ModuleEntry(ModuleEntryStruct data, ModuleStruct module) { Name = module.StringTable.GetStringAtOffset((int)data.NameOffset); ParentIndex = data.ParentFileIndex; Unknown8 = data.Unknown8; UnknownC = data.UnknownC; Blocks = GetBlockList(data, module).AsReadOnly(); CompressedOffset = data.CompressedOffset; TotalCompressedSize = data.TotalCompressedSize; TotalUncompressedSize = data.TotalUncompressedSize; Unknown28 = data.Unknown28; Unknown29 = data.Unknown29; Unknown2A = data.Unknown2A; Unknown2B = data.Unknown2B; GlobalTagId = data.GlobalTagId; SourceTagId = data.SourceTagId; Unknown38 = data.Unknown38; GroupTag = data.GroupTag; UncompressedHeaderSize = data.UncompressedHeaderSize; UncompressedTagDataSize = data.UncompressedTagDataSize; UncompressedResourceDataSize = data.UncompressedResourceDataSize; Unknown50 = data.Unknown50; Unknown52 = data.Unknown52; Unknown54 = data.Unknown54; }
/// <summary> /// Creates an empty module file. /// </summary> /// <param name="stream">The stream to write to.</param> /// <returns>The created module.</returns> public static AusarModule Create(Stream stream) { // NOTE: Untested var moduleStruct = new ModuleStruct(); BinarySerializer.Serialize(stream, moduleStruct); var dataBaseOffset = stream.Position; return(new AusarModule(dataBaseOffset, moduleStruct.FileHeader, Enumerable.Empty <ModuleEntry>())); }
public void register_module_test() { var moduleStruct = new ModuleStruct { descrp = Encoding.ASCII.GetBytes("Test Module\0"), sttrou = new FarPtr(0x0001, 0x0001), dlarou = new FarPtr(0x0002, 0x0002), finrou = new FarPtr(0x0003, 0x0003), huprou = new FarPtr(0x0004, 0x0004), injrou = new FarPtr(0x0005, 0x0005), lofrou = new FarPtr(0x0006, 0x0006), lonrou = new FarPtr(0x0007, 0x0007), mcurou = new FarPtr(0x0008, 0x0008), stsrou = new FarPtr(0x0009, 0x0009) }; var modulePointer = mbbsEmuMemoryCore.AllocateVariable("MODULE", ModuleStruct.Size); mbbsEmuMemoryCore.SetArray(modulePointer, moduleStruct.Data); //Execute Test ExecuteApiTest(HostProcess.ExportedModules.Majorbbs.Segment, REGISTER_MODULE_ORDINAL, new List <FarPtr> { modulePointer }); Assert.Equal(Encoding.ASCII.GetString(moduleStruct.descrp).TrimEnd('\0'), mbbsModule.ModuleDescription); Assert.Equal(new FarPtr(0x0001, 0x0001), mbbsModule.MainModuleDll.EntryPoints["sttrou"]); Assert.Equal(new FarPtr(0x0002, 0x0002), mbbsModule.MainModuleDll.EntryPoints["dlarou"]); Assert.Equal(new FarPtr(0x0003, 0x0003), mbbsModule.MainModuleDll.EntryPoints["finrou"]); Assert.Equal(new FarPtr(0x0004, 0x0004), mbbsModule.MainModuleDll.EntryPoints["huprou"]); Assert.Equal(new FarPtr(0x0005, 0x0005), mbbsModule.MainModuleDll.EntryPoints["injrou"]); Assert.Equal(new FarPtr(0x0006, 0x0006), mbbsModule.MainModuleDll.EntryPoints["lofrou"]); Assert.Equal(new FarPtr(0x0007, 0x0007), mbbsModule.MainModuleDll.EntryPoints["lonrou"]); Assert.Equal(new FarPtr(0x0008, 0x0008), mbbsModule.MainModuleDll.EntryPoints["mcurou"]); Assert.Equal(new FarPtr(0x0009, 0x0009), mbbsModule.MainModuleDll.EntryPoints["stsrou"]); Assert.NotEqual(FarPtr.Empty, mbbsEmuMemoryCore.GetPointer(mbbsEmuMemoryCore.GetVariablePointer("MODULE") + (2 * mbbsModule.ModuleDlls[0].StateCode))); //Verify the Local Copy var localModulePointer = mbbsEmuMemoryCore.GetPointer( mbbsEmuMemoryCore.GetVariablePointer("MODULE") + (2 * mbbsModule.ModuleDlls[0].StateCode)); var localModuleStruct = new ModuleStruct(mbbsEmuMemoryCore.GetArray(localModulePointer, ModuleStruct.Size)); Assert.Equal(Encoding.ASCII.GetString(moduleStruct.descrp).TrimEnd('\0'), Encoding.ASCII.GetString(localModuleStruct.descrp).TrimEnd('\0')); Assert.Equal(new FarPtr(0x0001, 0x0001), localModuleStruct.sttrou); Assert.Equal(new FarPtr(0x0002, 0x0002), localModuleStruct.dlarou); Assert.Equal(new FarPtr(0x0003, 0x0003), localModuleStruct.finrou); Assert.Equal(new FarPtr(0x0004, 0x0004), localModuleStruct.huprou); Assert.Equal(new FarPtr(0x0005, 0x0005), localModuleStruct.injrou); Assert.Equal(new FarPtr(0x0006, 0x0006), localModuleStruct.lofrou); Assert.Equal(new FarPtr(0x0007, 0x0007), localModuleStruct.lonrou); Assert.Equal(new FarPtr(0x0008, 0x0008), localModuleStruct.mcurou); Assert.Equal(new FarPtr(0x0009, 0x0009), localModuleStruct.stsrou); }
/// <summary> /// Opens an existing module file. /// </summary> /// <param name="stream">The stream to read from.</param> /// <returns>The opened module.</returns> public static AusarModule Open(Stream stream) { var reader = new BinaryReader(stream, Encoding.UTF8, /* leaveOpen */ true); var moduleStruct = new ModuleStruct(); moduleStruct.Read(reader); var entries = moduleStruct.Entries.Select(e => new ModuleEntry(e, moduleStruct)).ToList(); var resources = moduleStruct.ResourceEntries.Select(i => entries[i]); return(new AusarModule(stream, entries, resources)); }
private static List <ModuleEntryBlock> GetBlockList(ModuleEntryStruct data, ModuleStruct module) { var blocks = new List <ModuleEntryBlock>(data.CompressedBlockCount); for (var i = 0; i < data.CompressedBlockCount; i++) { var block = module.CompressedBlocks[data.FirstCompressedBlockIndex + i]; blocks.Add(new ModuleEntryBlock(block)); } return(blocks); }