|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENBUS PATCH v3 5/9] Add EMULATED v3
Allow querying the current active device's forced-activation status by
calling EmulatedIsDevicePresent with DeviceID=NULL.
Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
include/emulated_interface.h | 42 ++++++++++++++++++++++---
include/revision.h | 3 +-
src/xenfilt/emulated.c | 60 ++++++++++++++++++++++++++++++++----
src/xenfilt/emulated.h | 1 +
src/xenfilt/pdo.c | 1 +
5 files changed, 96 insertions(+), 11 deletions(-)
diff --git a/include/emulated_interface.h b/include/emulated_interface.h
index a6c79f9..1c24ecb 100644
--- a/include/emulated_interface.h
+++ b/include/emulated_interface.h
@@ -62,7 +62,7 @@ typedef VOID
_In_ PINTERFACE Interface
);
-/*! \typedef XENFILT_EMULATED_IS_DEVICE_PRESENT
+/*! \typedef XENFILT_EMULATED_IS_DEVICE_PRESENT_V1
\brief Determine whether a given device is present in the VM
\param Interface The interface header
@@ -73,12 +73,34 @@ typedef VOID
FALSE if it is not
*/
typedef BOOLEAN
-(*XENFILT_EMULATED_IS_DEVICE_PRESENT)(
+(*XENFILT_EMULATED_IS_DEVICE_PRESENT_V1)(
_In_ PVOID Context,
_In_ PSTR DeviceID,
_In_opt_ PSTR InstanceID
);
+/*! \typedef XENFILT_EMULATED_IS_DEVICE_PRESENT
+ \brief Determine whether a given device is present in the VM
+
+ \param Interface The interface header
+ \param DeviceID The DeviceID of the device, or NULL to query the force-
+ activated device
+ \param InstanceID The (un-prefixed) InstanceID of the device or
+ NULL to match any device instance
+ \param IsForceActivated Returns 1 if the device was force-activated, -1 if
+ the device was not active and another device was force-activated,
+ and 0 otherwise
+ \return TRUE if the specified device is present in the system or
+ FALSE if it is not
+*/
+typedef BOOLEAN
+(*XENFILT_EMULATED_IS_DEVICE_PRESENT)(
+ _In_ PVOID Context,
+ _In_opt_ PSTR DeviceID,
+ _In_opt_ PSTR InstanceID,
+ _Out_opt_ PLONG IsForceActivated
+ );
+
/*! \typedef XENFILT_EMULATED_IS_DISK_PRESENT
\brief Determine whether a given emulated disk is present in the VM
@@ -103,6 +125,18 @@ DEFINE_GUID(GUID_XENFILT_EMULATED_INTERFACE,
\ingroup interfaces
*/
struct _XENFILT_EMULATED_INTERFACE_V2 {
+ INTERFACE Interface;
+ XENFILT_EMULATED_ACQUIRE EmulatedAcquire;
+ XENFILT_EMULATED_RELEASE EmulatedRelease;
+ XENFILT_EMULATED_IS_DEVICE_PRESENT_V1 EmulatedIsDevicePresentVersion1;
+ XENFILT_EMULATED_IS_DISK_PRESENT EmulatedIsDiskPresent;
+};
+
+/*! \struct _XENFILT_EMULATED_INTERFACE_V3
+ \brief EMULATED interface version 3
+ \ingroup interfaces
+*/
+struct _XENFILT_EMULATED_INTERFACE_V3 {
INTERFACE Interface;
XENFILT_EMULATED_ACQUIRE EmulatedAcquire;
XENFILT_EMULATED_RELEASE EmulatedRelease;
@@ -110,7 +144,7 @@ struct _XENFILT_EMULATED_INTERFACE_V2 {
XENFILT_EMULATED_IS_DISK_PRESENT EmulatedIsDiskPresent;
};
-typedef struct _XENFILT_EMULATED_INTERFACE_V2 XENFILT_EMULATED_INTERFACE,
*PXENFILT_EMULATED_INTERFACE;
+typedef struct _XENFILT_EMULATED_INTERFACE_V3 XENFILT_EMULATED_INTERFACE,
*PXENFILT_EMULATED_INTERFACE;
/*! \def XENFILT_EMULATED
\brief Macro at assist in method invocation
@@ -121,6 +155,6 @@ typedef struct _XENFILT_EMULATED_INTERFACE_V2
XENFILT_EMULATED_INTERFACE, *PXENF
#endif // _WINDLL
#define XENFILT_EMULATED_INTERFACE_VERSION_MIN 2
-#define XENFILT_EMULATED_INTERFACE_VERSION_MAX 2
+#define XENFILT_EMULATED_INTERFACE_VERSION_MAX 3
#endif // _XENFILT_EMULATED_INTERFACE_H
diff --git a/include/revision.h b/include/revision.h
index e9e62e6..a63e550 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -51,6 +51,7 @@
DEFINE_REVISION(0x09000008, 1, 3, 9, 1, 2, 1, 2, 4, 1, 1, 2), \
DEFINE_REVISION(0x09000009, 1, 4, 9, 1, 2, 1, 2, 4, 1, 1, 2), \
DEFINE_REVISION(0x0900000A, 1, 4, 9, 1, 2, 1, 2, 4, 2, 1, 2), \
- DEFINE_REVISION(0x0900000B, 1, 4, 9, 1, 2, 1, 2, 4, 3, 1, 2)
+ DEFINE_REVISION(0x0900000B, 1, 4, 9, 1, 2, 1, 2, 4, 3, 1, 2), \
+ DEFINE_REVISION(0x0900000C, 1, 4, 9, 1, 2, 1, 2, 4, 3, 1, 3)
#endif // _REVISION_H
diff --git a/src/xenfilt/emulated.c b/src/xenfilt/emulated.c
index ca358c7..8485b23 100644
--- a/src/xenfilt/emulated.c
+++ b/src/xenfilt/emulated.c
@@ -48,6 +48,7 @@ typedef struct _XENFILT_EMULATED_DEVICE_DATA {
CHAR DeviceID[MAXNAMELEN];
CHAR InstanceID[MAXNAMELEN];
CHAR CompatibleID[MAXNAMELEN];
+ LONG ForceActivate;
} XENFILT_EMULATED_DEVICE_DATA, *PXENFILT_EMULATED_DEVICE_DATA;
typedef struct _XENFILT_EMULATED_DISK_DATA {
@@ -227,6 +228,7 @@ EmulatedAddObject(
_In_ PSTR InstanceID,
_In_opt_ PSTR CompatibleIDs,
_In_ XENFILT_EMULATED_OBJECT_TYPE Type,
+ _In_ LONG ForceActivate,
_Outptr_ PXENFILT_EMULATED_OBJECT *EmulatedObject
)
{
@@ -267,6 +269,8 @@ EmulatedAddObject(
goto fail2;
(*EmulatedObject)->Type = Type;
+ if (Type == XENFILT_EMULATED_OBJECT_TYPE_PCI)
+ (*EmulatedObject)->Data.Device.ForceActivate = ForceActivate;
KeAcquireSpinLock(&Context->Lock, &Irql);
InsertTailList(&Context->List, &(*EmulatedObject)->ListEntry);
@@ -305,8 +309,9 @@ EmulatedRemoveObject(
static BOOLEAN
EmulatedIsDevicePresent(
_In_ PINTERFACE Interface,
- _In_ PSTR DeviceID,
- _In_opt_ PSTR InstanceID
+ _In_opt_ PSTR DeviceID,
+ _In_opt_ PSTR InstanceID,
+ _Out_opt_ PLONG IsForceActivated
)
{
PXENFILT_EMULATED_CONTEXT Context = Interface->Context;
@@ -314,24 +319,32 @@ EmulatedIsDevicePresent(
PLIST_ENTRY ListEntry;
Trace("====> (%s %s)\n",
- DeviceID,
+ (DeviceID != NULL) ? DeviceID : "ACTIVE",
(InstanceID != NULL) ? InstanceID : "ANY");
+ if (IsForceActivated)
+ *IsForceActivated = 0;
+
KeAcquireSpinLock(&Context->Lock, &Irql);
ListEntry = Context->List.Flink;
while (ListEntry != &Context->List) {
- PXENFILT_EMULATED_OBJECT EmulatedObject;
+ PXENFILT_EMULATED_OBJECT EmulatedObject;
+ PXENFILT_EMULATED_DEVICE_DATA Device;
EmulatedObject = CONTAINING_RECORD(ListEntry,
XENFILT_EMULATED_OBJECT,
ListEntry);
+ Device = &EmulatedObject->Data.Device;
if (EmulatedObject->Type == XENFILT_EMULATED_OBJECT_TYPE_PCI &&
- _stricmp(DeviceID, EmulatedObject->Data.Device.DeviceID) == 0 &&
+ ((DeviceID == NULL && Device->ForceActivate > 0) ||
+ (DeviceID != NULL && _stricmp(DeviceID, Device->DeviceID) == 0))
&&
(InstanceID == NULL ||
- _stricmp(InstanceID, EmulatedObject->Data.Device.InstanceID) ==
0)) {
+ _stricmp(InstanceID, Device->InstanceID) == 0)) {
Trace("FOUND\n");
+ if (IsForceActivated)
+ *IsForceActivated = Device->ForceActivate;
break;
}
@@ -345,6 +358,16 @@ EmulatedIsDevicePresent(
return (ListEntry != &Context->List) ? TRUE : FALSE;
}
+static BOOLEAN
+EmulatedIsDevicePresentVersion1(
+ _In_ PINTERFACE Interface,
+ _In_ PSTR DeviceID,
+ _In_opt_ PSTR InstanceID
+ )
+{
+ return EmulatedIsDevicePresent(Interface, DeviceID, InstanceID, NULL);
+}
+
static BOOLEAN
EmulatedIsDiskPresent(
_In_ PINTERFACE Interface,
@@ -434,6 +457,14 @@ static struct _XENFILT_EMULATED_INTERFACE_V2
EmulatedInterfaceVersion2 = {
{ sizeof (struct _XENFILT_EMULATED_INTERFACE_V2), 2, NULL, NULL, NULL },
EmulatedAcquire,
EmulatedRelease,
+ EmulatedIsDevicePresentVersion1,
+ EmulatedIsDiskPresent
+};
+
+static struct _XENFILT_EMULATED_INTERFACE_V3 EmulatedInterfaceVersion3 = {
+ { sizeof (struct _XENFILT_EMULATED_INTERFACE_V3), 3, NULL, NULL, NULL },
+ EmulatedAcquire,
+ EmulatedRelease,
EmulatedIsDevicePresent,
EmulatedIsDiskPresent
};
@@ -496,6 +527,23 @@ EmulatedGetInterface(
status = STATUS_SUCCESS;
break;
}
+ case 3: {
+ struct _XENFILT_EMULATED_INTERFACE_V3 *EmulatedInterface;
+
+ EmulatedInterface = (struct _XENFILT_EMULATED_INTERFACE_V3 *)Interface;
+
+ status = STATUS_BUFFER_OVERFLOW;
+ if (Size < sizeof (struct _XENFILT_EMULATED_INTERFACE_V3))
+ break;
+
+ *EmulatedInterface = EmulatedInterfaceVersion3;
+
+ ASSERT3U(Interface->Version, ==, Version);
+ Interface->Context = Context;
+
+ status = STATUS_SUCCESS;
+ break;
+ }
default:
status = STATUS_NOT_SUPPORTED;
break;
diff --git a/src/xenfilt/emulated.h b/src/xenfilt/emulated.h
index 9b02268..c01ff6a 100644
--- a/src/xenfilt/emulated.h
+++ b/src/xenfilt/emulated.h
@@ -72,6 +72,7 @@ EmulatedAddObject(
_In_ PSTR InstanceID,
_In_opt_ PSTR CompatibleIDs,
_In_ XENFILT_EMULATED_OBJECT_TYPE Type,
+ _In_ LONG ForceActivate,
_Outptr_ PXENFILT_EMULATED_OBJECT *EmulatedObject
);
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 48ae3a3..946c1c5 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -1748,6 +1748,7 @@ PdoCreate(
__PdoGetInstanceID(Pdo),
CompatibleIDs,
__PdoGetType(Pdo),
+ ForceActivate,
&Pdo->EmulatedObject);
if (!NT_SUCCESS(status))
goto fail5;
--
2.50.1.windows.1
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |