private IntPtr GetPointer(Process program, string asmName)
        {
            if (string.IsNullOrEmpty(asmName))
            {
                Searcher.MemoryFilter = delegate(MemInfo info) {
                    return((info.State & 0x1000) != 0 && (info.Protect & 0x40) != 0 && (info.Protect & 0x100) == 0);
                };
            }
            else
            {
                Tuple <IntPtr, IntPtr> range = ProgramPointer.GetAddressRange(program, asmName);
                Searcher.MemoryFilter = delegate(MemInfo info) {
                    return((ulong)info.BaseAddress >= (ulong)range.Item1 && (ulong)info.BaseAddress <= (ulong)range.Item2 && (info.State & 0x1000) != 0 && (info.Protect & 0x20) != 0 && (info.Protect & 0x100) == 0);
                };
            }

            BasePtr = Searcher.FindSignature(program, Signature);
            if (BasePtr != IntPtr.Zero)
            {
                LastVerified = DateTime.Now.AddSeconds(5);
                int offset = CalculateRelative(program);
                return(BasePtr + offset);
            }
            return(BasePtr);
        }
        public void VerifyPointer(Process program, ref IntPtr pointer)
        {
            DateTime now = DateTime.Now;

            if (now <= LastVerified)
            {
                return;
            }

            bool isValid = Searcher.VerifySignature(program, BasePtr, Signature);

            LastVerified = now.AddSeconds(1);
            if (isValid)
            {
                int    offset = CalculateRelative(program);
                IntPtr verify = ProgramPointer.DerefPointer(program, BasePtr + offset, AutoDeref);
                if (verify != pointer)
                {
                    pointer = verify;
                }
                return;
            }

            BasePtr = IntPtr.Zero;
            pointer = IntPtr.Zero;
        }
        public IntPtr FindPointer(Process program, string asmName)
        {
            if (string.IsNullOrEmpty(asmName))
            {
                BasePtr = program.MainModule.BaseAddress;
            }
            else
            {
                Tuple <IntPtr, IntPtr> range = ProgramPointer.GetAddressRange(program, asmName);
                BasePtr = range.Item1;
            }

            if (Offsets.Length > 1)
            {
                LastVerified = DateTime.Now.AddSeconds(5);
                return(ProgramPointer.DerefPointer(program, program.Read <IntPtr>(BasePtr, Offsets), AutoDeref));
            }
            else
            {
                LastVerified = DateTime.MaxValue;
                BasePtr     += Offsets[0];
                return(ProgramPointer.DerefPointer(program, BasePtr, AutoDeref));
            }
        }
 public IntPtr FindPointer(Process program, string asmName)
 {
     return(ProgramPointer.DerefPointer(program, GetPointer(program, asmName), AutoDeref));
 }