Author: rharabien Date: Mon Mar 21 14:43:56 2011 New Revision: 51108
URL: http://svn.reactos.org/svn/reactos?rev=51108&view=rev Log: Fix ProbeForRead. It wasn't ever checking if memory can be accessed. Thanks to big-endian it wasn't breaking MmUserProbeAddress as well. Code is now nearly the same as in ProbeForWrite. It shouldn't break anything. If it does, it's not bug in this code. :)
Modified: trunk/reactos/ntoskrnl/ex/exintrin.c
Modified: trunk/reactos/ntoskrnl/ex/exintrin.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/exintrin.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/ex/exintrin.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ex/exintrin.c [iso-8859-1] Mon Mar 21 14:43:56 2011 @@ -103,6 +103,8 @@ IN SIZE_T Length, IN ULONG Alignment) { + ULONG_PTR Last, Current = (ULONG_PTR)Address; + CHAR Temp; PAGED_CODE();
/* Only probe if we have a valid length */ @@ -115,18 +117,31 @@ (Alignment == 8) || (Alignment == 16));
- /* Check for correct alignment */ - if (((ULONG_PTR)Address & (Alignment - 1)) != 0) + /* Check the alignment */ + if ((Current & (Alignment - 1)) != 0) { /* Incorrect alignment */ ExRaiseDatatypeMisalignment(); } - else if (((ULONG_PTR)Address + Length) < (ULONG_PTR)Address || - ((ULONG_PTR)Address + Length) > (ULONG_PTR)MmUserProbeAddress) + + /* Get the end address */ + Last = Current + Length - 1; + if ((Last < Current) || (Last >= (ULONG_PTR)MmUserProbeAddress)) + { + /* Raise an access violation */ + ExRaiseAccessViolation(); + } + + /* Round down to the last page */ + Last = PAGE_ROUND_DOWN(Last) + PAGE_SIZE; + do { /* Attempt a read */ - *(volatile CHAR* const)MmUserProbeAddress = 0; - } + Temp = *(volatile CHAR*)Current; + + /* Go to the next address */ + Current = PAGE_ROUND_DOWN(Current) + PAGE_SIZE; + } while (Current != Last); } }