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.
 
 
 
 
 
 

357 lines
12 KiB

/****************************************************************************************************************
FILENAME: GetReg.cpp
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
*/
#include "stdafx.h"
#ifndef SNAPIN
#include <windows.h>
#endif
#include <stdio.h>
#include "ErrMacro.h"
#include "Message.h"
/****************************************************************************************************************
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
This routine gets a value from the registry.
INPUT + OUTPUT:
IN OUT phKey - Handle to where to store the registry key if NULL, or a valid key if otherwise.
IN cRegKey - If phKey is NULL, this specifies the name of the key to open.
IN cRegValueName - The name of the value to get from phKey.
OUT cRegValue - Where to write the value.
IN OUT pdwRegValueSize - The size of the cRegValue buffer in bytes on entry; the number of bytes written on return.
GLOBALS:
None.
RETURN:
ERROR_SUCCESS - Success
ERROR_... - Failure
*/
LONG
GetRegValue(
IN OUT PHKEY phKey,
IN PTCHAR cRegKey,
IN PTCHAR cRegValueName,
OUT PTCHAR cRegValue,
IN OUT PDWORD pdwRegValueSize
)
{
LONG lReturn;
DWORD dwKeyType;
//0.0E00 If no handle passed in then open the registry key and get a handle.
if (*phKey == NULL) {
//0.0E00 Open the registry
if((lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
cRegKey,
0,
KEY_QUERY_VALUE,
&*phKey
)) != ERROR_SUCCESS) {
Message(TEXT("GetRegValue - RegOpenKeyEx"), lReturn, cRegKey);
return lReturn;
}
}
//0.0E00 Query the registry for the value
if((lReturn = RegQueryValueEx(*phKey,
cRegValueName,
0,
&dwKeyType,
(PUCHAR)cRegValue,
&*pdwRegValueSize
)) != ERROR_SUCCESS) {
Message(TEXT("GetRegValue - RegQueryValueEx"), lReturn, cRegValueName);
return lReturn;
}
if (*pdwRegValueSize > 1) {
//0.0E00 Zero terminate the return string value.
cRegValue[(*pdwRegValueSize)/sizeof(TCHAR) - 1] = 0;
}
else {
cRegValue[0] = 0;
lReturn = ERROR_BADKEY;
}
return lReturn;
}
/****************************************************************************************************************
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
This routine gets a value from the registry.
INPUT + OUTPUT:
IN OUT phKey - Handle to where to store the registry key if NULL, or a valid key if otherwise.
IN cRegKey - If phKey is NULL, this specifies the name of the key to open.
IN cRegValueName - The name of the value to get from phKey.
OUT cRegValue - Where to write the value.
IN OUT pdwRegValueSize - The size of the cRegValue buffer in bytes on entry; the number of bytes written on return.
GLOBALS:
None.
RETURN:
ERROR_SUCCESS - Success
ERROR_... - Failure
*/
LONG
GetRegValue(
IN OUT PHKEY phKey,
IN PTCHAR cRegKey,
IN PTCHAR cRegValueName,
OUT PLONGLONG cRegValue,
IN OUT PDWORD pdwRegValueSize
)
{
LONG lReturn;
DWORD dwKeyType;
//0.0E00 If no handle passed in then open the registry key and get a handle.
if (*phKey == NULL) {
//0.0E00 Open the registry
if((lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
cRegKey,
0,
KEY_QUERY_VALUE,
&*phKey
)) != ERROR_SUCCESS) {
Message(TEXT("GetRegValue - RegOpenKeyEx"), lReturn, cRegKey);
return lReturn;
}
}
//0.0E00 Query the registry for the value
if((lReturn = RegQueryValueEx(*phKey,
cRegValueName,
0,
&dwKeyType,
(LPBYTE)&*cRegValue,
&*pdwRegValueSize
)) != ERROR_SUCCESS) {
Message(TEXT("GetRegValue - RegQueryValueEx"), lReturn, cRegValueName);
return lReturn;
}
return lReturn;
}
/*****************************************************************************************************************
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
This routine gets the NT registry subkey to the key and index value passed in.
INPUT + OUTPUT:
IN OUT phKey - Handle to where to store the registry key if NULL, or a valid key if otherwise.
IN cRegKey - If phKey is NULL, this specifies the name of the key to open.
IN dwIndex - The zero based index number of the sub key to enumerate.
OUT cRegSubKey - A string to return the value in. (Must be at least MAX_PATH length).
IN OUT dwRegSubKeySize - Size of the sub key register. On return this holds the size of the subkey returned.
GLOBALS:
None.
RETURN:
ERROR_SUCCESS or ERROR_NO_MORE_ITEMS - Success
ERROR_... - Failure
*/
LONG
GetRegSubKey(
IN OUT PHKEY phKey,
IN PTCHAR cRegKey,
IN DWORD dwIndex,
OUT PTCHAR cRegSubKey,
IN OUT PDWORD pdwRegSubKeySize
)
{
LONG lReturn;
FILETIME ftLastWriteTime;
//0.0E00 If no handle passed in then open the registry key and get a handle.
if (*phKey == NULL) {
if((lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
cRegKey,
0,
KEY_ENUMERATE_SUB_KEYS,
&*phKey
)) != ERROR_SUCCESS) {
Message(TEXT("GetRegSubKey - RegOpenKeyEx"), lReturn, cRegKey);
return lReturn;
}
}
//0.0E00 Get the sub key.
if((lReturn = RegEnumKeyEx(*phKey,
dwIndex,
cRegSubKey,
&*pdwRegSubKeySize,
NULL,
NULL,
NULL,
&ftLastWriteTime
)) != ERROR_SUCCESS && lReturn != ERROR_NO_MORE_ITEMS) {
Message(TEXT("GetRegSubKey - RegEnumKeyEx"), lReturn, cRegSubKey);
}
return lReturn;
}
/****************************************************************************************************************
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
This routine sets a value in the registry. And creates the registry key if it does not
already exist.
INPUT + OUTPUT:
IN OUT phKey - Handle to where to store the registry key if NULL, or a valid key if otherwise.
IN cRegKey - If phKey is NULL, this specifies the name of the key to open.
IN cRegValueName - The name of the value to save under phKey.
OUT cRegValue - Contains the value to write.
IN OUT pdwRegValueSize - The number of bytes to write.
IN dwKeyType - The type of value to write (e.g. REG_SZ).
GLOBALS:
None.
RETURN:
ERROR_SUCCESS - Success
ERROR_... - Failure
*/
LONG
SetRegValue(
IN OUT PHKEY phKey,
IN PTCHAR cRegKey,
IN PTCHAR cRegValueName,
OUT PTCHAR cRegValue,
IN DWORD dwRegValueSize,
IN DWORD dwKeyType
)
{
LONG lReturn;
TCHAR cClass[] = TEXT("");
DWORD dwDisposition;
//0.0E00 If no handle passed in then open the registry key and get a handle.
if (*phKey == NULL) {
// 1.0E00 Create the key if it does not exist otherwise open it.
if((lReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // handle of an open key
cRegKey, // address of subkey name
0, // reserved
cClass, // address of class string
REG_OPTION_NON_VOLATILE, // special options flag
KEY_ALL_ACCESS, // desired security access
NULL, // address of key security structure
&*phKey, // address of buffer for opened handle
&dwDisposition // address of disposition value buffer
)) != ERROR_SUCCESS) {
Message(TEXT("SetRegValue - RegOpenKeyEx"), lReturn, cRegKey);
return lReturn;
}
}
//0.0E00 Query the registry for the value
if((lReturn = RegSetValueEx(*phKey,
cRegValueName,
0,
dwKeyType,
(PUCHAR)cRegValue,
dwRegValueSize
)) != ERROR_SUCCESS) {
Message(TEXT("SetRegValue - RegSetValueEx"), lReturn, cRegValueName);
}
return lReturn;
}
/****************************************************************************************************************
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
ROUTINE DESCRIPTION:
This routine sets a value in the registry. And creates the registry key if it does not
already exist.
INPUT + OUTPUT:
IN OUT phKey - Handle to where to store the registry key if NULL, or a valid key if otherwise.
IN cRegKey - If phKey is NULL, this specifies the name of the key to open.
IN cRegValueName - The name of the value to save under phKey.
OUT cRegValue - Contains the value to write.
IN OUT pdwRegValueSize - The number of bytes to write.
IN dwKeyType - The type of value to write (e.g. REG_SZ).
GLOBALS:
None.
RETURN:
ERROR_SUCCESS - Success
ERROR_... - Failure
*/
LONG
SetRegValue(
IN OUT PHKEY phKey,
IN PTCHAR cRegKey,
IN PTCHAR cRegValueName,
IN LONGLONG cRegValue,
IN DWORD dwRegValueSize,
IN DWORD dwKeyType
)
{
LONG lReturn;
TCHAR cClass[] = TEXT("");
DWORD dwDisposition;
//0.0E00 If no handle passed in then open the registry key and get a handle.
if (*phKey == NULL) {
// 1.0E00 Create the key if it does not exist otherwise open it.
if((lReturn = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // handle of an open key
cRegKey, // address of subkey name
0, // reserved
cClass, // address of class string
REG_OPTION_NON_VOLATILE, // special options flag
KEY_ALL_ACCESS, // desired security access
NULL, // address of key security structure
&*phKey, // address of buffer for opened handle
&dwDisposition // address of disposition value buffer
)) != ERROR_SUCCESS) {
Message(TEXT("SetRegValue - RegOpenKeyEx"), lReturn, cRegKey);
return lReturn;
}
}
//0.0E00 Query the registry for the value
if((lReturn = RegSetValueEx(*phKey,
cRegValueName,
0,
dwKeyType,
(LPBYTE)&cRegValue,
dwRegValueSize
)) != ERROR_SUCCESS) {
Message(TEXT("SetRegValue - RegSetValueEx"), lReturn, cRegValueName);
}
return lReturn;
}