From: Paul Durrant Date: Mon, 5 Sep 2016 10:33:32 +0000 (+0100) Subject: Revert all recent coinstall changes X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=HEAD;p=people%2Fpauldu%2Fxennet.git Revert all recent coinstall changes All the changes to add settings stealing code to the co-installer should be reverted. Whilst it appeared to be impossible to implement this functionality in XENVIF, it turns out not to be. It requires much more hacky code in XENVIF but doing it there is still better than relying on a co-installer. Signed-off-by: Paul Durrant --- diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c index 371414a..acbb5ff 100644 --- a/src/coinst/coinst.c +++ b/src/coinst/coinst.c @@ -55,17 +55,6 @@ __user_code; #define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services" -#define SERVICE_KEY(_Driver) \ - SERVICES_KEY ## "\\" ## #_Driver - -#define ADDRESSES_KEY \ - SERVICE_KEY(XENVIF) ## "\\Addresses" - -#define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control" - -#define CLASS_KEY \ - CONTROL_KEY ## "\\Class" - static VOID #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024' __Log( @@ -320,92 +309,35 @@ fail1: return FALSE; } -static BOOLEAN -OpenSoftwareKey( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - OUT PHKEY Key +static FORCEINLINE HRESULT +__DifInstallPreProcess( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN PCOINSTALLER_CONTEXT_DATA Context ) { - HRESULT Error; - - *Key = SetupDiOpenDevRegKey(DeviceInfoSet, - DeviceInfoData, - DICS_FLAG_GLOBAL, - 0, - DIREG_DRV, - KEY_ALL_ACCESS); - if (Key == INVALID_HANDLE_VALUE) { - SetLastError(ERROR_PATH_NOT_FOUND); - goto fail1; - } - - return TRUE; - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; + HRESULT Error; + BOOLEAN Success; + BOOLEAN Allow; - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } + UNREFERENCED_PARAMETER(DeviceInfoSet); + UNREFERENCED_PARAMETER(DeviceInfoData); + UNREFERENCED_PARAMETER(Context); - return FALSE; -} + Log("====>"); -static PTCHAR -GetProperty( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN DWORD Index - ) -{ - DWORD Type; - DWORD PropertyLength; - PTCHAR Property; - HRESULT Error; - - if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet, - DeviceInfoData, - Index, - &Type, - NULL, - 0, - &PropertyLength)) { - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - goto fail1; - } + Success = AllowInstall(&Allow); + if (!Success) + goto fail1; - if (Type != REG_SZ) { - SetLastError(ERROR_BAD_FORMAT); + if (!Allow) { + SetLastError(ERROR_ACCESS_DENIED); goto fail2; } - PropertyLength += sizeof (TCHAR); - - Property = calloc(1, PropertyLength); - if (Property == NULL) - goto fail3; - - if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet, - DeviceInfoData, - Index, - NULL, - (PBYTE)Property, - PropertyLength, - NULL)) - goto fail4; - - return Property; - -fail4: - free(Property); + Log("<===="); -fail3: - Log("fail3"); + return NO_ERROR; fail2: Log("fail2"); @@ -421,1501 +353,69 @@ fail1: LocalFree(Message); } - return NULL; -} - -static BOOLEAN -GetLocation( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - OUT PTCHAR *Location - ) -{ - HRESULT Error; - - *Location = GetProperty(DeviceInfoSet, - DeviceInfoData, - SPDRP_LOCATION_INFORMATION); - if (*Location == NULL) - goto fail1; - - Log("%s", *Location); - - return TRUE; - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; + return Error; } -static BOOLEAN -ParseMacAddress( - IN PCHAR Buffer, - OUT PETHERNET_ADDRESS Address +static FORCEINLINE HRESULT +__DifInstallPostProcess( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN PCOINSTALLER_CONTEXT_DATA Context ) { - ULONG Length; - HRESULT Error; - - Length = 0; - for (;;) { - CHAR Character; - UCHAR Byte; - - Character = *Buffer++; - if (Character == '\0') - break; - - if (Character >= '0' && Character <= '9') - Byte = Character - '0'; - else if (Character >= 'A' && Character <= 'F') - Byte = 0x0A + Character - 'A'; - else if (Character >= 'a' && Character <= 'f') - Byte = 0x0A + Character - 'a'; - else - break; - - Byte <<= 4; - - Character = *Buffer++; - if (Character == '\0') - break; - - if (Character >= '0' && Character <= '9') - Byte += Character - '0'; - else if (Character >= 'A' && Character <= 'F') - Byte += 0x0A + Character - 'A'; - else if (Character >= 'a' && Character <= 'f') - Byte += 0x0A + Character - 'a'; - else - break; - - Address->Byte[Length++] = Byte; - - // Skip over any separator - if (*Buffer == ':' || *Buffer == '-') - Buffer++; - } - - if (Length != ETHERNET_ADDRESS_LENGTH) { - SetLastError(ERROR_BAD_FORMAT); - goto fail1; - } - - return TRUE; - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; + UNREFERENCED_PARAMETER(DeviceInfoSet); + UNREFERENCED_PARAMETER(DeviceInfoData); + UNREFERENCED_PARAMETER(Context); - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } + Log("<===>"); - return FALSE; + return NO_ERROR; } -static BOOLEAN -GetPermanentAddress( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - OUT PETHERNET_ADDRESS Address +static DECLSPEC_NOINLINE HRESULT +DifInstall( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN PCOINSTALLER_CONTEXT_DATA Context ) { - PTCHAR Location; - HRESULT Error; - HKEY AddressesKey; - DWORD MaxValueLength; - DWORD BufferLength; - PTCHAR Buffer; - DWORD Type; - BOOLEAN Success; - - Log("====>"); - - Success = GetLocation(DeviceInfoSet, - DeviceInfoData, - &Location); - if (!Success) - goto fail1; - - Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - ADDRESSES_KEY, - 0, - KEY_READ, - &AddressesKey); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; - } - - Error = RegQueryInfoKey(AddressesKey, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - &MaxValueLength, - NULL, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail3; - } - - BufferLength = MaxValueLength + sizeof (TCHAR); - - Buffer = calloc(1, BufferLength); - if (Buffer == NULL) - goto fail4; - - Error = RegQueryValueEx(AddressesKey, - Location, - NULL, - &Type, - (LPBYTE)Buffer, - &BufferLength); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail5; - } - - if (Type != REG_SZ) { - SetLastError(ERROR_BAD_FORMAT); - goto fail6; - } - - Success = ParseMacAddress(Buffer, Address); - if (!Success) - goto fail7; - - free(Buffer); - - RegCloseKey(AddressesKey); - - free(Location); - - Log("%02X:%02X:%02X:%02X:%02X:%02X", - Address->Byte[0], - Address->Byte[1], - Address->Byte[2], - Address->Byte[3], - Address->Byte[4], - Address->Byte[5]); - - Log("<===="); - - return TRUE; - -fail7: - Log("fail7"); - -fail6: - Log("fail6"); - -fail5: - Log("fail5"); - - free(Buffer); - -fail4: - Log("fail4"); - -fail3: - Log("fail3"); - - RegCloseKey(AddressesKey); - -fail2: - Log("fail2"); - - free(Location); - -fail1: - Error = GetLastError(); + HRESULT Error; - { - PTCHAR Message; + if (!Context->PostProcessing) { + Error = __DifInstallPreProcess(DeviceInfoSet, DeviceInfoData, Context); + if (Error == NO_ERROR) + Error = ERROR_DI_POSTPROCESSING_REQUIRED; + } else { + Error = Context->InstallResult; + + if (Error == NO_ERROR) { + (VOID) __DifInstallPostProcess(DeviceInfoSet, DeviceInfoData, Context); + } else { + PTCHAR Message; - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); + Message = __GetErrorMessage(Error); + Log("NOT RUNNING (__DifInstallPreProcess Error: %s)", Message); + LocalFree(Message); + } } - return FALSE; + return Error; } -static BOOLEAN -GetNetLuid( - IN PETHERNET_ADDRESS Address, - OUT PNET_LUID *NetLuid +static FORCEINLINE HRESULT +__DifRemovePreProcess( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData, + IN PCOINSTALLER_CONTEXT_DATA Context ) { - PMIB_IF_TABLE2 Table; - DWORD Index; - PMIB_IF_ROW2 Row; - HRESULT Error; - - Error = GetIfTable2(&Table); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail1; - } - - for (Index = 0; Index < Table->NumEntries; Index++) { - Row = &Table->Table[Index]; - - Log("checking %ws (%ws)", - Row->Alias, - Row->Description); - - if (!Row->InterfaceAndOperStatusFlags.ConnectorPresent) - continue; - - if (Row->PhysicalAddressLength != sizeof (ETHERNET_ADDRESS)) - continue; - - if (memcmp(Row->PermanentPhysicalAddress, - Address, - sizeof (ETHERNET_ADDRESS)) != 0) - continue; - - if (Row->OperStatus != IfOperStatusUp) - continue; - - goto found; - } - - *NetLuid = NULL; - goto done; - -found: - *NetLuid = calloc(1, sizeof (NET_LUID)); - if (*NetLuid == NULL) - goto fail2; - - (*NetLuid)->Value = Row->InterfaceLuid.Value; - - Log("%08x.%08x", - (*NetLuid)->Info.IfType, - (*NetLuid)->Info.NetLuidIndex); - -done: - FreeMibTable(Table); - - return TRUE; - -fail2: - Log("fail2"); - - FreeMibTable(Table); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; + UNREFERENCED_PARAMETER(DeviceInfoSet); + UNREFERENCED_PARAMETER(DeviceInfoData); + UNREFERENCED_PARAMETER(Context); - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static BOOLEAN -OpenClassKey( - IN const GUID *Guid, - OUT PHKEY Key - ) -{ - TCHAR KeyName[MAX_PATH]; - HRESULT Result; - HRESULT Error; - - Result = StringCbPrintf(KeyName, - MAX_PATH, - "%s\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - CLASS_KEY, - Guid->Data1, - Guid->Data2, - Guid->Data3, - Guid->Data4[0], - Guid->Data4[1], - Guid->Data4[2], - Guid->Data4[3], - Guid->Data4[4], - Guid->Data4[5], - Guid->Data4[6], - Guid->Data4[7]); - if (!SUCCEEDED(Result)) { - SetLastError(ERROR_BUFFER_OVERFLOW); - goto fail1; - } - - Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - KeyName, - 0, - KEY_READ, - Key); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; - } - - return TRUE; - -fail2: - Log("fail2"); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static BOOLEAN -FindAliasByAddress( - IN PETHERNET_ADDRESS Address, - OUT PTCHAR *SoftwareKeyName - ) -{ - const GUID *Guid = &GUID_DEVCLASS_NET; - BOOLEAN Success; - PNET_LUID NetLuid; - HKEY NetKey; - HRESULT Error; - DWORD SubKeys; - DWORD MaxSubKeyLength; - DWORD SubKeyLength; - PTCHAR SubKeyName; - DWORD Index; - HKEY SubKey; - - Log("====>"); - - Success = GetNetLuid(Address, &NetLuid); - if (!Success) - goto fail1; - - *SoftwareKeyName = NULL; - - if (NetLuid == NULL) - goto done; - - Success = OpenClassKey(Guid, &NetKey); - if (!Success) - goto fail2; - - Error = RegQueryInfoKey(NetKey, - NULL, - NULL, - NULL, - &SubKeys, - &MaxSubKeyLength, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail3; - } - - SubKeyLength = MaxSubKeyLength + sizeof (TCHAR); - - SubKeyName = calloc(1, SubKeyLength); - if (SubKeyName == NULL) - goto fail4; - - for (Index = 0; Index < SubKeys; Index++) { - DWORD Length; - DWORD Type; - DWORD IfType; - DWORD NetLuidIndex; - - SubKeyLength = MaxSubKeyLength + sizeof (TCHAR); - memset(SubKeyName, 0, SubKeyLength); - - Error = RegEnumKeyEx(NetKey, - Index, - (LPTSTR)SubKeyName, - &SubKeyLength, - NULL, - NULL, - NULL, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail5; - } - - Error = RegOpenKeyEx(NetKey, - SubKeyName, - 0, - KEY_READ, - &SubKey); - if (Error != ERROR_SUCCESS) - continue; - - Length = sizeof (DWORD); - Error = RegQueryValueEx(SubKey, - "*IfType", - NULL, - &Type, - (LPBYTE)&IfType, - &Length); - if (Error != ERROR_SUCCESS || - Type != REG_DWORD) - goto loop; - - Length = sizeof (DWORD); - Error = RegQueryValueEx(SubKey, - "NetLuidIndex", - NULL, - &Type, - (LPBYTE)&NetLuidIndex, - &Length); - if (Error != ERROR_SUCCESS || - Type != REG_DWORD) - goto loop; - - if (NetLuid->Info.IfType == IfType && - NetLuid->Info.NetLuidIndex == NetLuidIndex) { - *SoftwareKeyName = SubKeyName; - - RegCloseKey(SubKey); - break; - } - -loop: - RegCloseKey(SubKey); - } - - if (*SoftwareKeyName == NULL) - free(SubKeyName); - - RegCloseKey(NetKey); - - free(NetLuid); - -done: - Log("%s", (*SoftwareKeyName == NULL) ? "[NONE]" : *SoftwareKeyName); - - Log("<===="); - - return TRUE; - -fail5: - Log("fail5"); - - free(SubKeyName); - -fail4: - Log("fail4"); - -fail3: - Log("fail3"); - - RegCloseKey(NetKey); - -fail2: - Log("fail2"); - - free(NetLuid); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static BOOLEAN -LinkAliasToLocation( - IN PTCHAR Location, - IN PTCHAR SoftwareKeyName - ) -{ - const GUID *Guid = &GUID_DEVCLASS_NET; - HKEY NetKey; - HRESULT Error; - HKEY SoftwareKey; - DWORD LocationLength; - BOOLEAN Success; - - Log("====>"); - - Success = OpenClassKey(Guid, &NetKey); - if (!Success) - goto fail1; - - Error = RegOpenKeyEx(NetKey, - SoftwareKeyName, - 0, - KEY_ALL_ACCESS, - &SoftwareKey); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; - } - - LocationLength = (DWORD)((strlen(Location) + 1) * sizeof (TCHAR)); - - Error = RegSetValueEx(SoftwareKey, - "VIF", - 0, - REG_SZ, - (LPBYTE)Location, - LocationLength); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail3; - } - - Log("VIF = %s", Location); - - RegCloseKey(SoftwareKey); - - RegCloseKey(NetKey); - - Log("<===="); - - return TRUE; - -fail3: - Log("fail3"); - - RegCloseKey(SoftwareKey); - -fail2: - Log("fail2"); - - RegCloseKey(NetKey); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static BOOLEAN -FindAliasByLocation( - IN PTCHAR Location, - OUT PTCHAR *SoftwareKeyName - ) -{ - const GUID *Guid = &GUID_DEVCLASS_NET; - BOOLEAN Success; - HKEY NetKey; - HRESULT Error; - DWORD SubKeys; - DWORD MaxSubKeyLength; - DWORD SubKeyLength; - PTCHAR SubKeyName; - DWORD Index; - DWORD VifLength; - PTCHAR Vif; - HKEY SubKey; - - Log("====>"); - - *SoftwareKeyName = NULL; - - Success = OpenClassKey(Guid, &NetKey); - if (!Success) - goto fail1; - - Error = RegQueryInfoKey(NetKey, - NULL, - NULL, - NULL, - &SubKeys, - &MaxSubKeyLength, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; - } - - SubKeyLength = MaxSubKeyLength + sizeof (TCHAR); - - SubKeyName = calloc(1, SubKeyLength); - if (SubKeyName == NULL) - goto fail3; - - for (Index = 0; Index < SubKeys; Index++) { - DWORD MaxValueLength; - DWORD Type; - - SubKeyLength = MaxSubKeyLength + sizeof (TCHAR); - memset(SubKeyName, 0, SubKeyLength); - - Error = RegEnumKeyEx(NetKey, - Index, - (LPTSTR)SubKeyName, - &SubKeyLength, - NULL, - NULL, - NULL, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail4; - } - - Error = RegOpenKeyEx(NetKey, - SubKeyName, - 0, - KEY_READ, - &SubKey); - if (Error != ERROR_SUCCESS) - continue; - - Error = RegQueryInfoKey(SubKey, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - &MaxValueLength, - NULL, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail5; - } - - VifLength = MaxValueLength + sizeof (TCHAR); - - Vif = calloc(1, VifLength); - if (Vif == NULL) - goto fail6; - - Error = RegQueryValueEx(SubKey, - "VIF", - NULL, - &Type, - (LPBYTE)Vif, - &VifLength); - if (Error != ERROR_SUCCESS || - Type != REG_SZ) - goto loop; - - if (strcmp(Vif, Location) == 0) { - *SoftwareKeyName = SubKeyName; - - free(Vif); - - RegCloseKey(SubKey); - break; - } - -loop: - free(Vif); - - RegCloseKey(SubKey); - } - - if (*SoftwareKeyName == NULL) - free(SubKeyName); - - RegCloseKey(NetKey); - - Log("%s", (*SoftwareKeyName == NULL) ? "[NONE]" : *SoftwareKeyName); - - Log("<===="); - - return TRUE; - -fail6: - Log("fail6"); - -fail5: - Log("fail5"); - - RegCloseKey(SubKey); - -fail4: - Log("fail4"); - - free(SubKeyName); - -fail3: - Log("fail3"); - -fail2: - Log("fail2"); - - RegCloseKey(NetKey); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static BOOLEAN -CopyKeyValues( - IN HKEY DestinationKey, - IN HKEY SourceKey - ) -{ - HRESULT Error; - DWORD Values; - DWORD MaxValueNameLength; - PTCHAR ValueName; - DWORD MaxValueLength; - LPBYTE Value; - DWORD Index; - - Error = RegQueryInfoKey(SourceKey, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - &Values, - &MaxValueNameLength, - &MaxValueLength, - NULL, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail1; - } - - if (Values == 0) - goto done; - - MaxValueNameLength += sizeof (TCHAR); - - ValueName = calloc(1, MaxValueNameLength); - if (ValueName == NULL) - goto fail2; - - Value = calloc(1, MaxValueLength); - if (Value == NULL) - goto fail3; - - for (Index = 0; Index < Values; Index++) { - DWORD ValueNameLength; - DWORD ValueLength; - DWORD Type; - - ValueNameLength = MaxValueNameLength; - memset(ValueName, 0, ValueNameLength); - - ValueLength = MaxValueLength; - memset(Value, 0, ValueLength); - - Error = RegEnumValue(SourceKey, - Index, - (LPTSTR)ValueName, - &ValueNameLength, - NULL, - &Type, - Value, - &ValueLength); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail4; - } - - Error = RegSetValueEx(DestinationKey, - ValueName, - 0, - Type, - Value, - ValueLength); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail5; - } - - Log("COPIED %s", ValueName); - } - - free(Value); - free(ValueName); - -done: - return TRUE; - -fail5: - Log("fail5"); - -fail4: - Log("fail4"); - - free(Value); - -fail3: - Log("fail3"); - - free(ValueName); - -fail2: - Log("fail2"); - -fail1: - Log("fail1"); - - Error = GetLastError(); - - { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static BOOLEAN -CopySubKey( - IN HKEY DestinationKey, - IN HKEY SourceKey, - IN PTCHAR SubKeyName - ) -{ - HRESULT Error; - HKEY DestinationSubKey; - HKEY SourceSubKey; - - Log("====>"); - - Log("%s", SubKeyName); - - Error = RegOpenKeyEx(SourceKey, - SubKeyName, - 0, - KEY_READ, - &SourceSubKey); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail1; - } - - Error = RegCreateKeyEx(DestinationKey, - SubKeyName, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_ALL_ACCESS, - NULL, - &DestinationSubKey, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; - } - - CopyKeyValues(DestinationSubKey, SourceSubKey); - - RegCloseKey(DestinationSubKey); - RegCloseKey(SourceSubKey); - - Log("<===="); - - return TRUE; - -fail2: - Log("fail2"); - - RegCloseKey(SourceSubKey); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static BOOLEAN -CopyValue( - IN HKEY DestinationKey, - IN HKEY SourceKey, - IN PTCHAR ValueName - ) -{ - HRESULT Error; - DWORD MaxValueLength; - LPBYTE Value; - DWORD ValueLength; - DWORD Type; - - Log("====>"); - - Error = RegQueryInfoKey(SourceKey, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - &MaxValueLength, - NULL, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail1; - } - - ValueLength = MaxValueLength; - - Value = calloc(1, ValueLength); - if (Value == NULL) - goto fail2; - - memset(Value, 0, ValueLength); - - Error = RegQueryValueEx(SourceKey, - ValueName, - NULL, - &Type, - (LPBYTE)Value, - &ValueLength); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail3; - } - - Error = RegSetValueEx(DestinationKey, - ValueName, - 0, - Type, - Value, - ValueLength); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail4; - } - - Log("COPIED %s", ValueName); - - free(Value); - - Log("<===="); - - return TRUE; - -fail4: - Log("fail4"); - -fail3: - Log("fail3"); - - free(Value); - -fail2: - Log("fail2"); - -fail1: - Log("fail1"); - - Error = GetLastError(); - - { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static BOOLEAN -StealLinkageFromAlias( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN PTCHAR SoftwareKeyName - ) -{ - const GUID *Guid = &GUID_DEVCLASS_NET; - BOOLEAN Success; - HKEY NetKey; - HRESULT Error; - HKEY SourceKey; - HKEY DestinationKey; - - Log("====>"); - - Success = OpenClassKey(Guid, &NetKey); - if (!Success) - goto fail1; - - Error = RegOpenKeyEx(NetKey, - SoftwareKeyName, - 0, - KEY_ALL_ACCESS, - &SourceKey); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; - } - - Success = OpenSoftwareKey(DeviceInfoSet, - DeviceInfoData, - &DestinationKey); - if (!Success) - goto fail3; - - Success = CopyValue(DestinationKey, - SourceKey, - "NetCfgInstanceID"); - if (!Success) - goto fail4; - - Success = CopyValue(DestinationKey, - SourceKey, - "NetLuidIndex"); - if (!Success) - goto fail5; - - Success = CopySubKey(DestinationKey, - SourceKey, - "Linkage"); - if (!Success) - goto fail6; - - RegCloseKey(DestinationKey); - - RegCloseKey(SourceKey); - - RegCloseKey(NetKey); - - Log("<===="); - - return TRUE; - -fail6: - Log("fail6"); - -fail5: - Log("fail5"); - -fail4: - Log("fail4"); - - RegCloseKey(DestinationKey); - -fail3: - Log("fail3"); - - RegCloseKey(SourceKey); - -fail2: - Log("fail2"); - - RegCloseKey(NetKey); - -fail1: - Log("fail1"); - - Error = GetLastError(); - - { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static BOOLEAN -ClearStolenLinkage( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData - ) -{ - BOOLEAN Success; - HKEY SoftwareKey; - HRESULT Error; - - Log("====>"); - - Success = OpenSoftwareKey(DeviceInfoSet, - DeviceInfoData, - &SoftwareKey); - if (!Success) - goto fail1; - - (VOID) RegDeleteKey(SoftwareKey, "Linkage"); - (VOID) RegDeleteValue(SoftwareKey, "NetLuidIndex"); - (VOID) RegDeleteValue(SoftwareKey, "NetCfgInstanceID"); - - RegCloseKey(SoftwareKey); - - Log("<===="); - - return TRUE; - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -static FORCEINLINE HRESULT -__DifInstallPreProcess( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN PCOINSTALLER_CONTEXT_DATA Context - ) -{ - HRESULT Error; - BOOLEAN Success; - BOOLEAN Allow; - ETHERNET_ADDRESS Address; - PTCHAR Location; - PTCHAR SoftwareKeyName; - - Log("====>"); - - Context->PrivateData = NULL; - - Success = AllowInstall(&Allow); - if (!Success) - goto fail1; - - if (!Allow) { - SetLastError(ERROR_ACCESS_DENIED); - goto fail2; - } - - Location = NULL; - - Success = GetLocation(DeviceInfoSet, - DeviceInfoData, - &Location); - if (!Success) - goto fail3; - - Success = GetPermanentAddress(DeviceInfoSet, - DeviceInfoData, - &Address); - if (!Success) - goto fail4; - - SoftwareKeyName = NULL; - - Success = FindAliasByAddress(&Address, - &SoftwareKeyName); - if (!Success) - goto fail5; - - if (SoftwareKeyName != NULL) { - Success = LinkAliasToLocation(Location, - SoftwareKeyName); - - free(SoftwareKeyName); - - if (!Success) - goto fail6; - - Context->PrivateData = (PVOID)TRUE; - goto done; - } - - SoftwareKeyName = NULL; - - Success = FindAliasByLocation(Location, - &SoftwareKeyName); - if (!Success) - goto fail7; - - if (SoftwareKeyName != NULL) { - Success = StealLinkageFromAlias(DeviceInfoSet, - DeviceInfoData, - SoftwareKeyName); - - free(SoftwareKeyName); - - if (!Success) - goto fail8; - } - -done: - Log("<===="); - - return NO_ERROR; - -fail8: - Log("fail8"); - -fail7: - Log("fail7"); - -fail6: - Log("fail6"); - -fail5: - Log("fail5"); - -fail4: - Log("fail4"); - - free(Location); - -fail3: - Log("fail3"); - -fail2: - Log("fail2"); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return Error; -} - -static FORCEINLINE HRESULT -__DifInstallPostProcess( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN PCOINSTALLER_CONTEXT_DATA Context - ) -{ - HRESULT Error; - BOOLEAN Success; - PTCHAR Location; - PTCHAR SoftwareKeyName; - - Log("====>"); - - if (Context->PrivateData == NULL) - goto done; - - Location = NULL; - - Success = GetLocation(DeviceInfoSet, - DeviceInfoData, - &Location); - if (!Success) - goto fail1; - - SoftwareKeyName = NULL; - - Success = FindAliasByLocation(Location, - &SoftwareKeyName); - if (!Success) - goto fail2; - - if (SoftwareKeyName != NULL) { - Success = StealLinkageFromAlias(DeviceInfoSet, - DeviceInfoData, - SoftwareKeyName); - - free(SoftwareKeyName); - - if (!Success) - goto fail3; - } - -done: - Log("<===="); - - return NO_ERROR; - -fail3: - Log("fail3"); - -fail2: - Log("fail2"); - - free(Location); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return Error; -} - -static DECLSPEC_NOINLINE HRESULT -DifInstall( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN PCOINSTALLER_CONTEXT_DATA Context - ) -{ - HRESULT Error; - - if (!Context->PostProcessing) { - Error = __DifInstallPreProcess(DeviceInfoSet, DeviceInfoData, Context); - if (Error == NO_ERROR) - Error = ERROR_DI_POSTPROCESSING_REQUIRED; - } else { - Error = Context->InstallResult; - - if (Error == NO_ERROR) { - (VOID) __DifInstallPostProcess(DeviceInfoSet, DeviceInfoData, Context); - } else { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("NOT RUNNING (__DifInstallPreProcess Error: %s)", Message); - LocalFree(Message); - } - } - - return Error; -} - -static FORCEINLINE HRESULT -__DifRemovePreProcess( - IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData, - IN PCOINSTALLER_CONTEXT_DATA Context - ) -{ - HRESULT Error; - BOOLEAN Success; - PTCHAR Location; - PTCHAR SoftwareKeyName; - - UNREFERENCED_PARAMETER(Context); - - Log("====>"); - - Location = NULL; - - Success = GetLocation(DeviceInfoSet, - DeviceInfoData, - &Location); - if (!Success) - goto fail1; - - SoftwareKeyName = NULL; - - Success = FindAliasByLocation(Location, - &SoftwareKeyName); - - if (!Success) - goto fail2; - - if (SoftwareKeyName != NULL) { - free(SoftwareKeyName); - - (VOID) ClearStolenLinkage(DeviceInfoSet, - DeviceInfoData); - } - - Log("<===="); + Log("<===>"); return NO_ERROR; - -fail2: - Log("fail2"); - - free(Location); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - - Message = __GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return Error; } static FORCEINLINE HRESULT