////////////////////////////////////////////////////////////////////////////// // // REGISTRY.C // // Microsoft Confidential // Copyright (cMicrosoft Corporation 1998 // All rights reserved // // Registry functions for the application to easily interface with the // registry. // // 4/98 - Jason Cohen (JCOHEN) // ////////////////////////////////////////////////////////////////////////////// // Include files // #include #include "jcohen.h" #include "registry.h" BOOL RegExists(HKEY hKeyReg, LPTSTR lpKey, LPTSTR lpValue) { HKEY hOpenKey = NULL; BOOL bExists = FALSE; if (lpKey) { if (RegOpenKeyEx(hKeyReg, lpKey, 0, KEY_ALL_ACCESS, &hOpenKey) != ERROR_SUCCESS) return bExists; } else hOpenKey = hKeyReg; if (lpValue) bExists = (RegQueryValueEx(hOpenKey, lpValue, NULL, NULL, NULL, NULL) == ERROR_SUCCESS); else bExists = TRUE; if (lpKey) RegCloseKey(hOpenKey); return bExists; } BOOL RegDelete(HKEY hRootKey, LPTSTR lpSubKey, LPTSTR lpValue) { BOOL bSuccess = FALSE; if (lpValue) { if (lpSubKey) { HKEY hRegKey; if (RegOpenKeyEx(hRootKey, lpSubKey, 0, KEY_ALL_ACCESS, &hRegKey) == ERROR_SUCCESS) { bSuccess = (RegDeleteValue(hRegKey, lpValue) == ERROR_SUCCESS); RegCloseKey(hRegKey); } } else bSuccess = (RegDeleteValue(hRootKey, lpValue) == ERROR_SUCCESS); } else bSuccess = (RegDeleteKey(hRootKey, lpSubKey) == ERROR_SUCCESS); return bSuccess; } LPTSTR RegGetString(HKEY hKeyReg, LPTSTR lpKey, LPTSTR lpValue) { HKEY hOpenKey = NULL; LPTSTR lpBuffer = NULL, lpExpand = NULL; DWORD dwSize = 0, dwType; // If the key is specified, we must open it. Otherwise we can // just use the HKEY passed in. // if (lpKey) { // If the open key fails, return NULL because the value can't exist. // if (RegOpenKeyEx(hKeyReg, lpKey, 0, KEY_ALL_ACCESS, &hOpenKey) != ERROR_SUCCESS) return NULL; } else hOpenKey = hKeyReg; // Now query the value to get the size to allocate. Make sure the date // type is a string and that the malloc doesn't fail. // if ( ( RegQueryValueEx(hOpenKey, lpValue, NULL, &dwType, NULL, &dwSize) == ERROR_SUCCESS ) && ( ( dwType == REG_SZ ) || ( dwType == REG_EXPAND_SZ ) ) && ( lpBuffer = (LPTSTR) MALLOC(dwSize) ) ) { // We know the value exists and we have the memory we need to query the value again. // if ( ( RegQueryValueEx(hOpenKey, lpValue, NULL, NULL, (LPBYTE) lpBuffer, &dwSize) == ERROR_SUCCESS ) && ( ( dwType == REG_SZ ) || ( dwType == REG_EXPAND_SZ ) ) ) { // We should expand it if it is supposed to be. // if ( dwType == REG_EXPAND_SZ ) { if ( ( dwSize = ExpandEnvironmentStrings(lpBuffer, NULL, 0) ) && ( lpExpand = (LPTSTR) MALLOC(dwSize * sizeof(TCHAR)) ) && ( ExpandEnvironmentStrings(lpBuffer, lpExpand, dwSize) ) && ( *lpExpand ) ) { // The expand worked, so free the original buffer and return // the expanded one. // FREE(lpBuffer); lpBuffer = lpExpand; } else { // The expand failed see we should free everything up // and return NULL. // FREE(lpExpand); FREE(lpBuffer); } } } else // For some reason the query failed, that shouldn't happen // but now we need to free and return NULL. // FREE(lpBuffer); } // If we opened a key, we must close it. // if (lpKey) RegCloseKey(hOpenKey); // Return the buffer allocated, or NULL if something failed. // return lpBuffer; } LPVOID RegGetBin(HKEY hKeyReg, LPTSTR lpKey, LPTSTR lpValue) { HKEY hOpenKey = NULL; LPVOID lpBuffer = NULL; DWORD dwSize = 0, dwType; // If the key is specified, we must open it. Otherwise we can // just use the HKEY passed in. // if (lpKey) { // If the open key fails, return NULL because the value can't exist. // if (RegOpenKeyEx(hKeyReg, lpKey, 0, KEY_ALL_ACCESS, &hOpenKey) != ERROR_SUCCESS) return NULL; } else hOpenKey = hKeyReg; // Now query the value to get the size to allocate. Make sure the date // type is a string and that the malloc doesn't fail. // if ( ( RegQueryValueEx(hOpenKey, lpValue, NULL, &dwType, NULL, &dwSize) == ERROR_SUCCESS ) && ( dwType == REG_BINARY ) && ( lpBuffer = MALLOC(dwSize) ) ) { // We know the value exists and we have the memory we need to query the value again. // if ( ( RegQueryValueEx(hOpenKey, lpValue, NULL, NULL, (LPBYTE) lpBuffer, &dwSize) != ERROR_SUCCESS ) || ( dwType != REG_BINARY ) ) // For some reason the query failed, that shouldn't happen // but now we need to free and return NULL. // FREE(lpBuffer); } // If we opened a key, we must close it. // if (lpKey) RegCloseKey(hOpenKey); // Return the buffer allocated, or NULL if something failed. // return lpBuffer; } DWORD RegGetDword(HKEY hKeyReg, LPTSTR lpKey, LPTSTR lpValue) { HKEY hOpenKey = NULL; DWORD dwBuffer, dwSize = sizeof(DWORD), dwType; if (lpKey) { if (RegOpenKeyEx(hKeyReg, lpKey, 0, KEY_ALL_ACCESS, &hOpenKey) != ERROR_SUCCESS) return 0; } else hOpenKey = hKeyReg; if ( (RegQueryValueEx(hOpenKey, lpValue, NULL, &dwType, (LPBYTE) &dwBuffer, &dwSize) != ERROR_SUCCESS) || (dwSize != sizeof(DWORD)) ) dwBuffer = 0; if (lpKey) RegCloseKey(hOpenKey); return dwBuffer; } BOOL RegSetString(HKEY hRootKey, LPTSTR lpSubKey, LPTSTR lpValue, LPTSTR lpData) { BOOL bSuccess = FALSE; if (lpSubKey) { HKEY hRegKey; DWORD dwBuffer; if (RegCreateKeyEx(hRootKey, lpSubKey, 0, TEXT(""), 0, KEY_ALL_ACCESS, NULL, &hRegKey, &dwBuffer) == ERROR_SUCCESS) { bSuccess = (RegSetValueEx(hRegKey, lpValue, 0, REG_SZ, (CONST BYTE *) lpData, lstrlen(lpData) + 1) == ERROR_SUCCESS); RegCloseKey(hRegKey); } } else bSuccess = (RegSetValueEx(hRootKey, lpValue, 0, REG_SZ, (CONST BYTE *) lpData, lstrlen(lpData) + 1) == ERROR_SUCCESS); return bSuccess; } BOOL RegSetDword(HKEY hRootKey, LPTSTR lpSubKey, LPTSTR lpValue, DWORD dwData) { BOOL bSuccess = FALSE; if (lpSubKey) { HKEY hRegKey; DWORD dwBuffer; if (RegCreateKeyEx(hRootKey, lpSubKey, 0, TEXT(""), 0, KEY_ALL_ACCESS, NULL, &hRegKey, &dwBuffer) == ERROR_SUCCESS) { bSuccess = (RegSetValueEx(hRegKey, lpValue, 0, REG_DWORD, (CONST BYTE *) &dwData, sizeof(dwData)) == ERROR_SUCCESS); RegCloseKey(hRegKey); } } else bSuccess = (RegSetValueEx(hRootKey, lpValue, 0, REG_SZ, (CONST BYTE *) &dwData, sizeof(dwData)) == ERROR_SUCCESS); return bSuccess; } BOOL RegCheck(HKEY hKeyRoot, LPTSTR lpKey, LPTSTR lpValue) { LPTSTR lpBuffer; DWORD dwSize = 0, dwType, dwBuffer = 0; HKEY hKeyReg; BOOL bReturn = FALSE; if (lpKey) { if (RegOpenKeyEx(hKeyRoot, lpKey, 0, KEY_ALL_ACCESS, &hKeyReg) != ERROR_SUCCESS) return 0; } else hKeyReg = hKeyRoot; // Query for the value and allocate the memory for the // value data if it is type REG_SZ. // if (RegQueryValueEx(hKeyReg, lpValue, NULL, &dwType, NULL, &dwSize) == ERROR_SUCCESS) { if (dwType == REG_SZ) { // It is a string value, must allocate a buffer for the string. // if (lpBuffer = (LPTSTR) MALLOC(dwSize)) { if ( (RegQueryValueEx(hKeyReg, lpValue, NULL, NULL, (LPBYTE) lpBuffer, &dwSize) == ERROR_SUCCESS) && (*lpBuffer != '0') && (*lpBuffer) ) { dwBuffer = 1; } FREE(lpBuffer); } } else { // Must be a DWORD or BIN value. // RegQueryValueEx(hKeyReg, lpValue, NULL, &dwType, (LPBYTE) &dwBuffer, &dwSize); } bReturn = (dwBuffer != 0); } if (lpKey) RegCloseKey(hKeyReg); return bReturn; } BOOL RegEnumKeys(HKEY hKey, LPTSTR lpRegKey, REGENUMKEYPROC hCallBack, LPARAM lParam, BOOL bDelKeys) { TCHAR szKeyName[MAX_PATH + 1]; DWORD dwIndex = 0, dwSize = sizeof(szKeyName); HKEY hKeyReg, hKeyEnum; BOOL bReturn = TRUE; // Open a key handle to the key to enumerate. // if ( ( lpRegKey == NULL ) || ( RegOpenKeyEx(hKey, lpRegKey, 0, KEY_ALL_ACCESS, &hKeyReg) == ERROR_SUCCESS ) ) { // Enumerate all the subkeys in this key. // while ( bReturn && ( RegEnumKeyEx(hKeyReg, dwIndex, szKeyName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS ) ) { if ( RegOpenKeyEx(hKeyReg, szKeyName, 0, KEY_ALL_ACCESS, &hKeyEnum) == ERROR_SUCCESS ) { bReturn = hCallBack(hKeyEnum, szKeyName, lParam); RegCloseKey(hKeyEnum); } if ( !bDelKeys || ( RegDeleteKey(hKeyReg, szKeyName) != ERROR_SUCCESS ) ) dwIndex++; dwSize = sizeof(szKeyName); } if (lpRegKey) RegCloseKey(hKeyReg); } else bReturn = FALSE; return bReturn; } BOOL RegEnumValues(HKEY hKey, LPTSTR lpRegKey, REGENUMVALPROC hCallBack, LPARAM lParam, BOOL bDelValues) { TCHAR szValueName[MAX_PATH + 1]; LPTSTR lpBuffer; DWORD dwIndex = 0, dwSize = sizeof(szValueName), dwDataSize = 0, dwType; HKEY hKeyReg; BOOL bReturn = TRUE; // Open a key handle to the key to enumerate. // if ( (lpRegKey == NULL) || (RegOpenKeyEx(hKey, lpRegKey, 0, KEY_ALL_ACCESS, &hKeyReg) == ERROR_SUCCESS) ) { // Enumerate all the values in this key. // while (bReturn && (RegEnumValue(hKeyReg, dwIndex, szValueName, &dwSize, NULL, &dwType, NULL, &dwDataSize) == ERROR_SUCCESS)) { if ((dwType == REG_SZ) && (lpBuffer = (LPTSTR) MALLOC(dwDataSize))) { if (RegQueryValueEx(hKeyReg, szValueName, NULL, NULL, (LPBYTE) lpBuffer, &dwDataSize) == ERROR_SUCCESS) bReturn = hCallBack(szValueName, lpBuffer, lParam); FREE(lpBuffer); } if ( !bDelValues || (RegDeleteValue(hKeyReg, szValueName) != ERROR_SUCCESS) ) dwIndex++; dwSize = sizeof(szValueName); dwDataSize = 0; } if (lpRegKey) RegCloseKey(hKeyReg); } else bReturn = FALSE; return bReturn; }