ntdll/tests: Move TlsIndex test to kernel32:loader.

Gets us access to a dll with tls to verify.
This commit is contained in:
Evan Tang 2023-03-09 11:16:53 -06:00 committed by Alexandre Julliard
parent 2203a8564c
commit a8fa80cfb4
2 changed files with 31 additions and 26 deletions

View file

@ -2117,6 +2117,33 @@ nt4_is_broken:
} }
} }
static void check_tls_index(HANDLE dll, BOOL tls_initialized)
{
BOOL found_dll = FALSE;
LIST_ENTRY *root = &NtCurrentTeb()->Peb->LdrData->InLoadOrderModuleList;
for (LIST_ENTRY *entry = root->Flink; entry != root; entry = entry->Flink)
{
LDR_DATA_TABLE_ENTRY *mod = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
if (wcsicmp(L"ntdll.dll", mod->BaseDllName.Buffer) == 0)
{
/* Pick ntdll as a dll that definitely won't have TLS */
ok(mod->TlsIndex == 0, "ntdll.dll TlsIndex: %d instead of 0\n", mod->TlsIndex);
}
else if (mod->DllBase == dll)
{
SHORT expected = tls_initialized ? -1 : 0;
ok(mod->TlsIndex == expected, "Test exe TlsIndex: %d instead of %d\n", mod->TlsIndex, expected);
found_dll = TRUE;
}
else
{
ok(mod->TlsIndex == 0 || mod->TlsIndex == -1, "%s TlsIndex: %d\n",
debugstr_w(mod->BaseDllName.Buffer), mod->TlsIndex);
}
}
ok(found_dll, "Couldn't find dll %p in module list\n", dll);
}
static void test_import_resolution(void) static void test_import_resolution(void)
{ {
char temp_path[MAX_PATH]; char temp_path[MAX_PATH];
@ -2251,6 +2278,7 @@ static void test_import_resolution(void)
ok( !strcmp( str, "hello world" ), "wrong tls data '%s' at %p\n", str, str ); ok( !strcmp( str, "hello world" ), "wrong tls data '%s' at %p\n", str, str );
ok(ptr->tls_index_hi == 0, "TLS Index written as a short, high half: %d\n", ptr->tls_index_hi); ok(ptr->tls_index_hi == 0, "TLS Index written as a short, high half: %d\n", ptr->tls_index_hi);
} }
check_tls_index(mod, ptr->tls_index != 9999);
FreeLibrary( mod ); FreeLibrary( mod );
break; break;
case 1: /* load with DONT_RESOLVE_DLL_REFERENCES doesn't resolve imports */ case 1: /* load with DONT_RESOLVE_DLL_REFERENCES doesn't resolve imports */
@ -2267,6 +2295,7 @@ static void test_import_resolution(void)
ok( ptr->thunks[0].u1.Function == 0xdeadbeef, "thunk resolved to %p for %s.%s\n", ok( ptr->thunks[0].u1.Function == 0xdeadbeef, "thunk resolved to %p for %s.%s\n",
(void *)ptr->thunks[0].u1.Function, data.module, data.function.name ); (void *)ptr->thunks[0].u1.Function, data.module, data.function.name );
ok( ptr->tls_index == 9999, "wrong tls index %d\n", ptr->tls_index ); ok( ptr->tls_index == 9999, "wrong tls index %d\n", ptr->tls_index );
check_tls_index(mod, ptr->tls_index != 9999);
FreeLibrary( mod2 ); FreeLibrary( mod2 );
FreeLibrary( mod ); FreeLibrary( mod );
break; break;
@ -2278,6 +2307,7 @@ static void test_import_resolution(void)
ok( ptr->thunks[0].u1.Function == 0xdeadbeef, "thunk resolved to %p for %s.%s\n", ok( ptr->thunks[0].u1.Function == 0xdeadbeef, "thunk resolved to %p for %s.%s\n",
(void *)ptr->thunks[0].u1.Function, data.module, data.function.name ); (void *)ptr->thunks[0].u1.Function, data.module, data.function.name );
ok( ptr->tls_index == 9999, "wrong tls index %d\n", ptr->tls_index ); ok( ptr->tls_index == 9999, "wrong tls index %d\n", ptr->tls_index );
check_tls_index(mod, ptr->tls_index != 9999);
FreeLibrary( mod ); FreeLibrary( mod );
break; break;
case 3: /* load with tls init function */ case 3: /* load with tls init function */
@ -2293,6 +2323,7 @@ static void test_import_resolution(void)
str = ((char **)NtCurrentTeb()->ThreadLocalStoragePointer)[ptr->tls_index]; str = ((char **)NtCurrentTeb()->ThreadLocalStoragePointer)[ptr->tls_index];
ok( !strcmp( str, "hello!world" ), "wrong tls data '%s' at %p\n", str, str ); ok( !strcmp( str, "hello!world" ), "wrong tls data '%s' at %p\n", str, str );
} }
check_tls_index(mod, ptr->tls_index != 9999);
FreeLibrary( mod ); FreeLibrary( mod );
} }
DeleteFileA( dll_name ); DeleteFileA( dll_name );

View file

@ -3608,31 +3608,6 @@ static void test_RtlFirstFreeAce(void)
HeapFree(GetProcessHeap(), 0, acl); HeapFree(GetProcessHeap(), 0, acl);
} }
static void test_TlsIndex(void)
{
LIST_ENTRY *root = &NtCurrentTeb()->Peb->LdrData->InLoadOrderModuleList;
for (LIST_ENTRY *entry = root->Flink; entry != root; entry = entry->Flink)
{
LDR_DATA_TABLE_ENTRY *mod = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
if (lstrcmpiW(L"ntdll.dll", mod->BaseDllName.Buffer) == 0)
{
/* Pick ntdll as a dll that definitely won't have TLS */
ok(mod->TlsIndex == 0, "ntdll.dll TlsIndex: %d instead of 0\n", mod->TlsIndex);
}
else if (mod->DllBase == GetModuleHandleA(NULL))
{
/* mingw gcc doesn't support MSVC-style TLS */
/* If we do get a way to add tls to this exe, uncomment the following test: */
/* ok(mod->TlsIndex == -1, "Test exe TlsIndex: %d instead of -1\n", mod->TlsIndex); */
}
else
{
ok(mod->TlsIndex == 0 || mod->TlsIndex == -1, "%s TlsIndex: %d\n",
debugstr_w(mod->BaseDllName.Buffer), mod->TlsIndex);
}
}
}
START_TEST(rtl) START_TEST(rtl)
{ {
InitFunctionPtrs(); InitFunctionPtrs();
@ -3677,5 +3652,4 @@ START_TEST(rtl)
test_DbgPrint(); test_DbgPrint();
test_RtlDestroyHeap(); test_RtlDestroyHeap();
test_RtlFirstFreeAce(); test_RtlFirstFreeAce();
test_TlsIndex();
} }