[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Revert all settings stealing code
This patch accompanies commit bf92f4b7 to XENVIF. That patch reverts XENVIF to using the settings copy mechanism employed in the 8.1 driver, so this patch accordingly removes all relevant modifications to the XENNET co-installer. The patches reverted are: 9695e3bd "Re-instate code network settings code in the co-installer" 59901522 "Remove code to clear stolen stack binding" ed747f69 "Clear stolen linkage on device removal" Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/coinst/coinst.c | 1622 ++------------------------------------------------- 1 file changed, 61 insertions(+), 1561 deletions(-) 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 -- 2.5.3 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |