From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/ntdll/actctx.c | 19 +++++++++++++++++++ dlls/ntdll/ntdll.spec | 2 +- include/winternl.h | 11 +++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c index 20d22bbe4de..5c7aa6936ac 100644 --- a/dlls/ntdll/actctx.c +++ b/dlls/ntdll/actctx.c @@ -5435,6 +5435,25 @@ NTSTATUS WINAPI RtlActivateActivationContext( ULONG flags, HANDLE handle, PULONG return RtlActivateActivationContextEx( flags, NtCurrentTeb(), handle, cookie ); }
+/****************************************************************** + * RtlActivateActivationContextUnsafeFast (NTDLL.@) + * + * FIXME: function prototype might be wrong + */ +RTL_ACTIVATION_CONTEXT_STACK_FRAME * FASTCALL RtlActivateActivationContextUnsafeFast( RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED *frame_extended, + PVOID context ) +{ + ACTIVATION_CONTEXT_STACK *actctx_stack = NtCurrentTeb()->ActivationContextStackPointer; + + TRACE( "%p %p\n", frame_extended, context ); + + frame_extended->Frame.Previous = actctx_stack->ActiveFrame; + frame_extended->Frame.ActivationContext = context; + frame_extended->Frame.Flags = 0x20; + actctx_stack->ActiveFrame = &frame_extended->Frame; + RtlAddRefActivationContext( context ); + return &frame_extended->Frame; +}
/****************************************************************** * RtlActivateActivationContextEx (NTDLL.@) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 4e36bfe2662..f79dfd50da5 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -484,7 +484,7 @@ @ stdcall RtlAcquireSRWLockShared(ptr) @ stdcall RtlActivateActivationContext(long ptr ptr) @ stdcall RtlActivateActivationContextEx(long ptr ptr ptr) -@ stub RtlActivateActivationContextUnsafeFast +@ stdcall -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) diff --git a/include/winternl.h b/include/winternl.h index 86f5f4e5480..76d719ffac9 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -231,6 +231,17 @@ typedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME ULONG Flags; } RTL_ACTIVATION_CONTEXT_STACK_FRAME, *PRTL_ACTIVATION_CONTEXT_STACK_FRAME;
+typedef struct _RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED +{ + SIZE_T Size; + ULONG Format; + RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame; + PVOID Extra1; + PVOID Extra2; + PVOID Extra3; + PVOID Extra4; +} RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED, *PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED; + typedef struct _ACTIVATION_CONTEXT_STACK { RTL_ACTIVATION_CONTEXT_STACK_FRAME *ActiveFrame;