From bd73d35e4da88805dcce9d6090d2272c1e9cc7b6 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Mon, 22 Aug 2005 13:38:30 +0000 Subject: [PATCH] added a macro IsKernelPointer() to test whether a pointer value points to the kernel address space. This is needed because on IA-64 the MSB is not necessarily set for pointers to the kernel address space. svn path=/trunk/; revision=17474 --- reactos/ntoskrnl/include/internal/ntoskrnl.h | 18 ++++++++++++++++++ reactos/ntoskrnl/ob/wait.c | 6 +++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ntoskrnl.h b/reactos/ntoskrnl/include/internal/ntoskrnl.h index 7eef767a441..8ce0e52ab40 100644 --- a/reactos/ntoskrnl/include/internal/ntoskrnl.h +++ b/reactos/ntoskrnl/include/internal/ntoskrnl.h @@ -147,6 +147,24 @@ RtlReleaseCapturedUnicodeString( #define ProbeForReadLargeInteger(Ptr) ((LARGE_INTEGER)ProbeForReadGenericType(&(Ptr)->QuadPart, LONGLONG, 0)) #define ProbeForReadUlargeInteger(Ptr) ((ULARGE_INTEGER)ProbeForReadGenericType(&(Ptr)->QuadPart, ULONGLONG, 0)) +/* + * Use IsKernelPointer to test whether a pointer points to the kernel address + * space + */ +#if defined(_X86_) || defined(_M_AMD64) + +/* for x86 and x86-64 the MSB is 1 so we can simply test on that */ +#define IsKernelPointer(Ptr) ((LONG_PTR)(Ptr) < 0) + +#elif defined(_IA64_) + +/* on Itanium if the 24 most significant bits are set, we're not dealing with + user mode pointers. */ +#define IsKernelPointer(Ptr) (((ULONG_PTR)(Ptr) & 0xFFFFFF0000000000ULL) != 0) + +#else +#error IsKernelPointer() needs to be defined for this architecture +#endif #endif /* diff --git a/reactos/ntoskrnl/ob/wait.c b/reactos/ntoskrnl/ob/wait.c index 96f45bddb21..538cc42dcae 100644 --- a/reactos/ntoskrnl/ob/wait.c +++ b/reactos/ntoskrnl/ob/wait.c @@ -149,7 +149,7 @@ NtWaitForMultipleObjects(IN ULONG ObjectCount, DefaultObject = ObjectHeader->Type->DefaultObject; /* Check if it's the internal offset */ - if ((LONG_PTR)DefaultObject >= 0) + if (!IsKernelPointer(DefaultObject)) { /* Increase reference count */ InterlockedIncrement(&ObjectHeader->PointerCount); @@ -295,7 +295,7 @@ NtWaitForSingleObject(IN HANDLE ObjectHandle, WaitableObject = BODY_TO_HEADER(Object)->Type->DefaultObject; /* Is it an offset for internal objects? */ - if ((LONG_PTR)WaitableObject >= 0) + if (!IsKernelPointer(WaitableObject)) { /* Turn it into a pointer */ WaitableObject = (PVOID)((ULONG_PTR)Object + @@ -389,7 +389,7 @@ NtSignalAndWaitForSingleObject(IN HANDLE ObjectHandleToSignal, WaitableObject = BODY_TO_HEADER(WaitObj)->Type->DefaultObject; /* Handle internal offset */ - if ((LONG_PTR)WaitableObject >= 0) + if (!IsKernelPointer(WaitableObject)) { /* Get real pointer */ WaitableObject = (PVOID)((ULONG_PTR)WaitObj +