Author: mturk Date: Fri Dec 11 07:26:49 2009 New Revision: 889520 URL: http://svn.apache.org/viewvc?rev=889520&view=rev Log: Apply the patch from Jesse Morris (DAEMON-131)
Modified: commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c commons/proper/daemon/trunk/src/native/nt/procrun/include/registry.h commons/proper/daemon/trunk/src/native/nt/procrun/src/registry.c Modified: commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c?rev=889520&r1=889519&r2=889520&view=diff ============================================================================== --- commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c (original) +++ commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c Fri Dec 11 07:26:49 2009 @@ -642,7 +642,7 @@ } if (rv) { /* Delete all service registry settings */ - apxDeleteRegistryW(PRG_REGROOT, lpCmdline->szApplication, TRUE); + apxDeleteRegistryW(PRG_REGROOT, lpCmdline->szApplication, KREG_WOW6432, TRUE); apxLogWrite(APXLOG_MARK_DEBUG "Service %S deleted", lpCmdline->szApplication); } Modified: commons/proper/daemon/trunk/src/native/nt/procrun/include/registry.h URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/nt/procrun/include/registry.h?rev=889520&r1=889519&r2=889520&view=diff ============================================================================== --- commons/proper/daemon/trunk/src/native/nt/procrun/include/registry.h (original) +++ commons/proper/daemon/trunk/src/native/nt/procrun/include/registry.h Fri Dec 11 07:26:49 2009 @@ -43,12 +43,13 @@ #endif /** Delete the process registry keys + * samDesired only needs to be KREG_WOW6432 or 0 */ BOOL apxDeleteRegistryA(LPCSTR szRoot, LPCSTR szKeyName, - BOOL bDeleteEmpty); + REGSAM samDesired, BOOL bDeleteEmptyRoot); BOOL apxDeleteRegistryW(LPCWSTR szRoot, LPCWSTR szKeyName, - BOOL bDeleteEmpty); + REGSAM samDesired, BOOL bDeleteEmptyRoot); #ifdef _UNICODE #define apxDeleteRegistry apxDeleteRegistryW Modified: commons/proper/daemon/trunk/src/native/nt/procrun/src/registry.c URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/nt/procrun/src/registry.c?rev=889520&r1=889519&r2=889520&view=diff ============================================================================== --- commons/proper/daemon/trunk/src/native/nt/procrun/src/registry.c (original) +++ commons/proper/daemon/trunk/src/native/nt/procrun/src/registry.c Fri Dec 11 07:26:49 2009 @@ -815,39 +815,86 @@ } +LONG apxDeleteRegistryRecursive(HKEY hKeyRoot, LPCWSTR szSubKey) { + LONG rc = ERROR_SUCCESS; + DWORD dwSize = 0; + WCHAR szName[SIZ_BUFLEN]; + HKEY hKey = NULL; + + if (ERROR_SUCCESS == RegDeleteKey(hKeyRoot, szSubKey)) { + return ERROR_SUCCESS; + } + + rc = RegOpenKeyExW(hKeyRoot, szSubKey, 0, KEY_ENUMERATE_SUB_KEYS | DELETE, &hKey); + if (rc != ERROR_SUCCESS) { + if (rc == ERROR_FILE_NOT_FOUND) { + return ERROR_SUCCESS; + } else { + return rc; + } + } + while (rc == ERROR_SUCCESS) { + dwSize = SIZ_BUFLEN; + rc = RegEnumKeyExW(hKey, 0, szName, &dwSize, NULL, NULL, NULL, NULL ); + + if (rc == ERROR_NO_MORE_ITEMS) { + rc = RegDeleteKeyW(hKeyRoot, szSubKey); + break; + } else { + rc = apxDeleteRegistryRecursive(hKey, szName); + if (rc != ERROR_SUCCESS) { + break; // abort when we start failing + } + } + } + RegCloseKey(hKey); + return rc; +} + + BOOL apxDeleteRegistryW(LPCWSTR szRoot, LPCWSTR szKeyName, - BOOL bDeleteEmpty) + REGSAM samDesired, + BOOL bDeleteEmptyRoot) { WCHAR buff[SIZ_BUFLEN]; - BOOL rv; + LONG rc = ERROR_SUCCESS; + HKEY hKey = NULL; + BOOL rv = TRUE; + HKEY hives[] = {HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, NULL}, *hive = NULL; if (!szKeyName || lstrlenW(szKeyName) > SIZ_RESMAX) return FALSE; if (szRoot && lstrlenW(szRoot) > SIZ_RESMAX) return FALSE; - lstrcpyW(buff, REGSOFTWARE_ROOT); if (szRoot) - lstrcatW(buff, szRoot); + lstrcpyW(buff, szRoot); else - lstrcatW(buff, REGAPACHE_ROOT); + lstrcpyW(buff, REGAPACHE_ROOT); lstrcatW(buff, REGSEPARATOR); - lstrcatW(buff, szKeyName); - - rv = SHDeleteKeyW(HKEY_LOCAL_MACHINE, buff); - rv += SHDeleteKeyW(HKEY_CURRENT_USER, buff); - if (bDeleteEmpty) { - lstrcpyW(buff, REGSOFTWARE_ROOT); - if (szRoot) - lstrcatW(buff, szRoot); - else - lstrcatW(buff, REGAPACHE_ROOT); + for (hive = &hives[0]; *hive; hive++) { + HKEY hkeySoftware = NULL; - SHDeleteEmptyKeyW(HKEY_LOCAL_MACHINE, buff); - SHDeleteEmptyKeyW(HKEY_CURRENT_USER, buff); + rc = RegOpenKeyExW(*hive, REGSOFTWARE_ROOT, 0, KEY_READ | samDesired, &hkeySoftware); + if (rc != ERROR_SUCCESS) { + rv = FALSE; + } else { + rc = RegOpenKeyExW(hkeySoftware, buff, 0, samDesired | KEY_ENUMERATE_SUB_KEYS | DELETE, &hKey); + if (rc == ERROR_SUCCESS) { + rc = apxDeleteRegistryRecursive(hKey, szKeyName); + RegCloseKey(hKey); + hKey = NULL; + rv |= (rc == ERROR_SUCCESS); + } + if (bDeleteEmptyRoot) { + // will fail if there are subkeys, just like we want + RegDeleteKeyW(hkeySoftware, buff); + } + RegCloseKey(hkeySoftware); + } } return rv; } @@ -855,7 +902,8 @@ BOOL apxDeleteRegistryA(LPCSTR szRoot, LPCSTR szKeyName, - BOOL bDeleteEmpty) + REGSAM samDesired, + BOOL bDeleteEmptyRoot) { WCHAR wcRoot[SIZ_RESLEN]; WCHAR wcKey[SIZ_RESLEN]; @@ -866,7 +914,7 @@ } AsciiToWide(szKeyName, wcKey); - return apxDeleteRegistryW(wsRoot, wcKey, bDeleteEmpty); + return apxDeleteRegistryW(wsRoot, wcKey, samDesired, bDeleteEmptyRoot); }