public byte[] ReadBytes(Int64 Address, int BytesCount)
        {
            var Buffer = new byte[BytesCount];

            var lpNumberOfBytesRead = IntPtr.Zero;

            var AddressAsIntPtr = CastToIntPtrAvoidOverflow(Address);

            if (!AddressAsIntPtr.HasValue)
            {
                return(null);
            }

            var Error = Kernel32.ReadProcessMemory(ProcessHandle, AddressAsIntPtr.Value, Buffer, (IntPtr)Buffer.Length, out lpNumberOfBytesRead);

            var NumberOfBytesRead = (int)lpNumberOfBytesRead;

            if (NumberOfBytesRead < 1)
            {
                return(null);
            }

            if (Buffer.Length == NumberOfBytesRead)
            {
                return(Buffer);
            }

            return(Buffer.Take(NumberOfBytesRead).ToArray());
        }
        public ProcessMemoryReader(
            int ProcessId)
        {
            this.ProcessId = ProcessId;

            ProcessHandle = Kernel32.OpenProcess(Kernel32.PROCESS_ACCESS_RIGHT.PROCESS_VM_READ, 0, (uint)ProcessId);

            ModulesCache = ModulesOfProcess(ProcessId);
        }
 public void Dispose()
 {
     Kernel32.CloseHandle(ProcessHandle);
 }