diff --git a/reactos/dll/ntdll/def/ntdll.pspec b/reactos/dll/ntdll/def/ntdll.pspec index 2c5de04b8d1..e87b71c6bf1 100644 --- a/reactos/dll/ntdll/def/ntdll.pspec +++ b/reactos/dll/ntdll/def/ntdll.pspec @@ -419,7 +419,7 @@ @ stdcall RtlAcquireSRWLockShared(ptr) @ stdcall RtlActivateActivationContext(long ptr ptr) //@ stdcall RtlActivateActivationContextEx -@ stdcall RtlActivateActivationContextUnsafeFast(ptr ptr) +@ fastcall RtlActivateActivationContextUnsafeFast(ptr ptr) @ stdcall RtlAddAccessAllowedAce(ptr long long ptr) @ stdcall RtlAddAccessAllowedAceEx(ptr long long long ptr) @ stdcall RtlAddAccessAllowedObjectAce(ptr long long long ptr ptr ptr) @@ -532,7 +532,7 @@ @ stdcall RtlCutoverTimeToSystemTime(ptr ptr ptr long) @ stdcall RtlDeNormalizeProcessParams(ptr) @ stdcall RtlDeactivateActivationContext(long long) -@ stdcall RtlDeactivateActivationContextUnsafeFast(ptr) +@ fastcall RtlDeactivateActivationContextUnsafeFast(ptr) //@ stdcall RtlDebugPrintTimes @ stdcall RtlDecodePointer(ptr) @ stdcall RtlDecodeSystemPointer(ptr) RtlEncodeSystemPointer diff --git a/reactos/dll/ntdll/ldr/ldrinit.c b/reactos/dll/ntdll/ldr/ldrinit.c index 5913304361a..a7a196fcaa3 100644 --- a/reactos/dll/ntdll/ldr/ldrinit.c +++ b/reactos/dll/ntdll/ldr/ldrinit.c @@ -616,8 +616,8 @@ LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL) /* Set up the Act Ctx */ ActCtx.Size = sizeof(ActCtx); - ActCtx.Frame.Flags = ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID; - RtlZeroMemory(&ActCtx, sizeof(ActCtx)); + ActCtx.Format = 1; + RtlZeroMemory(&ActCtx.Frame, sizeof(RTL_ACTIVATION_CONTEXT_STACK_FRAME)); /* Activate the ActCtx */ RtlActivateActivationContextUnsafeFast(&ActCtx, @@ -682,8 +682,8 @@ LdrpRunInitializeRoutines(IN PCONTEXT Context OPTIONAL) { /* Set up the Act Ctx */ ActCtx.Size = sizeof(ActCtx); - ActCtx.Frame.Flags = ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID; - RtlZeroMemory(&ActCtx, sizeof(ActCtx)); + ActCtx.Format = 1; + RtlZeroMemory(&ActCtx.Frame, sizeof(RTL_ACTIVATION_CONTEXT_STACK_FRAME)); /* Activate the ActCtx */ RtlActivateActivationContextUnsafeFast(&ActCtx, diff --git a/reactos/dll/ntdll/ldr/ldrpe.c b/reactos/dll/ntdll/ldr/ldrpe.c index 730d260d836..12e24fe547d 100644 --- a/reactos/dll/ntdll/ldr/ldrpe.c +++ b/reactos/dll/ntdll/ldr/ldrpe.c @@ -660,8 +660,8 @@ LdrpWalkImportDescriptor(IN LPWSTR DllPath OPTIONAL, DPRINT1("LdrpWalkImportDescriptor('%S' %x)\n", DllPath, LdrEntry); /* Set up the Act Ctx */ ActCtx.Size = sizeof(ActCtx); - ActCtx.Frame.Flags = ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID; - RtlZeroMemory(&ActCtx, sizeof(ActCtx)); + ActCtx.Frame.Flags = 1; + RtlZeroMemory(&ActCtx.Frame, sizeof(RTL_ACTIVATION_CONTEXT_STACK_FRAME)); /* Check if we have a manifest prober routine */ if (LdrpManifestProberRoutine) diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index a5c453f2e32..6807128b626 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -3071,8 +3071,8 @@ RtlAddRefActivationContext( NTSYSAPI -NTSTATUS -NTAPI +PRTL_ACTIVATION_CONTEXT_STACK_FRAME +FASTCALL RtlActivateActivationContextUnsafeFast( IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame, IN PVOID Context @@ -3121,8 +3121,8 @@ NTAPI RtlFreeThreadActivationContextStack(void); NTSYSAPI -NTSTATUS -NTAPI +PRTL_ACTIVATION_CONTEXT_STACK_FRAME +FASTCALL RtlDeactivateActivationContextUnsafeFast( IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame ); diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index cd900e1b8de..1a6dc569178 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -22,6 +22,8 @@ #include +BOOLEAN RtlpNotAllowingMultipleActivation; + #define QUERY_ACTCTX_FLAG_ACTIVE (0x00000001) #define ACTCTX_FLAGS_ALL (\ @@ -2730,31 +2732,75 @@ RtlAllocateActivationContextStack(IN PVOID *Context) return STATUS_SUCCESS; } -NTSTATUS -NTAPI +PRTL_ACTIVATION_CONTEXT_STACK_FRAME +FASTCALL RtlActivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame, IN PVOID Context) { - static int i; +#if NEW_NTDLL_LOADER + RTL_ACTIVATION_CONTEXT_STACK_FRAME *ActiveFrame; - if (i == 0) - UNIMPLEMENTED; - i++; + /* Get the curren active frame */ + ActiveFrame = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame; - return STATUS_NOT_IMPLEMENTED; + DPRINT1("ActiveFrame %p, &Frame->Frame %p, Context %p\n", ActiveFrame, &Frame->Frame, Context); + + /* Actually activate it */ + Frame->Frame.Previous = ActiveFrame; + Frame->Frame.ActivationContext = Context; + Frame->Frame.Flags = 0; + + /* Check if we can activate this context */ + if ((ActiveFrame && (ActiveFrame->ActivationContext != Context)) || + Context) + { + /* Set new active frame */ + NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame = &Frame->Frame; + return &Frame->Frame; + } + + /* We can get here only one way: it was already activated */ + DPRINT1("Trying to activate improper activation context\n"); + + /* Activate only if we are allowing multiple activation */ + if (!RtlpNotAllowingMultipleActivation) + { + NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame = &Frame->Frame; + } + else + { + /* Set flag */ + Frame->Frame.Flags = 0x30; + } + + /* Return pointer to the activation frame */ + return &Frame->Frame; +#else + return NULL; +#endif } -NTSTATUS -NTAPI +PRTL_ACTIVATION_CONTEXT_STACK_FRAME +FASTCALL RtlDeactivateActivationContextUnsafeFast(IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame) { - static int i; +#if NEW_NTDLL_LOADER + RTL_ACTIVATION_CONTEXT_STACK_FRAME *frame, *top; - if (i == 0) - UNIMPLEMENTED; - i++; + /* find the right frame */ + top = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame; + frame = &Frame->Frame; - return STATUS_NOT_IMPLEMENTED; + if (!frame) + RtlRaiseStatus( STATUS_SXS_INVALID_DEACTIVATION ); + + /* pop everything up to and including frame */ + NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame = frame->Previous; + + return frame; +#else + return NULL; +#endif }