IN BOOLEAN Make
);
+/*! \typedef XENBUS_UNPLUG_IS_REQUESTED
+ \brief Has a type of emulated device been unplugged
+
+ \param Interface The interface header
+ \param Type The type of device
+
+ \return TRUE The type of device has been unplugged this boot.
+*/
+typedef BOOLEAN
+(*XENBUS_UNPLUG_IS_REQUESTED)(
+ IN PINTERFACE Interface,
+ IN XENBUS_UNPLUG_DEVICE_TYPE Type
+ );
+
// {73db6517-3d06-4937-989f-199b7501e229}
DEFINE_GUID(GUID_XENBUS_UNPLUG_INTERFACE,
0x73db6517, 0x3d06, 0x4937, 0x98, 0x9f, 0x19, 0x9b, 0x75, 0x01, 0xe2, 0x29);
XENBUS_UNPLUG_REQUEST UnplugRequest;
};
-typedef struct _XENBUS_UNPLUG_INTERFACE_V1 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE;
+/*! \struct _XENBUS_UNPLUG_INTERFACE_V2
+ \brief UNPLUG interface version 2
+ \ingroup interfaces
+*/
+struct _XENBUS_UNPLUG_INTERFACE_V2 {
+ INTERFACE Interface;
+ XENBUS_UNPLUG_ACQUIRE UnplugAcquire;
+ XENBUS_UNPLUG_RELEASE UnplugRelease;
+ XENBUS_UNPLUG_REQUEST UnplugRequest;
+ XENBUS_UNPLUG_IS_REQUESTED UnplugIsRequested;
+};
+
+typedef struct _XENBUS_UNPLUG_INTERFACE_V2 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE;
/*! \def XENBUS_UNPLUG
\brief Macro at assist in method invocation
#endif // _WINDLL
#define XENBUS_UNPLUG_INTERFACE_VERSION_MIN 1
-#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX 1
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX 2
#endif // _XENBUS_UNPLUG_INTERFACE_H
; DisplayName Section DeviceID
; ----------- ------- --------
-%XenVifName% =XenVif_Inst, XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VIF&REV_09000009
-%XenVifName% =XenVif_Inst, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VIF&REV_09000009
-%XenVifName% =XenVif_Inst, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VIF&REV_09000009
+%XenVifName% =XenVif_Inst, XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VIF&REV_0900000A
+%XenVifName% =XenVif_Inst, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VIF&REV_0900000A
+%XenVifName% =XenVif_Inst, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VIF&REV_0900000A
[XenVif_Inst]
CopyFiles=XenVif_Copyfiles
XENBUS_UNPLUG(Release, &Pdo->UnplugInterface);
}
+static BOOLEAN
+PdoUnplugRequested(
+ IN PXENVIF_PDO Pdo
+ )
+{
+ BOOLEAN State;
+ NTSTATUS status;
+
+ status = XENBUS_UNPLUG(Acquire, &Pdo->UnplugInterface);
+ if (!NT_SUCCESS(status))
+ return FALSE;
+
+ State = XENBUS_UNPLUG(IsRequested,
+ &Pdo->UnplugInterface,
+ XENBUS_UNPLUG_DEVICE_TYPE_NICS);
+
+ XENBUS_UNPLUG(Release, &Pdo->UnplugInterface);
+
+ return State;
+}
+
static DECLSPEC_NOINLINE NTSTATUS
PdoStartDevice(
IN PXENVIF_PDO Pdo,
break;
}
- if (Pdo->HasAlias) {
+ if (Pdo->HasAlias || !PdoUnplugRequested(Pdo)) {
PdoUnplugRequest(Pdo, TRUE);
status = STATUS_PNP_REBOOT_REQUIRED;