mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|