ntdll: Reserve TLS slot 0 for broken apps that compare index to 0 instead of TLS_OUT_OF_INDEXES.
This commit is contained in:
parent
f3488d0fea
commit
93920c3893
|
@ -1638,6 +1638,43 @@ static void test_threadpool(void)
|
||||||
todo_wine ok (pool != NULL, "CreateThreadpool failed\n");
|
todo_wine ok (pool != NULL, "CreateThreadpool failed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_reserved_tls(void)
|
||||||
|
{
|
||||||
|
void *val;
|
||||||
|
DWORD tls;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
|
/* This seems to be a WinXP+ feature. */
|
||||||
|
if(!pCreateActCtxW) {
|
||||||
|
win_skip("Skipping reserved TLS slot on too old Windows.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = TlsGetValue(0);
|
||||||
|
ok(!val, "TlsGetValue(0) = %p\n", val);
|
||||||
|
|
||||||
|
/* Also make sure that there is a TLS allocated. */
|
||||||
|
tls = TlsAlloc();
|
||||||
|
ok(tls && tls != TLS_OUT_OF_INDEXES, "tls = %x\n", tls);
|
||||||
|
TlsSetValue(tls, (void*)1);
|
||||||
|
|
||||||
|
val = TlsGetValue(0);
|
||||||
|
ok(!val, "TlsGetValue(0) = %p\n", val);
|
||||||
|
|
||||||
|
TlsFree(tls);
|
||||||
|
|
||||||
|
/* The following is too ugly to be run by default */
|
||||||
|
if(0) {
|
||||||
|
/* Set TLS index 0 value and see that this works and doesn't cause problems
|
||||||
|
* for remaining tests. */
|
||||||
|
ret = TlsSetValue(0, (void*)1);
|
||||||
|
ok(ret, "TlsSetValue(0, 1) failed: %u\n", GetLastError());
|
||||||
|
|
||||||
|
val = TlsGetValue(0);
|
||||||
|
ok(val == (void*)1, "TlsGetValue(0) = %p\n", val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void init_funcs(void)
|
static void init_funcs(void)
|
||||||
{
|
{
|
||||||
HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
|
HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
|
||||||
|
@ -1711,6 +1748,7 @@ START_TEST(thread)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test_reserved_tls();
|
||||||
test_CreateRemoteThread();
|
test_CreateRemoteThread();
|
||||||
test_CreateThread_basic();
|
test_CreateThread_basic();
|
||||||
test_CreateThread_suspended();
|
test_CreateThread_suspended();
|
||||||
|
|
|
@ -256,6 +256,7 @@ HANDLE thread_init(void)
|
||||||
RtlInitializeBitMap( &tls_expansion_bitmap, peb->TlsExpansionBitmapBits,
|
RtlInitializeBitMap( &tls_expansion_bitmap, peb->TlsExpansionBitmapBits,
|
||||||
sizeof(peb->TlsExpansionBitmapBits) * 8 );
|
sizeof(peb->TlsExpansionBitmapBits) * 8 );
|
||||||
RtlInitializeBitMap( &fls_bitmap, peb->FlsBitmapBits, sizeof(peb->FlsBitmapBits) * 8 );
|
RtlInitializeBitMap( &fls_bitmap, peb->FlsBitmapBits, sizeof(peb->FlsBitmapBits) * 8 );
|
||||||
|
RtlSetBits( peb->TlsBitmap, 0, 1 ); /* TLS index 0 is reserved and should be initialized to NULL. */
|
||||||
InitializeListHead( &peb->FlsListHead );
|
InitializeListHead( &peb->FlsListHead );
|
||||||
InitializeListHead( &ldr.InLoadOrderModuleList );
|
InitializeListHead( &ldr.InLoadOrderModuleList );
|
||||||
InitializeListHead( &ldr.InMemoryOrderModuleList );
|
InitializeListHead( &ldr.InMemoryOrderModuleList );
|
||||||
|
|
Loading…
Reference in New Issue