[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/2] Add a registry override to veto driver installations
There are certain cases where a local installer package may wish to prevent Windows Update installations of drivers. This can be achieved by having the co-installer check for a registry value and fail it's pre-install phase if the value is present. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/coinst/coinst.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 2 deletions(-) diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c index 75d3f28..d6700c0 100644 --- a/src/coinst/coinst.c +++ b/src/coinst/coinst.c @@ -185,6 +185,146 @@ __FunctionName( } static BOOLEAN +AllowUpdate( + IN PTCHAR DriverName, + OUT PBOOLEAN Allow + ) +{ + TCHAR ServiceKeyName[MAX_PATH]; + HKEY ServiceKey; + HRESULT Result; + HRESULT Error; + DWORD ValueLength; + DWORD Value; + DWORD Type; + + Log("====> (%s)", DriverName); + + Result = StringCbPrintf(ServiceKeyName, + MAX_PATH, + SERVICES_KEY "\\%s", + DriverName); + assert(SUCCEEDED(Result)); + + Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, + ServiceKeyName, + 0, + KEY_READ, + &ServiceKey); + if (Error != ERROR_SUCCESS) { + if (Error == ERROR_FILE_NOT_FOUND) { + Value = 1; + goto done; + } + + SetLastError(Error); + goto fail1; + } + + ValueLength = sizeof (Value); + + Error = RegQueryValueEx(ServiceKey, + "AllowUpdate", + NULL, + &Type, + (LPBYTE)&Value, + &ValueLength); + if (Error != ERROR_SUCCESS) { + if (Error == ERROR_FILE_NOT_FOUND) { + Type = REG_DWORD; + Value = 1; + } else { + SetLastError(Error); + goto fail2; + } + } + + if (Type != REG_DWORD) { + SetLastError(ERROR_BAD_FORMAT); + goto fail3; + } + +done: + if (Value == 0) { + Log("DISALLOWED"); + *Allow = FALSE; + } + + RegCloseKey(ServiceKey); + + Log("<===="); + + return TRUE; + +fail3: + Log("fail3"); + +fail2: + Log("fail2"); + + RegCloseKey(ServiceKey); + +fail1: + Error = GetLastError(); + + { + PTCHAR Message; + Message = GetErrorMessage(Error); + Log("fail1 (%s)", Message); + LocalFree(Message); + } + + return FALSE; +} + +static BOOLEAN +AllowInstall( + OUT PBOOLEAN Allow + ) +{ + BOOLEAN Success; + HRESULT Error; + + Log("====>"); + + *Allow = TRUE; + + Success = AllowUpdate("XEN", Allow); + if (!Success) + goto fail1; + + Success = AllowUpdate("XENBUS", Allow); + if (!Success) + goto fail2; + + Success = AllowUpdate("XENFILT", Allow); + if (!Success) + goto fail3; + + Log("<===="); + + return TRUE; + +fail3: + Log("fail3"); + +fail2: + Log("fail2"); + +fail1: + Error = GetLastError(); + + { + PTCHAR Message; + Message = GetErrorMessage(Error); + Log("fail1 (%s)", Message); + LocalFree(Message); + } + + return FALSE; +} + +static BOOLEAN OpenEnumKey( OUT PHKEY EnumKey ) @@ -1271,6 +1411,7 @@ DifInstallPreProcess( { BOOLEAN Success; HRESULT Error; + BOOLEAN Allow; UNREFERENCED_PARAMETER(DeviceInfoSet); UNREFERENCED_PARAMETER(DeviceInfoData); @@ -1278,18 +1419,33 @@ DifInstallPreProcess( Log("====>"); - Success = MatchExistingDriver(); + Success = AllowInstall(&Allow); if (!Success) goto fail1; + if (!Allow) { + SetLastError(ERROR_ACCESS_DENIED); + goto fail2; + } + + Success = MatchExistingDriver(); + if (!Success) + goto fail3; + Success = SupportChildDrivers(); if (!Success) - goto fail2; + goto fail4; Log("<===="); return NO_ERROR; +fail4: + Log("fail4"); + +fail3: + Log("fail3"); + fail2: Log("fail2"); -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |