/*++ Copyright (c) 1996 Microsoft Corporation Module Name: registry.c Abstract: This module provides a generic table driven access to the registry. Author: Wesley Witt (wesw) 9-June-1996 Revision History: --*/ #include #include #include #include #define StringSize(_s) (( _s ) ? (_tcslen( _s ) + 1) * sizeof(TCHAR) : 0) LPTSTR StringDup( LPTSTR String ) { LPTSTR NewString; if (!String) { return NULL; } NewString = (LPTSTR) LocalAlloc( LPTR, (_tcslen( String ) + 1) * sizeof(TCHAR) ); if (!NewString) { return NULL; } _tcscpy( NewString, String ); return NewString; } HKEY OpenRegistryKey( HKEY hKey, LPTSTR KeyName, BOOL CreateNewKey, REGSAM SamDesired ) { LONG Rslt; HKEY hKeyNew; DWORD Disposition; if (CreateNewKey) { Rslt = RegCreateKeyEx( hKey, KeyName, 0, NULL, REG_OPTION_NON_VOLATILE, SamDesired == 0 ? KEY_ALL_ACCESS : SamDesired, NULL, &hKeyNew, &Disposition ); if (Rslt != ERROR_SUCCESS) { // // could not open the registry key // return NULL; } } else { Rslt = RegOpenKeyEx( hKey, KeyName, 0, SamDesired == 0 ? KEY_ALL_ACCESS : SamDesired, &hKeyNew ); if (Rslt != ERROR_SUCCESS) { // // could not open the registry key // return NULL; } } return hKeyNew; } LPTSTR GetRegistryStringValue( HKEY hKey, DWORD RegType, LPTSTR ValueName, LPTSTR DefaultValue ) { BOOL Success = FALSE; DWORD Size; LONG Rslt; DWORD Type; LPBYTE Buffer = NULL; LPBYTE ExpandBuffer = NULL; Rslt = RegQueryValueEx( hKey, ValueName, NULL, &Type, NULL, &Size ); if (Rslt != ERROR_SUCCESS) { if (Rslt == ERROR_FILE_NOT_FOUND) { Size = StringSize( DefaultValue ); } else { goto exit; } } Buffer = (LPBYTE) LocalAlloc( LPTR, Size ); if (!Buffer) { goto exit; } Rslt = RegQueryValueEx( hKey, ValueName, NULL, &Type, Buffer, &Size ); if (Rslt != ERROR_SUCCESS) { if (Rslt != ERROR_FILE_NOT_FOUND) { goto exit; } // // create the value since it doesn't exist // _tcscpy( (LPTSTR) Buffer, DefaultValue ); Rslt = RegSetValueEx( hKey, ValueName, 0, RegType, Buffer, Size ); if (Rslt != ERROR_SUCCESS) { // // could not set the registry value // goto exit; } } if (RegType == REG_EXPAND_SZ) { Rslt = ExpandEnvironmentStrings( (LPTSTR) Buffer, NULL, 0 ); if (!Rslt) { goto exit; } ExpandBuffer = (LPBYTE) LocalAlloc( LPTR, (Rslt + 1) * sizeof(WCHAR) ); if (!ExpandBuffer) { goto exit; } Rslt = ExpandEnvironmentStrings( (LPTSTR) Buffer, (LPTSTR) ExpandBuffer, Rslt ); if (Rslt == 0) { LocalFree( ExpandBuffer ); goto exit; } LocalFree( Buffer ); Buffer = ExpandBuffer; } Success = TRUE; exit: if (!Success) { LocalFree( Buffer ); return StringDup( DefaultValue ); } return (LPTSTR) Buffer; } LPTSTR GetRegistryString( HKEY hKey, LPTSTR ValueName, LPTSTR DefaultValue ) { return GetRegistryStringValue( hKey, REG_SZ, ValueName, DefaultValue ); } LPTSTR GetRegistryStringExpand( HKEY hKey, LPTSTR ValueName, LPTSTR DefaultValue ) { return GetRegistryStringValue( hKey, REG_EXPAND_SZ, ValueName, DefaultValue ); } DWORD GetRegistryDword( HKEY hKey, LPTSTR ValueName ) { DWORD Size = sizeof(DWORD); LONG Rslt; DWORD Type; DWORD Value = 0; Rslt = RegQueryValueEx( hKey, ValueName, NULL, &Type, (LPBYTE) &Value, &Size ); if (Rslt != ERROR_SUCCESS) { // // create the value since it doesn't exist // Value = 0; Rslt = RegSetValueEx( hKey, ValueName, 0, REG_DWORD, (LPBYTE) &Value, Size ); if (Rslt != ERROR_SUCCESS) { // // could not set the registry value // Value = 0; } } return Value; } DWORD GetSubKeyCount( HKEY hKey ) { DWORD KeyCount = 0; LONG Rval; Rval = RegQueryInfoKey( hKey, NULL, NULL, NULL, &KeyCount, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); if (Rval != ERROR_SUCCESS) { return 0; } return KeyCount; } DWORD GetMaxSubKeyLen( HKEY hKey ) { DWORD MaxSubKeyLen = 0; LONG Rval; Rval = RegQueryInfoKey( hKey, NULL, NULL, NULL, NULL, &MaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, NULL ); if (Rval != ERROR_SUCCESS) { return 0; } return MaxSubKeyLen; } BOOL SetRegistryDword( HKEY hKey, LPTSTR ValueName, DWORD Value ) { LONG Rslt; Rslt = RegSetValueEx( hKey, ValueName, 0, REG_DWORD, (LPBYTE) &Value, sizeof(DWORD) ); if (Rslt != ERROR_SUCCESS) { return FALSE; } return TRUE; } BOOL SetRegistryStringValue( HKEY hKey, DWORD RegType, LPTSTR ValueName, LPTSTR Value, LONG Length ) { LONG Rslt; Rslt = RegSetValueEx( hKey, ValueName, 0, RegType, (LPBYTE) Value, Length == -1 ? StringSize( Value ) : Length ); if (Rslt != ERROR_SUCCESS) { return FALSE; } return TRUE; } BOOL SetRegistryString( HKEY hKey, LPTSTR ValueName, LPTSTR Value ) { return SetRegistryStringValue( hKey, REG_SZ, ValueName, Value, -1 ); } BOOL SetRegistryStringExpand( HKEY hKey, LPTSTR ValueName, LPTSTR Value ) { return SetRegistryStringValue( hKey, REG_EXPAND_SZ, ValueName, Value, -1 ); } BOOL SetRegistryStringMultiSz( HKEY hKey, LPTSTR ValueName, LPTSTR Value, DWORD Length ) { return SetRegistryStringValue( hKey, REG_MULTI_SZ, ValueName, Value, Length ); }