[ros-diffs] [tkreuzer] 55415: [RTL] - Fix RtlLengthSecurityDescriptor - Implement amd64 version of Implement RtlInitializeContext - Add unwind info to amd64 debug asm functions - Fix 64 bit HEAP_COMMON_ENTRY s...

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sat Feb 4 18:35:56 UTC 2012


Author: tkreuzer
Date: Sat Feb  4 18:35:56 2012
New Revision: 55415

URL: http://svn.reactos.org/svn/reactos?rev=55415&view=rev
Log:
[RTL]
- Fix RtlLengthSecurityDescriptor
- Implement amd64 version of Implement RtlInitializeContext
- Add unwind info to amd64 debug asm functions
- Fix 64 bit HEAP_COMMON_ENTRY structure The resulting version doesn't exactly match the original windows one, but its compatible, as every field, except the dummy fields - which are omitted - is at its correct position.

Modified:
    trunk/reactos/lib/rtl/amd64/debug_asm.S
    trunk/reactos/lib/rtl/amd64/stubs.c
    trunk/reactos/lib/rtl/heap.h

Modified: trunk/reactos/lib/rtl/amd64/debug_asm.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/amd64/debug_asm.S?rev=55415&r1=55414&r2=55415&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/amd64/debug_asm.S [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/amd64/debug_asm.S [iso-8859-1] Sat Feb  4 18:35:56 2012
@@ -22,20 +22,31 @@
 
 .code64
 
-DbgBreakPointNoBugCheck:
+.PROC DbgBreakPointNoBugCheck
+    .endprolog
     int 3
     ret
+.ENDP
 
-DbgBreakPoint:
 DbgUserBreakPoint:
+.PROC DbgBreakPoint
+    .endprolog
     int 3
     ret
+.ENDP
 
-DbgBreakPointWithStatus:
+.PROC DbgBreakPointWithStatus
+    .endprolog
     mov eax, ecx
-RtlpBreakWithStatusInstruction:
     int 3
     ret
+.ENDP
+
+.PROC RtlpBreakWithStatusInstruction
+    .endprolog
+    int 3
+    ret
+.ENDP
 
 DebugService2:
     ret

Modified: trunk/reactos/lib/rtl/amd64/stubs.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/amd64/stubs.c?rev=55415&r1=55414&r2=55415&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/amd64/stubs.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/amd64/stubs.c [iso-8859-1] Sat Feb  4 18:35:56 2012
@@ -11,6 +11,7 @@
 #include <rtl.h>
 #define NDEBUG
 #include <debug.h>
+#include "amd64/ketypes.h"
 
 /* PUBLIC FUNCTIONS **********************************************************/
 
@@ -23,9 +24,60 @@
                      OUT PCONTEXT ThreadContext,
                      IN PVOID ThreadStartParam  OPTIONAL,
                      IN PTHREAD_START_ROUTINE ThreadStartAddress,
-                     IN PINITIAL_TEB InitialTeb)
+                     IN PINITIAL_TEB StackBase)
 {
-    UNIMPLEMENTED;
+
+    ThreadContext->Rax = 0;
+    ThreadContext->Rbx = 0;
+    ThreadContext->Rcx = (ULONG64)ThreadStartParam;
+    ThreadContext->Rdx = 0;
+    ThreadContext->Rsi = 0;
+    ThreadContext->Rdi = 0;
+    ThreadContext->Rbp = 0;
+    ThreadContext->R8 = 0;
+    ThreadContext->R9 = 0;
+    ThreadContext->R10 = 0;
+    ThreadContext->R11 = 0;
+    ThreadContext->R12 = 0;
+
+    /* Set the Selectors */
+    if ((LONG64)ThreadStartAddress < 0)
+    {
+        /* Initialize kernel mode segments */
+        ThreadContext->SegCs = KGDT64_R0_CODE;
+        ThreadContext->SegDs = KGDT64_R3_DATA;
+        ThreadContext->SegEs = KGDT64_R3_DATA;
+        ThreadContext->SegFs = KGDT64_R3_CMTEB;
+        ThreadContext->SegGs = KGDT64_R3_DATA;
+        ThreadContext->SegSs = KGDT64_R0_DATA;
+    }
+    else
+    {
+        /* Initialize user mode segments */
+        ThreadContext->SegCs = KGDT64_R3_CODE |  RPL_MASK;
+        ThreadContext->SegDs = KGDT64_R3_DATA |  RPL_MASK;
+        ThreadContext->SegEs = KGDT64_R3_DATA |  RPL_MASK;
+        ThreadContext->SegFs = KGDT64_R3_CMTEB |  RPL_MASK;
+        ThreadContext->SegGs = KGDT64_R3_DATA |  RPL_MASK;
+        ThreadContext->SegSs = KGDT64_R3_DATA |  RPL_MASK;
+    }
+
+    /* Enable Interrupts */
+    ThreadContext->EFlags = EFLAGS_INTERRUPT_MASK;
+
+    /* Settings passed */
+    ThreadContext->Rip = (ULONG64)ThreadStartAddress;
+    ThreadContext->Rsp = (ULONG64)StackBase - 6 * sizeof(PVOID);
+
+    /* Align stack by 16 and substract 8 (unaligned on function entry) */
+    ThreadContext->Rsp &= ~15;
+    ThreadContext->Rsp -= 8;
+
+    /* Only the basic Context is initialized */
+    ThreadContext->ContextFlags = CONTEXT_CONTROL |
+                                  CONTEXT_INTEGER |
+                                  CONTEXT_SEGMENTS;
+
     return;
 }
 

Modified: trunk/reactos/lib/rtl/heap.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/heap.h?rev=55415&r1=55414&r2=55415&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/heap.h [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/heap.h [iso-8859-1] Sat Feb  4 18:35:56 2012
@@ -78,6 +78,9 @@
 /* Heap structures */
 struct _HEAP_COMMON_ENTRY
 {
+#ifdef _M_AMD64
+    PVOID PreviousBlockPrivateData;
+#endif
     union
     {
         struct
@@ -88,7 +91,11 @@
         };
         struct
         {
+#ifndef _M_AMD64
             PVOID SubSegmentCode;
+#else
+            ULONG SubSegmentCodeDummy;
+#endif
             USHORT PreviousSize;
             union
             {




More information about the Ros-diffs mailing list