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.

269 lines
6.5 KiB

  1. /*++
  2. Copyright (c) 2001 Microsoft Corporation
  3. All rights reserved
  4. Module Name:
  5. lsasecbfrd.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 "lsasecbfrd.hxx"
  17. #include <stdio.h>
  18. #include <string.h>
  19. #define SECBUFFER_TOKEN 2 // Security token
  20. TSecBufferDesc::TSecBufferDesc(void) : m_hr(E_FAIL)
  21. {
  22. }
  23. TSecBufferDesc::TSecBufferDesc(IN ULONG64 baseOffset)
  24. : m_baseOffset(baseOffset), m_hr(E_FAIL)
  25. {
  26. m_hr = Initialize();
  27. }
  28. TSecBufferDesc::~TSecBufferDesc(void)
  29. {
  30. }
  31. HRESULT TSecBufferDesc::IsValid(void) const
  32. {
  33. return m_hr;
  34. }
  35. ULONG TSecBufferDesc::GetcBuffersDirect(void) const
  36. {
  37. ULONG cbBuffers = 0;
  38. if (!ReadMemory(m_baseOffset + sizeof(ULONG), &cbBuffers, sizeof(cbBuffers), NULL)) {
  39. DBG_LOG(LSA_ERROR, ("Unable to read cBuffers for SecBufferDesc at %#I64x\n", m_baseOffset));
  40. throw "TSecBufferDesc::GetcBuffersDirect failed";
  41. }
  42. return cbBuffers;
  43. }
  44. ULONG TSecBufferDesc::GetulVersionDirect(void) const
  45. {
  46. ULONG ulVersion = 0;
  47. if (!ReadMemory(m_baseOffset, &ulVersion, sizeof(ulVersion), NULL)) {
  48. DBG_LOG(LSA_ERROR, ("Unable to read ulVersion for SecBufferDesc at %#I64x\n", m_baseOffset));
  49. throw "TSecBuffer::GetulVersionDirect failed";
  50. }
  51. return ulVersion;
  52. }
  53. ULONG64 TSecBufferDesc::GetpBuffersDirect(void) const
  54. {
  55. DBG_LOG(LSA_LOG, ("TSecBufferDesc::GetpBuffersDirect reading _SecBuffer::pBuffers from %#I64x\n", m_baseOffset));
  56. return toPtr(ReadPtrVar(ForwardAdjustPtrAddr(m_baseOffset + 2 * sizeof(ULONG))));
  57. }
  58. ULONG64 TSecBufferDesc::GetTokenAddrDirect(OUT ULONG* pcbBuffer OPTIONAL) const
  59. {
  60. ULONG64 addr = 0;
  61. ULONG cbSecBufferInArray = TSecBuffer::GetcbSecBufferSizeInArrayDirect();
  62. ULONG cBuffers = GetcBuffersDirect();
  63. ULONG64 addrBuffers = GetpBuffersDirect();
  64. if (pcbBuffer) {
  65. *pcbBuffer = 0;
  66. }
  67. for (ULONG i = 0; i < min(cBuffers, 16); i++) {
  68. TSecBuffer sb(addrBuffers + i * cbSecBufferInArray);
  69. ULONG type = sb.GetBufferTypeDirect();
  70. if (type & SECBUFFER_TOKEN) {
  71. addr = sb.GetpvBufferDirect();
  72. if (pcbBuffer) {
  73. *pcbBuffer = sb.GetcbBufferDirect();
  74. }
  75. break;
  76. }
  77. }
  78. //
  79. // return NULL if no token buffer is found
  80. //
  81. return addr;
  82. }
  83. void TSecBufferDesc::ShowDirect(IN BOOL bVerbose) const
  84. {
  85. ULONG64 addrpBuffers = 0;
  86. ULONG64 addrBuffers = 0;
  87. ULONG cBuffers = 0;
  88. ULONG cbSecBufferInArray = 0;
  89. CHAR szBanner[MAX_PATH] = {0};
  90. ExitIfControlC();
  91. cBuffers = GetcBuffersDirect();
  92. cbSecBufferInArray = TSecBuffer::GetcbSecBufferSizeInArrayDirect();
  93. dprintf("ulVersion \t%d\n", GetulVersionDirect());
  94. addrpBuffers = ForwardAdjustPtrAddr(m_baseOffset + 2 * sizeof(ULONG));
  95. DBG_LOG(LSA_LOG, ("TSecBufferDesc::ShowDirect reading _SecBufferDesc::pBuffers from %#I64x\n", addrpBuffers));
  96. addrBuffers = ReadPtrVar(addrpBuffers);
  97. dprintf("pBuffers \t%#I64x\n", addrBuffers);
  98. dprintf("cBuffers \t%x\n", cBuffers);
  99. //
  100. // Display not more than 16 SecBuffer at a time
  101. //
  102. for (ULONG i = 0; i < min(cBuffers, 16); i++) {
  103. _snprintf(szBanner, sizeof(szBanner) - 1, "%s%d) %s %#I64x: ", kstr4Spaces, i, kstrSecBuffer, addrBuffers + i * cbSecBufferInArray);
  104. TSecBuffer(addrBuffers + i * cbSecBufferInArray).ShowDirect(szBanner, bVerbose);
  105. }
  106. if (cBuffers > 16) {
  107. dprintf(kstrSbdWrn);
  108. }
  109. }
  110. PCSTR TSecBufferDesc::toStrDirect(void) const
  111. {
  112. HRESULT hRetval = E_FAIL;
  113. static CHAR szBuffer[1024] = {0};
  114. PSTR pszBuffer = szBuffer;
  115. ULONG cbBuffer = sizeof(szBuffer) - 1;
  116. LONG cStored = 0;
  117. CHAR szBanner[MAX_PATH] = {0};
  118. ULONG64 addrpBuffers = 0;
  119. ULONG64 addrBuffers = 0;
  120. ULONG cbSecBufferInArray = 0;
  121. ExitIfControlC();
  122. ULONG cBuffers = GetcBuffersDirect();
  123. cbSecBufferInArray = TSecBuffer::GetcbSecBufferSizeInArrayDirect();
  124. if (SUCCEEDED(hRetval)) {
  125. addrpBuffers = ForwardAdjustPtrAddr(m_baseOffset + 2 * sizeof(ULONG));
  126. DBG_LOG(LSA_LOG, ("TSecBufferDesc::toStrDirect reading _SecBufferDesc::pBuffers from %#I64x\n", addrpBuffers));
  127. addrBuffers = ReadPtrVar(addrpBuffers);
  128. cStored = _snprintf(pszBuffer, cbBuffer,
  129. "ulVersion \t%d\n"
  130. "pBuffers \t%#I64x\n"
  131. "cBuffers \t%x\n",
  132. GetulVersionDirect(),
  133. addrBuffers,
  134. cBuffers);
  135. hRetval = cStored >= 0 ? S_OK : HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
  136. }
  137. //
  138. // Display not more than 16 SecBuffer at a time
  139. //
  140. for (ULONG i = 0; SUCCEEDED(hRetval) && (i < min(cBuffers, 16)); i++) {
  141. cbBuffer -= cStored;
  142. pszBuffer += cStored;
  143. _snprintf(szBanner, sizeof(szBanner) - 1, "%s%d) %s %#I64x: ", kstr4Spaces, i, kstrSecBuffer, addrBuffers + i * cbSecBufferInArray);
  144. cStored = _snprintf(pszBuffer, cbBuffer, "%s", EasyStr(TSecBuffer(addrBuffers + i * cbSecBufferInArray).toStrDirect(szBanner)));
  145. hRetval = cStored >= 0 ? S_OK : HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
  146. }
  147. if (SUCCEEDED(hRetval) && (cBuffers > 16)) {
  148. dprintf(kstrSbdWrn);
  149. }
  150. if (FAILED(hRetval)) {
  151. DBG_LOG(LSA_ERROR, ("TSecBuffer::toStrDirect _SecBufferDesc %#I64x failed with error code %#x\n", m_baseOffset, hRetval));
  152. throw "TSecBuffer::toStrDirect failed";
  153. }
  154. return szBuffer;
  155. }
  156. /******************************************************************************
  157. Private Methods
  158. ******************************************************************************/
  159. /*++
  160. Routine Name:
  161. Initialize
  162. Routine Description:
  163. Do necessary initialization.
  164. Arguments:
  165. None
  166. Return Value:
  167. An HRESULT
  168. --*/
  169. HRESULT TSecBufferDesc::Initialize(void)
  170. {
  171. HRESULT hRetval = E_FAIL;
  172. hRetval = S_OK;
  173. return hRetval;
  174. }
  175. HRESULT TSecBufferDesc::Initialize(IN ULONG64 baseOffset)
  176. {
  177. m_baseOffset = baseOffset;
  178. m_hr = Initialize();
  179. return m_hr;
  180. }