ntdll: Inherit default activation context from creation thread.

This commit is contained in:
Nikolay Sivov 2013-09-05 11:35:17 +04:00 committed by Alexandre Julliard
parent ab08d2a5ba
commit 93c59714c0
2 changed files with 27 additions and 4 deletions

View File

@ -287,7 +287,6 @@ static DWORD WINAPI thread_actctx_func(void *p)
cur = (void*)0xdeadbeef;
ret = pGetCurrentActCtx(&cur);
ok(ret, "thread GetCurrentActCtx failed, %u\n", GetLastError());
todo_wine
ok(cur == param->handle, "got %p, expected %p\n", cur, param->handle);
param->thread_context = cur;
@ -1550,6 +1549,17 @@ static void test_thread_actctx(void)
ok(b, "GetCurentActCtx failed: %u\n", GetLastError());
ok(handle == 0, "active context %p\n", handle);
/* without active context */
param.thread_context = (void*)0xdeadbeef;
param.handle = NULL;
thread = CreateThread(NULL, 0, thread_actctx_func, &param, 0, &tid);
ok(thread != NULL, "failed, got %u\n", GetLastError());
ret = WaitForSingleObject(thread, 1000);
ok(ret == WAIT_OBJECT_0, "wait timeout\n");
ok(param.thread_context == NULL, "got wrong thread context %p\n", param.thread_context);
CloseHandle(thread);
b = pActivateActCtx(context, &cookie);
ok(b, "activation failed: %u\n", GetLastError());
@ -1568,7 +1578,6 @@ static void test_thread_actctx(void)
ret = WaitForSingleObject(thread, 1000);
ok(ret == WAIT_OBJECT_0, "wait timeout\n");
todo_wine
ok(param.thread_context == context, "got wrong thread context %p, %p\n", param.thread_context, context);
CloseHandle(thread);
@ -1579,7 +1588,6 @@ todo_wine
ret = WaitForSingleObject(thread, 1000);
ok(ret == WAIT_OBJECT_0, "wait timeout\n");
todo_wine
ok(param.thread_context == context, "got wrong thread context %p, %p\n", param.thread_context, context);
CloseHandle(thread);

View File

@ -432,7 +432,7 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *
pthread_attr_t attr;
struct ntdll_thread_data *thread_data;
struct startup_info *info = NULL;
HANDLE handle = 0;
HANDLE handle = 0, actctx = 0;
TEB *teb = NULL;
DWORD tid = 0;
int request_pipe[2];
@ -497,6 +497,21 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *
teb->StaticUnicodeString.Buffer = teb->StaticUnicodeBuffer;
teb->StaticUnicodeString.MaximumLength = sizeof(teb->StaticUnicodeBuffer);
/* create default activation context frame for new thread */
RtlGetActiveActivationContext(&actctx);
if (actctx)
{
RTL_ACTIVATION_CONTEXT_STACK_FRAME *frame;
frame = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(*frame));
frame->Previous = NULL;
frame->ActivationContext = actctx;
frame->Flags = 0;
teb->ActivationContextStack.ActiveFrame = frame;
RtlAddRefActivationContext(actctx);
}
info = (struct startup_info *)(teb + 1);
info->teb = teb;
info->entry_point = start;