- Fill Level field in DEVICE_NODE structure
[reactos.git] / reactos / ntoskrnl / io / pnproot.c
index fbd8e8e..d4c24fd 100644 (file)
@@ -1,5 +1,4 @@
-/* $Id$
- *
+/*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/io/pnproot.c
@@ -159,23 +158,21 @@ PnpRootCreateDevice(
 
   PdoDeviceExtension->Common.DevicePowerState = PowerDeviceD0;
 
-  if (!IopCreateUnicodeString(
+  if (!RtlCreateUnicodeString(
     &PdoDeviceExtension->DeviceID,
     ENUM_NAME_ROOT \
-    L"\\LEGACY_UNKNOWN",
-    PagedPool))
+    L"\\LEGACY_UNKNOWN"))
   {
     /* FIXME: */
-    DPRINT("IopCreateUnicodeString() failed\n");
+    DPRINT("RtlCreateUnicodeString() failed\n");
   }
 
-  if (!IopCreateUnicodeString(
+  if (!RtlCreateUnicodeString(
     &PdoDeviceExtension->InstanceID,
-    L"0000",
-    PagedPool))
+    L"0000"))
   {
     /* FIXME: */
-    DPRINT("IopCreateUnicodeString() failed\n");
+    DPRINT("RtlCreateUnicodeString() failed\n");
   }
 
   ExInterlockedInsertTailList(
@@ -213,12 +210,11 @@ PdoQueryId(
 
   switch (IrpSp->Parameters.QueryId.IdType) {
     case BusQueryDeviceID:
-      Status = IopCreateUnicodeString(
-        &String,
-        DeviceExtension->DeviceID.Buffer,
-        PagedPool);
+      Status = RtlDuplicateUnicodeString(TRUE,
+                                         &DeviceExtension->DeviceID,
+                                         &String);
 
-      DPRINT("DeviceID: %S\n", String.Buffer);
+      DPRINT("DeviceID: %wZ\n", &String);
 
       Irp->IoStatus.Information = (ULONG_PTR)String.Buffer;
       break;
@@ -229,10 +225,9 @@ PdoQueryId(
       break;
 
     case BusQueryInstanceID:
-      Status = IopCreateUnicodeString(
-        &String,
-        DeviceExtension->InstanceID.Buffer,
-        PagedPool);
+      Status = RtlDuplicateUnicodeString(TRUE,
+                                         &DeviceExtension->InstanceID,
+                                         &String);
 
       DPRINT("InstanceID: %S\n", String.Buffer);
 
@@ -313,6 +308,30 @@ PdoQueryResourceRequirements(
 }
 
 
+static NTSTATUS
+PnpRootPdoQueryCapabilities(
+  IN PDEVICE_OBJECT DeviceObject,
+  IN PIRP Irp,
+  PIO_STACK_LOCATION IrpSp)
+{
+  PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
+  PDEVICE_CAPABILITIES DeviceCapabilities;
+
+  DPRINT("Called\n");
+
+  DeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+  DeviceCapabilities = IrpSp->Parameters.DeviceCapabilities.Capabilities;
+
+  if (DeviceCapabilities->Version != 1)
+    return STATUS_UNSUCCESSFUL;
+
+  DeviceCapabilities->UniqueID = TRUE;
+  /* FIXME: Fill other fields */
+
+  return STATUS_SUCCESS;
+}
+
+
 /*
  * FUNCTION: Handle Plug and Play IRPs for the child device
  * ARGUMENTS:
@@ -357,6 +376,10 @@ PnpRootPdoPnpControl(
     Status = PdoQueryResources(DeviceObject, Irp, IrpSp);
     break;
 
+  case IRP_MN_QUERY_CAPABILITIES:
+    Status = PnpRootPdoQueryCapabilities(DeviceObject, Irp, IrpSp);
+    break;
+
   case IRP_MN_START_DEVICE:
   case IRP_MN_QUERY_STOP_DEVICE:
   case IRP_MN_CANCEL_STOP_DEVICE:
@@ -705,31 +728,30 @@ PnpRootFdoEnumerateDevices(
 
       RtlZeroMemory(Device, sizeof(PNPROOT_DEVICE));
 
-      if (!IopCreateUnicodeString(&Device->ServiceName, KeyInfo->Name, PagedPool))
+      if (!RtlCreateUnicodeString(&Device->ServiceName, KeyInfo->Name))
       {
         /* FIXME: */
-        DPRINT("IopCreateUnicodeString() failed\n");
+        DPRINT("RtlCreateUnicodeString() failed\n");
       }
 
       wcscpy(Buffer, ENUM_NAME_ROOT);
       wcscat(Buffer, L"\\");
       wcscat(Buffer, KeyInfo->Name);
 
-      if (!IopCreateUnicodeString(&Device->DeviceID, Buffer, PagedPool))
+      if (!RtlCreateUnicodeString(&Device->DeviceID, Buffer))
       {
         /* FIXME: */
-        DPRINT("IopCreateUnicodeString() failed\n");
+        DPRINT("RtlCreateUnicodeString() failed\n");
       }
 
       DPRINT("Got entry: %S\n", Device->DeviceID.Buffer);
 
-      if (!IopCreateUnicodeString(
+      if (!RtlCreateUnicodeString(
         &Device->InstanceID,
-        SubKeyInfo->Name,
-        PagedPool))
+        SubKeyInfo->Name))
       {
         /* FIXME: */
-        DPRINT("IopCreateUnicodeString() failed\n");
+        DPRINT("RtlCreateUnicodeString() failed\n");
       }
 
       Status = PnpRootFdoReadDeviceInfo(Device);
@@ -771,7 +793,6 @@ PnpRootQueryBusRelations(
   PPNPROOT_PDO_DEVICE_EXTENSION PdoDeviceExtension;
   PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
   PDEVICE_RELATIONS Relations;
-  PLIST_ENTRY CurrentEntry;
   PPNPROOT_DEVICE Device;
   NTSTATUS Status;
   ULONG Size;
@@ -801,11 +822,8 @@ PnpRootQueryBusRelations(
   Relations->Count = DeviceExtension->DeviceListCount;
 
   i = 0;
-  CurrentEntry = DeviceExtension->DeviceListHead.Flink;
-  while (CurrentEntry != &DeviceExtension->DeviceListHead)
+  LIST_FOR_EACH(Device,&DeviceExtension->DeviceListHead,PNPROOT_DEVICE, ListEntry) 
   {
-    Device = CONTAINING_RECORD(CurrentEntry, PNPROOT_DEVICE, ListEntry);
-
     if (!Device->Pdo)
     {
       /* Create a physical device object for the
@@ -843,10 +861,9 @@ PnpRootQueryBusRelations(
 
       PdoDeviceExtension->Common.DevicePowerState = PowerDeviceD0;
 
-      if (!IopCreateUnicodeString(
+      if (!RtlCreateUnicodeString(
         &PdoDeviceExtension->DeviceID,
-        Device->DeviceID.Buffer,
-        PagedPool))
+        Device->DeviceID.Buffer))
       {
         DPRINT("Insufficient resources\n");
         /* FIXME: */
@@ -856,10 +873,9 @@ PnpRootQueryBusRelations(
         &PdoDeviceExtension->DeviceID,
         Device->Pdo);
 
-      if (!IopCreateUnicodeString(
+      if (!RtlCreateUnicodeString(
         &PdoDeviceExtension->InstanceID,
-        Device->InstanceID.Buffer,
-        PagedPool))
+        Device->InstanceID.Buffer))
       {
         DPRINT("Insufficient resources\n");
         /* FIXME: */
@@ -901,8 +917,6 @@ PnpRootQueryBusRelations(
     Relations->Objects[i] = Device->Pdo;
 
     i++;
-
-    CurrentEntry = CurrentEntry->Flink;
   }
 
   if (NT_SUCCESS(Status))