[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENVIF PATCH 3/3] Use UNPLUG v3
Uses UnplugReboot to request a reboot from xenbus_monitor, rather than writing values into an absolute registry path, which is a driver verifier violation during Server 2025 WHQL testing. Also removes the RequestKey from the INF file Signed-off-by: Owen Smith <owen.smith@xxxxxxxxx> --- include/revision.h | 3 +- include/unplug_interface.h | 40 +++++++++++++++- src/xenvif.inf | 8 ++-- src/xenvif/driver.c | 93 -------------------------------------- src/xenvif/driver.h | 5 -- src/xenvif/pdo.c | 20 +++++++- 6 files changed, 62 insertions(+), 107 deletions(-) diff --git a/include/revision.h b/include/revision.h index 2f4ac80..656f171 100644 --- a/include/revision.h +++ b/include/revision.h @@ -46,6 +46,7 @@ DEFINE_REVISION(0x09000001, 2, 8, 2, 1, 1), \ DEFINE_REVISION(0x09000002, 2, 9, 2, 1, 1), \ DEFINE_REVISION(0x09000003, 2, 10, 2, 1, 1), \ - DEFINE_REVISION(0x09000004, 2, 10, 2, 1, 2) + DEFINE_REVISION(0x09000004, 2, 10, 2, 1, 2), \ + DEFINE_REVISION(0x09000005, 2, 10, 2, 1, 3) #endif // _REVISION_H diff --git a/include/unplug_interface.h b/include/unplug_interface.h index dbdc76d..dad3afc 100644 --- a/include/unplug_interface.h +++ b/include/unplug_interface.h @@ -99,6 +99,28 @@ typedef BOOLEAN IN XENBUS_UNPLUG_DEVICE_TYPE Type ); +/*! \typedef XENBUS_UNPLUG_BOOT_EMULATED + \brief Should the boot disk be emulated + + \param Interface The interface header +*/ +typedef BOOLEAN +(*XENBUS_UNPLUG_BOOT_EMULATED)( + IN PINTERFACE Interface + ); + +/*! \typedef XENBUS_UNPLUG_REBOOT + \brief Request a reboot to complete setup + + \param Interface The interface header + \param Module The module name requesting a reboot +*/ +typedef VOID +(*XENBUS_UNPLUG_REBOOT)( + IN PINTERFACE Interface, + IN PCHAR Module + ); + // {73db6517-3d06-4937-989f-199b7501e229} DEFINE_GUID(GUID_XENBUS_UNPLUG_INTERFACE, 0x73db6517, 0x3d06, 0x4937, 0x98, 0x9f, 0x19, 0x9b, 0x75, 0x01, 0xe2, 0x29); @@ -126,7 +148,21 @@ struct _XENBUS_UNPLUG_INTERFACE_V2 { XENBUS_UNPLUG_IS_REQUESTED UnplugIsRequested; }; -typedef struct _XENBUS_UNPLUG_INTERFACE_V2 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE; +/*! \struct _XENBUS_UNPLUG_INTERFACE_V3 + \brief UNPLUG interface version 3 + \ingroup interfaces +*/ +struct _XENBUS_UNPLUG_INTERFACE_V3 { + INTERFACE Interface; + XENBUS_UNPLUG_ACQUIRE UnplugAcquire; + XENBUS_UNPLUG_RELEASE UnplugRelease; + XENBUS_UNPLUG_REQUEST UnplugRequest; + XENBUS_UNPLUG_IS_REQUESTED UnplugIsRequested; + XENBUS_UNPLUG_BOOT_EMULATED UnplugBootEmulated; + XENBUS_UNPLUG_REBOOT UnplugReboot; +}; + +typedef struct _XENBUS_UNPLUG_INTERFACE_V3 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE; /*! \def XENBUS_UNPLUG \brief Macro at assist in method invocation @@ -137,6 +173,6 @@ typedef struct _XENBUS_UNPLUG_INTERFACE_V2 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNP #endif // _WINDLL #define XENBUS_UNPLUG_INTERFACE_VERSION_MIN 1 -#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX 2 +#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX 3 #endif // _XENBUS_UNPLUG_INTERFACE_H diff --git a/src/xenvif.inf b/src/xenvif.inf index 8bfc37c..0430f04 100644 --- a/src/xenvif.inf +++ b/src/xenvif.inf @@ -56,9 +56,9 @@ xenvif.sys=0,, ; DisplayName Section DeviceID ; ----------- ------- -------- -%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 +%XenVifName% =XenVif_Inst, XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VIF&REV_0900000B +%XenVifName% =XenVif_Inst, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VIF&REV_0900000B +%XenVifName% =XenVif_Inst, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VIF&REV_0900000B [XenVif_Inst] CopyFiles=XenVif_Copyfiles @@ -83,7 +83,6 @@ HKR,,"BootFlags",0x00010003,0x81 [XenVif_Parameters] HKR,"Parameters",,0x00000010 -HKR,"Parameters","RequestKey",0x00000000,%RequestKey% HKR,"Parameters","FrontendMaxQueues",0x00010001,0x00000008 [XenVif_Unplug] @@ -94,7 +93,6 @@ HKLM,%UnplugKey%,"NICS",0x00010001,0 Vendor="@VENDOR_NAME@" DiskDesc="@PRODUCT_NAME@ PV Network Class Package" XenVifName="@PRODUCT_NAME@ PV Network Class" -RequestKey="SYSTEM\CurrentControlSet\Services\xenbus_monitor\Request" UnplugKey="SYSTEM\CurrentControlSet\Services\XEN\Unplug" SERVICE_BOOT_START=0x0 diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c index 2ac793d..30e3373 100644 --- a/src/xenvif/driver.c +++ b/src/xenvif/driver.c @@ -49,7 +49,6 @@ typedef struct _XENVIF_DRIVER { HANDLE ParametersKey; HANDLE AddressesKey; HANDLE SettingsKey; - BOOLEAN NeedReboot; } XENVIF_DRIVER, *PXENVIF_DRIVER; static XENVIF_DRIVER Driver; @@ -120,96 +119,6 @@ DriverGetParametersKey( return __DriverGetParametersKey(); } -#define MAXNAMELEN 256 - -static FORCEINLINE VOID -__DriverRequestReboot( - VOID - ) -{ - PANSI_STRING Ansi; - CHAR RequestKeyName[MAXNAMELEN]; - HANDLE RequestKey; - HANDLE SubKey; - NTSTATUS status; - - Info("====>\n"); - - ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); - - status = RegistryQuerySzValue(__DriverGetParametersKey(), - "RequestKey", - NULL, - &Ansi); - if (!NT_SUCCESS(status)) - goto fail1; - - status = RtlStringCbPrintfA(RequestKeyName, - MAXNAMELEN, - "\\Registry\\Machine\\%Z", - &Ansi[0]); - ASSERT(NT_SUCCESS(status)); - - status = RegistryCreateSubKey(NULL, - RequestKeyName, - REG_OPTION_NON_VOLATILE, - &RequestKey); - if (!NT_SUCCESS(status)) - goto fail2; - - status = RegistryCreateSubKey(RequestKey, - __MODULE__, - REG_OPTION_VOLATILE, - &SubKey); - if (!NT_SUCCESS(status)) - goto fail3; - - status = RegistryUpdateDwordValue(SubKey, - "Reboot", - 1); - if (!NT_SUCCESS(status)) - goto fail4; - - RegistryCloseKey(SubKey); - - RegistryFreeSzValue(Ansi); - - Info("<====\n"); - - return; - -fail4: - Error("fail4\n"); - - RegistryCloseKey(SubKey); - -fail3: - Error("fail3\n"); - - RegistryCloseKey(RequestKey); - -fail2: - Error("fail2\n"); - - RegistryFreeSzValue(Ansi); - -fail1: - Error("fail1 (%08x)\n", status); -} - -VOID -DriverRequestReboot( - VOID - ) -{ - if (Driver.NeedReboot) - return; - - __DriverRequestReboot(); - - Driver.NeedReboot = TRUE; -} - DRIVER_UNLOAD DriverUnload; VOID @@ -223,8 +132,6 @@ DriverUnload( Trace("====>\n"); - Driver.NeedReboot = FALSE; - ParametersKey = __DriverGetParametersKey(); __DriverSetParametersKey(NULL); diff --git a/src/xenvif/driver.h b/src/xenvif/driver.h index a9b47d4..8ce0494 100644 --- a/src/xenvif/driver.h +++ b/src/xenvif/driver.h @@ -48,11 +48,6 @@ DriverGetParametersKey( VOID ); -extern VOID -DriverRequestReboot( - VOID - ); - typedef struct _XENVIF_PDO XENVIF_PDO, *PXENVIF_PDO; typedef struct _XENVIF_FDO XENVIF_FDO, *PXENVIF_FDO; diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c index 51cbd97..ffbf924 100644 --- a/src/xenvif/pdo.c +++ b/src/xenvif/pdo.c @@ -1152,6 +1152,24 @@ fail1: return status; } +static VOID +PdoRequestReboot( + IN PXENVIF_PDO Pdo + ) +{ + NTSTATUS status; + + status = XENBUS_UNPLUG(Acquire, &Pdo->UnplugInterface); + if (!NT_SUCCESS(status)) + return; + + XENBUS_UNPLUG(Reboot, + &Pdo->UnplugInterface, + __MODULE__); + + XENBUS_UNPLUG(Release, &Pdo->UnplugInterface); +} + static VOID PdoUnplugRequest( IN PXENVIF_PDO Pdo, @@ -1305,7 +1323,7 @@ PdoStartDevice( status = PdoParseMibTable(Pdo); if (status == STATUS_PNP_REBOOT_REQUIRED || !PdoUnplugRequested(Pdo)) { PdoUnplugRequest(Pdo, TRUE); // fix unplug reference count - DriverRequestReboot(); + PdoRequestReboot(Pdo); status = STATUS_SUCCESS; } -- 2.44.0.windows.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |