[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 | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 1 deletion(-) diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c index d1222df..f60aa43 100644 --- a/src/coinst/coinst.c +++ b/src/coinst/coinst.c @@ -191,6 +191,132 @@ __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("XENNET", 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 CheckStatus( OUT PBOOLEAN NeedReboot ) @@ -315,13 +441,44 @@ __DifInstallPreProcess( IN PCOINSTALLER_CONTEXT_DATA Context ) { + HRESULT Error; + BOOLEAN Success; + BOOLEAN Allow; + UNREFERENCED_PARAMETER(DeviceInfoSet); UNREFERENCED_PARAMETER(DeviceInfoData); UNREFERENCED_PARAMETER(Context); - Log("<===>"); + Log("====>"); + + Success = AllowInstall(&Allow); + if (!Success) + goto fail1; + + if (!Allow) { + SetLastError(ERROR_ACCESS_DENIED); + goto fail2; + } + + Log("<===="); return NO_ERROR; + +fail2: + Log("fail2"); + +fail1: + Error = GetLastError(); + + { + PTCHAR Message; + + Message = __GetErrorMessage(Error); + Log("fail1 (%s)", Message); + LocalFree(Message); + } + + return Error; } static FORCEINLINE HRESULT -- 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 |