Mike McCormack : ntdll: Implement RtlDecodePointer and
RtlEncodePointer.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jan 22 07:05:31 CST 2007
Module: wine
Branch: master
Commit: bcc717174c54017e0cb5dfdb8c0a8e4f521ea42a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bcc717174c54017e0cb5dfdb8c0a8e4f521ea42a
Author: Mike McCormack <mike at codeweavers.com>
Date: Mon Jan 22 19:24:14 2007 +0900
ntdll: Implement RtlDecodePointer and RtlEncodePointer.
---
dlls/ntdll/ntdll.spec | 4 ++--
dlls/ntdll/rtl.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 803ed53..b3e3540 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -501,7 +501,7 @@
@ stub RtlDeactivateActivationContext
@ stub RtlDeactivateActivationContextUnsafeFast
@ stub RtlDebugPrintTimes
-# @ stub RtlDecodePointer
+@ stdcall RtlDecodePointer(ptr)
# @ stub RtlDecodeSystemPointer
@ stub RtlDecompressBuffer
@ stub RtlDecompressFragment
@@ -543,7 +543,7 @@
@ stdcall RtlDuplicateUnicodeString(long ptr ptr)
@ stdcall RtlEmptyAtomTable(ptr long)
# @ stub RtlEnableEarlyCriticalSectionEventCreation
-# @ stub RtlEncodePointer
+@ stdcall RtlEncodePointer(ptr)
# @ stub RtlEncodeSystemPointer
@ stdcall -ret64 RtlEnlargedIntegerMultiply(long long)
@ stdcall RtlEnlargedUnsignedDivide(double long ptr)
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c
index 8ddab6a..449e91a 100644
--- a/dlls/ntdll/rtl.c
+++ b/dlls/ntdll/rtl.c
@@ -886,3 +886,39 @@ NTSTATUS WINAPI RtlIpv4AddressToStringEx
return STATUS_SUCCESS;
}
+
+static DWORD_PTR get_pointer_obfuscator( void )
+{
+ static DWORD_PTR pointer_obfuscator;
+
+ if (!pointer_obfuscator)
+ {
+ ULONG seed = NtGetTickCount();
+ ULONG_PTR rand;
+
+ /* generate a random value for the obfuscator */
+ rand = RtlUniform( &seed );
+
+ /* handle 64bit pointers */
+ rand ^= RtlUniform( &seed ) << ((sizeof (DWORD_PTR) - sizeof (ULONG))*8);
+
+ /* set the high bits so dereferencing obfuscated pointers will (usually) crash */
+ rand |= 0xc0000000 << ((sizeof (DWORD_PTR) - sizeof (ULONG))*8);
+
+ interlocked_cmpxchg_ptr( (void**) &pointer_obfuscator, (void*) rand, NULL );
+ }
+
+ return pointer_obfuscator;
+}
+
+PVOID WINAPI RtlEncodePointer( PVOID ptr )
+{
+ DWORD_PTR ptrval = (DWORD_PTR) ptr;
+ return (PVOID)(ptrval ^ get_pointer_obfuscator());
+}
+
+PVOID WINAPI RtlDecodePointer( PVOID ptr )
+{
+ DWORD_PTR ptrval = (DWORD_PTR) ptr;
+ return (PVOID)(ptrval ^ get_pointer_obfuscator());
+}
More information about the wine-cvs
mailing list