/**************************************************************************************************************** FILENAME: GetReg.cpp COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. */ #include "stdafx.h" #ifndef SNAPIN #include #endif #include #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; }