
Here is version working on MSVC6. It uses definition of IMAGE_TLS_DIRECTORY structure as defined in Platform SDK installed together with MSVC6 (later on it has been updated to contain just 6 DWORDs). I received this code from Holger Grund, tweaked it to run with old Platform SDK headers, added Beeps and second thread and finally tested with MSVC6. I think that definition of _tls_used (from Holger) is something new and useful :> B. #define WIN32_LEAN_AND_MEAN #include <windows.h> typedef unsigned long ULONG_PTR; namespace StaticTlsSection { void NTAPI tls_thread_callback( void*, DWORD dwReason, void* ) { if(dwReason == DLL_THREAD_DETACH) Beep(440, 100); else if(dwReason == DLL_PROCESS_DETACH) Beep(880, 50); } ULONG tls_index; const char data_template[1] = { 0 }; //const void (NTAPI *callback_array[1])( PIMAGE_TLS_CALLBACK callback_array[2] = { &tls_thread_callback, NULL }; extern "C" const IMAGE_TLS_DIRECTORY _tls_used; const IMAGE_TLS_DIRECTORY _tls_used = { reinterpret_cast<DWORD> ( &data_template ), reinterpret_cast<DWORD> ( (&data_template) + 1 ), reinterpret_cast<PDWORD> ( &tls_index ), reinterpret_cast<PIMAGE_TLS_CALLBACK *> ( &callback_array ), 0, 0 }; } DWORD WINAPI f(void *) { Sleep(500); return 0; } int main(int argc, char* argv[]) { DWORD id; HANDLE h = CreateThread(NULL, 0, &f, 0, 0, &id); WaitForSingleObject(h, INFINITE); CloseHandle(h); return 0; }