Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
3.6 KiB

  1. /*++
  2. Copyright (c) 1989 Microsoft Corporation
  3. Module Name:
  4. tls.c
  5. Abstract:
  6. This module implements verification functions for TLS (thread
  7. local storage) interfaces.
  8. Author:
  9. Silviu Calinoiu (SilviuC) 3-Jul-2001
  10. Revision History:
  11. 3-Jul-2001 (SilviuC): initial version.
  12. --*/
  13. #include "pch.h"
  14. #include "verifier.h"
  15. #include "support.h"
  16. //
  17. // TLS (thread local storage) checks.
  18. //
  19. // All TLS indexes have the thread ID OR'd into the index.
  20. // This will prevent using uninitialized variables.
  21. //
  22. // If more than 2**16 indeces are requested the functions will start
  23. // to fail TLS index allocations.
  24. //
  25. #define TLS_MAXIMUM_INDEX 0xFFFF
  26. #define TLS_MAGIC_PATTERN 0xABBA
  27. DWORD
  28. ScrambleTlsIndex (
  29. DWORD Index
  30. )
  31. {
  32. return (Index << 16) | TLS_MAGIC_PATTERN;
  33. }
  34. DWORD
  35. UnscrambleTlsIndex (
  36. DWORD Index
  37. )
  38. {
  39. return (Index >> 16);
  40. }
  41. BOOL
  42. CheckTlsIndex (
  43. DWORD Index
  44. )
  45. {
  46. DWORD Tid;
  47. Tid = HandleToUlong(NtCurrentTeb()->ClientId.UniqueThread);
  48. //
  49. // Check the TLS index value.
  50. //
  51. if ((Index & 0xFFFF) != TLS_MAGIC_PATTERN) {
  52. VERIFIER_STOP (APPLICATION_VERIFIER_INVALID_HANDLE,
  53. "Invalid TLS index used in current stack (use kb).",
  54. Index, "Invalid TLS index",
  55. TLS_MAGIC_PATTERN, "Expected lower part of the index",
  56. 0, NULL, 0, NULL);
  57. return FALSE;
  58. }
  59. else {
  60. return TRUE;
  61. }
  62. }
  63. //WINBASEAPI
  64. DWORD
  65. WINAPI
  66. AVrfpTlsAlloc(
  67. VOID
  68. )
  69. {
  70. typedef DWORD (WINAPI * FUNCTION_TYPE) (VOID);
  71. FUNCTION_TYPE Function;
  72. DWORD Index;
  73. Function = AVRFP_GET_ORIGINAL_EXPORT (AVrfpKernel32Thunks,
  74. AVRF_INDEX_KERNEL32_TLSALLOC);
  75. Index = (*Function)();
  76. //
  77. // If we get a TLS index bigger than maximum possible index
  78. // return failure.
  79. //
  80. if (Index > TLS_MAXIMUM_INDEX) {
  81. return TLS_OUT_OF_INDEXES;
  82. }
  83. //
  84. // Scramble the TLS index and return it.
  85. //
  86. return ScrambleTlsIndex (Index);
  87. }
  88. //WINBASEAPI
  89. BOOL
  90. WINAPI
  91. AVrfpTlsFree(
  92. IN DWORD dwTlsIndex
  93. )
  94. {
  95. typedef BOOL (WINAPI * FUNCTION_TYPE) (DWORD);
  96. FUNCTION_TYPE Function;
  97. BOOL Result;
  98. Function = AVRFP_GET_ORIGINAL_EXPORT (AVrfpKernel32Thunks,
  99. AVRF_INDEX_KERNEL32_TLSFREE);
  100. Result = CheckTlsIndex (dwTlsIndex);
  101. if (Result == FALSE) {
  102. return FALSE;
  103. }
  104. dwTlsIndex = UnscrambleTlsIndex (dwTlsIndex);
  105. return (*Function)(dwTlsIndex);
  106. }
  107. //WINBASEAPI
  108. LPVOID
  109. WINAPI
  110. AVrfpTlsGetValue(
  111. IN DWORD dwTlsIndex
  112. )
  113. {
  114. typedef LPVOID (WINAPI * FUNCTION_TYPE) (DWORD);
  115. FUNCTION_TYPE Function;
  116. LPVOID Value;
  117. BOOL Result;
  118. Function = AVRFP_GET_ORIGINAL_EXPORT (AVrfpKernel32Thunks,
  119. AVRF_INDEX_KERNEL32_TLSGETVALUE);
  120. Result = CheckTlsIndex (dwTlsIndex);
  121. if (Result == FALSE) {
  122. return NULL;
  123. }
  124. dwTlsIndex = UnscrambleTlsIndex (dwTlsIndex);
  125. Value = (*Function)(dwTlsIndex);
  126. return Value;
  127. }
  128. //WINBASEAPI
  129. BOOL
  130. WINAPI
  131. AVrfpTlsSetValue(
  132. IN DWORD dwTlsIndex,
  133. IN LPVOID lpTlsValue
  134. )
  135. {
  136. typedef BOOL (WINAPI * FUNCTION_TYPE) (DWORD, LPVOID);
  137. FUNCTION_TYPE Function;
  138. BOOL Result;
  139. Function = AVRFP_GET_ORIGINAL_EXPORT (AVrfpKernel32Thunks,
  140. AVRF_INDEX_KERNEL32_TLSSETVALUE);
  141. Result = CheckTlsIndex (dwTlsIndex);
  142. if (Result == FALSE) {
  143. return FALSE;
  144. }
  145. dwTlsIndex = UnscrambleTlsIndex (dwTlsIndex);
  146. return (*Function)(dwTlsIndex, lpTlsValue);
  147. }