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