/* Sampledll.dll Author : Mithun Shanbhag, mrshanbh@syr.edu */ #include #include #include /* param for TLS storage */ typedef struct { DWORD myId ; }TLSParam, * pTLSParam ; /* the key */ static DWORD TLSKey ; //----< The Thread Proc >---- unsigned __stdcall ThreadFunc (void * p) { return 0 ; } // really does nothing //----< Dll Entry Point >---- BOOL __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { DWORD thrId = GetCurrentThreadId () ; DWORD procId = GetCurrentProcessId () ; pTLSParam pThrData ; switch ( fdwReason ) { case DLL_PROCESS_ATTACH: printf ( "DLL : I am attached to Process # %d \n" , procId ) ; DisableThreadLibraryCalls ( GetModuleHandle ( "SampleDll.dll" ) ) ; if ( ( TLSKey = TlsAlloc () ) == TLS_OUT_OF_INDEXES ) { printf ( "DLL : No keys available for TLS Indexing\n" ) ; return FALSE ; } else printf ( "DLL : key obtained for TLS Indexing\n" ) ; /* Entry to DllMain () is serialized by some internal synchronization primitive. */ HANDLE hInternalThread ; unsigned InternalThreadId ; //////////////////////////////////////////////////////////////// /* This should generate CREATE_THREAD_DEBUG_EVENT in debugger */ //////////////////////////////////////////////////////////////// hInternalThread = (HANDLE) _beginthreadex ( NULL, 0, &ThreadFunc, NULL, 0, &InternalThreadId ) ; ////////////////////////////////////////////////////////////// /* This should generate EXIT_THREAD_DEBUG_EVENT in debugger */ ////////////////////////////////////////////////////////////// CloseHandle ( hInternalThread ) ; break ; case DLL_THREAD_ATTACH: printf ( "DLL : I am attached by thread # %d of process # %d \n" , thrId, procId ) ; pThrData = new TLSParam ; pThrData -> myId = thrId ; if ( TlsSetValue ( TLSKey, pThrData ) != 0 ) printf ( "DLL : Stored data of thread # %d of process # %d in TLS \n", thrId, procId ) ; else printf ( "DLL : Unable to store data of thread # %d of process # %d in TLS \n", thrId, procId ) ; break ; case DLL_THREAD_DETACH: printf ( "DLL : I am detached from thread # %d of process # %d \n" , thrId, procId ) ; pThrData = ( pTLSParam ) TlsGetValue ( TLSKey ) ; if ( pThrData != NULL ) { delete pThrData ; printf ( "DLL : Removed data of thread # %d of process # %d from TLS \n", thrId, procId ) ; } else printf ( "DLL : Could not Remove data of thread # %d of process # %d from TLS \n", thrId, procId ) ; break ; case DLL_PROCESS_DETACH: printf ( "DLL : I am detached from Process # %d \n" , procId ) ; if ( TlsFree ( TLSKey ) != 0 ) printf ( "DLL : key has been freed\n" ) ; else printf ( "DLL : key could not be freed\n" ) ; break ; } return TRUE ; } extern "C" __declspec (dllexport) void SayHello ( DWORD thrId, DWORD procId ) { printf ( "Hello From Thread # %d of Process # %d !\n", thrId, procId ) ; } extern "C" __declspec (dllexport) void AnotherDummyExport ( ) { }