[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 | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 143 insertions(+), 1 deletion(-) diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c index e35c5d3..156a6a3 100644 --- a/src/coinst/coinst.c +++ b/src/coinst/coinst.c @@ -235,6 +235,132 @@ fail1: } 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("XENVIF", Allow); + if (!Success) + goto fail1; + + Log("<===="); + + return TRUE; + +fail1: + Error = GetLastError(); + + { + PTCHAR Message; + Message = GetErrorMessage(Error); + Log("fail1 (%s)", Message); + LocalFree(Message); + } + + return FALSE; +} + +static BOOLEAN OpenEnumKey( OUT PHKEY EnumKey ) @@ -903,6 +1029,7 @@ DifInstallPreProcess( { HRESULT Error; BOOLEAN Success; + BOOLEAN Allow; UNREFERENCED_PARAMETER(DeviceInfoSet); UNREFERENCED_PARAMETER(DeviceInfoData); @@ -910,14 +1037,29 @@ DifInstallPreProcess( Log("====>"); - Success = SupportChildDrivers(); + Success = AllowInstall(&Allow); if (!Success) goto fail1; + if (!Allow) { + SetLastError(ERROR_ACCESS_DENIED); + goto fail2; + } + + Success = SupportChildDrivers(); + if (!Success) + goto fail3; + Log("<===="); return NO_ERROR; +fail3: + Log("fail3"); + +fail2: + Log("fail2"); + fail1: Error = GetLastError(); -- 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 |