|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Move interface subscription code into co-installer
Interface subscription is better handled at package installation time and
therefore the co-installer is the right place for it to live.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
src/coinst/coinst.c | 187 +++++++++++++++++++++++++++++
src/xenvif/fdo.c | 99 ++-------------
vs2012/xenvif_coinst/xenvif_coinst.vcxproj | 2 +-
vs2013/xenvif_coinst/xenvif_coinst.vcxproj | 2 +-
4 files changed, 199 insertions(+), 91 deletions(-)
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 0f6fc9f..bc3c214 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -35,6 +35,13 @@
#include <stdlib.h>
#include <strsafe.h>
+#include <debug_interface.h>
+#include <suspend_interface.h>
+#include <evtchn_interface.h>
+#include <store_interface.h>
+#include <range_set_interface.h>
+#include <cache_interface.h>
+#include <gnttab_interface.h>
#include <vif_interface.h>
#include <version.h>
@@ -742,6 +749,176 @@ 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 FORCEINLINE HRESULT
__DifInstallPreProcess(
IN HDEVINFO DeviceInfoSet,
@@ -793,6 +970,14 @@ __DifInstallPostProcess(
Log("====>");
+ SUBSCRIBE_INTERFACE(XENBUS, XENVIF, DEBUG);
+ SUBSCRIBE_INTERFACE(XENBUS, XENVIF, SUSPEND);
+ SUBSCRIBE_INTERFACE(XENBUS, XENVIF, EVTCHN);
+ SUBSCRIBE_INTERFACE(XENBUS, XENVIF, STORE);
+ SUBSCRIBE_INTERFACE(XENBUS, XENVIF, RANGE_SET);
+ SUBSCRIBE_INTERFACE(XENBUS, XENVIF, CACHE);
+ SUBSCRIBE_INTERFACE(XENBUS, XENVIF, GNTTAB);
+
(VOID) InstallUnplugService("NICS", "XENVIF");
Log("<====");
@@ -871,6 +1056,8 @@ __DifRemovePreProcess(
(VOID) RemoveUnplugService("NICS", "XENVIF");
+ UnsubscribeInterfaces("XENBUS", "XENVIF");
+
Log("<====");
return NO_ERROR;
diff --git a/src/xenvif/fdo.c b/src/xenvif/fdo.c
index d57b10d..2f2e6bd 100644
--- a/src/xenvif/fdo.c
+++ b/src/xenvif/fdo.c
@@ -2606,13 +2606,9 @@ __FdoReleaseLowerBusInterface(
RtlZeroMemory(BusInterface, sizeof (BUS_INTERFACE_STANDARD));
}
-#define SERVICES_KEY
L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services"
-
-static FORCEINLINE NTSTATUS
-__FdoQueryInterface(
+static NTSTATUS
+FdoQueryInterface(
IN PXENVIF_FDO Fdo,
- IN const WCHAR *ProviderName,
- IN const CHAR *InterfaceName,
IN const GUID *Guid,
IN ULONG Version,
OUT PINTERFACE Interface,
@@ -2620,9 +2616,6 @@ __FdoQueryInterface(
IN BOOLEAN Optional
)
{
- UNICODE_STRING Unicode;
- HANDLE InterfacesKey;
- HANDLE SubscriberKey;
KEVENT Event;
IO_STATUS_BLOCK StatusBlock;
PIRP Irp;
@@ -2631,38 +2624,6 @@ __FdoQueryInterface(
ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
- Unicode.MaximumLength = (USHORT)((wcslen(SERVICES_KEY) +
- 1 +
- wcslen(ProviderName) +
- 1 +
- wcslen(L"Interfaces") +
- 1) * sizeof (WCHAR));
-
- Unicode.Buffer = __FdoAllocate(Unicode.MaximumLength);
-
- status = STATUS_NO_MEMORY;
- if (Unicode.Buffer == NULL)
- goto fail1;
-
- status = RtlStringCbPrintfW(Unicode.Buffer,
- Unicode.MaximumLength,
- SERVICES_KEY L"\\%ws\\Interfaces",
- ProviderName);
- ASSERT(NT_SUCCESS(status));
-
- Unicode.Length = (USHORT)(wcslen(Unicode.Buffer) * sizeof (WCHAR));
-
- status = RegistryOpenKey(NULL, &Unicode, KEY_READ, &InterfacesKey);
- if (!NT_SUCCESS(status))
- goto fail2;
-
- status = RegistryCreateSubKey(InterfacesKey,
- "XENVIF",
- REG_OPTION_NON_VOLATILE,
- &SubscriberKey);
- if (!NT_SUCCESS(status))
- goto fail3;
-
KeInitializeEvent(&Event, NotificationEvent, FALSE);
RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
@@ -2676,7 +2637,7 @@ __FdoQueryInterface(
status = STATUS_UNSUCCESSFUL;
if (Irp == NULL)
- goto fail4;
+ goto fail1;
StackLocation = IoGetNextIrpStackLocation(Irp);
StackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
@@ -2702,45 +2663,15 @@ __FdoQueryInterface(
if (status == STATUS_NOT_SUPPORTED && Optional)
goto done;
- goto fail5;
+ goto fail2;
}
- status = RegistryUpdateDwordValue(SubscriberKey,
- (PCHAR)InterfaceName,
- Version);
- if (!NT_SUCCESS(status))
- goto fail6;
-
done:
- RegistryCloseKey(SubscriberKey);
-
- RegistryCloseKey(InterfacesKey);
-
- __FdoFree(Unicode.Buffer);
-
return STATUS_SUCCESS;
-fail6:
- Error("fail6\n");
-
-fail5:
- Error("fail5\n");
-
-fail4:
- Error("fail4\n");
-
- RegistryCloseKey(SubscriberKey);
-
-fail3:
- Error("fail3\n");
-
- RegistryCloseKey(InterfacesKey);
-
fail2:
Error("fail2\n");
- __FdoFree(Unicode.Buffer);
-
fail1:
Error("fail1 (%08x)\n", status);
@@ -2751,18 +2682,15 @@ fail1:
_Fdo,
\
_ProviderName,
\
_InterfaceName,
\
- _Version,
\
_Interface,
\
_Size,
\
_Optional)
\
- __FdoQueryInterface((_Fdo),
\
- L ## #_ProviderName,
\
- #_InterfaceName,
\
- &GUID_ ## _ProviderName ## _ ## _InterfaceName ##
_INTERFACE, \
- (_Version),
\
- (_Interface),
\
- (_Size),
\
- (_Optional))
+ FdoQueryInterface((_Fdo),
\
+ &GUID_ ## _ProviderName ## _ ## _InterfaceName ##
_INTERFACE, \
+ _ProviderName ## _ ## _InterfaceName ##
_INTERFACE_VERSION_MAX, \
+ (_Interface),
\
+ (_Size),
\
+ (_Optional))
#define DEFINE_FDO_GET_INTERFACE(_Interface, _Type) \
VOID \
@@ -2854,7 +2782,6 @@ FdoCreate(
status = FDO_QUERY_INTERFACE(Fdo,
XENBUS,
DEBUG,
- XENBUS_DEBUG_INTERFACE_VERSION_MAX,
(PINTERFACE)&Fdo->DebugInterface,
sizeof (Fdo->DebugInterface),
FALSE);
@@ -2864,7 +2791,6 @@ FdoCreate(
status = FDO_QUERY_INTERFACE(Fdo,
XENBUS,
SUSPEND,
- XENBUS_SUSPEND_INTERFACE_VERSION_MAX,
(PINTERFACE)&Fdo->SuspendInterface,
sizeof (Fdo->SuspendInterface),
FALSE);
@@ -2874,7 +2800,6 @@ FdoCreate(
status = FDO_QUERY_INTERFACE(Fdo,
XENBUS,
EVTCHN,
- XENBUS_EVTCHN_INTERFACE_VERSION_MAX,
(PINTERFACE)&Fdo->EvtchnInterface,
sizeof (Fdo->EvtchnInterface),
FALSE);
@@ -2884,7 +2809,6 @@ FdoCreate(
status = FDO_QUERY_INTERFACE(Fdo,
XENBUS,
STORE,
- XENBUS_STORE_INTERFACE_VERSION_MAX,
(PINTERFACE)&Fdo->StoreInterface,
sizeof (Fdo->StoreInterface),
FALSE);
@@ -2894,7 +2818,6 @@ FdoCreate(
status = FDO_QUERY_INTERFACE(Fdo,
XENBUS,
RANGE_SET,
- XENBUS_RANGE_SET_INTERFACE_VERSION_MAX,
(PINTERFACE)&Fdo->RangeSetInterface,
sizeof (Fdo->RangeSetInterface),
FALSE);
@@ -2904,7 +2827,6 @@ FdoCreate(
status = FDO_QUERY_INTERFACE(Fdo,
XENBUS,
CACHE,
- XENBUS_CACHE_INTERFACE_VERSION_MAX,
(PINTERFACE)&Fdo->CacheInterface,
sizeof (Fdo->CacheInterface),
FALSE);
@@ -2914,7 +2836,6 @@ FdoCreate(
status = FDO_QUERY_INTERFACE(Fdo,
XENBUS,
GNTTAB,
- XENBUS_GNTTAB_INTERFACE_VERSION_MAX,
(PINTERFACE)&Fdo->GnttabInterface,
sizeof (Fdo->GnttabInterface),
FALSE);
diff --git a/vs2012/xenvif_coinst/xenvif_coinst.vcxproj
b/vs2012/xenvif_coinst/xenvif_coinst.vcxproj
index c95a12f..1eb1ea3 100644
--- a/vs2012/xenvif_coinst/xenvif_coinst.vcxproj
+++ b/vs2012/xenvif_coinst/xenvif_coinst.vcxproj
@@ -36,7 +36,7 @@
<ClCompile>
<PreprocessorDefinitions>__MODULE__="XENVIF_COINST";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>EnableAllWarnings</WarningLevel>
-
<DisableSpecificWarnings>4548;4820;4668;4255;6001;6054;28196;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+
<DisableSpecificWarnings>4127;4548;4820;4668;4255;6001;6054;28196;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnablePREfast>true</EnablePREfast>
<RuntimeLibrary
Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary>
diff --git a/vs2013/xenvif_coinst/xenvif_coinst.vcxproj
b/vs2013/xenvif_coinst/xenvif_coinst.vcxproj
index bfc1b4d..5624389 100644
--- a/vs2013/xenvif_coinst/xenvif_coinst.vcxproj
+++ b/vs2013/xenvif_coinst/xenvif_coinst.vcxproj
@@ -68,7 +68,7 @@
<ClCompile>
<PreprocessorDefinitions>__MODULE__="XENVIF_COINST";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>EnableAllWarnings</WarningLevel>
-
<DisableSpecificWarnings>4548;4820;4668;4255;6001;6054;28196;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+
<DisableSpecificWarnings>4127;4548;4820;4668;4255;6001;6054;28196;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<EnablePREfast>true</EnablePREfast>
<RuntimeLibrary
Condition="'$(UseDebugLibraries)'=='true'">MultiThreadedDebug</RuntimeLibrary>
--
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 |