[ros-diffs] [cgutman] 46844: [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

cgutman at svn.reactos.org cgutman at svn.reactos.org
Sun Apr 11 19:31:17 CEST 2010


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?rev=46844&r1=46843&r2=46844&view=diff
==============================================================================
--- 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
    {




More information about the Ros-diffs mailing list