public virtual void Scan() { if (Memory.Scanner.Enabled == false) { throw new Exception("Please enable SignatureScanner first"); } var result = Memory.Scanner.Scan <uint>(MemoryRegionType.EXECUTE, Signature); foreach (var ptr in Pointers) { ptr.Refresh(Memory); } // Search the address and offset.); switch (AddressType) { case MemoryAddress.StaticAbsolute: case MemoryAddress.Static: if (result == 0) { return; } AddressTree = new int[1 + Pointers.Count()]; if (Pointers.Count() == 0) { // The result is directly our address Address = (int)result; AddressTree[0] = (int)result; } else { // We must follow one pointer. var computedAddress = 0; if (AddressType == MemoryAddress.Static) { computedAddress = Memory.BaseAddress + (int)result; } else { computedAddress = (int)result; } int treeInd = 0; foreach (var ptr in Pointers) { AddressTree[treeInd++] = computedAddress; if (ptr.Additive) { computedAddress += ptr.Offset; } else { computedAddress = Memory.Reader.ReadInt32(computedAddress + ptr.Offset); } } AddressTree[treeInd] = computedAddress; Address = computedAddress; } break; case MemoryAddress.Dynamic: Offset = (int)result; foreach (var ptr in Pointers) { if (ptr.Additive) { Offset += ptr.Offset; } } break; default: throw new Exception("AddressType for '" + Name + "' is not valid"); break; } Initialized = true; }
public void Refresh() { if (IsTemplate) { return; } var computedAddress = 0; if (IsSignature && Offset == 0 && Address == 0 && Memory.Scanner.Enabled) { var result = Memory.Scanner.Scan <uint>(MemoryRegionType.EXECUTE, Signature); // Search the address and offset. switch (AddressType) { case MemoryAddress.StaticAbsolute: case MemoryAddress.Static: if (result == 0) { return; } if (Pointers.Count() == 0) { // The result is directly our address Address = (int)result; } else { // We must follow one pointer. if (AddressType == MemoryAddress.Static) { computedAddress = Memory.BaseAddress + (int)result; } else { computedAddress = (int)result; } Address = computedAddress; } break; case MemoryAddress.Dynamic: Offset = (int)result; break; default: throw new Exception("AddressType for '" + Name + "' is not valid"); break; } } // Refresh pointers too foreach (var ptr in Pointers) { ptr.Refresh(Memory); } // Refresh this memory block. if (Size > 0) { AddressTree = new int[1 + Pointers.Count()]; if (IsStatic) { if (Address != 0 && Offset != 0) { computedAddress = Memory.Reader.ReadInt32(Memory.BaseAddress + Address) + Offset; } else { computedAddress = AddressType == MemoryAddress.Static ? Memory.BaseAddress + Address : Address; } } else { computedAddress = Pool == null ? 0 : MemoryDataConverter.Read <int>(Pool.Value, Offset); } int treeInd = 0; foreach (var ptr in Pointers) { AddressTree[treeInd++] = computedAddress; if (ptr.Additive) { computedAddress += ptr.Offset; } else { computedAddress = Memory.Reader.ReadInt32(computedAddress + ptr.Offset); } } AddressTree[treeInd] = computedAddress; // Read into this buffer. Memory.Reader.Read(computedAddress, Value); } // Refresh underlying fields. foreach (var field in Fields) { field.Value.Refresh(); } foreach (var pool in Pools.Values) { pool.Refresh(); } }