[UMPNPMGR][USETUP] Use PlugPlayControlStartDevice in usetup and umpnpmgr 3481/head
authorVictor Perevertkin <victor.perevertkin@reactos.org>
Mon, 15 Mar 2021 23:25:09 +0000 (02:25 +0300)
committerVictor Perevertkin <victor.perevertkin@reactos.org>
Tue, 16 Mar 2021 00:17:58 +0000 (03:17 +0300)
Instead of PlugPlayControlResetDevice, PlugPlayControlStartDevice should
be used for a newly installed device.
For usetup, add a device status check before starting attempt, so we're
not touching devices which are already started.

CORE-17463 CORE-17490

base/services/umpnpmgr/rpcserver.c
base/setup/usetup/devinst.c

index cf9ba10..cf49713 100644 (file)
@@ -3081,17 +3081,14 @@ static CONFIGRET
 EnableDeviceInstance(
     _In_ LPWSTR pszDeviceInstance)
 {
-    PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA ResetDeviceData;
+    PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA ControlData;
     CONFIGRET ret = CR_SUCCESS;
     NTSTATUS Status;
 
     DPRINT("Enable device instance %S\n", pszDeviceInstance);
 
-    RtlInitUnicodeString(&ResetDeviceData.DeviceInstance,
-                         pszDeviceInstance);
-    Status = NtPlugPlayControl(PlugPlayControlResetDevice,
-                               &ResetDeviceData,
-                               sizeof(PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA));
+    RtlInitUnicodeString(&ControlData.DeviceInstance, pszDeviceInstance);
+    Status = NtPlugPlayControl(PlugPlayControlStartDevice, &ControlData, sizeof(ControlData));
     if (!NT_SUCCESS(Status))
         ret = NtStatusToCrError(Status);
 
index 80d93ce..eee7c25 100644 (file)
@@ -39,20 +39,25 @@ typedef struct
 /* FUNCTIONS ****************************************************************/
 
 static BOOLEAN
-ResetDevice(
-    IN LPCWSTR DeviceId)
+AreDriversLoaded(
+    IN PCWSTR DeviceId)
 {
-    PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA ResetDeviceData;
+    PLUGPLAY_CONTROL_STATUS_DATA PlugPlayData;
     NTSTATUS Status;
 
-    RtlInitUnicodeString(&ResetDeviceData.DeviceInstance, DeviceId);
-    Status = NtPlugPlayControl(PlugPlayControlResetDevice, &ResetDeviceData, sizeof(PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA));
-    if (!NT_SUCCESS(Status))
+    RtlInitUnicodeString(&PlugPlayData.DeviceInstance, DeviceId);
+    PlugPlayData.Operation = PNP_GET_DEVICE_STATUS;
+
+    Status = NtPlugPlayControl(PlugPlayControlDeviceStatus, &PlugPlayData, sizeof(PlugPlayData));
+    if (NT_SUCCESS(Status))
+    {
+        return (_Bool)((PlugPlayData.DeviceStatus & DN_DRIVER_LOADED) &&
+                       !(PlugPlayData.DeviceStatus & DN_HAS_PROBLEM));
+    }
+    else
     {
-        DPRINT1("NtPlugPlayControl() failed with status 0x%08x\n", Status);
         return FALSE;
     }
-    return TRUE;
 }
 
 static BOOLEAN
@@ -81,6 +86,10 @@ InstallDriver(
     NTSTATUS Status;
     BOOLEAN deviceInstalled = FALSE;
 
+    /* First check if the driver needs any action at all */
+    if (AreDriversLoaded(DeviceId))
+        return TRUE;
+
     /* Check if we know the hardware */
     if (!SpInfFindFirstLine(hInf, L"HardwareIdsDatabase", HardwareId, &Context))
         return FALSE;
@@ -190,8 +199,17 @@ InstallDriver(
                            (wcslen(Driver) + 1) * sizeof(WCHAR));
     if (NT_SUCCESS(Status))
     {
-        /* Restart the device, so it will use the driver we registered */
-        deviceInstalled = ResetDevice(DeviceId);
+        /* We've registered the driver, time to start a device */
+        PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA ControlData;
+        RtlInitUnicodeString(&ControlData.DeviceInstance, DeviceId);
+
+        Status = NtPlugPlayControl(PlugPlayControlStartDevice, &ControlData, sizeof(ControlData));
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("NtPlugPlayControl() failed with status 0x%08x\n", Status);
+        }
+
+        deviceInstalled = NT_SUCCESS(Status);
     }
 
     INF_FreeData(Driver);