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.

251 lines
8.2 KiB

  1. /****************************************************************************
  2. *
  3. * File: reginfo.cpp
  4. * Project: DxDiag (DirectX Diagnostic Tool)
  5. * Author: Mike Anderson (manders@microsoft.com)
  6. * Purpose: Gather and hold registry information
  7. *
  8. * (C) Copyright 1998 Microsoft Corp. All rights reserved.
  9. *
  10. ****************************************************************************/
  11. #include <Windows.h>
  12. #include <tchar.h>
  13. #include "sysinfo.h"
  14. #include "reginfo.h"
  15. static HRESULT AddError(RegError** ppRegErrorFirst, RegError* pRegErrorNew);
  16. static BOOL EqualMemory(BYTE* pb1, BYTE* pb2, DWORD numBytes);
  17. /****************************************************************************
  18. *
  19. * CheckRegDword
  20. *
  21. ****************************************************************************/
  22. HRESULT CheckRegDword(RegError** ppRegErrorFirst, HKEY hkeyRoot, TCHAR* pszKey,
  23. TCHAR* pszValue, DWORD dwExpected)
  24. {
  25. HKEY hkey = NULL;
  26. RegError regErrorNew;
  27. ZeroMemory(&regErrorNew, sizeof(RegError));
  28. regErrorNew.m_hkeyRoot = hkeyRoot;
  29. lstrcpy(regErrorNew.m_szKey, pszKey);
  30. lstrcpy(regErrorNew.m_szValue, pszValue);
  31. regErrorNew.m_dwTypeExpected = REG_DWORD;
  32. regErrorNew.m_dwExpected = dwExpected;
  33. if (ERROR_SUCCESS != RegOpenKeyEx(hkeyRoot, pszKey, 0, KEY_READ, &hkey))
  34. {
  35. regErrorNew.m_ret = RET_MISSINGKEY;
  36. }
  37. else
  38. {
  39. regErrorNew.m_dwExpectedSize = sizeof(DWORD);
  40. regErrorNew.m_dwActualSize = regErrorNew.m_dwExpectedSize; // RegQueryValueEx will change this
  41. if (ERROR_SUCCESS != RegQueryValueEx(hkey, pszValue, 0, &regErrorNew.m_dwTypeActual,
  42. (LPBYTE)&regErrorNew.m_dwActual, &regErrorNew.m_dwActualSize))
  43. {
  44. regErrorNew.m_ret = RET_MISSINGVALUE;
  45. }
  46. else if (regErrorNew.m_dwTypeActual != regErrorNew.m_dwTypeExpected)
  47. {
  48. regErrorNew.m_ret = RET_VALUEWRONGTYPE;
  49. }
  50. else if (regErrorNew.m_dwActual != dwExpected)
  51. {
  52. regErrorNew.m_ret = RET_VALUEWRONGDATA;
  53. }
  54. RegCloseKey(hkey);
  55. }
  56. if (regErrorNew.m_ret == RET_NOERROR)
  57. return S_OK;
  58. else
  59. return AddError(ppRegErrorFirst, &regErrorNew);
  60. }
  61. /****************************************************************************
  62. *
  63. * CheckRegString
  64. *
  65. ****************************************************************************/
  66. HRESULT CheckRegString(RegError** ppRegErrorFirst, HKEY hkeyRoot, TCHAR* pszKey,
  67. TCHAR* pszValue, TCHAR* pszExpected, CheckRegFlags crf,
  68. HRESULT* phrError )
  69. {
  70. HKEY hkey = NULL;
  71. RegError regErrorNew;
  72. ZeroMemory(&regErrorNew, sizeof(RegError));
  73. regErrorNew.m_hkeyRoot = hkeyRoot;
  74. lstrcpy(regErrorNew.m_szKey, pszKey);
  75. lstrcpy(regErrorNew.m_szValue, pszValue);
  76. regErrorNew.m_dwTypeExpected = REG_SZ;
  77. lstrcpy(regErrorNew.m_szExpected, pszExpected);
  78. if (ERROR_SUCCESS != RegOpenKeyEx(hkeyRoot, pszKey, 0, KEY_READ, &hkey))
  79. {
  80. regErrorNew.m_ret = RET_MISSINGKEY;
  81. }
  82. else
  83. {
  84. regErrorNew.m_dwExpectedSize = lstrlen(pszExpected) + 1;
  85. regErrorNew.m_dwActualSize = sizeof(regErrorNew.m_szActual); // RegQueryValueEx will change this
  86. if (ERROR_SUCCESS != RegQueryValueEx(hkey, pszValue, 0, &regErrorNew.m_dwTypeActual,
  87. (LPBYTE)&regErrorNew.m_szActual, &regErrorNew.m_dwActualSize))
  88. {
  89. regErrorNew.m_ret = RET_MISSINGVALUE;
  90. }
  91. else if (regErrorNew.m_dwTypeActual != regErrorNew.m_dwTypeExpected)
  92. {
  93. regErrorNew.m_ret = RET_VALUEWRONGTYPE;
  94. }
  95. else if (lstrcmp(regErrorNew.m_szExpected, TEXT("*")) != 0)
  96. {
  97. TCHAR* pszCompare = regErrorNew.m_szActual;
  98. if (crf & CRF_LEAF)
  99. {
  100. pszCompare = _tcsrchr(regErrorNew.m_szActual, TEXT('\\'));
  101. if (pszCompare == NULL)
  102. pszCompare = regErrorNew.m_szActual;
  103. else
  104. pszCompare++; // skip past backslash
  105. }
  106. if (DXUtil_strcmpi(regErrorNew.m_szExpected, pszCompare) != 0)
  107. {
  108. regErrorNew.m_ret = RET_VALUEWRONGDATA;
  109. }
  110. }
  111. RegCloseKey(hkey);
  112. }
  113. if( phrError )
  114. *phrError = regErrorNew.m_ret;
  115. if (regErrorNew.m_ret == RET_NOERROR)
  116. return S_OK;
  117. else
  118. return AddError(ppRegErrorFirst, &regErrorNew);
  119. }
  120. /****************************************************************************
  121. *
  122. * CheckRegBinary
  123. *
  124. ****************************************************************************/
  125. HRESULT CheckRegBinary(RegError** ppRegErrorFirst, HKEY hkeyRoot, TCHAR* pszKey,
  126. TCHAR* pszValue, BYTE* pbDataExpected, DWORD dwSizeExpected)
  127. {
  128. HKEY hkey = NULL;
  129. RegError regErrorNew;
  130. if (dwSizeExpected > sizeof(regErrorNew.m_bExpected))
  131. return E_INVALIDARG;
  132. ZeroMemory(&regErrorNew, sizeof(RegError));
  133. regErrorNew.m_hkeyRoot = hkeyRoot;
  134. lstrcpy(regErrorNew.m_szKey, pszKey);
  135. lstrcpy(regErrorNew.m_szValue, pszValue);
  136. regErrorNew.m_dwTypeExpected = REG_BINARY;
  137. CopyMemory(regErrorNew.m_bExpected, pbDataExpected, dwSizeExpected);
  138. if (ERROR_SUCCESS != RegOpenKeyEx(hkeyRoot, pszKey, 0, KEY_READ, &hkey))
  139. {
  140. regErrorNew.m_ret = RET_MISSINGKEY;
  141. }
  142. else
  143. {
  144. regErrorNew.m_dwExpectedSize = dwSizeExpected;
  145. regErrorNew.m_dwActualSize = sizeof(regErrorNew.m_bExpected); // RegQueryValueEx will change this
  146. if (ERROR_SUCCESS != RegQueryValueEx(hkey, pszValue, 0, &regErrorNew.m_dwTypeActual,
  147. (LPBYTE)&regErrorNew.m_bActual, &regErrorNew.m_dwActualSize))
  148. {
  149. regErrorNew.m_ret = RET_MISSINGVALUE;
  150. }
  151. else if (regErrorNew.m_dwTypeActual != regErrorNew.m_dwTypeExpected)
  152. {
  153. regErrorNew.m_ret = RET_VALUEWRONGTYPE;
  154. }
  155. else if (regErrorNew.m_dwActualSize != regErrorNew.m_dwExpectedSize)
  156. {
  157. regErrorNew.m_ret = RET_VALUEWRONGDATA;
  158. }
  159. else if (!EqualMemory(regErrorNew.m_bExpected, regErrorNew.m_bActual, regErrorNew.m_dwActualSize))
  160. {
  161. regErrorNew.m_ret = RET_VALUEWRONGDATA;
  162. }
  163. RegCloseKey(hkey);
  164. }
  165. if (regErrorNew.m_ret == RET_NOERROR)
  166. return S_OK;
  167. else
  168. return AddError(ppRegErrorFirst, &regErrorNew);
  169. }
  170. /****************************************************************************
  171. *
  172. * AddError - Allocate a RegError node, copy data from pRegErrorNew, and
  173. * insert the node at the beginning of the ppRegErrorFirst linked list.
  174. *
  175. ****************************************************************************/
  176. HRESULT AddError(RegError** ppRegErrorFirst, RegError* pRegErrorNew)
  177. {
  178. RegError* pRegErrorInsert;
  179. pRegErrorInsert = new RegError;
  180. if (pRegErrorInsert == NULL)
  181. return E_OUTOFMEMORY;
  182. *pRegErrorInsert = *pRegErrorNew;
  183. pRegErrorInsert->m_pRegErrorNext = *ppRegErrorFirst;
  184. *ppRegErrorFirst = pRegErrorInsert;
  185. return S_OK;
  186. }
  187. /****************************************************************************
  188. *
  189. * EqualMemory
  190. *
  191. ****************************************************************************/
  192. BOOL EqualMemory(BYTE* pb1, BYTE* pb2, DWORD numBytes)
  193. {
  194. while (numBytes > 0)
  195. {
  196. if (*pb1 != *pb2)
  197. return FALSE;
  198. pb1++;
  199. pb2++;
  200. numBytes--;
  201. }
  202. return TRUE;
  203. }
  204. /****************************************************************************
  205. *
  206. * DestroyReg
  207. *
  208. ****************************************************************************/
  209. VOID DestroyReg( RegError** ppRegErrorFirst )
  210. {
  211. if( ppRegErrorFirst && *ppRegErrorFirst )
  212. {
  213. RegError* pRegError;
  214. RegError* pRegErrorNext;
  215. for (pRegError = *ppRegErrorFirst; pRegError != NULL;
  216. pRegError = pRegErrorNext)
  217. {
  218. pRegErrorNext = pRegError->m_pRegErrorNext;
  219. delete pRegError;
  220. }
  221. *ppRegErrorFirst = NULL;
  222. }
  223. }