/*++ 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 #include "winfax.h" #include "faxutil.h" #include "faxreg.h" HKEY OpenRegistryKey( HKEY hKey, LPCTSTR 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 // DebugPrint(( TEXT("RegCreateKeyEx() failed, ec=%d"), Rslt )); return NULL; } if (Disposition == REG_CREATED_NEW_KEY) { DebugPrint(( TEXT("Created new fax registry key, ec=%d"), Rslt )); } } else { Rslt = RegOpenKeyEx( hKey, KeyName, 0, SamDesired == 0 ? KEY_ALL_ACCESS : SamDesired, &hKeyNew ); if (Rslt != ERROR_SUCCESS) { // // could not open the registry key // DebugPrint(( TEXT("RegOpenKeyEx() failed, ec=%d"), Rslt )); return NULL; } } return hKeyNew; } LPTSTR GetRegistryStringValue( HKEY hKey, DWORD RegType, LPCTSTR ValueName, LPCTSTR DefaultValue, LPDWORD StringSize ) { 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 { DebugPrint(( TEXT("RegQueryValueEx() failed, ec=%d"), Rslt )); goto exit; } } else { if (Type != RegType) { return NULL; } } if (Size == 0) { Size = 32; } Buffer = (LPBYTE) MemAlloc( Size ); if (!Buffer) { goto exit; } Rslt = RegQueryValueEx( hKey, ValueName, NULL, &Type, Buffer, &Size ); if (Rslt != ERROR_SUCCESS) { if (Rslt != ERROR_FILE_NOT_FOUND) { DebugPrint(( TEXT("RegQueryValueEx() failed, ec=%d"), Rslt )); 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 // DebugPrint(( TEXT("RegSetValueEx() failed[%s], ec=%d"), ValueName, Rslt )); goto exit; } } if (RegType == REG_EXPAND_SZ) { Rslt = ExpandEnvironmentStrings( (LPTSTR) Buffer, NULL, 0 ); if (!Rslt) { goto exit; } ExpandBuffer = (LPBYTE) MemAlloc( (Rslt + 1) * sizeof(WCHAR) ); if (!ExpandBuffer) { goto exit; } Rslt = ExpandEnvironmentStrings( (LPTSTR) Buffer, (LPTSTR) ExpandBuffer, Rslt ); if (Rslt == 0) { MemFree( ExpandBuffer ); DebugPrint(( TEXT("ExpandEnvironmentStrings() failed, ec=%d"), GetLastError() )); goto exit; } MemFree( Buffer ); Buffer = ExpandBuffer; } Success = TRUE; if (StringSize) { *StringSize = Size; } exit: if (!Success) { MemFree( Buffer ); return StringDup( DefaultValue ); } return (LPTSTR) Buffer; } LPTSTR GetRegistryString( HKEY hKey, LPCTSTR ValueName, LPCTSTR DefaultValue ) { return GetRegistryStringValue( hKey, REG_SZ, ValueName, DefaultValue, NULL ); } LPTSTR GetRegistryStringExpand( HKEY hKey, LPCTSTR ValueName, LPCTSTR DefaultValue ) { return GetRegistryStringValue( hKey, REG_EXPAND_SZ, ValueName, DefaultValue, NULL ); } LPTSTR GetRegistryStringMultiSz( HKEY hKey, LPCTSTR ValueName, LPCTSTR DefaultValue, LPDWORD StringSize ) { return GetRegistryStringValue( hKey, REG_MULTI_SZ, ValueName, DefaultValue, StringSize ); } DWORD GetRegistryDword( HKEY hKey, LPCTSTR 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 // DebugPrint(( TEXT("RegSetValueEx() failed[%s], ec=%d"), ValueName, Rslt )); Value = 0; } } return Value; } LPBYTE GetRegistryBinary( HKEY hKey, LPCTSTR ValueName, LPDWORD DataSize ) { BOOL Success = FALSE; DWORD Size; LONG Rslt; DWORD Type; LPBYTE Buffer = NULL; Rslt = RegQueryValueEx( hKey, ValueName, NULL, &Type, NULL, &Size ); if (Rslt != ERROR_SUCCESS) { if (Rslt == ERROR_FILE_NOT_FOUND) { Size = 1; } else { DebugPrint(( TEXT("RegQueryValueEx() failed, ec=%d"), Rslt )); goto exit; } } else { if (Type != REG_BINARY) { return NULL; } } if (Size == 0) { Size = 1; } Buffer = (LPBYTE) MemAlloc( Size ); if (!Buffer) { goto exit; } Rslt = RegQueryValueEx( hKey, ValueName, NULL, &Type, Buffer, &Size ); if (Rslt != ERROR_SUCCESS) { if (Rslt != ERROR_FILE_NOT_FOUND) { DebugPrint(( TEXT("RegQueryValueEx() failed, ec=%d"), Rslt )); goto exit; } // // create the value since it doesn't exist // Rslt = RegSetValueEx( hKey, ValueName, 0, REG_BINARY, Buffer, Size ); if (Rslt != ERROR_SUCCESS) { // // could not set the registry value // DebugPrint(( TEXT("RegSetValueEx() failed[%s], ec=%d"), ValueName, Rslt )); goto exit; } } Success = TRUE; if (DataSize) { *DataSize = Size; } exit: if (!Success) { MemFree( Buffer ); return NULL; } return Buffer; } 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, LPCTSTR ValueName, DWORD Value ) { LONG Rslt; Rslt = RegSetValueEx( hKey, ValueName, 0, REG_DWORD, (LPBYTE) &Value, sizeof(DWORD) ); if (Rslt != ERROR_SUCCESS) { DebugPrint(( TEXT("RegSetValueEx() failed[%s], ec=%d"), ValueName, Rslt )); return FALSE; } return TRUE; } BOOL SetRegistryBinary( HKEY hKey, LPCTSTR ValueName, const LPBYTE Value, LONG Length ) { LONG Rslt; Rslt = RegSetValueEx( hKey, ValueName, 0, REG_BINARY, (LPBYTE) Value, Length ); if (Rslt != ERROR_SUCCESS) { DebugPrint(( TEXT("RegSetValueEx() failed[%s], ec=%d"), ValueName, Rslt )); return FALSE; } return TRUE; } BOOL SetRegistryStringValue( HKEY hKey, DWORD RegType, LPCTSTR ValueName, LPCTSTR Value, LONG Length ) { LONG Rslt; Rslt = RegSetValueEx( hKey, ValueName, 0, RegType, (LPBYTE) Value, Length == -1 ? StringSize( Value ) : Length ); if (Rslt != ERROR_SUCCESS) { DebugPrint(( TEXT("RegSetValueEx() failed[%s], ec=%d"), ValueName, Rslt )); return FALSE; } return TRUE; } BOOL SetRegistryString( HKEY hKey, LPCTSTR ValueName, LPCTSTR Value ) { return SetRegistryStringValue( hKey, REG_SZ, ValueName, Value, -1 ); } BOOL SetRegistryStringExpand( HKEY hKey, LPCTSTR ValueName, LPCTSTR Value ) { return SetRegistryStringValue( hKey, REG_EXPAND_SZ, ValueName, Value, -1 ); } BOOL SetRegistryStringMultiSz( HKEY hKey, LPCTSTR ValueName, LPCTSTR Value, DWORD Length ) { return SetRegistryStringValue( hKey, REG_MULTI_SZ, ValueName, Value, Length ); } DWORD EnumerateRegistryKeys( HKEY hKey, LPCTSTR KeyName, BOOL ChangeValues, PREGENUMCALLBACK EnumCallback, LPVOID ContextData ) { LONG Rslt; HKEY hSubKey = NULL; HKEY hKeyEnum = NULL; DWORD Index = 0; DWORD MaxSubKeyLen; DWORD SubKeyCount; LPTSTR SubKeyName = NULL; hSubKey = OpenRegistryKey( hKey, KeyName, ChangeValues, ChangeValues ? KEY_ALL_ACCESS : KEY_READ ); if (!hSubKey) { goto exit; } Rslt = RegQueryInfoKey( hSubKey, NULL, NULL, NULL, &SubKeyCount, &MaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, NULL ); if (Rslt != ERROR_SUCCESS) { // // could not open the registry key // DebugPrint(( TEXT("RegQueryInfoKey() failed, ec=%d"), Rslt )); goto exit; } if (!EnumCallback( hSubKey, NULL, SubKeyCount, ContextData )) { goto exit; } MaxSubKeyLen += 4; SubKeyName = (LPTSTR) MemAlloc( (MaxSubKeyLen+1) * sizeof(WCHAR) ); if (!SubKeyName) { goto exit; } while( TRUE ) { Rslt = RegEnumKey( hSubKey, Index, (LPTSTR) SubKeyName, MaxSubKeyLen ); if (Rslt != ERROR_SUCCESS) { if (Rslt == ERROR_NO_MORE_ITEMS) { break; } DebugPrint(( TEXT("RegEnumKey() failed, ec=%d"), Rslt )); goto exit; } hKeyEnum = OpenRegistryKey( hSubKey, SubKeyName, ChangeValues, ChangeValues ? KEY_ALL_ACCESS : KEY_READ ); if (!hKeyEnum) { continue; } if (!EnumCallback( hKeyEnum, SubKeyName, Index, ContextData )) { RegCloseKey( hKeyEnum ); break; } RegCloseKey( hKeyEnum ); Index += 1; } exit: if (hSubKey) { RegCloseKey( hSubKey ); } MemFree( SubKeyName ); return Index; } BOOL DeleteRegistryKey( HKEY hKey, LPCTSTR SubKey ) { DWORD Count = 0; HKEY hKeyCurrent; TCHAR szName[100]; DWORD dwName; long rslt; rslt = RegOpenKey(hKey,SubKey,&hKeyCurrent); if (rslt != ERROR_SUCCESS) { DebugPrint(( TEXT("RegOpenKey() failed, ec=%d"), rslt )); return FALSE; } while(1) { dwName = sizeof(szName); rslt = RegEnumKeyEx(hKeyCurrent,Count,szName,&dwName,NULL,NULL,NULL,NULL); if (rslt == ERROR_SUCCESS) { DeleteRegistryKey(hKeyCurrent,szName); Count++; } else if (rslt == ERROR_NO_MORE_ITEMS) { break; } else { // // other error // DebugPrint(( TEXT("RegEnumKeyExKey() failed, ec=%d"), rslt )); RegCloseKey(hKeyCurrent); return FALSE; } } RegCloseKey(hKeyCurrent); RegDeleteKey(hKey, SubKey); return TRUE; }