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.
494 lines
13 KiB
494 lines
13 KiB
/*++
|
|
|
|
Copyright (C) 1998-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
REG.CPP
|
|
|
|
Abstract:
|
|
|
|
Utility Registry classes
|
|
|
|
History:
|
|
|
|
raymcc 30-May-96 Created.
|
|
raymcc 26-Jul-99 Updated for wchar_t.
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include <wbemcli.h>
|
|
#include <stdio.h>
|
|
#include <reg.h>
|
|
#include <malloc.h>
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
int Registry::Open(HKEY hStart, wchar_t *pszStartKey, DWORD desiredAccess )
|
|
{
|
|
int nStatus = no_error;
|
|
DWORD dwDisp = 0;
|
|
|
|
m_nLastError = RegCreateKeyEx(hStart, pszStartKey,
|
|
0, 0, 0,
|
|
desiredAccess, 0, &hPrimaryKey, &dwDisp);
|
|
|
|
if (m_nLastError != 0)
|
|
nStatus = failed;
|
|
|
|
return nStatus;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
Registry::Registry(HKEY hRoot, REGSAM flags, wchar_t *pszStartKey)
|
|
{
|
|
hPrimaryKey = 0;
|
|
hSubkey = 0;
|
|
nStatus = RegOpenKeyEx(hRoot, pszStartKey,
|
|
0, flags, &hPrimaryKey
|
|
);
|
|
hSubkey = hPrimaryKey;
|
|
m_nLastError = nStatus;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
Registry::Registry(HKEY hRoot, DWORD dwOptions, REGSAM flags, wchar_t *pszStartKey)
|
|
{
|
|
hPrimaryKey = 0;
|
|
hSubkey = 0;
|
|
|
|
int nStatus = no_error;
|
|
DWORD dwDisp = 0;
|
|
|
|
m_nLastError = RegCreateKeyEx(hRoot, pszStartKey,
|
|
0, 0, dwOptions,
|
|
flags, 0, &hPrimaryKey, &dwDisp
|
|
);
|
|
|
|
hSubkey = hPrimaryKey;
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
Registry::Registry(wchar_t *pszLocalMachineStartKey, DWORD desiredAccess)
|
|
{
|
|
hPrimaryKey = 0;
|
|
hSubkey = 0;
|
|
nStatus = Open(HKEY_LOCAL_MACHINE, pszLocalMachineStartKey, desiredAccess);
|
|
hSubkey = hPrimaryKey;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
Registry::Registry()
|
|
{
|
|
hPrimaryKey = 0;
|
|
hSubkey = 0;
|
|
nStatus = 0;
|
|
hSubkey = 0;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
Registry::~Registry()
|
|
{
|
|
if (hSubkey)
|
|
RegCloseKey(hSubkey);
|
|
if (hPrimaryKey != hSubkey)
|
|
RegCloseKey(hPrimaryKey);
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
int Registry::MoveToSubkey(wchar_t *pszNewSubkey)
|
|
{
|
|
DWORD dwDisp = 0;
|
|
m_nLastError = RegCreateKeyEx(hPrimaryKey, pszNewSubkey, 0, 0, 0, KEY_ALL_ACCESS,
|
|
0, &hSubkey, &dwDisp);
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
return no_error;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
int Registry::GetDWORD(wchar_t *pszValueName, DWORD *pdwValue)
|
|
{
|
|
DWORD dwSize = sizeof(DWORD);
|
|
DWORD dwType = 0;
|
|
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegQueryValueEx(hSubkey, pszValueName, 0, &dwType,
|
|
LPBYTE(pdwValue), &dwSize);
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
|
|
if (dwType != REG_DWORD)
|
|
return failed;
|
|
|
|
return no_error;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
int Registry::GetType(wchar_t *pszValueName, DWORD *pdwType)
|
|
{
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegQueryValueEx(hSubkey, pszValueName, 0, pdwType,
|
|
NULL, NULL);
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
return no_error;
|
|
}
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
int Registry::GetDWORDStr(wchar_t *pszValueName, DWORD *pdwValue)
|
|
{
|
|
wchar_t cTemp[25];
|
|
DWORD dwSize = 25;
|
|
DWORD dwType = 0;
|
|
wchar_t * pEnd = NULL; // gets set to character that stopped the scan
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegQueryValueEx(hSubkey, pszValueName, 0, &dwType,
|
|
(LPBYTE)cTemp, &dwSize);
|
|
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
|
|
if (dwType != REG_SZ)
|
|
return failed;
|
|
|
|
*pdwValue = wcstoul(cTemp, &pEnd, 10);
|
|
if(pEnd == NULL || pEnd == cTemp)
|
|
return failed;
|
|
else
|
|
return no_error;
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
// Use operator delete on the returned pointer!!
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
|
|
int Registry::GetBinary(wchar_t *pszValue, byte ** pData, DWORD * pdwSize)
|
|
{
|
|
*pData = 0;
|
|
DWORD dwSize = 0;
|
|
DWORD dwType = 0;
|
|
if(m_nLastError)
|
|
return failed;
|
|
|
|
m_nLastError = RegQueryValueEx(hSubkey, pszValue, 0, &dwType,
|
|
0, &dwSize);
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
|
|
if (dwType != REG_BINARY)
|
|
return failed;
|
|
|
|
byte *p = new byte[dwSize];
|
|
if (p == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegQueryValueEx(hSubkey, pszValue, 0, &dwType,
|
|
LPBYTE(p), &dwSize);
|
|
if (m_nLastError != 0)
|
|
{
|
|
delete [] p;
|
|
return failed;
|
|
}
|
|
|
|
*pdwSize = dwSize;
|
|
*pData = p;
|
|
return no_error;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
int Registry::SetBinary(wchar_t *pszValue, byte * pData, DWORD dwSize)
|
|
{
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegSetValueEx(hSubkey, pszValue, 0, REG_BINARY, pData, dwSize);
|
|
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
return no_error;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
int Registry::SetDWORD(wchar_t *pszValueName, DWORD dwValue)
|
|
{
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegSetValueEx(hSubkey, pszValueName, 0, REG_DWORD, LPBYTE(&dwValue),
|
|
sizeof(DWORD));
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
return no_error;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
|
|
int Registry::SetDWORDStr(wchar_t *pszValueName, DWORD dwVal)
|
|
{
|
|
wchar_t cTemp[30];
|
|
StringCchPrintfW(cTemp,30, L"%d",dwVal);
|
|
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegSetValueEx(hSubkey, pszValueName, 0, REG_SZ, LPBYTE(cTemp),
|
|
(wcslen(cTemp)+1) * sizeof(wchar_t));
|
|
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
|
|
return no_error;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
|
|
int Registry::DeleteValue(wchar_t *pszValueName)
|
|
{
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
return RegDeleteValue(hSubkey, pszValueName);
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
int Registry::SetMultiStr(wchar_t *pszValueName, wchar_t * pszValue, DWORD dwSize)
|
|
{
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegSetValueEx(hSubkey,
|
|
pszValueName,
|
|
0,
|
|
REG_MULTI_SZ,
|
|
LPBYTE(pszValue),
|
|
dwSize);
|
|
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
return no_error;
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
|
|
int Registry::SetStr(wchar_t *pszValueName, wchar_t *pszValue)
|
|
{
|
|
|
|
int nSize = (wcslen(pszValue)+1) * sizeof(wchar_t);
|
|
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegSetValueEx(hSubkey, pszValueName, 0, REG_SZ, LPBYTE(pszValue), nSize);
|
|
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
|
|
return no_error;
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
|
|
int Registry::SetExpandStr(wchar_t *pszValueName, wchar_t *pszValue)
|
|
{
|
|
int nSize = (wcslen(pszValue)+1) * sizeof(wchar_t);
|
|
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegSetValueEx(hSubkey, pszValueName, 0, REG_EXPAND_SZ, LPBYTE(pszValue), nSize);
|
|
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
|
|
return no_error;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
|
|
wchar_t* Registry::GetMultiStr(wchar_t *pszValueName, DWORD &dwSize)
|
|
{
|
|
//Find out the size of the buffer required
|
|
DWORD dwType;
|
|
if(hSubkey == NULL)
|
|
return NULL;
|
|
|
|
dwSize = 0;
|
|
m_nLastError = RegQueryValueEx(hSubkey, pszValueName, 0, &dwType, NULL, &dwSize);
|
|
|
|
if ((m_nLastError == ERROR_SUCCESS) && (dwType != REG_MULTI_SZ))
|
|
{
|
|
m_nLastError = WBEM_E_TYPE_MISMATCH;
|
|
dwSize = 0;
|
|
return NULL;
|
|
}
|
|
|
|
//If the error is an unexpected one bail out
|
|
if ((m_nLastError != ERROR_SUCCESS) || (dwType != REG_MULTI_SZ))
|
|
{
|
|
dwSize = 0;
|
|
return NULL;
|
|
}
|
|
|
|
if (dwSize == 0)
|
|
{
|
|
dwSize = 0;
|
|
return NULL;
|
|
}
|
|
|
|
wmilib::auto_ptr<BYTE> pData( new BYTE[dwSize]);
|
|
if (NULL == pData.get()) return NULL;
|
|
|
|
//get the values
|
|
m_nLastError = RegQueryValueEx(hSubkey,
|
|
pszValueName,
|
|
0,
|
|
&dwType,
|
|
pData.get(),
|
|
&dwSize);
|
|
|
|
//if an error bail out
|
|
if (m_nLastError != 0)
|
|
{
|
|
dwSize = 0;
|
|
return NULL;
|
|
}
|
|
|
|
return (wchar_t *)pData.release();
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
/// Use operator delete on returned value.
|
|
//
|
|
//***************************************************************************
|
|
// ok
|
|
|
|
int Registry::GetStr(wchar_t *pszValueName, wchar_t **pValue)
|
|
{
|
|
*pValue = 0;
|
|
DWORD dwSize = 0;
|
|
DWORD dwType = 0;
|
|
|
|
if(hSubkey == NULL)
|
|
return failed;
|
|
|
|
m_nLastError = RegQueryValueEx(hSubkey, pszValueName, 0, &dwType,
|
|
0, &dwSize);
|
|
if (m_nLastError != 0)
|
|
return failed;
|
|
|
|
if (dwType != REG_SZ && dwType != REG_EXPAND_SZ)
|
|
return failed;
|
|
|
|
//
|
|
// length will not include the null terminated character when you don't
|
|
// pass the buffer and the reg value was not already null terminated,
|
|
// so make up for it. If you give RegQueryValueEx enough room in the buff
|
|
// it will add the null terminator for you.
|
|
//
|
|
dwSize += sizeof(wchar_t);
|
|
|
|
wchar_t *p = new wchar_t[dwSize]; // May be twice as big as required when _UNICODE
|
|
// is defined, but harmless nonetheless.
|
|
if (p == 0)
|
|
return failed;
|
|
|
|
m_nLastError = RegQueryValueEx(hSubkey, pszValueName, 0, &dwType,
|
|
LPBYTE(p), &dwSize);
|
|
if (m_nLastError != 0)
|
|
{
|
|
delete [] p;
|
|
return failed;
|
|
}
|
|
|
|
if(dwType == REG_EXPAND_SZ)
|
|
{
|
|
wchar_t tTemp;
|
|
|
|
// Get the initial length
|
|
|
|
DWORD nSize = ExpandEnvironmentStrings((wchar_t *)p,&tTemp,1) + 1;
|
|
wchar_t * pTemp = new wchar_t[nSize+1];
|
|
if (pTemp == 0)
|
|
{
|
|
delete [] p;
|
|
return failed;
|
|
}
|
|
ExpandEnvironmentStrings((wchar_t *)p,pTemp,nSize+1);
|
|
delete [] p;
|
|
*pValue = pTemp;
|
|
}
|
|
else
|
|
*pValue = p;
|
|
return no_error;
|
|
}
|
|
|
|
|