implemented RegDisablePredefinedCacheEx() Modified: trunk/reactos/lib/advapi32/advapi32.def Modified: trunk/reactos/lib/advapi32/reg/reg.c _____
Modified: trunk/reactos/lib/advapi32/advapi32.def --- trunk/reactos/lib/advapi32/advapi32.def 2005-08-25 23:54:39 UTC (rev 17553) +++ trunk/reactos/lib/advapi32/advapi32.def 2005-08-26 09:40:37 UTC (rev 17554) @@ -483,6 +483,7 @@
RegDeleteValueA@8 RegDeleteValueW@8 ;RegDisablePredefinedCache +RegDisablePredefinedCacheEx@0 RegEnumKeyA@16 RegEnumKeyExA@32 RegEnumKeyExW@32 _____
Modified: trunk/reactos/lib/advapi32/reg/reg.c --- trunk/reactos/lib/advapi32/reg/reg.c 2005-08-25 23:54:39 UTC (rev 17553) +++ trunk/reactos/lib/advapi32/reg/reg.c 2005-08-26 09:40:37 UTC (rev 17554) @@ -31,11 +31,16 @@
static RTL_CRITICAL_SECTION HandleTableCS; static HANDLE DefaultHandleTable[MAX_DEFAULT_HANDLES]; static HANDLE ProcessHeap; +static BOOLEAN DefaultHandlesDisabled = FALSE;
/* PROTOTYPES ***************************************************************/
static NTSTATUS MapDefaultKey (PHANDLE ParentKey, HKEY Key); static VOID CloseDefaultKeys(VOID); +#define CloseDefaultKey(Handle) \ + if ((ULONG_PTR)Handle & 0x1) { \ + NtClose(Handle); \ + }
static NTSTATUS OpenClassesRootKey(PHANDLE KeyHandle); static NTSTATUS OpenLocalMachineKey (PHANDLE KeyHandle); @@ -83,18 +88,19 @@
static NTSTATUS -MapDefaultKey (PHANDLE RealKey, - HKEY Key) +MapDefaultKey (OUT PHANDLE RealKey, + IN HKEY Key) { PHANDLE Handle; ULONG Index; + BOOLEAN DoOpen; NTSTATUS Status = STATUS_SUCCESS;
TRACE("MapDefaultKey (Key %x)\n", Key);
if (((ULONG)Key & 0xF0000000) != 0x80000000) { - *RealKey = (HANDLE)Key; + *RealKey = (HANDLE)((ULONG_PTR)Key & ~0x1); return STATUS_SUCCESS; }
@@ -106,9 +112,20 @@ }
RtlEnterCriticalSection (&HandleTableCS); - Handle = &DefaultHandleTable[Index]; - if (*Handle == NULL) + + if (!DefaultHandlesDisabled) { + Handle = &DefaultHandleTable[Index]; + DoOpen = (*Handle == NULL); + } + else + { + Handle = RealKey; + DoOpen = TRUE; + } + + if (DoOpen) + { /* create/open the default handle */ switch (Index) { @@ -144,14 +161,19 @@ default: WARN("MapDefaultHandle() no handle creator\n"); Status = STATUS_INVALID_PARAMETER; + break; } } - RtlLeaveCriticalSection (&HandleTableCS);
- if (NT_SUCCESS(Status)) - { - *RealKey = *Handle; - } + if (NT_SUCCESS(Status)) + { + if (!DefaultHandlesDisabled) + *RealKey = *Handle; + else + *(PULONG_PTR)Handle |= 0x1; + } + + RtlLeaveCriticalSection (&HandleTableCS);
return Status; } @@ -257,6 +279,21 @@
/*********************************************************************** * + * RegDisablePredefinedCacheEx + * + * @implemented + */ +LONG STDCALL +RegDisablePredefinedCacheEx(VOID) +{ + RtlEnterCriticalSection (&HandleTableCS); + DefaultHandlesDisabled = TRUE; + RtlLeaveCriticalSection (&HandleTableCS); + return ERROR_SUCCESS; +} + + +/********************************************************************** ** * RegCloseKey * * @implemented @@ -307,7 +344,7 @@ IN LPCWSTR lpSubKey OPTIONAL, IN HKEY hKeyDest) { - HANDLE DestKeyHandle, KeyHandle, SubKeyHandle = NULL; + HANDLE DestKeyHandle, KeyHandle, CurKey, SubKeyHandle = NULL; NTSTATUS Status;
Status = MapDefaultKey(&KeyHandle, @@ -321,7 +358,7 @@ hKeyDest); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError(Status); + goto Cleanup2; }
if (lpSubKey != NULL) @@ -343,9 +380,13 @@ &ObjectAttributes); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError(Status); + goto Cleanup; } + + CurKey = SubKeyHandle; } + else + CurKey = KeyHandle;
/* FIXME - copy all keys and values recursively */ Status = STATUS_NOT_IMPLEMENTED; @@ -355,6 +396,11 @@ NtClose(SubKeyHandle); }
+Cleanup: + CloseDefaultKey(DestKeyHandle); +Cleanup2: + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError(Status); @@ -549,7 +595,7 @@
/* get the real parent key */ Status = MapDefaultKey (&ParentKey, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -581,6 +627,8 @@ RtlFreeUnicodeString (&ClassString); }
+ CloseDefaultKey(ParentKey); + TRACE("Status %x\n", Status); if (!NT_SUCCESS(Status)) { @@ -617,7 +665,7 @@
/* get the real parent key */ Status = MapDefaultKey (&ParentKey, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError(Status); @@ -639,6 +687,9 @@ dwOptions, samDesired, lpdwDisposition); + + CloseDefaultKey(ParentKey); + TRACE("Status %x\n", Status); if (!NT_SUCCESS(Status)) { @@ -709,7 +760,7 @@ NTSTATUS Status;
Status = MapDefaultKey (&ParentKey, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -729,11 +780,15 @@ RtlFreeUnicodeString (&SubKeyName); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + goto Cleanup; }
Status = NtDeleteKey (TargetKey); NtClose (TargetKey); + +Cleanup: + CloseDefaultKey(ParentKey); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError(Status); @@ -759,7 +814,7 @@ NTSTATUS Status;
Status = MapDefaultKey (&ParentKey, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -777,11 +832,15 @@ &ObjectAttributes); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + goto Cleanup; }
Status = NtDeleteKey (TargetKey); NtClose (TargetKey); + +Cleanup: + CloseDefaultKey(ParentKey); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -802,7 +861,7 @@ IN LPCWSTR lpValueName OPTIONAL) { UNICODE_STRING ValueName; - HANDLE KeyHandle, SubKeyHandle = NULL; + HANDLE KeyHandle, CurKey, SubKeyHandle = NULL; NTSTATUS Status;
Status = MapDefaultKey(&KeyHandle, @@ -831,22 +890,27 @@ &ObjectAttributes); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError(Status); + goto Cleanup; }
- KeyHandle = SubKeyHandle; + CurKey = SubKeyHandle; } + else + CurKey = KeyHandle;
RtlInitUnicodeString(&ValueName, (LPWSTR)lpValueName);
- Status = NtDeleteValueKey(KeyHandle, + Status = NtDeleteValueKey(CurKey, &ValueName);
if (SubKeyHandle != NULL) { NtClose(SubKeyHandle); } + +Cleanup: + CloseDefaultKey(KeyHandle);
if (!NT_SUCCESS(Status)) { @@ -915,7 +979,7 @@ RegDeleteTreeW(IN HKEY hKey, IN LPCWSTR lpSubKey OPTIONAL) { - HANDLE KeyHandle, SubKeyHandle = NULL; + HANDLE KeyHandle, CurKey, SubKeyHandle = NULL; NTSTATUS Status;
Status = MapDefaultKey(&KeyHandle, @@ -944,11 +1008,13 @@ &ObjectAttributes); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError(Status); + goto Cleanup; }
- KeyHandle = SubKeyHandle; + CurKey = SubKeyHandle; } + else + CurKey = KeyHandle;
/* FIXME - delete all keys recursively */ Status = STATUS_NOT_IMPLEMENTED; @@ -958,6 +1024,9 @@ NtClose(SubKeyHandle); }
+Cleanup: + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError(Status); @@ -1013,7 +1082,7 @@ IN LPCVOID lpData OPTIONAL, IN DWORD cbData) { - HANDLE KeyHandle, SubKeyHandle = NULL; + HANDLE KeyHandle, CurKey, SubKeyHandle = NULL; NTSTATUS Status; LONG Ret;
@@ -1043,13 +1112,16 @@ &ObjectAttributes); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError(Status); + Ret = RtlNtStatusToDosError(Status); + goto Cleanup; }
- KeyHandle = SubKeyHandle; + CurKey = SubKeyHandle; } + else + CurKey = KeyHandle;
- Ret = RegSetValueExW(KeyHandle, + Ret = RegSetValueExW(CurKey, lpValueName, 0, dwType, @@ -1060,6 +1132,9 @@ { NtClose(SubKeyHandle); } + +Cleanup: + CloseDefaultKey(KeyHandle);
return Ret; } @@ -1078,7 +1153,7 @@ IN LPCVOID lpData OPTIONAL, IN DWORD cbData) { - HANDLE KeyHandle, SubKeyHandle = NULL; + HANDLE KeyHandle, CurKey, SubKeyHandle = NULL; NTSTATUS Status; LONG Ret;
@@ -1097,7 +1172,8 @@ if (!RtlCreateUnicodeStringFromAsciiz(&SubKeyName, (LPSTR)lpSubKey)) { - return ERROR_NOT_ENOUGH_MEMORY; + Ret = ERROR_NOT_ENOUGH_MEMORY; + goto Cleanup; }
InitializeObjectAttributes(&ObjectAttributes, @@ -1114,13 +1190,16 @@
if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError(Status); + Ret = RtlNtStatusToDosError(Status); + goto Cleanup; }
- KeyHandle = SubKeyHandle; + CurKey = SubKeyHandle; } + else + CurKey = KeyHandle;
- Ret = RegSetValueExA(KeyHandle, + Ret = RegSetValueExA(CurKey, lpValueName, 0, dwType, @@ -1131,6 +1210,9 @@ { NtClose(SubKeyHandle); } + +Cleanup: + CloseDefaultKey(KeyHandle);
return Ret; } @@ -1150,7 +1232,7 @@ NTSTATUS Status;
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -1161,6 +1243,9 @@ Status = NtDeleteValueKey (KeyHandle, &ValueName); RtlFreeUnicodeString (&ValueName); + + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -1184,7 +1269,7 @@ HANDLE KeyHandle;
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -1195,6 +1280,9 @@
Status = NtDeleteValueKey (KeyHandle, &ValueName); + + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -1330,7 +1418,8 @@ KeyInfo = RtlAllocateHeap (ProcessHeap, 0, BufferSize); if (KeyInfo == NULL) { - return ERROR_OUTOFMEMORY; + ErrorCode = ERROR_OUTOFMEMORY; + goto Cleanup; }
Status = NtEnumerateKey (KeyHandle, @@ -1416,7 +1505,10 @@ 0, KeyInfo);
- return ErrorCode; +Cleanup: + CloseDefaultKey(KeyHandle); + + return ErrorCode; }
@@ -1450,7 +1542,7 @@ NTSTATUS Status;
Status = MapDefaultKey(&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -1488,7 +1580,8 @@ BufferSize); if (KeyInfo == NULL) { - return ERROR_OUTOFMEMORY; + ErrorCode = ERROR_OUTOFMEMORY; + goto Cleanup; }
Status = NtEnumerateKey (KeyHandle, @@ -1560,6 +1653,9 @@ 0, KeyInfo);
+Cleanup: + CloseDefaultKey(KeyHandle); + return ErrorCode; }
@@ -1607,7 +1703,10 @@ { if (buf_ptr != buffer) HeapFree( GetProcessHeap(), 0, buf_ptr ); if (!(buf_ptr = HeapAlloc( GetProcessHeap(), 0, total_size ))) - return ERROR_NOT_ENOUGH_MEMORY; + { + status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } info = (KEY_VALUE_FULL_INFORMATION *)buf_ptr; status = NtEnumerateValueKey( KeyHandle, index, KeyValueFullInformation, buf_ptr, total_size, &total_size ); @@ -1670,6 +1769,7 @@
done: if (buf_ptr != buffer) HeapFree( GetProcessHeap(), 0, buf_ptr ); + CloseDefaultKey(KeyHandle); return RtlNtStatusToDosError(status); }
@@ -1729,7 +1829,10 @@ { if (buf_ptr != buffer) HeapFree( GetProcessHeap(), 0, buf_ptr ); if (!(buf_ptr = HeapAlloc( GetProcessHeap(), 0, total_size ))) - return ERROR_NOT_ENOUGH_MEMORY; + { + status = ERROR_NOT_ENOUGH_MEMORY; + goto done; + } info = (KEY_VALUE_FULL_INFORMATION *)buf_ptr; status = NtEnumerateValueKey( KeyHandle, index, KeyValueFullInformation, buf_ptr, total_size, &total_size ); @@ -1774,6 +1877,7 @@
done: if (buf_ptr != buffer) HeapFree( GetProcessHeap(), 0, buf_ptr ); + CloseDefaultKey(KeyHandle); return RtlNtStatusToDosError(status); }
@@ -1794,13 +1898,16 @@ }
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); }
Status = NtFlushKey (KeyHandle); + + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -1830,7 +1937,7 @@ }
Status = MapDefaultKey(&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { TRACE("MapDefaultKey() failed (Status %lx)\n", Status); @@ -1842,6 +1949,9 @@ pSecurityDescriptor, *lpcbSecurityDescriptor, lpcbSecurityDescriptor); + + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { WARN("NtQuerySecurityObject() failed (Status %lx)\n", Status); @@ -1898,6 +2008,7 @@ UNICODE_STRING KeyName; HANDLE KeyHandle; NTSTATUS Status; + LONG ErrorCode = ERROR_SUCCESS;
if (hKey == HKEY_PERFORMANCE_DATA) { @@ -1905,7 +2016,7 @@ }
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -1916,7 +2027,8 @@ NULL, NULL)) { - return ERROR_BAD_PATHNAME; + ErrorCode = ERROR_BAD_PATHNAME; + goto Cleanup; }
InitializeObjectAttributes (&FileObjectAttributes, @@ -1941,10 +2053,14 @@
if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + ErrorCode = RtlNtStatusToDosError (Status); + goto Cleanup; }
- return ERROR_SUCCESS; +Cleanup: + CloseDefaultKey(KeyHandle); + + return ErrorCode; }
@@ -1963,6 +2079,7 @@ IO_STATUS_BLOCK IoStatusBlock; HANDLE KeyHandle; NTSTATUS Status; + LONG ErrorCode = ERROR_SUCCESS;
if (hKey == HKEY_PERFORMANCE_DATA) { @@ -1975,7 +2092,7 @@ }
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -1995,10 +2112,12 @@ fAsynchronous); if (!NT_SUCCESS(Status) && Status != STATUS_TIMEOUT) { - return RtlNtStatusToDosError (Status); + ErrorCode = RtlNtStatusToDosError (Status); }
- return ERROR_SUCCESS; + CloseDefaultKey(KeyHandle); + + return ErrorCode; }
@@ -2090,6 +2209,7 @@ UNICODE_STRING SubKeyString; HANDLE KeyHandle; NTSTATUS Status; + LONG ErrorCode = ERROR_SUCCESS;
TRACE("RegOpenKeyExA hKey 0x%x lpSubKey %s ulOptions 0x%x samDesired 0x%x phkResult %p\n", hKey, lpSubKey, ulOptions, samDesired, phkResult); @@ -2111,10 +2231,12 @@ RtlFreeUnicodeString (&SubKeyString); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + ErrorCode = RtlNtStatusToDosError (Status); } + + CloseDefaultKey(KeyHandle);
- return ERROR_SUCCESS; + return ErrorCode; }
@@ -2134,6 +2256,7 @@ UNICODE_STRING SubKeyString; HANDLE KeyHandle; NTSTATUS Status; + LONG ErrorCode = ERROR_SUCCESS;
TRACE("RegOpenKeyExW hKey 0x%x lpSubKey %S ulOptions 0x%x samDesired 0x%x phkResult %p\n", hKey, lpSubKey, ulOptions, samDesired, phkResult); @@ -2159,10 +2282,12 @@
if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + ErrorCode = RtlNtStatusToDosError (Status); } + + CloseDefaultKey(KeyHandle);
- return ERROR_SUCCESS; + return ErrorCode; }
@@ -2430,7 +2555,8 @@ FullInfoSize); if (FullInfo == NULL) { - return ERROR_OUTOFMEMORY; + ErrorCode = ERROR_OUTOFMEMORY; + goto Cleanup; }
FullInfo->ClassLength = ClassLength; @@ -2458,7 +2584,8 @@ FullInfo); }
- return RtlNtStatusToDosError (Status); + ErrorCode = RtlNtStatusToDosError (Status); + goto Cleanup; }
TRACE("SubKeys %d\n", FullInfo->SubKeys); @@ -2515,7 +2642,8 @@ FullInfo); }
- return RtlNtStatusToDosError (Status); + ErrorCode = RtlNtStatusToDosError (Status); + goto Cleanup; } }
@@ -2545,6 +2673,9 @@ FullInfo); }
+Cleanup: + CloseDefaultKey(KeyHandle); + return ErrorCode; }
@@ -2711,7 +2842,8 @@
if (lpData != NULL && lpcbData == NULL) { - return ERROR_INVALID_PARAMETER; + ErrorCode = ERROR_INVALID_PARAMETER; + goto Cleanup; }
RtlInitUnicodeString (&ValueName, @@ -2722,7 +2854,8 @@ BufferSize); if (ValueInfo == NULL) { - return ERROR_OUTOFMEMORY; + ErrorCode = ERROR_OUTOFMEMORY; + goto Cleanup; }
Status = NtQueryValueKey (KeyHandle, @@ -2790,6 +2923,9 @@ 0, ValueInfo);
+Cleanup: + CloseDefaultKey(KeyHandle); + return ErrorCode; }
@@ -3013,7 +3149,7 @@ hKey, lpSubKey, lpValue, lpcbValue ? *lpcbValue : 0);
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3034,7 +3170,8 @@ &ObjectAttributes); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + ErrorCode = RtlNtStatusToDosError (Status); + goto Cleanup; } CloseRealKey = TRUE; } @@ -3055,6 +3192,9 @@ NtClose (RealKey); }
+Cleanup: + CloseDefaultKey(KeyHandle); + return ErrorCode; }
@@ -3116,6 +3256,7 @@ HANDLE RealKeyHandle; HANDLE KeyHandle; NTSTATUS Status; + LONG ErrorCode = ERROR_SUCCESS;
if (hKey == HKEY_PERFORMANCE_DATA) { @@ -3123,7 +3264,7 @@ }
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3144,7 +3285,8 @@ &KeyObjectAttributes); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + ErrorCode = RtlNtStatusToDosError (Status); + goto Cleanup; } CloseRealKey = TRUE; } @@ -3164,7 +3306,8 @@ { NtClose (RealKeyHandle); } - return ERROR_INVALID_PARAMETER; + ErrorCode = ERROR_INVALID_PARAMETER; + goto Cleanup; }
InitializeObjectAttributes (&NewObjectAttributes, @@ -3184,7 +3327,8 @@ { NtClose (RealKeyHandle); } - return ERROR_INVALID_PARAMETER; + ErrorCode = ERROR_INVALID_PARAMETER; + goto Cleanup; }
InitializeObjectAttributes (&OldObjectAttributes, @@ -3210,7 +3354,10 @@ return RtlNtStatusToDosError (Status); }
- return ERROR_SUCCESS; +Cleanup: + CloseDefaultKey(KeyHandle); + + return ErrorCode; }
@@ -3263,7 +3410,7 @@ }
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3274,7 +3421,8 @@ NULL, NULL)) { - return ERROR_INVALID_PARAMETER; + Status = STATUS_INVALID_PARAMETER; + goto Cleanup; }
InitializeObjectAttributes (&ObjectAttributes, @@ -3292,13 +3440,17 @@ RtlFreeUnicodeString (&FileName); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + goto Cleanup; }
Status = NtRestoreKey (KeyHandle, FileHandle, (ULONG)dwFlags); NtClose (FileHandle); + +Cleanup: + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3351,7 +3503,7 @@ NTSTATUS Status;
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3362,7 +3514,8 @@ NULL, NULL)) { - return ERROR_INVALID_PARAMETER; + Status = STATUS_INVALID_PARAMETER; + goto Cleanup; }
if (lpSecurityAttributes != NULL) @@ -3389,12 +3542,16 @@ RtlFreeUnicodeString (&FileName); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + goto Cleanup; }
Status = NtSaveKey (KeyHandle, FileHandle); NtClose (FileHandle); + +Cleanup: + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3423,7 +3580,7 @@ }
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3432,6 +3589,9 @@ Status = NtSetSecurityObject (KeyHandle, SecurityInformation, pSecurityDescriptor); + + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3547,7 +3707,7 @@ NTSTATUS Status;
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3579,6 +3739,9 @@ dwType, (PVOID)lpData, (ULONG)cbData); + + CloseDefaultKey(KeyHandle); + if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3659,7 +3822,7 @@ LONG ErrorCode;
Status = MapDefaultKey (&KeyHandle, - hKey); + hKey); if (!NT_SUCCESS(Status)) { return RtlNtStatusToDosError (Status); @@ -3679,7 +3842,8 @@ &ObjectAttributes); if (!NT_SUCCESS(Status)) { - return RtlNtStatusToDosError (Status); + ErrorCode = RtlNtStatusToDosError (Status); + goto Cleanup; } CloseRealKey = TRUE; [truncated at 1000 lines; 20 more skipped]