[UMPNPMGR][USETUP] Use PlugPlayControlStartDevice in usetup and umpnpmgr

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
This commit is contained in:
Victor Perevertkin 2021-03-16 02:25:09 +03:00
parent 59a5dba443
commit abbc5ba45a
No known key found for this signature in database
GPG key ID: C750B7222E9C7830
2 changed files with 31 additions and 16 deletions

View 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);

View 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);