[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH] Ensure DifRemove coinst routine runs on uninstall.
> -----Original Message----- > From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of > Paul Durrant > Sent: 10 November 2020 11:59 > To: 'Troy Crosley' <troycrosley@xxxxxxxxx>; win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: ben.chalmers@xxxxxxxxxx; owen.smith@xxxxxxxxxx; 'Joel Upham' > <uphamj@xxxxxxxxxxxx> > Subject: RE: [EXTERNAL] [PATCH] Ensure DifRemove coinst routine runs on > uninstall. > > CAUTION: This email originated from outside of the organization. Do not click > links or open > attachments unless you can confirm the sender and know the content is safe. > > > > > -----Original Message----- > > From: Troy Crosley <troycrosley@xxxxxxxxx> > > Sent: 05 November 2020 21:39 > > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > > Cc: paul@xxxxxxx; ben.chalmers@xxxxxxxxxx; owen.smith@xxxxxxxxxx; Troy > > Crosley > > <troycrosley@xxxxxxxxx>; Joel Upham <uphamj@xxxxxxxxxxxx> > > Subject: [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; > > + } When I came to test this, my system (which is actually an old 1809 VM) got into an endless loop of startup repair. This appears to because returning ERROR_DI_POSTPROCESSING_REQUIRED from DIF_SELECTBESTCOMPATDRV pre-processing leads to post-processing getting an InstallResult of ERROR_NO_COMPAT_DRIVERS, which then causes DifRemove() to bail out early and that error gets returned. AFAICT ERROR_NO_COMPAT_DRIVERS is exactly what we'd expect if the NULL driver is being installed so I added the following hunk: 1995 // An InstallResult value of ERROR_NO_COMPAT_DRIVERS simply means 1996 // that the NULL driver was selected, and so should not be treated 1997 // as an error. 1998 // 1999 if (Context->PostProcessing && 2000 Context->InstallResult == ERROR_NO_COMPAT_DRIVERS) 2001 Context->InstallResult = NO_ERROR; This seems to make everything work correctly me. I'll fold it into the patch you sent and apply it. Paul > > 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 |