Author: cgutman
Date: Mon Feb 20 11:30:51 2012
New Revision: 55747
URL: 
http://svn.reactos.org/svn/reactos?rev=55747&view=rev
Log:
[NTOSKRNL]
- Create the DeviceClasses key necessary for device interfaces to be registered
successfully in 1st stage
- This may not be the correct place to do this so anyone is free to move it
Modified:
    trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit.c
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit…
==============================================================================
--- trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/pnpmgr/pnpinit.c [iso-8859-1] Mon Feb 20 11:30:51 2012
@@ -362,7 +362,7 @@
 {
     NTSTATUS Status;
     ULONG Disposition;
-    HANDLE KeyHandle, EnumHandle, ParentHandle, TreeHandle;
+    HANDLE KeyHandle, EnumHandle, ParentHandle, TreeHandle, ControlHandle;
     UNICODE_STRING KeyName =
RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET");
     PDEVICE_OBJECT Pdo;
@@ -386,7 +386,37 @@
                                   &KeyName,
                                   KEY_ALL_ACCESS);
     if (!NT_SUCCESS(Status)) return Status;
-
+
+    /* Create the control key */
+    RtlInitUnicodeString(&KeyName, L"Control");
+    Status = IopCreateRegistryKeyEx(&ControlHandle,
+                                    KeyHandle,
+                                    &KeyName,
+                                    KEY_ALL_ACCESS,
+                                    REG_OPTION_NON_VOLATILE,
+                                    &Disposition);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Check if it's a new key */
+    if (Disposition == REG_CREATED_NEW_KEY)
+    {
+        HANDLE DeviceClassesHandle;
+
+        /* Create the device classes key */
+        RtlInitUnicodeString(&KeyName, L"DeviceClasses");
+        Status = IopCreateRegistryKeyEx(&DeviceClassesHandle,
+                                        ControlHandle,
+                                        &KeyName,
+                                        KEY_ALL_ACCESS,
+                                        REG_OPTION_NON_VOLATILE,
+                                        &Disposition);
+        if (!NT_SUCCESS(Status)) return Status;
+
+        ZwClose(DeviceClassesHandle);
+    }
+
+    ZwClose(ControlHandle);
+
     /* Create the enum key */
     RtlInitUnicodeString(&KeyName, REGSTR_KEY_ENUM);
     Status = IopCreateRegistryKeyEx(&EnumHandle,
@@ -436,7 +466,26 @@
         NtClose(EnumHandle);
         if (NT_SUCCESS(Status)) NtClose(TreeHandle);
     }
-
+
+    /* Open the root key now */
+    RtlInitUnicodeString(&KeyName,
L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET\\ENUM");
+    Status = IopOpenRegistryKeyEx(&EnumHandle,
+                                  NULL,
+                                  &KeyName,
+                                  KEY_ALL_ACCESS);
+    if (NT_SUCCESS(Status))
+    {
+        /* Create the root dev node */
+        RtlInitUnicodeString(&KeyName, REGSTR_VAL_ROOT_DEVNODE);
+        Status = IopCreateRegistryKeyEx(&TreeHandle,
+                                        EnumHandle,
+                                        &KeyName,
+                                        KEY_ALL_ACCESS,
+                                        REG_OPTION_NON_VOLATILE,
+                                        NULL);
+        NtClose(EnumHandle);
+        if (NT_SUCCESS(Status)) NtClose(TreeHandle);
+    }
     /* Create the root driver */
     Status = IoCreateDriver(NULL, PnpRootDriverEntry);
     if (!NT_SUCCESS(Status))