Leaked source code of windows server 2003
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.

369 lines
9.6 KiB

  1. /*++
  2. Copyright (c) 2001 Microsoft Corporation
  3. All rights reserved
  4. Module Name:
  5. lsasecbfr.cxx
  6. Abstract:
  7. This file provides useful accssors and mutators.
  8. Author:
  9. Larry Zhu (LZhu) May 1, 2001 Created
  10. Environment:
  11. User Mode -Win32
  12. Revision History:
  13. --*/
  14. #include "precomp.hxx"
  15. #pragma hdrstop
  16. #include "lsasecbfr.hxx"
  17. #include <stdio.h>
  18. #include <string.h>
  19. #define SECBUFFER_ATTRMASK 0xF0000000
  20. #define SECBUFFER_READONLY 0x80000000 // Buffer is read-only
  21. #define SECBUFFER_RESERVED 0x40000000
  22. #define SECBUFFER_READONLY_WITH_CHECKSUM 0x10000000 // Buffer is read-only, and checksummed
  23. #define SECBUFFER_UNMAPPED 0x40000000
  24. //
  25. // This flag is used to indicate that the buffer was mapped into the LSA
  26. // from kernel mode.
  27. //
  28. #define SECBUFFER_KERNEL_MAP 0x20000000
  29. #if 0
  30. #define SECBUFFER_EMPTY 0 // Undefined, replaced by provider
  31. #define SECBUFFER_DATA 1 // Packet data
  32. #define SECBUFFER_TOKEN 2 // Security token
  33. #define SECBUFFER_PKG_PARAMS 3 // Package specific parameters
  34. #define SECBUFFER_MISSING 4 // Missing Data indicator
  35. #define SECBUFFER_EXTRA 5 // Extra data
  36. #define SECBUFFER_STREAM_TRAILER 6 // Security Trailer
  37. #define SECBUFFER_STREAM_HEADER 7 // Security Header
  38. #define SECBUFFER_NEGOTIATION_INFO 8 // Hints from the negotiation pkg
  39. #define SECBUFFER_PADDING 9 // non-data padding
  40. #define SECBUFFER_STREAM 10 // whole encrypted message
  41. #define SECBUFFER_MECHLIST 11
  42. #define SECBUFFER_MECHLIST_SIGNATURE 12
  43. #define SECBUFFER_TARGET 13
  44. #define SECBUFFER_CHANNEL_BINDINGS 14
  45. #endif
  46. PCSTR TSecBuffer::GetSecBufferTypeStr(IN ULONG type)
  47. {
  48. static PCSTR aszSecBufferTypes[] = {
  49. "Empty", "Data", "Token", "Package", "Missing",
  50. "Extra", "Trailer", "Header", "NegoInfo", "Padding",
  51. "Stream", "MechList", "MechListSignature", "Target",
  52. "ChannelBinding"};
  53. type &= ~SECBUFFER_ATTRMASK;
  54. return (type < COUNTOF(aszSecBufferTypes)) ?
  55. aszSecBufferTypes[type] : kstrInvalid;
  56. }
  57. void ShowSecBufferAttrs(IN PCSTR pszPad, IN ULONG cbBuf, IN CHAR* pBuf, IN ULONG ulFlags)
  58. {
  59. LONG cbUsed = 0;
  60. #define BRANCH_AND_PRINT(x) \
  61. do { \
  62. if (ulFlags & SECBUFFER_##x) { \
  63. cbUsed = _snprintf(pBuf, cbBuf, "%s ", #x); \
  64. if (cbUsed <= 0) return; \
  65. cbBuf -= cbUsed; \
  66. pBuf += cbUsed; \
  67. ulFlags &= ~ SECBUFFER_##x; \
  68. } \
  69. } while(0) \
  70. cbUsed = _snprintf(pBuf, cbBuf, "%s%#x : ", pszPad, (ulFlags >> 28) & 0xF);
  71. if (cbUsed <= 0) return;
  72. cbBuf -= cbUsed;
  73. pBuf += cbUsed;
  74. BRANCH_AND_PRINT(READONLY);
  75. BRANCH_AND_PRINT(READONLY_WITH_CHECKSUM);
  76. BRANCH_AND_PRINT(UNMAPPED);
  77. BRANCH_AND_PRINT(KERNEL_MAP);
  78. if (ulFlags & SECBUFFER_ATTRMASK)
  79. {
  80. cbUsed = _snprintf(pBuf, cbBuf, "%#x", (ulFlags >> 28) & 0xF);
  81. if (cbUsed <= 0) return;
  82. cbBuf -= cbUsed;
  83. pBuf += cbUsed;
  84. }
  85. cbUsed = _snprintf(pBuf, cbBuf, "\n");
  86. if (cbUsed <= 0) return;
  87. cbBuf -= cbUsed;
  88. pBuf += cbUsed;
  89. #undef BRANCH_AND_PRINT
  90. }
  91. ULONG TSecBuffer::GetcbSecBufferSizeInArray(void)
  92. {
  93. //
  94. // To get the size of one element we do as follows in case there is
  95. // padding after each elements
  96. //
  97. static ULONG cbSecBufferTypeSize = ReadTypeSize(kstrSecBuffer);
  98. static ULONG cbTwoSecBufferTypeSize = ReadTypeSize("_SecBuffer[2]");
  99. return cbTwoSecBufferTypeSize - cbSecBufferTypeSize;
  100. }
  101. ULONG TSecBuffer::GetcbSecBufferSizeInArrayDirect(void)
  102. {
  103. static ULONG cbSecBuffer = 2 * sizeof(ULONG) + ReadPtrSize();
  104. return cbSecBuffer;
  105. }
  106. TSecBuffer::TSecBuffer(void) : m_hr(E_FAIL)
  107. {
  108. }
  109. TSecBuffer::TSecBuffer(IN ULONG64 baseOffset)
  110. : m_baseOffset(baseOffset), m_hr(E_FAIL)
  111. {
  112. m_hr = Initialize();
  113. }
  114. TSecBuffer::~TSecBuffer(void)
  115. {
  116. }
  117. HRESULT TSecBuffer::IsValid(void) const
  118. {
  119. return m_hr;
  120. }
  121. ULONG TSecBuffer::GetcbBuffer(void) const
  122. {
  123. ULONG cbBuffer = 0;
  124. ReadStructField(m_baseOffset, kstrSecBuffer, "cbBuffer", sizeof(cbBuffer), &cbBuffer);
  125. return cbBuffer;
  126. }
  127. ULONG TSecBuffer::GetcbBufferDirect(void) const
  128. {
  129. ULONG cbBuffer = 0;
  130. if (!ReadMemory(m_baseOffset, &cbBuffer, sizeof(cbBuffer), NULL)) {
  131. DBG_LOG(LSA_ERROR, ("Unable to read SecBuffer %#I64x cbBuffer\n", m_baseOffset));
  132. throw "TSecBuffer::GetcbBufferDirect failed";
  133. }
  134. return cbBuffer;
  135. }
  136. ULONG TSecBuffer::GetBufferType(void) const
  137. {
  138. ULONG BufferType = 0;
  139. ReadStructField(m_baseOffset, kstrSecBuffer, "BufferType", sizeof(BufferType), &BufferType);
  140. return BufferType;
  141. }
  142. ULONG TSecBuffer::GetBufferTypeDirect(void) const
  143. {
  144. ULONG BufferType = 0;
  145. if (!ReadMemory(m_baseOffset + sizeof(ULONG), &BufferType, sizeof(BufferType), NULL)) {
  146. DBG_LOG(LSA_ERROR, ("Unable to read BufferType for SecBuffer at %#I64x\n", m_baseOffset));
  147. throw "TSecBuffer::GetBufferTypeDirect failed";
  148. }
  149. return BufferType;
  150. }
  151. ULONG64 TSecBuffer::GetpvBuffer(void) const
  152. {
  153. return ReadStructPtrField(m_baseOffset, kstrSecBuffer, "pvBuffer");
  154. }
  155. ULONG64 TSecBuffer::GetpvBufferDirect(void) const
  156. {
  157. DBG_LOG(LSA_LOG, ("TSecBuffer::GetpvBufferDirect reading _SecBuffer %#I64x pvBuffer\n", m_baseOffset));
  158. return toPtr(ReadPtrVar(ForwardAdjustPtrAddr(m_baseOffset + 2 * sizeof(ULONG))));
  159. }
  160. PCSTR TSecBuffer::toStr(IN PCSTR pszBanner) const
  161. {
  162. static CHAR szBuffer[256] = {0};
  163. LONG cbUsed = 0;
  164. ULONG type = GetBufferType();
  165. ULONG dwAttrMask = type & SECBUFFER_ATTRMASK;
  166. ExitIfControlC();
  167. szBuffer[RTL_NUMBER_OF(szBuffer) - 1] = '\0';
  168. if ((cbUsed = _snprintf(szBuffer, RTL_NUMBER_OF(szBuffer) - 1,
  169. "%s%s %#x bytes, pvBuffer %s, attr ",
  170. pszBanner ? pszBanner : "",
  171. GetSecBufferTypeStr(type),
  172. GetcbBuffer(),
  173. PtrToStr(GetpvBuffer()))) <= 0) {
  174. DBG_LOG(LSA_ERROR, ("Unable to print _SecBuffer %#I64x\n", m_baseOffset));
  175. throw "TSecBuffer::toStr failed";
  176. }
  177. ShowSecBufferAttrs(kstrEmptyA, RTL_NUMBER_OF(szBuffer) - cbUsed, szBuffer + cbUsed, dwAttrMask );
  178. return szBuffer;
  179. }
  180. PCSTR TSecBuffer::toStrDirect(IN PCSTR pszBanner) const
  181. {
  182. static CHAR szBuffer[256] = {0};
  183. LONG cbUsed;
  184. ULONG type = GetBufferTypeDirect();
  185. ULONG dwAttrMask = type & SECBUFFER_ATTRMASK;
  186. ExitIfControlC();
  187. szBuffer[RTL_NUMBER_OF(szBuffer) - 1] = '\0';
  188. if ((cbUsed = _snprintf(szBuffer, RTL_NUMBER_OF(szBuffer) - 1,
  189. "%s%s %#x bytes, pvBuffer %s, attr ",
  190. pszBanner ? pszBanner : "",
  191. GetSecBufferTypeStr(type),
  192. GetcbBufferDirect(),
  193. PtrToStr(GetpvBufferDirect()))) <= 0) {
  194. DBG_LOG(LSA_ERROR, ("Unable to print _SecBuffer %#I64x\n", m_baseOffset));
  195. throw "TSecBuffer::toStrDirect failed";
  196. }
  197. ShowSecBufferAttrs(kstrEmptyA, RTL_NUMBER_OF(szBuffer) - cbUsed, szBuffer + cbUsed, dwAttrMask );
  198. return szBuffer;
  199. }
  200. void TSecBuffer::ShowDirect(IN PCSTR pszBanner, IN BOOL bVerbose) const
  201. {
  202. ULONG type = GetBufferTypeDirect();
  203. ULONG dwAttrMask = type & SECBUFFER_ATTRMASK;
  204. ULONG cbBuffer = 0;
  205. ULONG64 addrBuffer = 0;
  206. CHAR* pBuffer = NULL;
  207. CHAR szBuffer[256] = {0};
  208. ExitIfControlC();
  209. cbBuffer = GetcbBufferDirect();
  210. addrBuffer = GetpvBufferDirect();
  211. dprintf("%s%s %#x bytes, pvBuffer %s, attr ",
  212. pszBanner ? pszBanner : "",
  213. GetSecBufferTypeStr(type),
  214. cbBuffer,
  215. PtrToStr(addrBuffer));
  216. ShowSecBufferAttrs(kstrEmptyA, RTL_NUMBER_OF(szBuffer), szBuffer, dwAttrMask );
  217. dprintf("%s", szBuffer);
  218. //
  219. // Now print out the content of security buffers
  220. //
  221. if (bVerbose && addrBuffer) {
  222. pBuffer = new char[cbBuffer];
  223. if (!pBuffer) {
  224. throw "TSecBuffer::ShowDirect out of memory";
  225. }
  226. if (ReadMemory(addrBuffer, pBuffer, cbBuffer, NULL)) {
  227. debugPrintHex(pBuffer, cbBuffer);
  228. } else {
  229. DBG_LOG(LSA_ERROR, ("Unable to print SecBuffer::pvBuffer at %#I64x\n", toPtr(addrBuffer)));
  230. delete[] pBuffer;
  231. throw "TSecBuffer::ShowDirect read memory error";
  232. }
  233. }
  234. delete[] pBuffer;
  235. }
  236. /******************************************************************************
  237. Private Methods
  238. ******************************************************************************/
  239. /*++
  240. Routine Name:
  241. Initialize
  242. Routine Description:
  243. Do necessary initialization.
  244. Arguments:
  245. None
  246. Return Value:
  247. An HRESULT
  248. --*/
  249. HRESULT TSecBuffer::Initialize(void)
  250. {
  251. HRESULT hRetval = E_FAIL;
  252. hRetval = S_OK;
  253. return hRetval;
  254. }
  255. HRESULT TSecBuffer::Initialize(IN ULONG64 baseOffset)
  256. {
  257. m_baseOffset = baseOffset;
  258. m_hr = Initialize();
  259. return m_hr;
  260. }