| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #pragma once
- #include <windows.h>
- #include <stdio.h>
- #include <strsafe.h>
- // Stolen from the "Deleting a Key with Subkeys" example to replace
- // RegDeleteTree which isn't available on WinXP.
- // https://msdn.microsoft.com/en-us/library/ms724235(VS.85).aspx
- //*************************************************************
- //
- // RegDelnodeRecurse()
- //
- // Purpose: Deletes a registry key and all its subkeys / values.
- //
- // Parameters: hKeyRoot - Root key
- // lpSubKey - SubKey to delete
- //
- // Return: TRUE if successful.
- // FALSE if an error occurs.
- //
- //*************************************************************
- HRESULT RegDelnodeRecurse(HKEY hKeyRoot, LPTSTR lpSubKey)
- {
- LPTSTR lpEnd;
- LONG lResult;
- DWORD dwSize;
- TCHAR szName[MAX_PATH];
- HKEY hKey;
- FILETIME ftWrite;
- // First, see if we can delete the key without having
- // to recurse.
- lResult = RegDeleteKey(hKeyRoot, lpSubKey);
- if (lResult == ERROR_SUCCESS)
- return lResult;
- lResult = RegOpenKeyEx(hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);
- if (lResult != ERROR_SUCCESS)
- return lResult;
- // Check for an ending slash and add one if it is missing.
- lpEnd = lpSubKey + lstrlen(lpSubKey);
- if (*(lpEnd - 1) != TEXT('\\'))
- {
- *lpEnd = TEXT('\\');
- lpEnd++;
- *lpEnd = TEXT('\0');
- }
- // Enumerate the keys
- dwSize = MAX_PATH;
- lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, nullptr,
- nullptr, nullptr, &ftWrite);
- if (lResult == ERROR_SUCCESS)
- {
- do {
- StringCchCopy(lpEnd, MAX_PATH * 2, szName);
- if (RegDelnodeRecurse(hKeyRoot, lpSubKey) != ERROR_SUCCESS) {
- break;
- }
- dwSize = MAX_PATH;
- lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, nullptr,
- nullptr, nullptr, &ftWrite);
- } while (lResult == ERROR_SUCCESS);
- }
- lpEnd--;
- *lpEnd = TEXT('\0');
- RegCloseKey(hKey);
- // Try again to delete the key.
- lResult = RegDeleteKey(hKeyRoot, lpSubKey);
- return lResult;
- }
- //*************************************************************
- //
- // RegDelnode()
- //
- // Purpose: Deletes a registry key and all its subkeys / values.
- //
- // Parameters: hKeyRoot - Root key
- // lpSubKey - SubKey to delete
- //
- // Return: TRUE if successful.
- // FALSE if an error occurs.
- //
- //*************************************************************
- HRESULT RegDelnode(HKEY hKeyRoot, LPTSTR lpSubKey)
- {
- TCHAR szDelKey[MAX_PATH * 2];
- StringCchCopy(szDelKey, MAX_PATH * 2, lpSubKey);
- return RegDelnodeRecurse(hKeyRoot, szDelKey);
- }
|