Author: ekohl
Date: Sat Jun 11 11:58:46 2011
New Revision: 52184
URL:
http://svn.reactos.org/svn/reactos?rev=52184&view=rev
Log:
[NTOSKRNL]
- Do not create/open the CurrentVersion key in a single call to NtCreateKey because its
parent key might not exist yet.
See issue #6302 for more details.
Modified:
trunk/reactos/ntoskrnl/config/cmsysini.c
Modified: trunk/reactos/ntoskrnl/config/cmsysini.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmsysini.c…
==============================================================================
--- trunk/reactos/ntoskrnl/config/cmsysini.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/config/cmsysini.c [iso-8859-1] Sat Jun 11 11:58:46 2011
@@ -1946,13 +1946,16 @@
UNICODE_STRING KeyName;
UNICODE_STRING ValueName;
UNICODE_STRING ValueData;
- HANDLE KeyHandle;
+ HANDLE SoftwareKeyHandle = NULL;
+ HANDLE MicrosoftKeyHandle = NULL;
+ HANDLE WindowsNtKeyHandle = NULL;
+ HANDLE CurrentVersionKeyHandle = NULL;
WCHAR Buffer[128];
NTSTATUS Status;
/* Open the 'CurrentVersion' key */
RtlInitUnicodeString(&KeyName,
- L"\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows
NT\\CurrentVersion");
+ L"\\REGISTRY\\MACHINE\\SOFTWARE");
InitializeObjectAttributes(&ObjectAttributes,
&KeyName,
@@ -1960,7 +1963,7 @@
NULL,
NULL);
- Status = NtCreateKey(&KeyHandle,
+ Status = NtCreateKey(&SoftwareKeyHandle,
KEY_CREATE_SUB_KEY,
&ObjectAttributes,
0,
@@ -1973,6 +1976,75 @@
return;
}
+ /* Open the 'CurrentVersion' key */
+ RtlInitUnicodeString(&KeyName,
+ L"Microsoft");
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ SoftwareKeyHandle,
+ NULL);
+
+ Status = NtCreateKey(&MicrosoftKeyHandle,
+ KEY_CREATE_SUB_KEY,
+ &ObjectAttributes,
+ 0,
+ NULL,
+ 0,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to create key %wZ (Status: %08lx)\n", &KeyName,
Status);
+ goto done;
+ }
+
+ /* Open the 'CurrentVersion' key */
+ RtlInitUnicodeString(&KeyName,
+ L"Windows NT");
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ MicrosoftKeyHandle,
+ NULL);
+
+ Status = NtCreateKey(&WindowsNtKeyHandle,
+ KEY_CREATE_SUB_KEY,
+ &ObjectAttributes,
+ 0,
+ NULL,
+ 0,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to create key %wZ (Status: %08lx)\n", &KeyName,
Status);
+ goto done;
+ }
+
+ /* Open the 'CurrentVersion' key */
+ RtlInitUnicodeString(&KeyName,
+ L"CurrentVersion");
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ WindowsNtKeyHandle,
+ NULL);
+
+ Status = NtCreateKey(&CurrentVersionKeyHandle,
+ KEY_CREATE_SUB_KEY | KEY_SET_VALUE,
+ &ObjectAttributes,
+ 0,
+ NULL,
+ 0,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to create key %wZ (Status: %08lx)\n", &KeyName,
Status);
+ goto done;
+ }
+
/* Set the 'CurrentType' value */
RtlInitUnicodeString(&ValueName,
L"CurrentType");
@@ -1994,15 +2066,26 @@
RtlInitUnicodeString(&ValueData,
Buffer);
- NtSetValueKey(KeyHandle,
+ NtSetValueKey(CurrentVersionKeyHandle,
&ValueName,
0,
REG_SZ,
ValueData.Buffer,
ValueData.Length + sizeof(WCHAR));
- /* Close the key */
- NtClose(KeyHandle);
+done:;
+ /* Close the keys */
+ if (CurrentVersionKeyHandle != NULL)
+ NtClose(CurrentVersionKeyHandle);
+
+ if (WindowsNtKeyHandle != NULL)
+ NtClose(WindowsNtKeyHandle);
+
+ if (MicrosoftKeyHandle != NULL)
+ NtClose(MicrosoftKeyHandle);
+
+ if (SoftwareKeyHandle != NULL)
+ NtClose(SoftwareKeyHandle);
}
/* EOF */