From d568475220437109561c8a329b257124673fe8e6 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 11 Apr 2010 17:31:17 +0000 Subject: [PATCH] [NTOSKRNL] - Use IopDeviceNodeSetFlag to set the DNF_HAS_BOOT_CONFIG flag - Set DNF_START_FAILED and print a warning if we fail to start a device - Clear the DNF_ASSIGNING_RESOURCES flag before failing - TODO: Release device resources when start fails svn path=/trunk/; revision=46844 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 8862fd87bcd..644338ee502 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -147,7 +147,7 @@ IopStartDevice( IO_STACK_LOCATION Stack; ULONG RequiredLength; NTSTATUS Status; - HANDLE InstanceHandle, ControlHandle; + HANDLE InstanceHandle = INVALID_HANDLE_VALUE, ControlHandle = INVALID_HANDLE_VALUE; UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; @@ -162,6 +162,7 @@ IopStartDevice( if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED) { DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n"); + IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); return Status; } else if (NT_SUCCESS(Status)) @@ -192,6 +193,9 @@ IopStartDevice( } IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + if (!NT_SUCCESS(Status)) + goto ByeBye; + DPRINT("Sending IRP_MN_START_DEVICE to driver\n"); Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->ResourceList; Stack.Parameters.StartDevice.AllocatedResourcesTranslated = DeviceNode->ResourceListTranslated; @@ -213,7 +217,9 @@ IopStartDevice( if (!NT_SUCCESS(Status)) { - DPRINT("IopInitiatePnpIrp() failed\n"); + DPRINT1("IRP_MN_START_DEVICE failed for %wZ\n", &DeviceNode->InstancePath); + IopDeviceNodeClearFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); + goto ByeBye; } else { @@ -229,7 +235,7 @@ IopStartDevice( Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceHandle); if (!NT_SUCCESS(Status)) - return Status; + goto ByeBye; RtlInitUnicodeString(&KeyName, L"Control"); InitializeObjectAttributes(&ObjectAttributes, @@ -239,10 +245,7 @@ IopStartDevice( NULL); Status = ZwCreateKey(&ControlHandle, KEY_SET_VALUE, &ObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL); if (!NT_SUCCESS(Status)) - { - ZwClose(InstanceHandle); - return Status; - } + goto ByeBye; RtlInitUnicodeString(&KeyName, L"ActiveService"); Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_SZ, DeviceNode->ServiceName.Buffer, DeviceNode->ServiceName.Length); @@ -254,11 +257,17 @@ IopStartDevice( DeviceNode->ResourceList, CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); } +ByeBye: if (NT_SUCCESS(Status)) IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); + else + IopDeviceNodeSetFlag(DeviceNode, DNF_START_FAILED); - ZwClose(ControlHandle); - ZwClose(InstanceHandle); + if (ControlHandle != INVALID_HANDLE_VALUE) + ZwClose(ControlHandle); + + if (InstanceHandle != INVALID_HANDLE_VALUE) + ZwClose(InstanceHandle); return Status; } @@ -2497,7 +2506,7 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, { DeviceNode->BootResources = (PCM_RESOURCE_LIST)IoStatusBlock.Information; - DeviceNode->Flags |= DNF_HAS_BOOT_CONFIG; + IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG); } else { -- 2.17.1