Windows doesn't do any access checks in ProbeForRead, it only checks the
range and alignment. The MmUserProbeAddress access is used to raise an
exception with the appropriate parameters. So the old version was
correct (except for the misleading comment maybe)
Am 21.03.2011 15:43, schrieb rharabien(a)svn.reactos.org:
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);
}
}