//+---------------------------------------------------------------------------- // // File: regutil.cpp // // Module: CMSETUP.LIB // // Synopsis: Implementation of the CmDeleteRegKeyWithoutSubKeys function. // // Copyright (c) 1999 Microsoft Corporation // // Author: quintinb Created Header 08/19/99 // //+---------------------------------------------------------------------------- #include "cmsetup.h" //+---------------------------------------------------------------------------- // // Function: CmDeleteRegKeyWithoutSubKeys // // Synopsis: This function is used to safely delete keys on both Winnt and win95. // The win95 version of RegDeleteKey will delete a key with subkeys. // In certain situations this is desirable but in others it is not. // // Arguments: HKEY hBaseKey - key that pszSubKey is relative to (usually a predefined key) // LPCTSTR pszSubKey - String containing the subkey to delete. // BOOL bIgnoreValues - if TRUE, we delete even if values exist // if FALSE, then we won't delete if values exist. // // Returns: LONG - Returns the value from RegDeleteKey unless it couldn't find the // key specified (then returns ERROR_FILE_NOT_FOUND). If the key // exists but has subkeys (or values if bIgnoreValues == FALSE), then // it returns ERROR_FILE_EXISTS. // // History: quintinb Created 9/21/98 // //+---------------------------------------------------------------------------- LONG CmDeleteRegKeyWithoutSubKeys(HKEY hBaseKey, LPCTSTR pszKey, BOOL bIgnoreValues) { DWORD dwSubKeys; DWORD dwValues; HKEY hKey = NULL; LPTSTR pszSubKey = NULL; LONG lReturn = ERROR_INVALID_PARAMETER; BOOL bFreePszSubKey = FALSE; if (hBaseKey && pszKey) { // // First check to see if the subkey ends with a final slash. If it // does we need to remove it because the win9x versions of the registry // APIs don't deal well with trailing slashes. // DWORD dwLen = lstrlen(pszKey); if (TEXT('\\') == pszKey[dwLen-1]) { pszSubKey = (LPTSTR)CmMalloc((dwLen +1)*sizeof(TCHAR)); if (pszSubKey) { lstrcpy(pszSubKey, pszKey); pszSubKey[dwLen-1] = TEXT('\0'); bFreePszSubKey = TRUE; // we allocated it, so we need to delete it. } else { lReturn = ERROR_NOT_ENOUGH_MEMORY; goto exit; } } else { pszSubKey = (LPTSTR)pszKey; } // // Now open the key, check for values and subkeys, and then delete // the key if it is appropriate. // if (ERROR_SUCCESS == RegOpenKeyEx(hBaseKey, pszSubKey, 0, KEY_ALL_ACCESS, &hKey)) { if (ERROR_SUCCESS == RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, NULL, NULL, &dwValues, NULL, NULL, NULL, NULL)) { if ((0 == dwSubKeys) && (bIgnoreValues || (0 == dwValues))) { lReturn = RegDeleteKey(hBaseKey, pszSubKey); goto exit; } else { lReturn = ERROR_FILE_EXISTS; goto exit; } } } lReturn = ERROR_FILE_NOT_FOUND; } exit: if (hKey) { RegCloseKey(hKey); } if (bFreePszSubKey) { CmFree(pszSubKey); } return lReturn; }