[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] [RFC] Interface compatibility example - for comment.


  • To: <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Martin Harvey <Martin.Harvey@xxxxxxxxxx>
  • Date: Wed, 7 Sep 2022 13:23:28 +0100
  • Authentication-results: esa4.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
  • Cc: Martin Harvey <Martin.Harvey@xxxxxxxxxx>, Martin Harvey <martin.harvey@xxxxxxxxxx>
  • Delivery-date: Wed, 07 Sep 2022 12:24:03 +0000
  • Ironport-data: A9a23:IT49LqPxxTgb/CHvrR3pl8FynXyQoLVcMsEvi/4bfWQNrUoqhDZSz 2cbDWqOPPiDYTOgLd9+bt/ipEoH6pbcn4IyQQto+SlhQUwRpJueD7x1DKtR0wB+jCHnZBg6h ynLQoCYdKjYdleF+lH3dOCJQUBUjcmgXqD7BPPPJhd/TAplTDZJoR94kqsyj5UAbeKRWmthg vuv5ZyEULOZ82QsaDhMuvrc8EkHUMna41v0gHRvPZing3eG/5UlJMp3Db28KXL+Xr5VEoaSL woU5Ojklo9x105F5uKNyt4XQGVTKlLhFVHmZk5tc7qjmnB/Shkaic7XAha+hXB/0F1ll/gpo DlEWAfZpQ0BZsUgk8xFO/VU/r0X0QSrN9YrLFDm2fF/wXEqfFPgmO5RA0gRALdD3fxZATpk+ 84INWokO0Xra+KemNpXS8Fpj8UnasLqIJkeqjdryjSx4fQOGM6ZBf+QvJkBgWl21psm8fX2P qL1bRJqZQ7cYhsJOl4NFp8vtOypmmP+Y3tTr1f9Sa8fszKPk10qi+aF3Nz9XefbRdoExGOj/ EHL3DjlIjAjJeGRxm/Qmp6rrrCWxn6qMG4IL5Wn9/gvmEPWymENBRk+UVqgveL/mkO4Q8hYK UEf5mwpt6dayaCwZoCjBVvi+ifC50NCHYoLewEn1O2T4qaP+DmWD085dGVmcvIm7+U4dyw3j HbcyrsFGgdTXK2ppWO1r+nK927uZXlNcgfudgdfE1JbvoCLTJUby0uWE409SPPdYsjdQ2mY/ tyckMQpa1z/Z+Yv3r7zw13IiinESnPhHl9svVW/so5IA2pEiG+Zi2+AswKzAQ5odtrxc7V4l CFsdzKixO4PF4qRsyeGXf8AGrqkj97cbmOG3Q4+RMh4r2nxk5JGQWy3yGgnTHqFz+5eIWO5C KMtkVg5CGBv0IuCMvYsPtPZ5zUCxqn8D9X1Ps3pgi51SsEoLGe6ENRGPxH4M5bFzBdxysnS+ P6zLa6RMJrtIf83kGXmGr9FjtfGBEkWnAvueHwy9Dz/uZL2WZJfYe1t3IemBgzh0J65nQ==
  • Ironport-hdrordr: A9a23:cMM+eauUZu2bSN9Kka4f79BU7skDetV00zEX/kB9WHVpmszxra 6TdZMgpHvJYVcqKRcdcL+7WJVoLUmxyXcX2/h1AV7BZniEhILAFugLhuGO/9SJIVyYygc378 ZdmsZFZ+EYdWIK7/rH3A==
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>

This patch is an example of implementing *client-side* interface
compatibility, in addition to the existing server-side mechanism.

Two-way interface compatiblity would reduce the number of cases
where we need to increment the Device-ID, which is likely to
reduce the frequency of upgrade problems, and/or lost IP configuration.

Further details on exact compatibility and upgrade cases solved by this
pending (tests currently in progress).

Signed-off-by: Martin Harvey <martin.harvey@xxxxxxxxxx>
---
 include/cache_interface.h                |   2 +-
 include/evtchn_interface.h               |   2 +-
 include/gnttab_interface.h               |   2 +-
 include/interface_compat.h               | 119 +++++++++++++++++++++++
 include/interface_compat_xeniface.h      |  81 +++++++++++++++
 include/shared_info_interface.h          |   2 +-
 include/store_interface.h                |   2 +-
 include/suspend_interface.h              |   2 +-
 src/xeniface/fdo.c                       |  70 +++++--------
 src/xeniface/fdo.h                       |  13 +--
 src/xeniface/interface_compat.c          | 117 ++++++++++++++++++++++
 src/xeniface/interface_compat_xeniface.c |  68 +++++++++++++
 vs2015/xeniface/xeniface.vcxproj         |   2 +
 vs2017/xeniface/xeniface.vcxproj         |   2 +
 vs2019/xeniface/xeniface.vcxproj         |   2 +
 15 files changed, 430 insertions(+), 56 deletions(-)
 create mode 100644 include/interface_compat.h
 create mode 100644 include/interface_compat_xeniface.h
 create mode 100644 src/xeniface/interface_compat.c
 create mode 100644 src/xeniface/interface_compat_xeniface.c

diff --git a/include/cache_interface.h b/include/cache_interface.h
index 048e06b..48e0809 100644
--- a/include/cache_interface.h
+++ b/include/cache_interface.h
@@ -253,7 +253,7 @@ typedef struct _XENBUS_CACHE_INTERFACE_V2 
XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE
     \brief Macro at assist in method invocation
 */
 #define XENBUS_CACHE(_Method, _Interface, ...)    \
-    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+    (_Interface)->CompatInterface.Cache ## 
_Method((PINTERFACE)(&(_Interface)->CompatInterface), __VA_ARGS__)
 
 #endif  // _WINDLL
 
diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
index dbe8745..6eee5bd 100644
--- a/include/evtchn_interface.h
+++ b/include/evtchn_interface.h
@@ -350,7 +350,7 @@ typedef struct _XENBUS_EVTCHN_INTERFACE_V9 
XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVT
     \brief Macro at assist in method invocation
 */
 #define XENBUS_EVTCHN(_Method, _Interface, ...)    \
-    (_Interface)->Evtchn ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+    (_Interface)->CompatInterface.Evtchn ## 
_Method((PINTERFACE)(&(_Interface)->CompatInterface), __VA_ARGS__)
 
 #endif  // _WINDLL
 
diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h
index 865c4f3..09fa970 100644
--- a/include/gnttab_interface.h
+++ b/include/gnttab_interface.h
@@ -292,7 +292,7 @@ typedef struct _XENBUS_GNTTAB_INTERFACE_V4 
XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNT
     \brief Macro at assist in method invocation
 */
 #define XENBUS_GNTTAB(_Method, _Interface, ...)    \
-    (_Interface)->Gnttab ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+    (_Interface)->CompatInterface.Gnttab ## 
_Method((PINTERFACE)(&(_Interface)->CompatInterface), __VA_ARGS__)
 
 #endif  // _WINDLL
 
diff --git a/include/interface_compat.h b/include/interface_compat.h
new file mode 100644
index 0000000..c91ceb6
--- /dev/null
+++ b/include/interface_compat.h
@@ -0,0 +1,119 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*! \file interface_compat.h
+    \brief Common interface compatibility functions, allowing for client side 
stubbing and xlation of interfaces.
+*/
+
+#ifndef _INTERFACE_COMPAT_H
+#define _INTERFACE_COMPAT_H
+
+struct _XEN_INTERFACE_COMPAT{
+    PINTERFACE          ImportedInterface;
+    ULONG               ImportedInterfaceMaxSize;
+    PINTERFACE          CompatInterface;
+    ULONG               CompatInterfaceMaxSize;
+};
+
+typedef struct _XEN_INTERFACE_COMPAT XEN_INTERFACE_COMPAT, 
*PXEN_INTERFACE_COMPAT;
+
+#define DEFINE_COMPAT_STRUCT(_ProviderName,_InterfaceName)                     
                                                  \
+                                                                               
                                                  \
+typedef struct _ ## _ProviderName ## _ ## _InterfaceName ##_INTERFACE_COMPAT { 
                                                  \
+    XEN_INTERFACE_COMPAT                                            Compat;    
                                                  \
+    _ProviderName ## _ ## _InterfaceName ## _INTERFACE              
ImportedInterface;                                           \
+    _ProviderName ## _ ## _InterfaceName ## _INTERFACE              
CompatInterface;                                             \
+} _ProviderName ## _ ## _InterfaceName ## _INTERFACE_COMPAT, *P ## 
_ProviderName ## _ ## _InterfaceName ## _INTERFACE_COMPAT;
+
+#define DECL_COMPAT_INIT(_ProviderName,_InterfaceName)                         
                                                  \
+VOID  _ProviderName ## ## _ ## _InterfaceName ## _ ## CompatInit (             
                                                  \
+    IN OUT PXEN_INTERFACE_COMPAT   IntfCompat                                  
                                                  \
+);
+
+#define IMPL_COMPAT_INIT(_ProviderName,_InterfaceName)                         
                                                  \
+VOID  _ProviderName ## ## _ ## _InterfaceName ## _ ## CompatInit (             
                                                  \
+    IN OUT PXEN_INTERFACE_COMPAT   IntfCompat                                  
                                                  \
+) {                                                                            
                                                  \
+    P ## _ProviderName ## _ ## _InterfaceName ## _INTERFACE_COMPAT FullCompat; 
                                                  \
+        FullCompat = (P ## _ProviderName ## _ ## _InterfaceName ## 
_INTERFACE_COMPAT) IntfCompat;                                \
+    FullCompat->Compat.ImportedInterface = 
(PINTERFACE)&FullCompat->ImportedInterface;                                     
      \
+    FullCompat->Compat.ImportedInterfaceMaxSize = 
sizeof(FullCompat->ImportedInterface);                                         \
+    FullCompat->Compat.CompatInterface = 
(PINTERFACE)&FullCompat->CompatInterface;                                       
        \
+    FullCompat->Compat.CompatInterfaceMaxSize = 
sizeof(FullCompat->CompatInterface);                                            
 \
+    RtlZeroMemory(&FullCompat->ImportedInterface, 
sizeof(FullCompat->ImportedInterface));                                        \
+    RtlZeroMemory(&FullCompat->CompatInterface, 
sizeof(FullCompat->CompatInterface));                                           
 \
+}
+
+#define DECL_FIXUP(_ProviderName, _InterfaceName)                              
                                                  \
+NTSTATUS  _ProviderName ## _ ## _InterfaceName ## _ ## CompatFixup (           
                                                  \
+    IN OUT PXEN_INTERFACE_COMPAT   IntfCompat                                  
                                                  \
+);
+
+#define IMPL_NULL_FIXUP(_ProviderName, _InterfaceName)                         
                                                  \
+NTSTATUS  _ProviderName ## _ ##_InterfaceName ## _ ## CompatFixup (            
                                                  \
+    IN OUT PXEN_INTERFACE_COMPAT   IntfCompat                                  
                                                  \
+) {                                                                            
                                                  \
+    UNREFERENCED_PARAMETER(IntfCompat);                                        
                                                  \
+    return STATUS_INTERNAL_ERROR;                                              
                                                  \
+}
+
+/* Encapsulated query function */
+typedef NTSTATUS (*XEN_COMPAT_QUERY_FUNC) (
+    IN  PVOID           Fdo,                /* e.g. PXENIFACE_FDO, 
PXENVIF_FDO, etc. */
+    IN  const GUID      *Guid,              /* As in existing Query for 
interface functions ... */
+    IN  ULONG           Version,
+    OUT PINTERFACE      Interface,
+    IN  ULONG           Size,
+    IN  BOOLEAN         Optional
+    );
+
+/* Helper fixup function */
+typedef NTSTATUS (*XEN_COMPAT_FIXUP_FUNC) (
+    IN OUT PXEN_INTERFACE_COMPAT    IntfCompat
+    );
+
+/* Helper init function */
+typedef VOID  (*XEN_COMPAT_INIT_FUNC) (
+    IN OUT PXEN_INTERFACE_COMPAT   IntfCompat
+);
+
+NTSTATUS FdoQueryInterfaceCompat(
+    IN  XEN_COMPAT_INIT_FUNC    CompatInit,
+    IN  XEN_COMPAT_QUERY_FUNC   InterfaceQuery,
+    IN  XEN_COMPAT_FIXUP_FUNC   CompatFixup,
+    IN  PVOID                   FdoStruct,
+    IN  const GUID              *Guid,
+    IN  ULONG                   VersionMax,
+    IN  ULONG                   VersionMin,
+    IN  BOOLEAN                 Optional,
+    IN OUT PXEN_INTERFACE_COMPAT IntfCompat);
+
+#endif
\ No newline at end of file
diff --git a/include/interface_compat_xeniface.h 
b/include/interface_compat_xeniface.h
new file mode 100644
index 0000000..7f45a17
--- /dev/null
+++ b/include/interface_compat_xeniface.h
@@ -0,0 +1,81 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*! \file interface_compat_xeniface.h
+    \brief Xeniface specific interface compatibility functions.
+*/
+
+#ifndef _INTERFACE_COMPAT_XENIFACE_H
+#define _INTERFACE_COMPAT_XENIFACE_H
+
+#include <interface_compat.h>
+#include <store_interface.h>
+#include <suspend_interface.h>
+#include <shared_info_interface.h>
+#include <evtchn_interface.h>
+#include <gnttab_interface.h>
+
+#define FDO_QUERY_INTERFACE_COMPAT(                                            
         \
+    _Fdo,                                                                      
         \
+    _ProviderName,                                                             
         \
+    _InterfaceName,                                                            
         \
+    _Optional,                                                                 
         \
+    _Compat)                                                                   
         \
+    FdoQueryInterfaceCompat(                                                   
         \
+                      _ProviderName ## _ ## _InterfaceName ## _ ## CompatInit, 
         \
+                      FdoQueryInterface,                                       
         \
+                      _ProviderName ## _ ## _InterfaceName ## _ ## 
CompatFixup,         \
+                      (_Fdo),                                                  
         \
+                      &GUID_ ## _ProviderName ## _ ## _InterfaceName ## 
_INTERFACE,     \
+                      _ProviderName ## _ ## _InterfaceName ## 
_INTERFACE_VERSION_MAX,   \
+                      _ProviderName ## _ ## _InterfaceName ## 
_INTERFACE_VERSION_MIN,   \
+                      (_Optional),                                             
         \
+                      &(_Compat)->Compat)
+
+DEFINE_COMPAT_STRUCT(XENBUS, STORE);            /* 
XENBUS_STORE_INTERFACE_COMPAT */
+DEFINE_COMPAT_STRUCT(XENBUS, SUSPEND);          /* 
XENBUS_SUSPEND_INTERFACE_COMPAT */
+DEFINE_COMPAT_STRUCT(XENBUS, SHARED_INFO);      /* 
XENBUS_SHARED_INFO_INTERFACE_COMPAT */
+DEFINE_COMPAT_STRUCT(XENBUS, EVTCHN);           /* 
XENBUS_EVTCHN_INTERFACE_COMPAT */
+DEFINE_COMPAT_STRUCT(XENBUS, GNTTAB);           /* 
XENBUS_GNTTAB_INTERFACE_COMPAT */
+
+DECL_COMPAT_INIT(XENBUS, STORE);
+DECL_COMPAT_INIT(XENBUS, SUSPEND);
+DECL_COMPAT_INIT(XENBUS, SHARED_INFO);
+DECL_COMPAT_INIT(XENBUS, EVTCHN);
+DECL_COMPAT_INIT(XENBUS, GNTTAB);
+
+DECL_FIXUP(XENBUS, STORE);
+DECL_FIXUP(XENBUS, SUSPEND);
+DECL_FIXUP(XENBUS, SHARED_INFO);
+DECL_FIXUP(XENBUS, EVTCHN);
+DECL_FIXUP(XENBUS, GNTTAB);
+
+#endif
\ No newline at end of file
diff --git a/include/shared_info_interface.h b/include/shared_info_interface.h
index 27910b0..fba90c7 100644
--- a/include/shared_info_interface.h
+++ b/include/shared_info_interface.h
@@ -200,7 +200,7 @@ typedef struct _XENBUS_SHARED_INFO_INTERFACE_V4 
XENBUS_SHARED_INFO_INTERFACE, *P
     \brief Macro at assist in method invocation
 */
 #define XENBUS_SHARED_INFO(_Method, _Interface, ...)    \
-    (_Interface)->SharedInfo ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+    (_Interface)->CompatInterface.SharedInfo ## 
_Method((PINTERFACE)(&(_Interface)->CompatInterface), __VA_ARGS__)
 
 #endif  // _WINDLL
 
diff --git a/include/store_interface.h b/include/store_interface.h
index e1251dd..084da60 100644
--- a/include/store_interface.h
+++ b/include/store_interface.h
@@ -317,7 +317,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V2 
XENBUS_STORE_INTERFACE, *PXENBUS_STORE
     \brief Macro at assist in method invocation
 */
 #define XENBUS_STORE(_Method, _Interface, ...)    \
-    (_Interface)->Store ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+    (_Interface)->CompatInterface.Store ## 
_Method((PINTERFACE)(&(_Interface)->CompatInterface), __VA_ARGS__)
 
 #endif  // _WINDLL
 
diff --git a/include/suspend_interface.h b/include/suspend_interface.h
index cbe11ab..6fdb777 100644
--- a/include/suspend_interface.h
+++ b/include/suspend_interface.h
@@ -166,7 +166,7 @@ typedef struct _XENBUS_SUSPEND_INTERFACE_V1 
XENBUS_SUSPEND_INTERFACE, *PXENBUS_S
     \brief Macro at assist in method invocation
 */
 #define XENBUS_SUSPEND(_Method, _Interface, ...)    \
-    (_Interface)-> ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+    (_Interface)->CompatInterface. ## 
_Method((PINTERFACE)(&(_Interface)->CompatInterface), __VA_ARGS__)
 
 #endif  // _WINDLL
 
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 6aabf96..cb16477 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -55,6 +55,7 @@
 #include "wmi.h"
 #include "xeniface_ioctls.h"
 #include "irp_queue.h"
+#include "interface_compat_xeniface.h"
 
 #define FDO_POOL 'ODF'
 
@@ -2447,20 +2448,6 @@ fail1:
     return status;
 }
 
-#define FDO_QUERY_INTERFACE(                                                   
         \
-    _Fdo,                                                                      
         \
-    _ProviderName,                                                             
         \
-    _InterfaceName,                                                            
         \
-    _Interface,                                                                
         \
-    _Size,                                                                     
         \
-    _Optional)                                                                 
         \
-    FdoQueryInterface((_Fdo),                                                  
         \
-                      &GUID_ ## _ProviderName ## _ ## _InterfaceName ## 
_INTERFACE,     \
-                      _ProviderName ## _ ## _InterfaceName ## 
_INTERFACE_VERSION_MAX,   \
-                      (_Interface),                                            
         \
-                      (_Size),                                                 
         \
-                      (_Optional))
-
 NTSTATUS
 FdoCreate(
     IN  PDEVICE_OBJECT  PhysicalDeviceObject
@@ -2535,48 +2522,43 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail7;
 
-    status = FDO_QUERY_INTERFACE(Fdo,
+    status = FDO_QUERY_INTERFACE_COMPAT(Fdo,
                                  XENBUS,
                                  SUSPEND,
-                                 (PINTERFACE)&Fdo->SuspendInterface,
-                                 sizeof (Fdo->SuspendInterface),
-                                 FALSE);
+                                 FALSE,
+                                 &Fdo->SuspendInterface);
     if (!NT_SUCCESS(status))
         goto fail8;
 
-    status = FDO_QUERY_INTERFACE(Fdo,
+    status = FDO_QUERY_INTERFACE_COMPAT(Fdo,
                                  XENBUS,
                                  SHARED_INFO,
-                                 (PINTERFACE)&Fdo->SharedInfoInterface,
-                                 sizeof (Fdo->SharedInfoInterface),
-                                 FALSE);
+                                 FALSE,
+                                 &Fdo->SharedInfoInterface);
     if (!NT_SUCCESS(status))
         goto fail9;
 
-    status = FDO_QUERY_INTERFACE(Fdo,
+    status = FDO_QUERY_INTERFACE_COMPAT(Fdo,
                                  XENBUS,
                                  STORE,
-                                 (PINTERFACE)&Fdo->StoreInterface,
-                                 sizeof (Fdo->StoreInterface),
-                                 FALSE);
+                                 FALSE,
+                                 &Fdo->StoreInterface);
     if (!NT_SUCCESS(status))
         goto fail10;
 
-    status = FDO_QUERY_INTERFACE(Fdo,
+    status = FDO_QUERY_INTERFACE_COMPAT(Fdo,
                                  XENBUS,
                                  EVTCHN,
-                                 (PINTERFACE)&Fdo->EvtchnInterface,
-                                 sizeof (Fdo->EvtchnInterface),
-                                 FALSE);
+                                 FALSE,
+                                 &Fdo->EvtchnInterface);
     if (!NT_SUCCESS(status))
         goto fail11;
 
-    status = FDO_QUERY_INTERFACE(Fdo,
+    status = FDO_QUERY_INTERFACE_COMPAT(Fdo,
                                  XENBUS,
                                  GNTTAB,
-                                 (PINTERFACE)&Fdo->GnttabInterface,
-                                 sizeof (Fdo->GnttabInterface),
-                                 FALSE);
+                                 FALSE,
+                                 &Fdo->GnttabInterface);
     if (!NT_SUCCESS(status))
         goto fail12;
 
@@ -2662,31 +2644,31 @@ fail13:
     Error("fail13\n");
 
     RtlZeroMemory(&Fdo->GnttabInterface,
-                  sizeof (XENBUS_GNTTAB_INTERFACE));
+                  sizeof (Fdo->GnttabInterface));
 
 fail12:
     Error("fail12\n");
 
     RtlZeroMemory(&Fdo->EvtchnInterface,
-                  sizeof (XENBUS_EVTCHN_INTERFACE));
+                  sizeof (Fdo->EvtchnInterface));
 
 fail11:
     Error("fail11\n");
 
     RtlZeroMemory(&Fdo->StoreInterface,
-                  sizeof (XENBUS_STORE_INTERFACE));
+                  sizeof (Fdo->StoreInterface));
 
 fail10:
     Error("fail10\n");
 
     RtlZeroMemory(&Fdo->SharedInfoInterface,
-                  sizeof (XENBUS_SHARED_INFO_INTERFACE));
+                  sizeof (Fdo->SharedInfoInterface));
 
 fail9:
     Error("fail8\n");
 
     RtlZeroMemory(&Fdo->SuspendInterface,
-                  sizeof (XENBUS_SUSPEND_INTERFACE));
+                  sizeof (Fdo->SuspendInterface));
 
 fail8:
     Error("fail8\n");
@@ -2780,19 +2762,19 @@ FdoDestroy(
     Fdo->InterfacesAcquired = FALSE;
 
     RtlZeroMemory(&Fdo->GnttabInterface,
-                  sizeof (XENBUS_GNTTAB_INTERFACE));
+                  sizeof (Fdo->GnttabInterface));
 
     RtlZeroMemory(&Fdo->EvtchnInterface,
-                  sizeof (XENBUS_EVTCHN_INTERFACE));
+                  sizeof (Fdo->EvtchnInterface));
 
     RtlZeroMemory(&Fdo->StoreInterface,
-                  sizeof (XENBUS_STORE_INTERFACE));
+                  sizeof (Fdo->StoreInterface));
 
     RtlZeroMemory(&Fdo->SharedInfoInterface,
-                  sizeof (XENBUS_SHARED_INFO_INTERFACE));
+                  sizeof (Fdo->SharedInfoInterface));
 
     RtlZeroMemory(&Fdo->SuspendInterface,
-                  sizeof (XENBUS_SUSPEND_INTERFACE));
+                  sizeof (Fdo->SuspendInterface));
 
     ThreadAlert(Fdo->registryThread);
     ThreadJoin(Fdo->registryThread);
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 1fedc09..7f3f237 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -38,6 +38,7 @@
 #include <gnttab_interface.h>
 #include <suspend_interface.h>
 #include <shared_info_interface.h>
+#include <interface_compat_xeniface.h>
 
 #include "driver.h"
 #include "types.h"
@@ -75,12 +76,12 @@ typedef struct _XENIFACE_FDO {
 
     FDO_RESOURCE                    Resource[RESOURCE_COUNT];
 
-    XENBUS_STORE_INTERFACE          StoreInterface;
-    XENBUS_SUSPEND_INTERFACE        SuspendInterface;
-    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
-    XENBUS_EVTCHN_INTERFACE         EvtchnInterface;
-    XENBUS_GNTTAB_INTERFACE         GnttabInterface;
-    PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
+    XENBUS_STORE_INTERFACE_COMPAT           StoreInterface;
+    XENBUS_SUSPEND_INTERFACE_COMPAT         SuspendInterface;
+    XENBUS_SHARED_INFO_INTERFACE_COMPAT     SharedInfoInterface;
+    XENBUS_EVTCHN_INTERFACE_COMPAT          EvtchnInterface;
+    XENBUS_GNTTAB_INTERFACE_COMPAT          GnttabInterface;
+    PXENBUS_SUSPEND_CALLBACK                SuspendCallbackLate;
 
     BOOLEAN                         InterfacesAcquired;
 
diff --git a/src/xeniface/interface_compat.c b/src/xeniface/interface_compat.c
new file mode 100644
index 0000000..794eac5
--- /dev/null
+++ b/src/xeniface/interface_compat.c
@@ -0,0 +1,117 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*! \file interface_compat.c
+    \brief Common interface compatibility functions, allowing for client side 
stubbing and xlation of interfaces.
+*/
+
+#include <ntifs.h>
+#include "interface_compat.h"
+#include "log.h"
+
+NTSTATUS FdoQueryInterfaceCompat(
+    IN  XEN_COMPAT_INIT_FUNC    CompatInit,
+    IN  XEN_COMPAT_QUERY_FUNC   InterfaceQuery,
+    IN  XEN_COMPAT_FIXUP_FUNC   CompatFixup,
+    IN  PVOID                   FdoStruct,
+    IN  const GUID              *Guid,
+    IN  ULONG                   VersionMax,
+    IN  ULONG                   VersionMin,
+    IN  BOOLEAN                 Optional,
+    IN OUT PXEN_INTERFACE_COMPAT IntfCompat)
+{
+    NTSTATUS status = STATUS_INVALID_PARAMETER;
+    ULONG QueryVersion;
+
+    if ((CompatInit == NULL) ||
+        (InterfaceQuery == NULL) ||
+        (CompatFixup == NULL) ||
+        (IntfCompat == NULL) ||
+        (VersionMin > VersionMax))
+        goto fail1;
+
+    CompatInit(IntfCompat);
+
+    QueryVersion = VersionMax;
+    while (!NT_SUCCESS(status)){
+        status = InterfaceQuery(FdoStruct,
+                                Guid,
+                                QueryVersion,
+                                IntfCompat->ImportedInterface,
+                                IntfCompat->ImportedInterfaceMaxSize,
+                                FALSE);
+        if (!NT_SUCCESS(status)) {
+            if (QueryVersion > VersionMin)
+                QueryVersion--;
+            else
+                break;
+        }
+    }
+    if (!NT_SUCCESS(status)) {
+        if (status == STATUS_NOT_SUPPORTED && Optional) {
+            status = STATUS_SUCCESS;
+            goto done;
+        }
+        goto fail2;
+    }
+
+    if (QueryVersion == VersionMax) {
+        if ((IntfCompat->ImportedInterface->Size > 
IntfCompat->ImportedInterfaceMaxSize) ||
+            (IntfCompat->ImportedInterface->Size > 
IntfCompat->CompatInterfaceMaxSize)) {
+            status = STATUS_INTERNAL_ERROR;
+            goto fail3;
+        }
+        RtlCopyMemory(IntfCompat->CompatInterface, 
IntfCompat->ImportedInterface, IntfCompat->ImportedInterface->Size);
+    } else {
+        status = CompatFixup(IntfCompat);
+        if (!NT_SUCCESS(status))
+            goto fail4;
+    }
+
+done:
+    return status;
+
+fail4:
+    Error("fail4\n");
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+
diff --git a/src/xeniface/interface_compat_xeniface.c 
b/src/xeniface/interface_compat_xeniface.c
new file mode 100644
index 0000000..33f6be9
--- /dev/null
+++ b/src/xeniface/interface_compat_xeniface.c
@@ -0,0 +1,68 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*! \file interface_compat_xeniface.c
+    \brief Xeniface specific interface compatibility functions.
+*/
+
+#include <ntifs.h>
+#include <interface_compat.h>
+#include <interface_compat_xeniface.h>
+
+IMPL_COMPAT_INIT(XENBUS, STORE);
+IMPL_COMPAT_INIT(XENBUS, SUSPEND);
+IMPL_COMPAT_INIT(XENBUS, SHARED_INFO);
+IMPL_COMPAT_INIT(XENBUS, EVTCHN);
+IMPL_COMPAT_INIT(XENBUS, GNTTAB);
+
+IMPL_NULL_FIXUP(XENBUS, STORE);
+IMPL_NULL_FIXUP(XENBUS, SUSPEND);
+
+NTSTATUS XENBUS_SHARED_INFO_CompatFixup (
+    IN OUT PXEN_INTERFACE_COMPAT   IntfCompat
+) {
+    UNREFERENCED_PARAMETER(IntfCompat);
+    return STATUS_NOT_IMPLEMENTED; /* TODO - Implement compatibility layer 
once got basics running.*/
+}
+
+NTSTATUS XENBUS_EVTCHN_CompatFixup (
+    IN OUT PXEN_INTERFACE_COMPAT   IntfCompat
+) {
+    UNREFERENCED_PARAMETER(IntfCompat);
+    return STATUS_NOT_IMPLEMENTED; /* TODO - Implement compatibility layer 
once got basics running.*/
+}
+
+NTSTATUS XENBUS_GNTTAB_CompatFixup (
+    IN OUT PXEN_INTERFACE_COMPAT   IntfCompat
+) {
+    UNREFERENCED_PARAMETER(IntfCompat);
+    return STATUS_NOT_IMPLEMENTED; /* TODO - Implement compatibility layer 
once got basics running.*/
+}
diff --git a/vs2015/xeniface/xeniface.vcxproj b/vs2015/xeniface/xeniface.vcxproj
index 4ac4d50..4392637 100644
--- a/vs2015/xeniface/xeniface.vcxproj
+++ b/vs2015/xeniface/xeniface.vcxproj
@@ -63,6 +63,8 @@
     <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
     <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
     <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
+    <ClCompile Include="..\..\src\xeniface\interface_compat.c" />
+    <ClCompile Include="..\..\src\xeniface\interface_compat_xeniface.c" />
   </ItemGroup>
   <ItemGroup>
     <Mofcomp Include="../../src/xeniface/wmi.mof">
diff --git a/vs2017/xeniface/xeniface.vcxproj b/vs2017/xeniface/xeniface.vcxproj
index ab74b40..0bf9bf2 100644
--- a/vs2017/xeniface/xeniface.vcxproj
+++ b/vs2017/xeniface/xeniface.vcxproj
@@ -71,6 +71,8 @@
     <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
     <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
     <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
+    <ClCompile Include="..\..\src\xeniface\interface_compat.c" />
+    <ClCompile Include="..\..\src\xeniface\interface_compat_xeniface.c" />
   </ItemGroup>
   <ItemGroup>
     <Mofcomp Include="../../src/xeniface/wmi.mof">
diff --git a/vs2019/xeniface/xeniface.vcxproj b/vs2019/xeniface/xeniface.vcxproj
index b9756dd..5472f08 100644
--- a/vs2019/xeniface/xeniface.vcxproj
+++ b/vs2019/xeniface/xeniface.vcxproj
@@ -79,6 +79,8 @@
     <ClCompile Include="..\..\src\xeniface\ioctl_gnttab.c" />
     <ClCompile Include="..\..\src\xeniface\ioctl_store.c" />
     <ClCompile Include="..\..\src\xeniface\irp_queue.c" />
+    <ClCompile Include="..\..\src\xeniface\interface_compat.c" />
+    <ClCompile Include="..\..\src\xeniface\interface_compat_xeniface.c" />
   </ItemGroup>
   <ItemGroup>
     <Mofcomp Include="../../src/xeniface/wmi.mof">
-- 
2.25.0.windows.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.