[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] Ensure DifRemove coinst routine runs on uninstall.
In Windows 10 version 2004, The coinstallers' DIF_INSTALLDEVICE routines do not get called on driver uninstall. In previous versions of Windows, this occurs as part of the uninstall during the null device install and is the only time DifRemove gets called to perform cleanup. Work around this change by calling DifRemove from DIF_SELECTBESTCOMPATDRV, which is the only coinstaller request that seems to happen on uninstall in Windows 10 version 2004. In addition, improve the null driver test to also check if DriverInfoData.DriverType is equal to SPDIT_CLASSDRIVER or SPDIT_COMPATDRIVER, which is necessary as of some Windows version (at least Windows 10 version 1803). Co-authored-by: Joel Upham <uphamj@xxxxxxxxxxxx> Co-authored-by: Troy Crosley <troycrosley@xxxxxxxxx> --- src/coinst/coinst.c | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c index 7b96f59..b9b60bd 100644 --- a/src/coinst/coinst.c +++ b/src/coinst/coinst.c @@ -1959,6 +1959,9 @@ Entry( ) { HRESULT Error; + SP_DRVINFO_DATA DriverInfoData; + BOOLEAN DriverInfoAvailable; + BOOLEAN IsNullDriver; Log("%s (%s) ===>", MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." BUILD_NUMBER_STR, @@ -1973,23 +1976,28 @@ Entry( Context->InstallResult); } + DriverInfoData.cbSize = sizeof(DriverInfoData); + DriverInfoAvailable = SetupDiGetSelectedDriver(DeviceInfoSet, + DeviceInfoData, + &DriverInfoData) ? + TRUE : + FALSE; + IsNullDriver = !(DriverInfoAvailable && + (DriverInfoData.DriverType == SPDIT_CLASSDRIVER || DriverInfoData.DriverType == SPDIT_COMPATDRIVER)); + switch (Function) { + case DIF_SELECTBESTCOMPATDRV: { + // If the NULL driver will be installed, treat this as we would a DIF_REMOVE + // to work around the fact that Windows 10 2004 doesn't call DIF_INSTALLDEVICE on uninstall. + Error = (IsNullDriver) ? + DifRemove(DeviceInfoSet, DeviceInfoData, Context) : + NO_ERROR; + break; + } case DIF_INSTALLDEVICE: { - SP_DRVINFO_DATA DriverInfoData; - BOOLEAN DriverInfoAvailable; - - DriverInfoData.cbSize = sizeof (DriverInfoData); - DriverInfoAvailable = SetupDiGetSelectedDriver(DeviceInfoSet, - DeviceInfoData, - &DriverInfoData) ? - TRUE : - FALSE; - - // If there is no driver information then the NULL driver is being - // installed. Treat this as we would a DIF_REMOVE. - Error = (DriverInfoAvailable) ? - DifInstall(DeviceInfoSet, DeviceInfoData, Context) : - DifRemove(DeviceInfoSet, DeviceInfoData, Context); + Error = (IsNullDriver) ? + NO_ERROR : + DifInstall(DeviceInfoSet, DeviceInfoData, Context); break; } case DIF_REMOVE: -- 2.25.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |