mirror of
https://github.com/reactos/reactos.git
synced 2025-01-07 14:51:00 +00:00
[ADVAPI32]
* Implement and export RegDeleteKeyEx{A,W} (Thanks Alex). svn path=/trunk/; revision=57069
This commit is contained in:
parent
02f891a26d
commit
d73b1daf7f
2 changed files with 113 additions and 8 deletions
|
@ -479,8 +479,8 @@
|
|||
@ stdcall RegCreateKeyExW(long wstr long ptr long long ptr ptr ptr)
|
||||
@ stdcall RegCreateKeyW(long wstr ptr)
|
||||
@ stdcall RegDeleteKeyA(long str)
|
||||
;@ stdcall RegDeleteKeyExA(long str long long)
|
||||
;@ stdcall RegDeleteKeyExW(long wstr long long)
|
||||
@ stdcall RegDeleteKeyExA(long str long long)
|
||||
@ stdcall RegDeleteKeyExW(long wstr long long)
|
||||
@ stdcall RegDeleteKeyW(long wstr)
|
||||
@ stdcall RegDeleteKeyValueA(ptr str str)
|
||||
@ stdcall RegDeleteKeyValueW(ptr wstr wstr)
|
||||
|
|
|
@ -1317,7 +1317,7 @@ Cleanup:
|
|||
/************************************************************************
|
||||
* RegDeleteKeyExA
|
||||
*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
LONG
|
||||
WINAPI
|
||||
|
@ -1326,15 +1326,68 @@ RegDeleteKeyExA(HKEY hKey,
|
|||
REGSAM samDesired,
|
||||
DWORD Reserved)
|
||||
{
|
||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
UNICODE_STRING SubKeyName;
|
||||
HANDLE ParentKey;
|
||||
HANDLE TargetKey;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Make sure we got a subkey */
|
||||
if (!lpSubKey)
|
||||
{
|
||||
/* Fail */
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = MapDefaultKey(&ParentKey,
|
||||
hKey);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return RtlNtStatusToDosError(Status);
|
||||
}
|
||||
|
||||
if (samDesired & KEY_WOW64_32KEY)
|
||||
ERR("Wow64 not yet supported!\n");
|
||||
|
||||
if (samDesired & KEY_WOW64_64KEY)
|
||||
ERR("Wow64 not yet supported!\n");
|
||||
|
||||
RtlCreateUnicodeStringFromAsciiz(&SubKeyName,
|
||||
(LPSTR)lpSubKey);
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&SubKeyName,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
ParentKey,
|
||||
NULL);
|
||||
|
||||
Status = NtOpenKey(&TargetKey,
|
||||
DELETE,
|
||||
&ObjectAttributes);
|
||||
RtlFreeUnicodeString(&SubKeyName);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
goto Cleanup;
|
||||
}
|
||||
|
||||
Status = NtDeleteKey(TargetKey);
|
||||
NtClose (TargetKey);
|
||||
|
||||
Cleanup:
|
||||
ClosePredefKey(ParentKey);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return RtlNtStatusToDosError(Status);
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* RegDeleteKeyExW
|
||||
*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
LONG
|
||||
WINAPI
|
||||
|
@ -1343,8 +1396,60 @@ RegDeleteKeyExW(HKEY hKey,
|
|||
REGSAM samDesired,
|
||||
DWORD Reserved)
|
||||
{
|
||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
UNICODE_STRING SubKeyName;
|
||||
HANDLE ParentKey;
|
||||
HANDLE TargetKey;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Make sure we got a subkey */
|
||||
if (!lpSubKey)
|
||||
{
|
||||
/* Fail */
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = MapDefaultKey(&ParentKey,
|
||||
hKey);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return RtlNtStatusToDosError(Status);
|
||||
}
|
||||
|
||||
if (samDesired & KEY_WOW64_32KEY)
|
||||
ERR("Wow64 not yet supported!\n");
|
||||
|
||||
if (samDesired & KEY_WOW64_64KEY)
|
||||
ERR("Wow64 not yet supported!\n");
|
||||
|
||||
|
||||
RtlInitUnicodeString(&SubKeyName,
|
||||
(LPWSTR)lpSubKey);
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&SubKeyName,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
ParentKey,
|
||||
NULL);
|
||||
Status = NtOpenKey(&TargetKey,
|
||||
DELETE,
|
||||
&ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
goto Cleanup;
|
||||
}
|
||||
|
||||
Status = NtDeleteKey(TargetKey);
|
||||
NtClose(TargetKey);
|
||||
|
||||
Cleanup:
|
||||
ClosePredefKey(ParentKey);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return RtlNtStatusToDosError(Status);
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue