Пример #1
0
        /// <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);
        }
Пример #2
0
 public static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out NativeStructs.MEMORY_BASIC_INFORMATION lpBuffer, int dwLength);