From bc8811f677767bffcb8f533876a24b7df1710bcf Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 24 Aug 2005 23:29:51 +0000 Subject: [PATCH] implemented RegDeleteKeyValueA/W() svn path=/trunk/; revision=17527 --- reactos/lib/advapi32/advapi32.def | 2 + reactos/lib/advapi32/reg/reg.c | 113 ++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/reactos/lib/advapi32/advapi32.def b/reactos/lib/advapi32/advapi32.def index 37c045c4ae3..ca9e885656a 100644 --- a/reactos/lib/advapi32/advapi32.def +++ b/reactos/lib/advapi32/advapi32.def @@ -473,6 +473,8 @@ RegCreateKeyExW@36 RegCreateKeyW@12 RegDeleteKeyA@8 RegDeleteKeyW@8 +RegDeleteKeyValueA@12 +RegDeleteKeyValueW@12 RegDeleteValueA@8 RegDeleteValueW@8 ;RegDisablePredefinedCache diff --git a/reactos/lib/advapi32/reg/reg.c b/reactos/lib/advapi32/reg/reg.c index 7aa9dbb8d42..a0b04f53ac3 100644 --- a/reactos/lib/advapi32/reg/reg.c +++ b/reactos/lib/advapi32/reg/reg.c @@ -689,6 +689,119 @@ RegDeleteKeyW (HKEY hKey, } +/************************************************************************ + * RegDeleteKeyValueW + * + * @implemented + */ +LONG STDCALL +RegDeleteKeyValueW(IN HKEY hKey, + IN LPCWSTR lpSubKey OPTIONAL, + IN LPCWSTR lpValueName OPTIONAL) +{ + UNICODE_STRING ValueName; + HANDLE KeyHandle, SubKeyHandle = NULL; + NTSTATUS Status; + + Status = MapDefaultKey(&KeyHandle, + hKey); + if (!NT_SUCCESS(Status)) + { + return RtlNtStatusToDosError(Status); + } + + if (lpSubKey != NULL) + { + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING SubKeyName; + + RtlInitUnicodeString(&SubKeyName, + (LPWSTR)lpSubKey); + + InitializeObjectAttributes(&ObjectAttributes, + &SubKeyName, + OBJ_CASE_INSENSITIVE, + KeyHandle, + NULL); + + Status = NtOpenKey(&SubKeyHandle, + KEY_SET_VALUE, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + return RtlNtStatusToDosError(Status); + } + } + + RtlInitUnicodeString(&ValueName, + (LPWSTR)lpValueName); + + Status = NtDeleteValueKey((SubKeyHandle != NULL) ? SubKeyHandle : KeyHandle, + &ValueName); + + if (SubKeyHandle != NULL) + { + NtClose(SubKeyHandle); + } + + if (!NT_SUCCESS(Status)) + { + return RtlNtStatusToDosError(Status); + } + + return ERROR_SUCCESS; +} + + +/************************************************************************ + * RegDeleteKeyValueA + * + * @implemented + */ +LONG STDCALL +RegDeleteKeyValueA(IN HKEY hKey, + IN LPCSTR lpSubKey OPTIONAL, + IN LPCSTR lpValueName OPTIONAL) +{ + UNICODE_STRING SubKey, ValueName; + LONG Ret; + + if (lpSubKey != NULL) + { + if (!RtlCreateUnicodeStringFromAsciiz(&SubKey, + (LPSTR)lpSubKey)) + { + return ERROR_NOT_ENOUGH_MEMORY; + } + } + else + RtlInitUnicodeString(&SubKey, + NULL); + + if (lpValueName != NULL) + { + if (!RtlCreateUnicodeStringFromAsciiz(&ValueName, + (LPSTR)lpValueName)) + { + RtlFreeUnicodeString(&SubKey); + return ERROR_NOT_ENOUGH_MEMORY; + } + } + else + RtlInitUnicodeString(&ValueName, + NULL); + + Ret = RegDeleteKeyValueW(hKey, + SubKey.Buffer, + SubKey.Buffer); + + RtlFreeUnicodeString(&SubKey); + RtlFreeUnicodeString(&ValueName); + + return Ret; +} + + /************************************************************************ * RegDeleteValueA * -- 2.17.1