windows-nt/Source/XPSP1/NT/ds/security/services/w32time/w32timep/config.cpp
2020-09-26 16:20:57 +08:00

164 lines
5.2 KiB
C++

//--------------------------------------------------------------------
// w32timep - implementation
// Copyright (C) Microsoft Corporation, 2000
//
// Created by: Duncan Bryce (duncanb), 12-07-00
//
// Contains methods to configure or query the windows time service
//
#include <windows.h>
#include <w32timep.h>
#include "DebugWPrintf.h"
#include "ErrorHandling.h"
#include "W32TmConsts.h"
struct PropertyTable {
DWORD dwProperty;
LPWSTR pwszRegKeyName;
LPWSTR pwszRegValueName;
} g_rgProperties[] = {
{ W32TIME_CONFIG_SPECIAL_POLL_INTERVAL, wszNtpClientRegKeyConfig, wszNtpClientRegValueSpecialPollInterval },
{ W32TIME_CONFIG_MANUAL_PEER_LIST, wszW32TimeRegKeyParameters, wszW32TimeRegValueNtpServer }
};
//-------------------------------------------------------------------------------------
HRESULT MODULEPRIVATE myRegOpenKeyForProperty(IN DWORD dwProperty, OUT HKEY *phKey) {
DWORD dwRetval;
HRESULT hr;
LPWSTR pwszKeyName = NULL;
for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_rgProperties); dwIndex++) {
if (dwProperty == g_rgProperties[dwIndex].dwProperty) {
pwszKeyName = g_rgProperties[dwIndex].pwszRegKeyName;
break;
}
}
if (NULL == pwszKeyName) {
hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
_JumpError(hr, error, "myRegOpenKeyForProperty: key not found");
}
dwRetval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, pwszKeyName, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, phKey);
if (ERROR_SUCCESS != dwRetval) {
hr = HRESULT_FROM_WIN32(dwRetval);
_JumpError(hr, error, "RegOpenKeyEx");
}
hr = S_OK;
error:
return hr;
}
//-------------------------------------------------------------------------------------
HRESULT MODULEPRIVATE myRegQueryValueForProperty(DWORD dwProperty, HKEY hKey, DWORD *pdwType, BYTE *pbValue, DWORD *pdwSize) {
DWORD dwRetval;
HRESULT hr;
LPWSTR pwszValueName = NULL;
for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_rgProperties); dwIndex++) {
if (dwProperty == g_rgProperties[dwIndex].dwProperty) {
pwszValueName = g_rgProperties[dwIndex].pwszRegValueName;
break;
}
}
if (NULL == pwszValueName) {
hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
_JumpError(hr, error, "myRegQueryValueForProperty: value not found");
}
dwRetval = RegQueryValueEx(hKey, pwszValueName, NULL, pdwType, pbValue, pdwSize);
if (ERROR_SUCCESS != dwRetval) {
hr = HRESULT_FROM_WIN32(dwRetval);
_JumpError(hr, error, "RegQueryValueEx");
}
hr = S_OK;
error:
return hr;
}
//-------------------------------------------------------------------------------------
HRESULT MODULEPRIVATE myRegSetValueForProperty(DWORD dwProperty, HKEY hKey, DWORD dwType, BYTE *pbValue, DWORD dwSize) {
DWORD dwRetval;
HRESULT hr;
LPWSTR pwszValueName = NULL;
for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_rgProperties); dwIndex++) {
if (dwProperty == g_rgProperties[dwIndex].dwProperty) {
pwszValueName = g_rgProperties[dwIndex].pwszRegValueName;
break;
}
}
if (NULL == pwszValueName) {
hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
_JumpError(hr, error, "myRegSetValueForProperty: value not found");
}
dwRetval = RegSetValueEx(hKey, pwszValueName, NULL, dwType, pbValue, dwSize);
if (ERROR_SUCCESS != dwRetval) {
hr = HRESULT_FROM_WIN32(dwRetval);
_JumpError(hr, error, "RegSetValueEx");
}
hr = S_OK;
error:
return hr;
}
//-------------------------------------------------------------------------------------
// MODULEPUBLIC functions
//
//-------------------------------------------------------------------------------------
HRESULT W32TimeQueryConfig(IN DWORD dwProperty,
OUT DWORD *pdwType,
IN OUT BYTE *pbConfig,
IN OUT DWORD *pdwSize)
{
HKEY hKey = NULL;
HRESULT hr;
if (NULL == pdwType || NULL == pbConfig || NULL == pdwSize) {
hr = E_INVALIDARG;
_JumpError(hr, error, "W32TimeQueryConfig: input validation");
}
hr = myRegOpenKeyForProperty(dwProperty, &hKey);
_JumpIfError(hr, error, "myOpenRegKeyForProperty");
hr = myRegQueryValueForProperty(dwProperty, hKey, pdwType, pbConfig, pdwSize);
_JumpIfError(hr, error, "myQueryRegValueForProperty");
hr = S_OK;
error:
if (NULL != hKey) { RegCloseKey(hKey); }
return hr;
}
//-------------------------------------------------------------------------------------
HRESULT W32TimeSetConfig(IN DWORD dwProperty,
IN DWORD dwType,
IN BYTE *pbConfig,
IN DWORD dwSize)
{
DWORD dwRetval;
HKEY hKey = NULL;
HRESULT hr;
hr = myRegOpenKeyForProperty(dwProperty, &hKey);
_JumpIfError(hr, error, "myRegOpenKeyForProperty");
hr = myRegSetValueForProperty(dwProperty, hKey, dwType, pbConfig, dwSize);
_JumpIfError(hr, error, "myRegSetValueForProperty");
hr = S_OK;
error:
if (NULL != hKey) { RegCloseKey(hKey); }
return hr;
}