private static bool HasReadAccess(IntPtr hProcess, IntPtr address, out int size) { size = 0; var memInfo = new ProcessNativeMethods.MEMORY_BASIC_INFORMATION(); IntPtr result = ProcessNativeMethods.VirtualQueryEx( hProcess, address, ref memInfo, (IntPtr)Marshal.SizeOf(memInfo)); if (result == IntPtr.Zero) { return(false); } if (memInfo.Protect == ProcessNativeMethods.PAGE_NOACCESS || memInfo.Protect == ProcessNativeMethods.PAGE_EXECUTE) { return(false); } try { size = Convert.ToInt32(memInfo.RegionSize.ToInt64() - (address.ToInt64() - memInfo.BaseAddress.ToInt64())); } catch (OverflowException) { return(false); } if (size <= 0) { return(false); } return(true); }