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.

359 lines
9.9 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000 Microsoft Corporation
  4. //
  5. // Module: setupkey.cpp
  6. //
  7. // Author: Dan Elliott
  8. //
  9. // Abstract: Definition of the CSetupKey object. This object provides methods
  10. // for accessing values under HKLM\System\Setup.
  11. //
  12. // Environment:
  13. // Neptune
  14. //
  15. // Revision History:
  16. // 00/08/08 dane Created.
  17. //
  18. //////////////////////////////////////////////////////////////////////////////
  19. #pragma comment(user, "Compiled on " __DATE__ " at " __TIME__)
  20. #pragma comment(compiler)
  21. //////////////////////////////////////////////////////////////////////////////
  22. //
  23. // Include files
  24. //
  25. #include "precomp.h"
  26. #include "msobmain.h"
  27. #include "setupkey.h"
  28. //////////////////////////////////////////////////////////////////////////////
  29. //
  30. // Static initialization
  31. //
  32. CSetupKey::CSetupKey()
  33. : m_hkey(NULL)
  34. {
  35. LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  36. REGSTR_PATH_SYSTEMSETUPKEY,
  37. 0,
  38. KEY_ALL_ACCESS,
  39. &m_hkey
  40. );
  41. MYASSERT(ERROR_SUCCESS == lRet);
  42. MYASSERT(NULL != m_hkey);
  43. } // CSetupKey::CSetupKey
  44. CSetupKey::~CSetupKey()
  45. {
  46. if (NULL != m_hkey)
  47. {
  48. RegCloseKey(m_hkey);
  49. }
  50. } // CSetupKey::~CSetupKey
  51. LRESULT
  52. CSetupKey::set_CommandLine(
  53. LPCWSTR szCmdLine
  54. )
  55. {
  56. MYASSERT(IsValid());
  57. MYASSERT(NULL != szCmdLine);
  58. return RegSetValueEx(m_hkey, REGSTR_VALUE_CMDLINE, 0, REG_SZ,
  59. (BYTE*)szCmdLine,
  60. BYTES_REQUIRED_BY_SZ(szCmdLine)
  61. );
  62. } // CSetupKey::set_CommandLine
  63. LRESULT
  64. CSetupKey::get_CommandLine(
  65. LPWSTR szCommandLine,
  66. DWORD cchCommandLine
  67. )
  68. {
  69. MYASSERT(IsValid());
  70. MYASSERT(NULL != szCommandLine);
  71. MYASSERT(0 < cchCommandLine);
  72. if (NULL == szCommandLine || 0 == cchCommandLine)
  73. {
  74. return ERROR_INVALID_PARAMETER;
  75. }
  76. WCHAR rgchCommandLine[MAX_PATH + 1];
  77. DWORD dwSize = sizeof(rgchCommandLine);
  78. LRESULT lResult = RegQueryValueEx(
  79. m_hkey,
  80. REGSTR_VALUE_CMDLINE,
  81. 0,
  82. NULL,
  83. (LPBYTE)rgchCommandLine,
  84. &dwSize
  85. );
  86. if (ERROR_SUCCESS == lResult)
  87. {
  88. if (cchCommandLine >= (DWORD)(lstrlen(rgchCommandLine) + 1))
  89. {
  90. lstrcpy(szCommandLine, rgchCommandLine);
  91. }
  92. else
  93. {
  94. lResult = ERROR_INSUFFICIENT_BUFFER;
  95. *szCommandLine = '\0';
  96. }
  97. }
  98. return lResult;
  99. } // CSetupKey::get_CommandLine
  100. LRESULT
  101. CSetupKey::set_SetupType(
  102. DWORD dwSetupType)
  103. {
  104. MYASSERT(IsValid());
  105. MYASSERT( dwSetupType == SETUPTYPE_NONE
  106. || dwSetupType == SETUPTYPE_FULL
  107. || dwSetupType == SETUPTYPE_NOREBOOT
  108. || dwSetupType == SETUPTYPE_UPGRADE
  109. );
  110. return RegSetValueEx(m_hkey, REGSTR_VALUE_SETUPTYPE, 0, REG_DWORD,
  111. (BYTE*)&dwSetupType, sizeof(DWORD)
  112. );
  113. } // CSetupKey::set_SetupType
  114. LRESULT
  115. CSetupKey::get_SetupType(
  116. DWORD* pdwSetupType
  117. )
  118. {
  119. MYASSERT(IsValid());
  120. MYASSERT(NULL != pdwSetupType);
  121. if (NULL == pdwSetupType)
  122. {
  123. return ERROR_INVALID_PARAMETER;
  124. }
  125. DWORD dwSetupType;
  126. DWORD dwSize = sizeof(DWORD);
  127. LRESULT lResult = RegQueryValueEx(
  128. m_hkey,
  129. REGSTR_VALUE_SETUPTYPE,
  130. 0,
  131. NULL,
  132. (LPBYTE)&dwSetupType,
  133. &dwSize
  134. );
  135. *pdwSetupType = (ERROR_SUCCESS == lResult) ? dwSetupType : SETUPTYPE_NONE;
  136. // Since FALSE is returned in cases where we fail to read a value,
  137. // ERROR_SUCCESS can always be returned.
  138. //
  139. return ERROR_SUCCESS;
  140. } // CSetupKey::get_SetupType
  141. LRESULT
  142. CSetupKey::set_MiniSetupInProgress(
  143. BOOL fInProgress)
  144. {
  145. MYASSERT(IsValid());
  146. if (fInProgress)
  147. {
  148. DWORD dwData = (DWORD)fInProgress;
  149. return RegSetValueEx(m_hkey, REGSTR_VALUE_MINISETUPINPROGRESS, 0,
  150. REG_DWORD, (BYTE*)&dwData, sizeof(DWORD)
  151. );
  152. }
  153. else
  154. {
  155. return RegDeleteValue(m_hkey, REGSTR_VALUE_MINISETUPINPROGRESS);
  156. }
  157. } // CSetupKey::set_MiniSetupInProgress
  158. LRESULT
  159. CSetupKey::get_MiniSetupInProgress(
  160. BOOL* pfInProgress
  161. )
  162. {
  163. MYASSERT(IsValid());
  164. MYASSERT(NULL != pfInProgress);
  165. if (NULL == pfInProgress)
  166. {
  167. return ERROR_INVALID_PARAMETER;
  168. }
  169. BOOL fInProgress;
  170. DWORD dwSize = sizeof(DWORD);
  171. LRESULT lResult = RegQueryValueEx(
  172. m_hkey,
  173. REGSTR_VALUE_MINISETUPINPROGRESS,
  174. 0,
  175. NULL,
  176. (LPBYTE)&fInProgress,
  177. &dwSize
  178. );
  179. *pfInProgress = (ERROR_SUCCESS == lResult) ? fInProgress : FALSE;
  180. // Since FALSE is returned in cases where we fail to read a value,
  181. // ERROR_SUCCESS can always be returned.
  182. //
  183. return ERROR_SUCCESS;
  184. } // CSetupKey::get_MiniSetupInProgress
  185. LRESULT
  186. CSetupKey::set_OobeInProgress(
  187. BOOL fInProgress)
  188. {
  189. MYASSERT(IsValid());
  190. if (fInProgress)
  191. {
  192. DWORD dwData = (DWORD)fInProgress;
  193. return RegSetValueEx(m_hkey, REGSTR_VALUE_OOBEINPROGRESS, 0, REG_DWORD,
  194. (BYTE*)&dwData, sizeof(DWORD));
  195. }
  196. else
  197. {
  198. return RegDeleteValue(m_hkey, REGSTR_VALUE_OOBEINPROGRESS);
  199. }
  200. } // CSetupKey::set_OobeInProgress
  201. LRESULT
  202. CSetupKey::get_OobeInProgress(
  203. BOOL* pfInProgress
  204. )
  205. {
  206. MYASSERT(IsValid());
  207. MYASSERT(NULL != pfInProgress);
  208. if (NULL == pfInProgress)
  209. {
  210. return ERROR_INVALID_PARAMETER;
  211. }
  212. BOOL fInProgress;
  213. DWORD dwSize = sizeof(DWORD);
  214. LRESULT lResult = RegQueryValueEx(
  215. m_hkey,
  216. REGSTR_VALUE_OOBEINPROGRESS,
  217. 0,
  218. NULL,
  219. (LPBYTE)&fInProgress,
  220. &dwSize
  221. );
  222. *pfInProgress = (ERROR_SUCCESS == lResult) ? fInProgress : FALSE;
  223. // Since FALSE is returned in cases where we fail to read a value,
  224. // ERROR_SUCCESS can always be returned.
  225. //
  226. return ERROR_SUCCESS;
  227. } // CSetupKey::get_OobeInProgress
  228. LRESULT
  229. CSetupKey::set_ShutdownAction(
  230. OOBE_SHUTDOWN_ACTION OobeShutdownAction
  231. )
  232. {
  233. MYASSERT(IsValid());
  234. MYASSERT(SHUTDOWN_MAX > OobeShutdownAction);
  235. DWORD dwData;
  236. switch (OobeShutdownAction)
  237. {
  238. case SHUTDOWN_NOACTION: // fall through
  239. case SHUTDOWN_LOGON:
  240. return RegDeleteValue(m_hkey, REGSTR_VALUE_SHUTDOWNREQUIRED);
  241. case SHUTDOWN_REBOOT:
  242. dwData = ShutdownReboot;
  243. return RegSetValueEx(m_hkey, REGSTR_VALUE_SHUTDOWNREQUIRED, 0,
  244. REG_DWORD, (BYTE*)&dwData, sizeof(DWORD)
  245. );
  246. case SHUTDOWN_POWERDOWN:
  247. dwData = ShutdownNoReboot;
  248. return RegSetValueEx(m_hkey, REGSTR_VALUE_SHUTDOWNREQUIRED, 0,
  249. REG_DWORD, (BYTE*)&dwData, sizeof(DWORD)
  250. );
  251. default:
  252. return ERROR_INVALID_DATA;
  253. }
  254. } // CSetupKey::set_ShutdownAction
  255. LRESULT
  256. CSetupKey::get_ShutdownAction(
  257. OOBE_SHUTDOWN_ACTION* pOobeShutdownAction
  258. )
  259. {
  260. MYASSERT(IsValid());
  261. MYASSERT(NULL != pOobeShutdownAction);
  262. if (NULL == pOobeShutdownAction)
  263. {
  264. return ERROR_INVALID_PARAMETER;
  265. }
  266. DWORD ShutdownAction;
  267. DWORD dwSize = sizeof(DWORD);
  268. LRESULT lResult = RegQueryValueEx(
  269. m_hkey,
  270. REGSTR_VALUE_SHUTDOWNREQUIRED,
  271. 0,
  272. NULL,
  273. (LPBYTE)&ShutdownAction,
  274. &dwSize
  275. );
  276. if (ERROR_SUCCESS == lResult)
  277. {
  278. switch ((SHUTDOWN_ACTION)ShutdownAction)
  279. {
  280. case ShutdownReboot:
  281. *pOobeShutdownAction = SHUTDOWN_REBOOT;
  282. break;
  283. case ShutdownNoReboot: // fall through
  284. case ShutdownPowerOff:
  285. *pOobeShutdownAction = SHUTDOWN_POWERDOWN;
  286. break;
  287. }
  288. }
  289. else
  290. {
  291. // if the key doesn't exist, assume no action is required.
  292. //
  293. *pOobeShutdownAction = SHUTDOWN_NOACTION;
  294. }
  295. // Since FALSE is returned in cases where we fail to read a value,
  296. // ERROR_SUCCESS can always be returned.
  297. //
  298. return ERROR_SUCCESS;
  299. } // CSetupKey::get_ShutdownAction
  300. //
  301. ///// End of file: setupkey.cpp ////////////////////////////////////////////