mirror of
https://github.com/nextcloud/desktop.git
synced 2024-10-28 16:13:53 +03:00
115 lines
2.4 KiB
C
115 lines
2.4 KiB
C
|
#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, NULL,
|
||
|
NULL, NULL, &ftWrite);
|
||
|
|
||
|
if (lResult == ERROR_SUCCESS)
|
||
|
{
|
||
|
do {
|
||
|
|
||
|
StringCchCopy(lpEnd, MAX_PATH * 2, szName);
|
||
|
|
||
|
if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
dwSize = MAX_PATH;
|
||
|
|
||
|
lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
|
||
|
NULL, NULL, &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);
|
||
|
|
||
|
}
|