public void Run(MemoryReader reader, IpcChannel channel) { var o = reader.FindOffset(_pattern).Cast <int?>().FirstOrDefault(); if (o == null) { channel.LogError("Could not find system message table"); return; } var count = reader.Read <uint>((int)o + _pattern.TakeWhile(x => x != null).Count()); var func = reader.GetDelegate <GetMessageNameFunc>((int)o); var arr = Enumerable.Range(0, (int)count).Select(x => (ushort)x).Select( x => Tuple.Create(x, Marshal.PtrToStringUni(func(x)))).ToArray(); channel.LogBasic("Found {0} system messages", arr.Length); channel.WriteSystemMessages(arr); }
static uint?ReadVersion(MemoryReader reader, int offset) { var off = reader.ReadOffset(offset); return(reader.IsInRange(off) ? (uint?)reader.Read <uint>(off) : null); }
static uint?ReadVersion(MemoryReader reader, byte?[] pattern, int offset) { var off = reader.ReadOffset(offset + pattern.TakeWhile(x => x != null).Count()); return(reader.IsInRange(off) ? (uint?)reader.Read <uint>(off) : null); }