From: Zhiyi Zhang zzhang@codeweavers.com
Prepare for RtlActivateActivationContextUnsafeFast(), which adds frames with flags 0x20. Normal frame flags are 0x28. So 0x8 is most likely to note that it's callee-allocated and needs to be freed in RtlFreeActivationContextStack(). Whereas missing 0x8 probably means a frame is caller-allocated. --- dlls/kernel32/tests/actctx.c | 27 --------------------------- dlls/ntdll/actctx.c | 12 ++++++++---- dlls/ntdll/ntdll_misc.h | 3 +++ 3 files changed, 11 insertions(+), 31 deletions(-)
diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c index b35e2f3f418..8bd459dccca 100644 --- a/dlls/kernel32/tests/actctx.c +++ b/dlls/kernel32/tests/actctx.c @@ -2234,29 +2234,16 @@ static void test_actctx(void) frame = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame; ok(!frame->Previous, "Got unexpected Previous.\n"); ok(frame->ActivationContext == handle, "Got unexpected ActivationContext.\n"); - todo_wine ok(frame->Flags == 0x28, "Got unexpected Flags %#lx.\n", frame->Flags);
b = DeactivateActCtx(0, cookie); ok(b, "DeactivateActCtx failed: %lu\n", GetLastError());
status = pRtlActivateActivationContext(0x20, handle, &cookie); - todo_wine ok(status == STATUS_INVALID_PARAMETER, "Got unexpected status %#lx.\n", status); - if (status == STATUS_SUCCESS) - { - b = DeactivateActCtx(0, cookie); - ok(b, "DeactivateActCtx failed: %lu\n", GetLastError()); - }
status = pRtlActivateActivationContext(0x28, handle, &cookie); - todo_wine ok(status == STATUS_INVALID_PARAMETER, "Got unexpected status %#lx.\n", status); - if (status == STATUS_SUCCESS) - { - b = DeactivateActCtx(0, cookie); - ok(b, "DeactivateActCtx failed: %lu\n", GetLastError()); - }
status = pRtlActivateActivationContext(0, handle, &cookie); ok(status == STATUS_SUCCESS, "Got unexpected status %#lx.\n", status); @@ -2264,7 +2251,6 @@ static void test_actctx(void) frame = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame; ok(!frame->Previous, "Got unexpected Previous.\n"); ok(frame->ActivationContext == handle, "Got unexpected ActivationContext.\n"); - todo_wine ok(frame->Flags == 0x28, "Got unexpected Flags %#lx.\n", frame->Flags);
b = DeactivateActCtx(0, cookie); @@ -2274,22 +2260,10 @@ static void test_actctx(void) ok(b, "GetCurrentActCtx failed: %lu\n", GetLastError());
status = pRtlActivateActivationContextEx(0x20, NtCurrentTeb(), handle, &cookie); - todo_wine ok(status == STATUS_INVALID_PARAMETER, "Got unexpected status %#lx.\n", status); - if (status == STATUS_SUCCESS) - { - b = DeactivateActCtx(0, cookie); - ok(b, "DeactivateActCtx failed: %lu\n", GetLastError()); - }
status = pRtlActivateActivationContextEx(0x28, NtCurrentTeb(), handle, &cookie); - todo_wine ok(status == STATUS_INVALID_PARAMETER, "Got unexpected status %#lx.\n", status); - if (status == STATUS_SUCCESS) - { - b = DeactivateActCtx(0, cookie); - ok(b, "DeactivateActCtx failed: %lu\n", GetLastError()); - }
status = pRtlActivateActivationContextEx(0, NtCurrentTeb(), handle, &cookie); ok(status == STATUS_SUCCESS, "Got unexpected status %#lx.\n", status); @@ -2297,7 +2271,6 @@ static void test_actctx(void) frame = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame; ok(!frame->Previous, "Got unexpected Previous.\n"); ok(frame->ActivationContext == handle, "Got unexpected ActivationContext.\n"); - todo_wine ok(frame->Flags == 0x28, "Got unexpected Flags %#lx.\n", frame->Flags);
b = DeactivateActCtx(0, cookie); diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c index 9828d90d11d..20d22bbe4de 100644 --- a/dlls/ntdll/actctx.c +++ b/dlls/ntdll/actctx.c @@ -5430,9 +5430,9 @@ NTSTATUS WINAPI RtlZombifyActivationContext( HANDLE handle ) /****************************************************************** * RtlActivateActivationContext (NTDLL.@) */ -NTSTATUS WINAPI RtlActivateActivationContext( ULONG unknown, HANDLE handle, PULONG_PTR cookie ) +NTSTATUS WINAPI RtlActivateActivationContext( ULONG flags, HANDLE handle, PULONG_PTR cookie ) { - return RtlActivateActivationContextEx( 0, NtCurrentTeb(), handle, cookie ); + return RtlActivateActivationContextEx( flags, NtCurrentTeb(), handle, cookie ); }
@@ -5444,10 +5444,13 @@ NTSTATUS WINAPI RtlActivateActivationContextEx( ULONG flags, TEB *teb, HANDLE ha ACTIVATION_CONTEXT_STACK *actctx_stack = teb->ActivationContextStackPointer; RTL_ACTIVATION_CONTEXT_STACK_FRAME *frame;
+ if (flags != 0) + return STATUS_INVALID_PARAMETER; + frame = RtlAllocateHeap( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, sizeof(*frame) ); frame->Previous = actctx_stack->ActiveFrame; frame->ActivationContext = handle; - frame->Flags = 0; + frame->Flags = 0x20 | NTDLL_STACK_FRAME_ALLOCATED; actctx_stack->ActiveFrame = frame; RtlAddRefActivationContext( handle );
@@ -5512,7 +5515,8 @@ void WINAPI RtlFreeActivationContextStack( ACTIVATION_CONTEXT_STACK *actctx_stac { RTL_ACTIVATION_CONTEXT_STACK_FRAME *prev = frame->Previous; RtlReleaseActivationContext( frame->ActivationContext ); - RtlFreeHeap( GetProcessHeap(), 0, frame ); + if (frame->Flags & NTDLL_STACK_FRAME_ALLOCATED) + RtlFreeHeap( GetProcessHeap(), 0, frame ); frame = prev; } actctx_stack->ActiveFrame = NULL; diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index f82edef6b65..7e9b39fbc53 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -35,6 +35,9 @@
#define NTDLL_TLS_ERRNO 16 /* TLS slot for _errno() */
+/* undocumented */ +#define NTDLL_STACK_FRAME_ALLOCATED 0x8 /* For RtlActivateActivationContextEx()/RtlFreeActivationContextStack() */ + #ifdef __i386__ static const USHORT current_machine = IMAGE_FILE_MACHINE_I386; #elif defined(__x86_64__)