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.…
==============================================================================
--- 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
{