Пример #1
0
        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);
        }
Пример #2
0
 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;
 }
Пример #3
0
 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;
 }
Пример #4
0
        /// <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>()));
        }
Пример #5
0
        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);
        }
Пример #6
0
        /// <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));
        }
Пример #7
0
        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);
        }