Fix the case when IRP_MN_QUERY_DEVICE_TEXT returns nothing
Set DN_DRIVER_LOADED and DN_STARTED flags
Modified: trunk/reactos/ntoskrnl/io/device.c
Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c
Modified: trunk/reactos/ntoskrnl/io/pnproot.c

Modified: trunk/reactos/ntoskrnl/io/device.c
--- trunk/reactos/ntoskrnl/io/device.c	2005-12-12 09:06:40 UTC (rev 20102)
+++ trunk/reactos/ntoskrnl/io/device.c	2005-12-12 16:44:09 UTC (rev 20103)
@@ -163,7 +163,10 @@
    }
 
    ObDereferenceObject(Fdo);
-   
+
+   if (NT_SUCCESS(Status))
+       DeviceNode->Flags |= DN_STARTED;
+
    return Status;
 }
 

Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c
--- trunk/reactos/ntoskrnl/io/pnpmgr.c	2005-12-12 09:06:40 UTC (rev 20102)
+++ trunk/reactos/ntoskrnl/io/pnpmgr.c	2005-12-12 16:44:09 UTC (rev 20103)
@@ -1753,7 +1753,7 @@
    RtlInitUnicodeString(&ValueName, L"DeviceDesc");
    if (ZwQueryValueKey(InstanceKey, &ValueName, KeyValueBasicInformation, NULL, 0, &RequiredLength) == STATUS_OBJECT_NAME_NOT_FOUND)
    {
-      if (NT_SUCCESS(IoStatusBlock.Status) &&
+      if (NT_SUCCESS(Status) &&
          IoStatusBlock.Information &&
          (*(PWSTR)IoStatusBlock.Information != 0))
       {
@@ -1768,16 +1768,15 @@
       }
       else
       {
-         UNICODE_STRING DeviceDesc;
-         RtlInitUnicodeString(&DeviceDesc, L"Unknown Device");
-         DPRINT("Driver didn't return DeviceDesc (Status %x), so place unknown device there\n", Status);
+         UNICODE_STRING DeviceDesc = RTL_CONSTANT_STRING(L"Unknown device");
+         DPRINT("Driver didn't return DeviceDesc (Status 0x%08lx), so place unknown device there\n", Status);
 
          Status = ZwSetValueKey(InstanceKey,
             &ValueName,
             0,
             REG_SZ,
-            &DeviceDesc,
-            (wcslen((PWSTR)&DeviceDesc) + 1) * sizeof(WCHAR));
+            DeviceDesc.Buffer,
+            DeviceDesc.MaximumLength);
 
          if (!NT_SUCCESS(Status))
          {
@@ -2014,6 +2013,7 @@
              * device is started */
             DPRINT("%wZ is using NULL driver\n", &DeviceNode->InstancePath);
             IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED);
+            DeviceNode->Flags |= DN_STARTED;
          }
          return STATUS_SUCCESS;
       }
@@ -2095,8 +2095,11 @@
       if (NT_SUCCESS(Status) || Status == STATUS_IMAGE_ALREADY_LOADED)
       {
          if (Status != STATUS_IMAGE_ALREADY_LOADED)
+         {
+            DeviceNode->Flags |= DN_DRIVER_LOADED;
             Status = IopInitializeDriverModule(DeviceNode, ModuleObject,
                &DeviceNode->ServiceName, FALSE, &DriverObject);
+         }
          else
          {
             /* get existing DriverObject pointer */

Modified: trunk/reactos/ntoskrnl/io/pnproot.c
--- trunk/reactos/ntoskrnl/io/pnproot.c	2005-12-12 09:06:40 UTC (rev 20102)
+++ trunk/reactos/ntoskrnl/io/pnproot.c	2005-12-12 16:44:09 UTC (rev 20103)
@@ -579,7 +579,7 @@
 
   if (!NT_SUCCESS(Status))
   {
-    /* FIXME: */
+    Device->DeviceDescription.Buffer = NULL;
   }
 
   DPRINT("Got device description: %S\n", DeviceDesc->Buffer);
@@ -1184,8 +1184,8 @@
 {
   DPRINT("Called\n");
 
-  DriverObject->MajorFunction[IRP_MJ_PNP] = (PDRIVER_DISPATCH) PnpRootPnpControl;
-  DriverObject->MajorFunction[IRP_MJ_POWER] = (PDRIVER_DISPATCH) PnpRootPowerControl;
+  DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl;
+  DriverObject->MajorFunction[IRP_MJ_POWER] = PnpRootPowerControl;
   DriverObject->DriverExtension->AddDevice = PnpRootAddDevice;
 
   return STATUS_SUCCESS;