1565 lines
35 KiB
C++
1565 lines
35 KiB
C++
/*++
|
||
|
||
Copyright (c) 1996 Microsoft Corporation
|
||
© 1998 Seagate Software, Inc. All rights reserved
|
||
|
||
Module Name:
|
||
|
||
wsbregty.cpp
|
||
|
||
Abstract:
|
||
|
||
This is the implementation of registry access helper functions
|
||
and is a part of RsCommon.dll.
|
||
|
||
Author:
|
||
|
||
Rohde Wakefield [rohde] 05-Nov-1996
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "stdafx.h"
|
||
|
||
|
||
HRESULT
|
||
WsbOpenRegistryKey (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN REGSAM sam,
|
||
OUT HKEY * phKeyMachine,
|
||
OUT HKEY * phKey
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Given a machine name and path, connect to obtain an HKEY
|
||
that can be used to do registry work.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
sam - permission desired to registry key.
|
||
|
||
phKeyMachine - return of HKEY to machine.
|
||
|
||
phKey - return of HKEY to path.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbOpenRegistryKey",
|
||
L"szMachine = '%ls', szPath = '%ls', sam = 0x%p, phKeyMachine = 0x%p, phKey = 0x%p",
|
||
szMachine, szPath, sam, phKeyMachine, phKey );
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
WsbAssert ( 0 != phKey, E_POINTER );
|
||
WsbAssert ( 0 != phKeyMachine, E_POINTER );
|
||
|
||
*phKey = *phKeyMachine = 0;
|
||
|
||
WsbAffirmWin32 ( RegConnectRegistry ( (WCHAR*) szMachine, HKEY_LOCAL_MACHINE, phKeyMachine ) );
|
||
|
||
WsbAffirmWin32 ( RegOpenKeyEx ( *phKeyMachine, szPath, 0, sam, phKey ) );
|
||
|
||
|
||
} WsbCatchAndDo ( hr,
|
||
|
||
//
|
||
// Clean up from error
|
||
//
|
||
|
||
if ( phKeyMachine && *phKeyMachine ) {
|
||
|
||
RegCloseKey ( *phKeyMachine );
|
||
*phKeyMachine = 0;
|
||
|
||
}
|
||
|
||
) // WsbCatchAndDo
|
||
|
||
WsbTraceOut ( L"WsbOpenRegistryKey",
|
||
L"HRESULT = %ls, *phKeyMachine = %ls, *phKey = %ls",
|
||
WsbHrAsString ( hr ),
|
||
WsbStringCopy ( WsbPtrToPtrAsString ( (void**)phKeyMachine ) ),
|
||
WsbStringCopy ( WsbPtrToPtrAsString ( (void**)phKey ) ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbCloseRegistryKey (
|
||
IN OUT HKEY * phKeyMachine,
|
||
IN OUT HKEY * phKey
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
As a companion to WsbOpenRegistryKey, close the given keys and zero
|
||
their results.
|
||
|
||
Arguments:
|
||
|
||
phKeyMachine - HKEY to machine.
|
||
|
||
phKey - HKEY to path.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Success.
|
||
|
||
E_POINTER - Invalid pointer passed in.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbCloseRegistryKey",
|
||
L"phKeyMachine = 0x%p, phKey = 0x%p", phKeyMachine, phKey );
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != phKey, E_POINTER );
|
||
WsbAssert ( 0 != phKeyMachine, E_POINTER );
|
||
|
||
//
|
||
// Clean up the keys
|
||
//
|
||
|
||
if ( *phKey ) {
|
||
|
||
RegCloseKey ( *phKey );
|
||
*phKey = 0;
|
||
|
||
}
|
||
|
||
if ( *phKeyMachine ) {
|
||
|
||
RegCloseKey ( *phKeyMachine );
|
||
*phKeyMachine = 0;
|
||
|
||
}
|
||
} WsbCatch ( hr )
|
||
|
||
WsbTraceOut ( L"WsbCloseRegistryKey",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbRemoveRegistryKey (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szKey
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine removes the value of a key as specified.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
E_POINTER - invalid pointer passed in as parameter.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbRemoveRegistryKey",
|
||
L"szMachine = '%ls', szPath = '%ls', szKey = '%ls'",
|
||
szMachine, szPath, szKey );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
|
||
//
|
||
// Open and delete the key
|
||
//
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, szPath, KEY_SET_VALUE | DELETE, &hKeyMachine, &hKey ) );
|
||
WsbAffirmWin32 ( RegDeleteKey ( hKey, szKey ) );
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbRemoveRegistryKey",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbRemoveRegistryValue (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine removes the value of a key as specified.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to remove.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
E_POINTER - invalid pointer passed in as parameter.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbRemoveRegistryValue",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls'",
|
||
szMachine, szPath, szValue );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
WsbAssert ( 0 != szValue, E_POINTER );
|
||
|
||
//
|
||
// Open and write the value in the key
|
||
//
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, szPath, KEY_SET_VALUE, &hKeyMachine, &hKey ) );
|
||
WsbAffirmWin32 ( RegDeleteValue ( hKey, szValue ) );
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbRemoveRegistryValue",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbSetRegistryValueData (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
IN const BYTE *pData,
|
||
IN DWORD cbData
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine set the value of a key as specified to the data
|
||
given. Type of the value is REG_BINARY.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to set.
|
||
|
||
pData - Pointer to the data buffer to copy into value.
|
||
|
||
cbData - Number of bytes to copy from pData.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
E_POINTER - invalid pointer passed in as parameter.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbSetRegistryValueData",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', pData = 0x%p, cbData = %ld",
|
||
szMachine, szPath, szValue, pData, cbData );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
WsbAssert ( 0 != szValue, E_POINTER );
|
||
|
||
//
|
||
// Open and write the value in the key
|
||
//
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, szPath, KEY_SET_VALUE, &hKeyMachine, &hKey ) );
|
||
WsbAffirmWin32 ( RegSetValueEx ( hKey, szValue, 0, REG_BINARY, pData, cbData ) );
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbSetRegistryValueData",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbGetRegistryValueData (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
OUT BYTE *pData,
|
||
IN DWORD cbData,
|
||
OUT DWORD * pcbData OPTIONAL
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine retrieves the value of a key as specified. Type of
|
||
the value must be REG_BINARY.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to get.
|
||
|
||
pData - Pointer to the data buffer to copy into value.
|
||
|
||
cbData - Size in bytes of pData.
|
||
|
||
pcbData - number of bytes filled in pData.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured getting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbGetRegistryValueData",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', pData = 0x%p, cbData = %ld, pcbData = 0x%p",
|
||
szMachine, szPath, szValue, pData, cbData, pcbData );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
WsbAssert ( 0 != szValue, E_POINTER );
|
||
WsbAssert ( 0 != pData, E_POINTER );
|
||
|
||
//
|
||
// Open the key
|
||
//
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, szPath, KEY_QUERY_VALUE, &hKeyMachine, &hKey ) );
|
||
|
||
//
|
||
// Set up temporary vars in case NULL passed for pcbData
|
||
//
|
||
DWORD dwType, cbData2;
|
||
if ( !pcbData ) {
|
||
|
||
pcbData = &cbData2;
|
||
|
||
}
|
||
|
||
//
|
||
// Query for the REG_BINARY value
|
||
//
|
||
|
||
*pcbData = cbData;
|
||
WsbAffirmWin32 ( RegQueryValueEx ( hKey, szValue, 0, &dwType, pData, pcbData ) );
|
||
|
||
WsbAffirm ( REG_BINARY == dwType, E_FAIL );
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbGetRegistryValueData",
|
||
L"HRESULT = %ls, *pcbData = %ls", WsbHrAsString ( hr ), WsbPtrToUlongAsString ( pcbData ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbSetRegistryValueString (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
IN const OLECHAR * szString,
|
||
IN DWORD dwType
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine set the value of a key as specified to the data
|
||
given. Type of the value is dwType (defaults to REG_SZ)
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to set.
|
||
|
||
szString - The string to place in the value.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbSetRegistryValueString",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', szString = '%ls'",
|
||
szMachine, szPath, szValue, szString );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
WsbAssert ( 0 != szValue, E_POINTER );
|
||
WsbAssert ( 0 != szString, E_POINTER );
|
||
|
||
//
|
||
// Open the key
|
||
//
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, szPath, KEY_SET_VALUE, &hKeyMachine, &hKey ) );
|
||
|
||
WsbAffirmWin32 ( RegSetValueEx ( hKey, szValue, 0, dwType, (BYTE*)szString, ( wcslen ( szString ) + 1 ) * sizeof ( OLECHAR ) ) );
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbSetRegistryValueString",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbGetRegistryValueString (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
OUT OLECHAR * szString,
|
||
IN DWORD cSize,
|
||
OUT DWORD *pcLength OPTIONAL
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine get the value specified
|
||
Type of the value must be REG_SZ or REG_EXPAND_SZ
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to get.
|
||
|
||
szString - The string buffer to fill with the value.
|
||
|
||
cSize - Size of szString in OLECAHR's.
|
||
|
||
pcLength - Number of OLECHAR actually written (without L'\0').
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbGetRegistryValueString",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', szString = 0x%p, cSize = '%ld', pcLength = 0x%p",
|
||
szMachine, szPath, szValue, szString, cSize, pcLength );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
WsbAssert ( 0 != szValue, E_POINTER );
|
||
WsbAssert ( 0 != szString, E_POINTER );
|
||
|
||
//
|
||
// Open the key
|
||
//
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, szPath, KEY_QUERY_VALUE, &hKeyMachine, &hKey ) );
|
||
|
||
|
||
//
|
||
// Temporary size vars in case pcLength is NULL
|
||
//
|
||
|
||
DWORD dwType, cbData2;
|
||
if ( !pcLength ) {
|
||
|
||
pcLength = &cbData2;
|
||
|
||
}
|
||
|
||
//
|
||
// And do the query
|
||
//
|
||
|
||
*pcLength = cSize * sizeof ( OLECHAR );
|
||
WsbAffirmWin32 ( RegQueryValueEx ( hKey, szValue, 0, &dwType, (BYTE*)szString, pcLength ) ) ;
|
||
|
||
WsbAffirm ( (REG_SZ == dwType) || (REG_EXPAND_SZ == dwType), E_FAIL );
|
||
|
||
//
|
||
// return characters, not bytes
|
||
//
|
||
|
||
*pcLength = ( *pcLength / sizeof ( OLECHAR ) ) - 1;
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbGetRegistryValueString",
|
||
L"HRESULT = %ls, szString = '%ls', *pcbLength = %ls",
|
||
WsbHrAsString ( hr ), szString, WsbPtrToUlongAsString ( pcLength ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
HRESULT
|
||
WsbGetRegistryValueMultiString (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
OUT OLECHAR * szMultiString,
|
||
IN DWORD cSize,
|
||
OUT DWORD *pcLength OPTIONAL
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine get the value specified
|
||
Type of the value must be REG_MULTI_SZ
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to get.
|
||
|
||
szMultiString - The string buffer to fill with the value.
|
||
|
||
cSize - Size of szString in OLECAHR's.
|
||
|
||
pcLength - Number of OLECHAR actually written (without L'\0').
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbGetRegistryValueMultiString",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', szMultiString = 0x%p, cSize = '%ld', pcLength = 0x%p",
|
||
szMachine, szPath, szValue, szMultiString, cSize, pcLength );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
WsbAssert ( 0 != szValue, E_POINTER );
|
||
WsbAssert ( 0 != szMultiString, E_POINTER );
|
||
|
||
//
|
||
// Open the key
|
||
//
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, szPath, KEY_QUERY_VALUE, &hKeyMachine, &hKey ) );
|
||
|
||
|
||
//
|
||
// Temporary size vars in case pcLength is NULL
|
||
//
|
||
|
||
DWORD dwType, cbData2;
|
||
if ( !pcLength ) {
|
||
|
||
pcLength = &cbData2;
|
||
|
||
}
|
||
|
||
//
|
||
// And do the query
|
||
//
|
||
|
||
*pcLength = cSize * sizeof ( OLECHAR );
|
||
WsbAffirmWin32 ( RegQueryValueEx ( hKey, szValue, 0, &dwType, (BYTE*)szMultiString, pcLength ) ) ;
|
||
|
||
WsbAffirm ( REG_MULTI_SZ == dwType, E_FAIL );
|
||
|
||
//
|
||
// return characters, not bytes
|
||
//
|
||
|
||
*pcLength = ( *pcLength / sizeof ( OLECHAR ) ) - 1;
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbGetRegistryValueMultiString",
|
||
L"HRESULT = %ls, *pcbLength = %ls",
|
||
WsbHrAsString ( hr ), WsbPtrToUlongAsString ( pcLength ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbSetRegistryValueDWORD (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
IN DWORD dw
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine set the value of a key as specified to the data
|
||
given. Type of the value is REG_DWORD
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to set.
|
||
|
||
dw - DWORD value to store.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbSetRegistryValueDWORD",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', dw = %lu [0x%p]",
|
||
szMachine, szPath, szValue, dw, dw );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssertPointer( szPath );
|
||
WsbAssertPointer( szValue );
|
||
|
||
//
|
||
// Open the key
|
||
//
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, szPath, KEY_SET_VALUE, &hKeyMachine, &hKey ) );
|
||
|
||
WsbAffirmWin32 ( RegSetValueEx ( hKey, szValue, 0, REG_DWORD, (BYTE*)&dw, sizeof( DWORD ) ) );
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbSetRegistryValueDWORD",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbGetRegistryValueDWORD(
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
OUT DWORD * pdw
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine set the value of a key as specified to the data
|
||
given. Type of the value is REG_SZ or REG_EXPAND_SZ
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to get.
|
||
|
||
pdw - pointer to a DWORD to store value in.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbGetRegistryValueDWORD",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', pdw = 0x%p",
|
||
szMachine, szPath, szValue, pdw );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssertPointer( szPath );
|
||
WsbAssertPointer( szValue );
|
||
WsbAssertPointer( pdw );
|
||
|
||
//
|
||
// Open the key
|
||
//
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, szPath, KEY_QUERY_VALUE, &hKeyMachine, &hKey ) );
|
||
|
||
|
||
//
|
||
// And do the query
|
||
//
|
||
|
||
DWORD dwType, cbData = sizeof( DWORD );
|
||
WsbAffirmWin32 ( RegQueryValueEx ( hKey, szValue, 0, &dwType, (BYTE*)pdw, &cbData ) ) ;
|
||
|
||
WsbAffirm( REG_DWORD == dwType, E_FAIL );
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbGetRegistryValueDWORD",
|
||
L"HRESULT = %ls, *pdw = %ls",
|
||
WsbHrAsString ( hr ), WsbPtrToUlongAsString ( pdw ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbAddRegistryValueDWORD (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
IN DWORD adw
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine adds an amount to a registry value.
|
||
Type of the value must be REG_DWORD
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to increment
|
||
|
||
adw - DWORD value to add.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbAddRegistryValueDWORD",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', adw = %lu",
|
||
szMachine, szPath, szValue, adw);
|
||
|
||
HRESULT hr = S_OK;
|
||
DWORD value = 0;
|
||
|
||
// Get the old value
|
||
hr = WsbGetRegistryValueDWORD(szMachine, szPath, szValue, &value);
|
||
|
||
// Add to value and replace
|
||
if (S_OK == hr) {
|
||
value += adw;
|
||
} else {
|
||
value = adw;
|
||
}
|
||
hr = WsbSetRegistryValueDWORD(szMachine, szPath, szValue, value);
|
||
|
||
WsbTraceOut ( L"WsbAddRegistryValueDWORD",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbIncRegistryValueDWORD (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine increments a registry value by one.
|
||
Type of the value must be REG_DWORD
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to increment
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbIncRegistryValueDWORD",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls'",
|
||
szMachine, szPath, szValue);
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
hr = WsbAddRegistryValueDWORD(szMachine, szPath, szValue, 1);
|
||
|
||
WsbTraceOut ( L"WsbIncRegistryValueDWORD",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbCheckIfRegistryKeyExists(
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine check if the supplied key exists
|
||
If the key already exists, S_OK is returned.
|
||
If it needed to be created, S_FALSE is returned.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Key already exists.
|
||
|
||
S_FALSE - Connection made, key did not exist but was created
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured creating the key.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbCheckIfRegistryKeyExists",
|
||
L"szMachine = '%ls', szPath = '%ls'", szMachine, szPath );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
|
||
//
|
||
// Open the key
|
||
//
|
||
|
||
HRESULT resultOpen = WsbOpenRegistryKey ( szMachine, szPath, KEY_QUERY_VALUE, &hKeyMachine, &hKey );
|
||
|
||
//
|
||
// If key could be opened, everything is fine - return S_OK
|
||
//
|
||
|
||
if ( SUCCEEDED ( resultOpen ) ) {
|
||
hr = S_OK;
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
} else {
|
||
hr = S_FALSE;
|
||
}
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
|
||
WsbTraceOut ( L"WsbCheckIfRegistryKeyExists",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbEnsureRegistryKeyExists (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine creates the key specified by szPath. Multiple
|
||
levels in the path can be missing and thus created. If the
|
||
key already exists, S_OK is returned. If it needed to be
|
||
created, S_FALSE is returned.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Key already exists.
|
||
|
||
S_FALSE - Connection made, key did not exist but was created
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured creating the key.
|
||
|
||
--*/
|
||
|
||
{
|
||
WsbTraceIn ( L"WsbEnsureRegistryKeyExists",
|
||
L"szMachine = '%ls', szPath = '%ls'", szMachine, szPath );
|
||
|
||
HKEY hKeyMachine = 0,
|
||
hKey = 0;
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
try {
|
||
|
||
//
|
||
// Ensure parameters are valid
|
||
//
|
||
|
||
WsbAssert ( 0 != szPath, E_POINTER );
|
||
|
||
//
|
||
// Open the key
|
||
//
|
||
|
||
HRESULT resultOpen = WsbOpenRegistryKey ( szMachine, szPath, KEY_QUERY_VALUE, &hKeyMachine, &hKey );
|
||
|
||
//
|
||
// If key could be opened, everything is fine - return S_OK
|
||
//
|
||
|
||
if ( SUCCEEDED ( resultOpen ) ) {
|
||
|
||
hr = S_OK;
|
||
|
||
} else {
|
||
|
||
//
|
||
// Otherwise, we need to start at root and create missing portion
|
||
//
|
||
|
||
//
|
||
// Create a copy of the string. Using WsbQuickString so we have
|
||
// automatic freeing of memory
|
||
//
|
||
|
||
WsbQuickString copyString ( szPath );
|
||
WCHAR * pSubKey = copyString;
|
||
|
||
WsbAffirm ( 0 != pSubKey, E_OUTOFMEMORY );
|
||
|
||
DWORD result, createResult;
|
||
HKEY hSubKey;
|
||
|
||
WsbAffirmHr ( WsbOpenRegistryKey ( szMachine, L"", KEY_CREATE_SUB_KEY, &hKeyMachine, &hKey ) );
|
||
|
||
pSubKey = wcstok ( pSubKey, L"\\" );
|
||
|
||
while ( 0 != pSubKey ) {
|
||
|
||
//
|
||
// Create the key. If it exists, RegCreateKeyEx returns
|
||
// REG_OPENED_EXISTING_KEY which is ok here.
|
||
//
|
||
|
||
createResult = 0;
|
||
|
||
result = RegCreateKeyEx ( hKey, pSubKey, 0, L"",
|
||
REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, 0, &hSubKey, &createResult );
|
||
|
||
WsbAffirm ( ERROR_SUCCESS == result, E_FAIL );
|
||
|
||
WsbAffirm (
|
||
( REG_CREATED_NEW_KEY == createResult ) ||
|
||
( REG_OPENED_EXISTING_KEY == createResult), E_FAIL );
|
||
|
||
//
|
||
// And move this hkey to be the next parent
|
||
//
|
||
|
||
RegCloseKey ( hKey );
|
||
hKey = hSubKey;
|
||
hSubKey = 0;
|
||
|
||
//
|
||
// And finally, find next token
|
||
//
|
||
|
||
pSubKey = wcstok ( 0, L"\\" );
|
||
|
||
};
|
||
|
||
//
|
||
// If we succeeded to this point, return S_FALSE
|
||
// for successfull creation of path
|
||
//
|
||
|
||
hr = S_FALSE;
|
||
}
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbCloseRegistryKey ( &hKeyMachine, &hKey );
|
||
|
||
WsbTraceOut ( L"WsbEnsureRegistryKeyExists",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbSetRegistryValueUlongAsString (
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
IN ULONG value
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine puts a ULONG value in the registry as a string value.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to set.
|
||
|
||
value - ULONG value to store.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
WsbTraceIn ( L"WsbSetRegistryValueUlongAsString",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', value = %lu",
|
||
szMachine, szPath, szValue, value );
|
||
|
||
try {
|
||
OLECHAR dataString[100];
|
||
|
||
WsbAffirmHr(WsbEnsureRegistryKeyExists(szMachine, szPath));
|
||
wsprintf(dataString, OLESTR("%lu"), value);
|
||
WsbAffirmHr(WsbSetRegistryValueString (szMachine, szPath, szValue,
|
||
dataString, REG_SZ));
|
||
} WsbCatch ( hr )
|
||
|
||
WsbTraceOut ( L"WsbSetRegistryValueUlongAsString",
|
||
L"HRESULT = %ls", WsbHrAsString ( hr ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbGetRegistryValueUlongAsString(
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
OUT ULONG * pvalue
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine gets a string value from the registry and converts
|
||
it to a ULONG value.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to get.
|
||
|
||
pvalue - pointer to a ULONG to store value in.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
WsbTraceIn ( L"WsbGetRegistryValueUlongAsString",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', pvalue = 0x%p",
|
||
szMachine, szPath, szValue, pvalue );
|
||
|
||
try {
|
||
OLECHAR dataString[100];
|
||
DWORD sizeGot;
|
||
OLECHAR * stopString;
|
||
|
||
WsbAssertPointer( pvalue );
|
||
|
||
WsbAffirmHr(WsbGetRegistryValueString(szMachine, szPath, szValue,
|
||
dataString, 100, &sizeGot));
|
||
*pvalue = wcstoul( dataString, &stopString, 10 );
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbTraceOut ( L"WsbGetRegistryValueUlongAsString",
|
||
L"HRESULT = %ls, *pvalue = %ls",
|
||
WsbHrAsString ( hr ), WsbPtrToUlongAsString ( pvalue ) );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
HRESULT
|
||
WsbGetRegistryValueUlongAsMultiString(
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
OUT ULONG ** ppValues,
|
||
OUT ULONG * pNumValues
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine gets a multi-string value from the registry and converts
|
||
it to a vector of ULONG values.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to get.
|
||
|
||
ppvalues - pointer to a ULONG * to alloacte and store the output vector in
|
||
|
||
pNumValues - Number of items returned
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured getting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
WsbTraceIn ( L"WsbGetRegistryValueUlongAsString",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls'",
|
||
szMachine, szPath, szValue );
|
||
|
||
try {
|
||
OLECHAR dataString[256];
|
||
DWORD sizeGot;
|
||
OLECHAR * stopString;
|
||
|
||
WsbAssertPointer(ppValues);
|
||
WsbAssertPointer(pNumValues);
|
||
|
||
*pNumValues = 0;
|
||
*ppValues = NULL;
|
||
|
||
WsbAffirmHr(WsbGetRegistryValueMultiString(szMachine, szPath, szValue,
|
||
dataString, 256, &sizeGot));
|
||
|
||
// Build the output vector
|
||
OLECHAR *currentString = dataString;
|
||
int size = 10;
|
||
if ((*currentString) != NULL) {
|
||
// first alocation
|
||
*ppValues = (ULONG *)WsbAlloc(size*sizeof(ULONG));
|
||
WsbAffirm(*ppValues != 0, E_OUTOFMEMORY);
|
||
} else {
|
||
hr = E_FAIL;
|
||
}
|
||
|
||
while ((*currentString) != NULL) {
|
||
(*ppValues)[*pNumValues] = wcstoul( currentString, &stopString, 10 );
|
||
(*pNumValues)++;
|
||
|
||
if (*pNumValues == size) {
|
||
size += 10;
|
||
ULONG* pTmp = (ULONG *)WsbRealloc(*ppValues, size*sizeof(ULONG));
|
||
WsbAffirm(0 != pTmp, E_OUTOFMEMORY);
|
||
*ppValues = pTmp;
|
||
}
|
||
|
||
currentString += wcslen(currentString);
|
||
currentString ++;
|
||
}
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbTraceOut ( L"WsbGetRegistryValueUlongAsString",
|
||
L"HRESULT = %ls, num values = %lu",
|
||
WsbHrAsString ( hr ), *pNumValues );
|
||
|
||
return ( hr );
|
||
}
|
||
|
||
|
||
HRESULT
|
||
WsbRegistryValueUlongAsString(
|
||
IN const OLECHAR * szMachine OPTIONAL,
|
||
IN const OLECHAR * szPath,
|
||
IN const OLECHAR * szValue,
|
||
IN OUT ULONG * pvalue
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
If a registry string value is present, this routine gets it and converts
|
||
it to a ULONG value. If it is not present, this routine sets it to the
|
||
supplied default value.
|
||
|
||
Arguments:
|
||
|
||
szMachine - Name of computer to connect to.
|
||
|
||
szPath - Path inside registry to connect to.
|
||
|
||
szValue - Name of the value to get.
|
||
|
||
pvalue - In: default value , Out: pointer to a ULONG to store value.
|
||
|
||
Return Value:
|
||
|
||
S_OK - Connection made, Success.
|
||
|
||
CO_E_OBJNOTCONNECTED - could not connect to registry or key.
|
||
|
||
E_POINTER - invalid pointer in parameters.
|
||
|
||
E_FAIL - Failure occured setting the value.
|
||
|
||
--*/
|
||
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
WsbTraceIn ( L"WsbRegistryValueUlongAsString",
|
||
L"szMachine = '%ls', szPath = '%ls', szValue = '%ls', pvalue = 0x%p",
|
||
szMachine, szPath, szValue, pvalue );
|
||
|
||
try {
|
||
ULONG l_value;
|
||
|
||
WsbAssertPointer( pvalue );
|
||
|
||
if (S_OK == WsbGetRegistryValueUlongAsString(szMachine, szPath, szValue,
|
||
&l_value)) {
|
||
*pvalue = l_value;
|
||
} else {
|
||
WsbAffirmHr(WsbSetRegistryValueUlongAsString(szMachine, szPath,
|
||
szValue, *pvalue));
|
||
}
|
||
|
||
} WsbCatch ( hr )
|
||
|
||
WsbTraceOut ( L"WsbRegistryValueUlongAsString",
|
||
L"HRESULT = %ls, *pvalue = %ls",
|
||
WsbHrAsString ( hr ), WsbPtrToUlongAsString ( pvalue ) );
|
||
|
||
return ( hr );
|
||
}
|