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))
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");
}
/* 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)
{
ExFreePoolWithTag(Device, TAG_PNP_ROOT);
}
if (DeviceKeyHandle != INVALID_HANDLE_VALUE)
- ZwClose(DeviceKeyHandle);
+ ObCloseHandle(DeviceKeyHandle, KernelMode);
return Status;
}
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(
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;
}