NtOpenKey modified to correctly behave when wrong input params are given (according to WINE tests). Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c _____
Modified: trunk/reactos/ntoskrnl/cm/ntfunc.c --- trunk/reactos/ntoskrnl/cm/ntfunc.c 2005-05-04 13:28:34 UTC (rev 14967) +++ trunk/reactos/ntoskrnl/cm/ntfunc.c 2005-05-04 15:27:05 UTC (rev 14968) @@ -1115,6 +1115,10 @@
ObjectAttributes, ObjectAttributes ? ObjectAttributes->ObjectName : NULL);
+ /* Check place for result handle, if it's null - return immediately */ + if (KeyHandle == NULL) + return(STATUS_INVALID_PARAMETER); + PreviousMode = ExGetPreviousMode();
if(PreviousMode != KernelMode) @@ -1137,6 +1141,10 @@ } }
+ /* WINE checks for the length also */ + /*if (ObjectAttributes->ObjectName->Length > MAX_NAME_LENGTH) + return(STATUS_BUFFER_OVERFLOW);*/ + RemainingPath.Buffer = NULL; Status = ObFindObject(ObjectAttributes, &Object, @@ -1144,7 +1152,10 @@ CmiKeyType); if (!NT_SUCCESS(Status)) { - return(Status); + DPRINT("ObFindObject() returned 0x%08lx\n", Status); + Status = STATUS_INVALID_HANDLE; /* Because ObFindObject returns STATUS_UNSUCCESSFUL */ + hKey = *KeyHandle; /* Preserve hkResult value */ + goto openkey_cleanup; }
VERIFY_KEY_OBJECT((PKEY_OBJECT) Object); @@ -1155,7 +1166,9 @@ { ObDereferenceObject(Object); RtlFreeUnicodeString(&RemainingPath); - return STATUS_OBJECT_NAME_NOT_FOUND; + Status = STATUS_OBJECT_NAME_NOT_FOUND; + hKey = NULL; + goto openkey_cleanup; }
RtlFreeUnicodeString(&RemainingPath); @@ -1164,7 +1177,9 @@ if (((PKEY_OBJECT)Object)->Flags & KO_MARKED_FOR_DELETE) { ObDereferenceObject(Object); - return(STATUS_UNSUCCESSFUL); + Status = STATUS_UNSUCCESSFUL; + hKey = NULL; + goto openkey_cleanup; }
Status = ObCreateHandle(PsGetCurrentProcess(), @@ -1175,10 +1190,9 @@ ObDereferenceObject(Object);
if (!NT_SUCCESS(Status)) - { - return(Status); - } + hKey = NULL;
+openkey_cleanup: _SEH_TRY { *KeyHandle = hKey;