[NTOS:PNP]
[reactos.git] / reactos / ntoskrnl / io / pnpmgr / pnproot.c
index cbe802a..65915d5 100644 (file)
@@ -227,9 +227,13 @@ PnpRootCreateDevice(
     Status = IopOpenRegistryKeyEx(&EnumHandle, NULL, &EnumKeyName, KEY_READ);
     if (NT_SUCCESS(Status))
     {
-        InitializeObjectAttributes(&ObjectAttributes, &Device->DeviceID, OBJ_CASE_INSENSITIVE, EnumHandle, NULL);
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &Device->DeviceID,
+                                   OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+                                   EnumHandle,
+                                   NULL);
         Status = ZwCreateKey(&DeviceKeyHandle, KEY_SET_VALUE, &ObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL);
-        ZwClose(EnumHandle);
+        ObCloseHandle(EnumHandle, KernelMode);
     }
 
     if (!NT_SUCCESS(Status))
@@ -271,7 +275,7 @@ tryagain:
     Status = LocateChildDevice(DeviceExtension, DevicePath, InstancePath, &Device);
     if (Status != STATUS_NO_SUCH_DEVICE || NextInstance > 9999)
     {
-        DPRINT1("NextInstance value is corrupt! (%d)\n", NextInstance);
+        DPRINT1("NextInstance value is corrupt! (%lu)\n", NextInstance);
         RtlDeleteRegistryValue(RTL_REGISTRY_HANDLE,
                                (PWSTR)DeviceKeyHandle,
                                L"NextInstance");
@@ -298,16 +302,20 @@ tryagain:
     }
 
     /* Finish creating the instance path in the registry */
-    InitializeObjectAttributes(&ObjectAttributes, &Device->InstanceID, OBJ_CASE_INSENSITIVE, DeviceKeyHandle, NULL);
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &Device->InstanceID,
+                               OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+                               DeviceKeyHandle,
+                               NULL);
     Status = ZwCreateKey(&InstanceKeyHandle, KEY_QUERY_VALUE, &ObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL);
-    if (NT_SUCCESS(Status))
+    if (!NT_SUCCESS(Status))
     {
         DPRINT1("Failed to create instance path (0x%x)\n", Status);
         goto cleanup;
     }
 
     /* Just close the handle */
-    ZwClose(InstanceKeyHandle);
+    ObCloseHandle(InstanceKeyHandle, KernelMode);
 
     if (FullInstancePath)
     {
@@ -370,7 +378,7 @@ cleanup:
         ExFreePoolWithTag(Device, TAG_PNP_ROOT);
     }
     if (DeviceKeyHandle != INVALID_HANDLE_VALUE)
-        ZwClose(DeviceKeyHandle);
+        ObCloseHandle(DeviceKeyHandle, KernelMode);
     return Status;
 }
 
@@ -1226,6 +1234,51 @@ PnpRootPnpControl(
     return Status;
 }
 
+/*
+ * FUNCTION: Handle Power IRPs
+ * ARGUMENTS:
+ *     DeviceObject = Pointer to PDO or FDO
+ *     Irp          = Pointer to IRP that should be handled
+ * RETURNS:
+ *     Status
+ */
+static NTSTATUS NTAPI
+PnpRootPowerControl(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension;
+    PIO_STACK_LOCATION IrpSp;
+    NTSTATUS Status;
+
+    DeviceExtension = DeviceObject->DeviceExtension;
+    Status = Irp->IoStatus.Status;
+    IrpSp = IoGetCurrentIrpStackLocation(Irp);
+
+    if (DeviceExtension->Common.IsFDO)
+    {
+        ASSERT(!DeviceExtension->Common.IsFDO);
+        PoStartNextPowerIrp(Irp);
+        IoCopyCurrentIrpStackLocationToNext(Irp);
+        Status = PoCallDriver(DeviceExtension->Ldo, Irp);
+    }
+    else
+    {
+        switch (IrpSp->MinorFunction)
+        {
+            case IRP_MN_QUERY_POWER:
+            case IRP_MN_SET_POWER:
+                Status = STATUS_SUCCESS;
+                break;
+        }
+        Irp->IoStatus.Status = Status;
+        PoStartNextPowerIrp(Irp);
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
+
+    return Status;
+}
+
 NTSTATUS
 NTAPI
 PnpRootAddDevice(
@@ -1297,7 +1350,7 @@ PnpRootDriverEntry(
     DriverObject->DriverExtension->AddDevice = PnpRootAddDevice;
 
     DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl;
-    //DriverObject->MajorFunction[IRP_MJ_POWER] = PnpRootPowerControl;
+    DriverObject->MajorFunction[IRP_MJ_POWER] = PnpRootPowerControl;
 
     return STATUS_SUCCESS;
 }