Author: cgutman Date: Sun Apr 11 19:31:17 2010 New Revision: 46844
URL: http://svn.reactos.org/svn/reactos?rev=46844&view=rev Log: [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
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c... ============================================================================== --- trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c [iso-8859-1] Sun Apr 11 19:31:17 2010 @@ -147,7 +147,7 @@ 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 @@ 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)) @@ -191,6 +192,9 @@ DPRINT("IopAssignDeviceResources() failed (Status 0x%08lx)\n", Status); } 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; @@ -213,7 +217,9 @@
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 @@
Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceHandle); if (!NT_SUCCESS(Status)) - return Status; + goto ByeBye;
RtlInitUnicodeString(&KeyName, L"Control"); InitializeObjectAttributes(&ObjectAttributes, @@ -239,10 +245,7 @@ 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 @@ DeviceNode->ResourceList, CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); }
+ByeBye: if (NT_SUCCESS(Status)) IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); - - ZwClose(ControlHandle); - ZwClose(InstanceHandle); + else + IopDeviceNodeSetFlag(DeviceNode, DNF_START_FAILED); + + if (ControlHandle != INVALID_HANDLE_VALUE) + ZwClose(ControlHandle); + + if (InstanceHandle != INVALID_HANDLE_VALUE) + ZwClose(InstanceHandle);
return Status; } @@ -2497,7 +2506,7 @@ { DeviceNode->BootResources = (PCM_RESOURCE_LIST)IoStatusBlock.Information; - DeviceNode->Flags |= DNF_HAS_BOOT_CONFIG; + IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG); } else {