Esempio n. 1
0
        public KernelTable(string fileName)
        {
            using (var bw = new BinaryReader(new FileStream(fileName, FileMode.Open)))
            {
                // Read kernel header
                var headerBytes = new byte[0x10];
                bw.Read(headerBytes, 0, 0x10);
                var ptrHeader = Marshal.AllocHGlobal(0x10);
                Marshal.Copy(headerBytes, 0, ptrHeader, 0x10);
                _kernelHeader = Marshal.PtrToStructure <KernelFileHeader>(ptrHeader);
                Marshal.FreeHGlobal(ptrHeader);

                // Read block data
                _dataBlock = bw.ReadBytes(_kernelHeader.DataLength);

                // skip 4 bytes
                bw.BaseStream.Seek(4, SeekOrigin.Current);

                // Read string table
                _stringTable = bw.ReadBytes((int)(bw.BaseStream.Length - bw.BaseStream.Position));
            }
        }
Esempio n. 2
0
        public KernelTable(int startOffset)
        {
            // Read kernel header
            _kernelHeader = GameMemory.Read <KernelFileHeader>(startOffset, false);

            // Read block data
            _dataBlock = GameMemory.Read <byte>(startOffset + 0x10, _kernelHeader.DataLength, false);

            // Calculate string table length
            var stringTableLength = 0;

            // Find the last referenced string offset
            for (int i = 0; i < BlockCount; i++)
            {
                var blockOffset = i * _kernelHeader.BlockLength;
                var string1     = BitConverter.ToInt16(_dataBlock, blockOffset + stringOffset1);
                var string2     = BitConverter.ToInt16(_dataBlock, blockOffset + stringOffset2);

                if (string1 > stringTableLength)
                {
                    stringTableLength = string1;
                }
                if (string2 > stringTableLength)
                {
                    stringTableLength = string2;
                }
            }

            // Add length of last string to table length
            var lastString       = GameMemory.Read <byte>(startOffset + _kernelHeader.DataLength + 0x14 + stringTableLength, 512, false);
            var lastStringLength = Array.IndexOf(lastString, (byte)0) + 3; // for 0x004700 end string marker

            stringTableLength += lastStringLength;

            // Read string table
            _stringTable = GameMemory.Read <byte>(startOffset + _kernelHeader.DataLength + 0x14, stringTableLength, false);
        }