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)); } }
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); }