/*++ Copyright (c) 1991 Microsoft Corporation Module Name: Regdval.c Abstract: This module contains the server side implementation for the Win32 Registry API to delete values from keys. That is: - BaseRegDeleteValue Author: David J. Gilman (davegi) 15-Nov-1991 Notes: See the Notes in Regkey.c. --*/ #include #include "regrpc.h" #include "localreg.h" #ifdef LOCAL #include "tsappcmp.h" #include "regclass.h" #endif error_status_t BaseRegDeleteValue ( HKEY hKey, PUNICODE_STRING lpValueName ) /*++ Routine Description: Remove the named value from the specified key. Arguments: hKey - Supplies a handle to the open key. lpValueName - Supplies the name of the value to remove. lpValueName may be NULL. Return Value: Returns ERROR_SUCCESS (0) for success; error-code for failure. Notes: hKey must have been opened for KEY_SET_VALUE. --*/ { HKEY hkDelete; NTSTATUS Status; #ifdef LOCAL HKEY hkUserClasses; HKEY hkMachineClasses; hkUserClasses = NULL; hkMachineClasses = NULL; #endif //LOCAL // // Check for malformed arguments from malicious clients // if( (lpValueName == NULL) || (lpValueName->Length < sizeof(UNICODE_NULL)) || ((lpValueName->Length % sizeof(WCHAR)) != 0) ) { return(ERROR_INVALID_PARAMETER); } hkDelete = hKey; // // Subtract the NULL from the string length. This was added // by the client so that RPC would transmit the whole thing. // lpValueName->Length -= sizeof( UNICODE_NULL ); // // Call the Nt Api to delete the value, map the NTSTATUS code to a // Win32 Registry error code and return. // #ifdef LOCAL if (gpfnTermsrvDeleteValue) { // // Remove the value from the Terminal Server registry tracking database // gpfnTermsrvDeleteValue(hKey, lpValueName); } #endif #ifdef LOCAL if (REG_CLASS_IS_SPECIAL_KEY(hKey)) { Status = BaseRegGetUserAndMachineClass( NULL, hkDelete, MAXIMUM_ALLOWED, &hkMachineClasses, &hkUserClasses); if (!NT_SUCCESS(Status)) { return (error_status_t)RtlNtStatusToDosError(Status); } } if (hkUserClasses && hkMachineClasses) { hkDelete = hkUserClasses; } #endif Status = NtDeleteValueKey( hkDelete, lpValueName ); #ifdef LOCAL // // For class keys, try again with machine if there were // two keys of the same name // if (REG_CLASS_IS_SPECIAL_KEY(hKey)) { if ((STATUS_OBJECT_NAME_NOT_FOUND == Status) && (hkUserClasses && hkMachineClasses)) { Status = NtDeleteValueKey( hkMachineClasses, lpValueName ); } } if (hkUserClasses && hkMachineClasses) { if (hkUserClasses != hKey) { NtClose(hkUserClasses); } else { NtClose(hkMachineClasses); } } #endif // LOCAL return (error_status_t)RtlNtStatusToDosError(Status); }