|
|
1.1 ! root 1: ! 2: /******************************************************************************\ ! 3: * This is a part of the Microsoft Source Code Samples. ! 4: * Copyright (C) 1993 Microsoft Corporation. ! 5: * All rights reserved. ! 6: * This source code is only intended as a supplement to ! 7: * Microsoft Development Tools and/or WinHelp documentation. ! 8: * See these sources for detailed information regarding the ! 9: * Microsoft samples programs. ! 10: \******************************************************************************/ ! 11: ! 12: /****************************************************************************\ ! 13: * MODULE: tlsdll.c ! 14: /****************************************************************************/ ! 15: ! 16: ! 17: #include "windows.h" ! 18: #include "stdlib.h" ! 19: #include "string.h" ! 20: #include "stdio.h" ! 21: #include "tlsdll.h" ! 22: ! 23: #define TLS_MINIMUM_AVAILABLE 64 ! 24: ! 25: DWORD TlsIndex; /* Global TLS index */ ! 26: int TlsCount=0; /* a counter for data in TLS storage */ ! 27: char chTlsCount[3]; /* string for counter values */ ! 28: ! 29: /*-----------------------------------------------------------------*/ ! 30: ! 31: void ErrorOut(char errstring[30]) ! 32: /* ! 33: Purpose: Print out an meainful error code by means of ! 34: GetLastError and printf ! 35: ! 36: Inputs: errstring - the action that failed, passed by the ! 37: calling proc. ! 38: ! 39: Returns: none ! 40: ! 41: Calls: GetLastError ! 42: */ ! 43: ! 44: { ! 45: DWORD Error; ! 46: ! 47: Error= GetLastError(); ! 48: printf("Error on %s = %d\n", errstring, Error); ! 49: } ! 50: ! 51: /*-----------------------------------------------------------------*/ ! 52: ! 53: INT WINAPI DllMain(HANDLE hInst, ULONG ul_reason_being_called, LPVOID lpReserved) ! 54: ! 55: /* ! 56: Purpose: Is called by LibEntry, upon entering a dll or detaching ! 57: from a DLL. This function does most of the TLS manipulation. ! 58: ! 59: Inputs: hInst - not used ! 60: ul_reason_being_called - reason DllMain is called ! 61: ! 62: ! 63: Returns: N/A ! 64: ! 65: Calls: TlsAlloc - allocate a TLS index ! 66: malloc - allocate space for tls storage ! 67: TlsSetValue - Store TLS values ! 68: TlsFree - free TLS index ! 69: TlsRetreive - retreives TLS values, based on index ! 70: */ ! 71: ! 72: { ! 73: ! 74: LPVOID TlsString; /* TLS string for storage */ ! 75: ! 76: ! 77: UNREFERENCED_PARAMETER(hInst); ! 78: UNREFERENCED_PARAMETER(lpReserved); ! 79: ! 80: switch (ul_reason_being_called) ! 81: { ! 82: case DLL_PROCESS_ATTACH: /* process attaches */ ! 83: printf("Process Attaching\n"); ! 84: TlsIndex= TlsAlloc(); /* create TLS index */ ! 85: if (TlsIndex == 0xFFFFFFFF) ! 86: ErrorOut("TlsAlloc"); ! 87: break; ! 88: ! 89: case DLL_THREAD_ATTACH: /* thread attaches */ ! 90: if (!(DLL_PROCESS_ATTACH & ul_reason_being_called)) ! 91: { ! 92: printf("Thread Attaching\n"); ! 93: TlsCount++; ! 94: TlsString= malloc(100); /* allocate storage */ ! 95: strcat(TlsString, "Tls Thread#");/* build - */ ! 96: strcat(TlsString, ! 97: itoa(TlsCount, chTlsCount, ! 98: 10) ); /* - string */ ! 99: if (TlsSetValue(TlsIndex, /* set TLS value */ ! 100: TlsString)) ! 101: printf("TlsSetValue success\n\n"); ! 102: else ! 103: ErrorOut("TlsSetValue"); ! 104: } ! 105: else ! 106: printf("Process & Thread attaching\n\n"); ! 107: break; ! 108: ! 109: case DLL_THREAD_DETACH: /* thread detaches */ ! 110: printf("Thread Detaching\n"); ! 111: TlsRetreive(TlsIndex); /* retreive TLS data */ ! 112: break; ! 113: ! 114: case DLL_PROCESS_DETACH: /* process detaches */ ! 115: printf("Process Detaching\n"); ! 116: if (!TlsFree(TlsIndex)) /* free TLS index */ ! 117: ErrorOut("TlsFree"); ! 118: else ! 119: printf("TlsIndex Freed\n"); ! 120: break; ! 121: ! 122: ! 123: default: ! 124: break; ! 125: } ! 126: ! 127: return 1; ! 128: } ! 129: ! 130: /****************************************************************************/ ! 131: ! 132: INT WINAPI TlsInit() ! 133: ! 134: /* ! 135: Purpose: Allow DllMain to be executed for each thread ! 136: ! 137: Inputs: none ! 138: ! 139: Returns: none ! 140: ! 141: Calls: none ! 142: */ ! 143: ! 144: { ! 145: return 1; ! 146: } ! 147: ! 148: /****************************************************************************/ ! 149: ! 150: INT WINAPI TlsRetreive(DWORD TlsIndex) ! 151: ! 152: /* ! 153: Purpose: Retreive TLS values and display (printf) them ! 154: ! 155: Inputs: TlsIndex - TLS index value ! 156: ! 157: Returns: none ! 158: ! 159: Calls: TlsGetValue - Gets the TLS value from the index ! 160: based on the current thread. ! 161: */ ! 162: ! 163: { ! 164: LPVOID tlsvals; ! 165: ! 166: (LPVOID)tlsvals= TlsGetValue(TlsIndex); /* get the TLS value */ ! 167: if (tlsvals == 0) ! 168: ErrorOut("TlsGetValue"); ! 169: else ! 170: printf("tls value= %s\n\n", tlsvals ); /* output it */ ! 171: return 1; ! 172: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.