[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/3] Remove interface subscriber checks from the co-installer...
...and replace with a scan of child driver software keys to check that the revision number in the MatchingDeviceId value is supported. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/coinst/coinst.c | 616 ++++++++++++++++++---------------------------------- 1 file changed, 216 insertions(+), 400 deletions(-) diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c index c06bc3f..0b8c306 100644 --- a/src/coinst/coinst.c +++ b/src/coinst/coinst.c @@ -40,18 +40,8 @@ #include <malloc.h> #include <assert.h> -#include <debug_interface.h> -#include <suspend_interface.h> -#include <shared_info_interface.h> -#include <evtchn_interface.h> -#include <store_interface.h> -#include <range_set_interface.h> -#include <cache_interface.h> -#include <gnttab_interface.h> -#include <unplug_interface.h> -#include <emulated_interface.h> - #include <version.h> +#include <revision.h> __user_code; @@ -202,7 +192,7 @@ __FunctionName( static BOOLEAN OpenEnumKey( - OUT PHKEY Key + OUT PHKEY EnumKey ) { HRESULT Error; @@ -211,7 +201,7 @@ OpenEnumKey( ENUM_KEY, 0, KEY_READ, - Key); + EnumKey); if (Error != ERROR_SUCCESS) { SetLastError(Error); goto fail1; @@ -233,8 +223,9 @@ fail1: } static BOOLEAN -OpenPciKey( - OUT PHKEY Key +OpenBusKey( + IN PTCHAR BusKeyName, + OUT PHKEY BusKey ) { BOOLEAN Success; @@ -246,10 +237,10 @@ OpenPciKey( goto fail1; Error = RegOpenKeyEx(EnumKey, - "PCI", + BusKeyName, 0, KEY_READ, - Key); + BusKey); if (Error != ERROR_SUCCESS) { SetLastError(Error); goto fail2; @@ -280,12 +271,13 @@ fail1: static BOOLEAN GetDeviceKeyName( - IN PTCHAR Prefix, - OUT PTCHAR *Name + IN PTCHAR BusKeyName, + IN PTCHAR DeviceKeyPrefix, + OUT PTCHAR *DeviceKeyName ) { BOOLEAN Success; - HKEY PciKey; + HKEY BusKey; HRESULT Error; DWORD SubKeys; DWORD MaxSubKeyLength; @@ -293,11 +285,11 @@ GetDeviceKeyName( PTCHAR SubKeyName; DWORD Index; - Success = OpenPciKey(&PciKey); + Success = OpenBusKey(BusKeyName, &BusKey); if (!Success) goto fail1; - Error = RegQueryInfoKey(PciKey, + Error = RegQueryInfoKey(BusKey, NULL, NULL, NULL, @@ -324,7 +316,7 @@ GetDeviceKeyName( SubKeyLength = MaxSubKeyLength + sizeof (TCHAR); memset(SubKeyName, 0, SubKeyLength); - Error = RegEnumKeyEx(PciKey, + Error = RegEnumKeyEx(BusKey, Index, (LPTSTR)SubKeyName, &SubKeyLength, @@ -337,7 +329,7 @@ GetDeviceKeyName( goto fail4; } - if (strncmp(SubKeyName, Prefix, strlen(Prefix)) == 0) + if (strncmp(SubKeyName, DeviceKeyPrefix, strlen(DeviceKeyPrefix)) == 0) goto found; } @@ -345,11 +337,11 @@ GetDeviceKeyName( SubKeyName = NULL; found: - RegCloseKey(PciKey); + RegCloseKey(BusKey); Log("%s", (SubKeyName != NULL) ? SubKeyName : "none found"); - *Name = SubKeyName; + *DeviceKeyName = SubKeyName; return TRUE; fail4: @@ -363,7 +355,7 @@ fail3: fail2: Log("fail2"); - RegCloseKey(PciKey); + RegCloseKey(BusKey); fail1: Error = GetLastError(); @@ -386,36 +378,37 @@ fail1: static BOOLEAN OpenDeviceKey( - IN PTCHAR Name, - OUT PHKEY Key + IN PTCHAR BusKeyName, + IN PTCHAR DeviceKeyName, + OUT PHKEY DeviceKey ) { BOOLEAN Success; - HKEY PciKey; + HKEY BusKey; HRESULT Error; - Success = OpenPciKey(&PciKey); + Success = OpenBusKey(BusKeyName, &BusKey); if (!Success) goto fail1; - Error = RegOpenKeyEx(PciKey, - Name, + Error = RegOpenKeyEx(BusKey, + DeviceKeyName, 0, KEY_READ, - Key); + DeviceKey); if (Error != ERROR_SUCCESS) { SetLastError(Error); goto fail2; } - RegCloseKey(PciKey); + RegCloseKey(BusKey); return TRUE; fail2: Log("fail2"); - RegCloseKey(PciKey); + RegCloseKey(BusKey); fail1: Error = GetLastError(); @@ -431,7 +424,6 @@ fail1: return FALSE; } - static BOOLEAN GetDriverKeyName( IN HKEY DeviceKey, @@ -585,7 +577,7 @@ fail1: static BOOLEAN OpenClassKey( - OUT PHKEY Key + OUT PHKEY ClassKey ) { HRESULT Error; @@ -594,7 +586,7 @@ OpenClassKey( CLASS_KEY, 0, KEY_READ, - Key); + ClassKey); if (Error != ERROR_SUCCESS) { SetLastError(Error); goto fail1; @@ -617,8 +609,8 @@ fail1: static BOOLEAN OpenDriverKey( - IN PTCHAR Name, - OUT PHKEY Key + IN PTCHAR DriverKeyName, + OUT PHKEY DriverKey ) { BOOLEAN Success; @@ -630,10 +622,10 @@ OpenDriverKey( goto fail1; Error = RegOpenKeyEx(ClassKey, - Name, + DriverKeyName, 0, KEY_READ, - Key); + DriverKey); if (Error != ERROR_SUCCESS) { SetLastError(Error); goto fail2; @@ -909,7 +901,8 @@ SetActiveDeviceInstanceID( // We are binding to a legacy platform device so only make it // active if there is no XenServer vendor device - Success = GetDeviceKeyName(XENSERVER_VENDOR_DEVICE_NAME, + Success = GetDeviceKeyName("PCI", + XENSERVER_VENDOR_DEVICE_NAME, &DeviceKeyName); if (!Success) goto fail1; @@ -1135,8 +1128,11 @@ MatchExistingDriver( DWORD ProductNameLength; DWORD Type; + Log("====>"); + // Look for a legacy platform device - Success = GetDeviceKeyName(PLATFORM_DEVICE_0001_NAME, + Success = GetDeviceKeyName("PCI", + PLATFORM_DEVICE_0001_NAME, &DeviceKeyName); if (!Success) goto fail1; @@ -1144,7 +1140,8 @@ MatchExistingDriver( if (DeviceKeyName != NULL) goto found; - Success = GetDeviceKeyName(PLATFORM_DEVICE_0002_NAME, + Success = GetDeviceKeyName("PCI", + PLATFORM_DEVICE_0002_NAME, &DeviceKeyName); if (!Success) goto fail2; @@ -1156,7 +1153,7 @@ MatchExistingDriver( goto done; found: - Success = OpenDeviceKey(DeviceKeyName, &DeviceKey); + Success = OpenDeviceKey("PCI", DeviceKeyName, &DeviceKey); if (!Success) goto fail3; @@ -1243,6 +1240,8 @@ done: if (DeviceKeyName != NULL) free(DeviceKeyName); + Log("<===="); + return TRUE; fail11: @@ -1299,89 +1298,89 @@ fail1: return FALSE; } -struct _INTERFACE_ENTRY { - const TCHAR *ProviderName; - const TCHAR *InterfaceName; - DWORD VersionMin; - DWORD VersionMax; -}; +#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \ + (_N) -#define DEFINE_INTERFACE_ENTRY(_ProviderName, _InterfaceName) \ - { #_ProviderName, \ - #_InterfaceName, \ - _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MIN, \ - _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX \ - } - -static struct _INTERFACE_ENTRY InterfaceTable[] = { - DEFINE_INTERFACE_ENTRY(XENBUS, DEBUG), - DEFINE_INTERFACE_ENTRY(XENBUS, SUSPEND), - DEFINE_INTERFACE_ENTRY(XENBUS, SHARED_INFO), - DEFINE_INTERFACE_ENTRY(XENBUS, EVTCHN), - DEFINE_INTERFACE_ENTRY(XENBUS, STORE), - DEFINE_INTERFACE_ENTRY(XENBUS, RANGE_SET), - DEFINE_INTERFACE_ENTRY(XENBUS, CACHE), - DEFINE_INTERFACE_ENTRY(XENBUS, GNTTAB), - DEFINE_INTERFACE_ENTRY(XENFILT, EMULATED), - DEFINE_INTERFACE_ENTRY(XENFILT, UNPLUG), - { NULL, NULL, 0, 0 } +static DWORD DeviceRevision[] = { + DEFINE_REVISION_TABLE }; +#undef DEFINE_REVISION + static BOOLEAN -SupportInterfaceVersion( - IN PTCHAR ProviderName, - IN PTCHAR InterfaceName, - IN DWORD Version +SupportDeviceID( + IN PTCHAR DeviceID ) { - BOOLEAN Supported; - struct _INTERFACE_ENTRY *Entry; - - Supported = FALSE; - SetLastError(ERROR_REVISION_MISMATCH); - - for (Entry = InterfaceTable; Entry->ProviderName != NULL; Entry++) { - if (_stricmp(ProviderName, Entry->ProviderName) == 0 && - _stricmp(InterfaceName, Entry->InterfaceName) == 0 && - Version >= Entry->VersionMin && - Version <= Entry->VersionMax) { - Supported = TRUE; - break; - } + unsigned int Revision; + int Count; + DWORD Index; + HRESULT Error; + + DeviceID = strrchr(DeviceID, '&'); + assert(DeviceID != NULL); + DeviceID++; + + Count = sscanf_s(DeviceID, + "REV_%8x", + &Revision); + if (Count != 1) { + SetLastError(ERROR_BAD_FORMAT); + goto fail1; + } + + for (Index = 0; Index < ARRAYSIZE(DeviceRevision); Index++) { + if (Revision == DeviceRevision[Index]) + goto found; } - Log("%s_%s_INTERFACE VERSION %d %s", - ProviderName, - InterfaceName, - Version, - (Supported) ? "SUPPORTED" : "NOT SUPPORTED"); + SetLastError(ERROR_FILE_NOT_FOUND); + goto fail2; + +found: + Log("%x", Revision); + + return TRUE; + +fail2: + Log("fail2"); + +fail1: + Error = GetLastError(); + + { + PTCHAR Message; + + Message = GetErrorMessage(Error); + Log("fail1 (%s)", Message); + LocalFree(Message); + } - return Supported; + return FALSE; } static BOOLEAN -SupportSubscriberInterfaces( - IN PTCHAR ProviderName, - IN HKEY SubscriberKey +GetMatchingDeviceID( + IN HKEY DriverKey, + OUT PTCHAR *MatchingDeviceID ) { - DWORD Values; - DWORD MaxInterfaceNameLength; - DWORD InterfaceNameLength; - PTCHAR InterfaceName; - DWORD Index; HRESULT Error; + DWORD MaxValueLength; + DWORD MatchingDeviceIDLength; + DWORD Type; + DWORD Index; - Error = RegQueryInfoKey(SubscriberKey, + Error = RegQueryInfoKey(DriverKey, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, - &Values, - &MaxInterfaceNameLength, NULL, + &MaxValueLength, NULL, NULL); if (Error != ERROR_SUCCESS) { @@ -1389,59 +1388,34 @@ SupportSubscriberInterfaces( goto fail1; } - if (Values == 0) - goto done; - - MaxInterfaceNameLength += sizeof (TCHAR); + MatchingDeviceIDLength = MaxValueLength + sizeof (TCHAR); - InterfaceNameLength = MaxInterfaceNameLength; - - InterfaceName = malloc(InterfaceNameLength); - if (InterfaceName == NULL) + *MatchingDeviceID = calloc(1, MatchingDeviceIDLength); + if (*MatchingDeviceID == NULL) goto fail2; - for (Index = 0; Index < Values; Index++) { - DWORD InterfaceNameLength; - DWORD Type; - DWORD Value; - DWORD ValueLength; - - InterfaceNameLength = MaxInterfaceNameLength; - memset(InterfaceName, 0, InterfaceNameLength); - - ValueLength = sizeof (DWORD); - - Error = RegEnumValue(SubscriberKey, - Index, - (LPTSTR)InterfaceName, - &InterfaceNameLength, - NULL, - &Type, - (LPBYTE)&Value, - &ValueLength); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail3; - } - - if (Type != REG_DWORD) { - SetLastError(ERROR_BAD_FORMAT); - goto fail4; - } + Error = RegQueryValueEx(DriverKey, + "MatchingDeviceId", + NULL, + &Type, + (LPBYTE)*MatchingDeviceID, + &MatchingDeviceIDLength); + if (Error != ERROR_SUCCESS) { + SetLastError(Error); + goto fail3; + } - if (!SupportInterfaceVersion(ProviderName, - InterfaceName, - Value)) - goto fail5; + if (Type != REG_SZ) { + SetLastError(ERROR_BAD_FORMAT); + goto fail4; } - free(InterfaceName); + for (Index = 0; Index < strlen(*MatchingDeviceID); Index++) + (*MatchingDeviceID)[Index] = (CHAR)toupper((*MatchingDeviceID)[Index]); -done: - return TRUE; + Log("%s", *MatchingDeviceID); -fail5: - Log("fail5"); + return TRUE; fail4: Log("fail4"); @@ -1449,8 +1423,8 @@ fail4: fail3: Log("fail3"); - free(InterfaceName); - + free(*MatchingDeviceID); + fail2: Log("fail2"); @@ -1469,51 +1443,40 @@ fail1: } static BOOLEAN -SupportRegisteredSubscribers( - IN PTCHAR ProviderName +SupportChildDrivers( + VOID ) { - TCHAR InterfacesKeyName[MAX_PATH]; - HKEY InterfacesKey; + BOOLEAN Success; + HKEY XenbusKey; + HRESULT Error; DWORD SubKeys; - DWORD MaxSubKeyNameLength; - DWORD Index; - DWORD SubKeyNameLength; + DWORD MaxSubKeyLength; + DWORD SubKeyLength; PTCHAR SubKeyName; - HKEY SubKey; - HRESULT Result; - HRESULT Error; + HKEY DeviceKey; + PTCHAR DriverKeyName; + HKEY DriverKey; + PTCHAR MatchingDeviceID; + DWORD Index; - Result = StringCbPrintf(InterfacesKeyName, - MAX_PATH, - "%s\\%s\\Interfaces", - SERVICES_KEY, - ProviderName); - if (!SUCCEEDED(Result)) { - SetLastError(ERROR_BUFFER_OVERFLOW); - goto fail1; - } + Log("====>"); - Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE, - InterfacesKeyName, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_ALL_ACCESS, - NULL, - &InterfacesKey, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; + Success = OpenBusKey("XENBUS", &XenbusKey); + if (!Success) { + // If there is no key then this must be a fresh installation + if (GetLastError() == ERROR_FILE_NOT_FOUND) + goto done; + + goto fail1; } - Error = RegQueryInfoKey(InterfacesKey, + Error = RegQueryInfoKey(XenbusKey, NULL, NULL, NULL, &SubKeys, - &MaxSubKeyNameLength, + &MaxSubKeyLength, NULL, NULL, NULL, @@ -1522,76 +1485,110 @@ SupportRegisteredSubscribers( NULL); if (Error != ERROR_SUCCESS) { SetLastError(Error); - goto fail3; + goto fail2; } - SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR); + SubKeyLength = MaxSubKeyLength + sizeof (TCHAR); - SubKeyName = malloc(SubKeyNameLength); + SubKeyName = malloc(SubKeyLength); if (SubKeyName == NULL) - goto fail4; + goto fail3; for (Index = 0; Index < SubKeys; Index++) { - SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR); - memset(SubKeyName, 0, SubKeyNameLength); + SubKeyLength = MaxSubKeyLength + sizeof (TCHAR); + memset(SubKeyName, 0, SubKeyLength); - Error = RegEnumKeyEx(InterfacesKey, + Error = RegEnumKeyEx(XenbusKey, Index, (LPTSTR)SubKeyName, - &SubKeyNameLength, + &SubKeyLength, NULL, NULL, NULL, NULL); if (Error != ERROR_SUCCESS) { SetLastError(Error); - goto fail5; + goto fail4; } - Error = RegOpenKeyEx(InterfacesKey, - SubKeyName, - 0, - KEY_READ, - &SubKey); - if (Error != ERROR_SUCCESS) + Success = OpenDeviceKey("XENBUS", SubKeyName, &DeviceKey); + if (!Success) + goto fail5; + + Success = GetDriverKeyName(DeviceKey, &DriverKeyName); + if (!Success) goto fail6; - if (!SupportSubscriberInterfaces(ProviderName, SubKey)) + if (DriverKeyName == NULL) + goto loop; + + Success = OpenDriverKey(DriverKeyName, &DriverKey); + if (!Success) goto fail7; - RegCloseKey(SubKey); + Success = GetMatchingDeviceID(DriverKey, &MatchingDeviceID); + if (!Success) + goto fail8; + + Success = SupportDeviceID(MatchingDeviceID); + if (!Success) + goto fail9; + + free(MatchingDeviceID); + + RegCloseKey(DriverKey); + + free(DriverKeyName); + + loop: + RegCloseKey(DeviceKey); } free(SubKeyName); - RegCloseKey(InterfacesKey); + RegCloseKey(XenbusKey); + +done: + Log("<===="); return TRUE; +fail9: + Log("fail9"); + + free(MatchingDeviceID); + +fail8: + Log("fail8"); + + RegCloseKey(DriverKey); + fail7: Log("fail7"); - RegCloseKey(SubKey); + free(DriverKeyName); fail6: Log("fail6"); + RegCloseKey(DeviceKey); + fail5: Log("fail5"); - free(SubKeyName); - fail4: Log("fail4"); - + + free(SubKeyName); + fail3: Log("fail3"); - RegCloseKey(InterfacesKey); - fail2: Log("fail2"); - + + RegCloseKey(XenbusKey); + fail1: Error = GetLastError(); @@ -1878,7 +1875,7 @@ SetFriendlyName( ) { PTCHAR Description; - DWORD Value; + unsigned int Value; TCHAR FriendlyName[MAX_PATH]; DWORD FriendlyNameLength; HRESULT Result; @@ -1945,176 +1942,6 @@ fail1: return FALSE; } -static HKEY -OpenInterfacesKey( - IN PTCHAR ProviderName - ) -{ - HRESULT Result; - TCHAR KeyName[MAX_PATH]; - HKEY Key; - HRESULT Error; - - Result = StringCbPrintf(KeyName, - MAX_PATH, - "%s\\%s\\Interfaces", - SERVICES_KEY, - ProviderName); - if (!SUCCEEDED(Result)) { - SetLastError(ERROR_BUFFER_OVERFLOW); - goto fail1; - } - - Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - KeyName, - 0, - KEY_ALL_ACCESS, - &Key); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; - } - - return Key; - -fail2: - Log("fail2"); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - Message = GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return NULL; -} - -static BOOLEAN -SubscribeInterface( - IN PTCHAR ProviderName, - IN PTCHAR SubscriberName, - IN PTCHAR InterfaceName, - IN DWORD InterfaceVersion - ) -{ - HKEY Key; - HKEY InterfacesKey; - HRESULT Error; - - InterfacesKey = OpenInterfacesKey(ProviderName); - if (InterfacesKey == NULL) - goto fail1; - - Error = RegCreateKeyEx(InterfacesKey, - SubscriberName, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_ALL_ACCESS, - NULL, - &Key, - NULL); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; - } - - Error = RegSetValueEx(Key, - InterfaceName, - 0, - REG_DWORD, - (const BYTE *)&InterfaceVersion, - sizeof(DWORD)); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail3; - } - - Log("%s: %s_%s_INTERFACE_VERSION %u", - SubscriberName, - ProviderName, - InterfaceName, - InterfaceVersion); - - RegCloseKey(Key); - RegCloseKey(InterfacesKey); - - return TRUE; - -fail3: - RegCloseKey(Key); - -fail2: - RegCloseKey(InterfacesKey); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - Message = GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - -#define SUBSCRIBE_INTERFACE(_ProviderName, _SubscriberName, _InterfaceName) \ - do { \ - (VOID) SubscribeInterface(#_ProviderName, \ - #_SubscriberName, \ - #_InterfaceName, \ - _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX); \ - } while (FALSE); - -static BOOLEAN -UnsubscribeInterfaces( - IN PTCHAR ProviderName, - IN PTCHAR SubscriberName - ) -{ - HKEY InterfacesKey; - HRESULT Error; - - Log("%s: %s", SubscriberName, ProviderName); - - InterfacesKey = OpenInterfacesKey(ProviderName); - if (InterfacesKey == NULL) { - goto fail1; - } - - Error = RegDeleteTree(InterfacesKey, - SubscriberName); - if (Error != ERROR_SUCCESS) { - SetLastError(Error); - goto fail2; - } - - RegCloseKey(InterfacesKey); - - return TRUE; - -fail2: - RegCloseKey(InterfacesKey); - -fail1: - Error = GetLastError(); - - { - PTCHAR Message; - Message = GetErrorMessage(Error); - Log("fail1 (%s)", Message); - LocalFree(Message); - } - - return FALSE; -} - static HRESULT DifInstallPreProcess( IN HDEVINFO DeviceInfoSet, @@ -2135,17 +1962,13 @@ DifInstallPreProcess( if (!Success) goto fail1; - Success = SupportRegisteredSubscribers("XENFILT"); + Success = SupportChildDrivers(); if (!Success) goto fail2; - Success = SupportRegisteredSubscribers("XENBUS"); - if (!Success) - goto fail3; - Success = GetActiveDeviceInstanceID(&DeviceID, &InstanceID); if (!Success) - goto fail4; + goto fail3; if (DeviceID == NULL) { assert(InstanceID == NULL); @@ -2153,11 +1976,11 @@ DifInstallPreProcess( Success = GetDeviceInstanceID(DeviceInfoSet, DeviceInfoData, &DeviceID, &InstanceID); if (!Success) - goto fail5; + goto fail4; Success = SetActiveDeviceInstanceID(DeviceID, InstanceID); if (!Success) - goto fail6; + goto fail5; } free(DeviceID); @@ -2167,15 +1990,12 @@ DifInstallPreProcess( return NO_ERROR; -fail6: - Log("fail6"); +fail5: + Log("fail5"); free(DeviceID); free(InstanceID); -fail5: - Log("fail5"); - fail4: Log("fail4"); @@ -2245,8 +2065,6 @@ DifInstallPostProcess( } if (Active) { - SUBSCRIBE_INTERFACE(XENFILT, XENBUS, UNPLUG); - (VOID) InstallFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT"); (VOID) InstallFilter(&GUID_DEVCLASS_HDC, "XENFILT"); (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData); @@ -2384,8 +2202,6 @@ DifRemovePreProcess( (VOID) RemoveFilter(&GUID_DEVCLASS_HDC, "XENFILT"); (VOID) RemoveFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT"); - - UnsubscribeInterfaces("XENFILT", "XENBUS"); } free(DeviceID); -- 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 |