/// <summary> /// Determines whether the specified pointer is valid to read from. /// </summary> /// <param name="ptr">The pointer to check.</param> /// <returns> /// <c>true</c> if the pointer is valid; otherwise, <c>false</c>. /// </returns> private static bool IsValidReadPtr(IntPtr ptr) { NativeStructs.MEMORY_BASIC_INFORMATION mbi = new NativeStructs.MEMORY_BASIC_INFORMATION(); int mbiSize = Marshal.SizeOf(typeof(NativeStructs.MEMORY_BASIC_INFORMATION)); if (SafeNativeMethods.VirtualQuery(ptr, out mbi, new UIntPtr((ulong)mbiSize)) == UIntPtr.Zero) { return(false); } if (mbi.State != NativeConstants.MEM_COMMIT || (mbi.Protect & NativeConstants.PAGE_GUARD) != 0 || (mbi.Protect & NativeConstants.PAGE_NOACCESS) != 0) { return(false); } const int ReadProtect = NativeConstants.PAGE_READONLY | NativeConstants.PAGE_READWRITE | NativeConstants.PAGE_WRITECOPY | NativeConstants.PAGE_EXECUTE_READ | NativeConstants.PAGE_EXECUTE_READWRITE | NativeConstants.PAGE_EXECUTE_WRITECOPY; return((mbi.Protect & ReadProtect) != 0); }
internal static extern unsafe UIntPtr VirtualQuery(IntPtr address, out NativeStructs.MEMORY_BASIC_INFORMATION buffer, UIntPtr sizeOfBuffer);