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);
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
#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
%Vendor%=Inst,NT@INF_ARCH@
[Inst.NT@INF_ARCH@]
-%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VBD&REV_0900000A
-%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VBD&REV_0900000A
-%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VBD&REV_0900000A
+%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VBD&REV_0900000B
+%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VBD&REV_0900000B
+%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VBD&REV_0900000B
[XenVbd_Inst]
CopyFiles=XenVbd_Copyfiles
HKR,"Parameters",,0x00000010
HKR,"Parameters","BusType",0x00010001,0x00000001
HKR,"Parameters\PnpInterface","5",0x00010001,0x00000001
-HKR,"Parameters","RequestKey",0x00000000,%RequestKey%
HKR,"Parameters","max-ring-page-order",0x00010001,0x00000001
HKR,"Parameters","multi-queue-max-queues",0x00010001,0x00000002
DiskDesc = "@PRODUCT_NAME@ PV Storage Host Adapter Package"
XenVbdName= "@PRODUCT_NAME@ PV Storage Host Adapter"
XenDiskName= "@PRODUCT_NAME@ PV Storage Filter"
-RequestKey="SYSTEM\CurrentControlSet\Services\xenbus_monitor\Request"
UnplugKey="SYSTEM\CurrentControlSet\Services\XEN\Unplug"
PnpKey="SYSTEM\CurrentControlSet\Control\Pnp"
PartMgrKey="SYSTEM\CurrentControlSet\Services\PartMgr\Parameters"
return Adapter->BootEmulated;
}
+VOID
+AdapterRequestReboot(
+ IN PXENVBD_ADAPTER Adapter
+ )
+{
+ NTSTATUS status;
+
+ status = XENBUS_UNPLUG(Acquire, &Adapter->UnplugInterface);
+ if (!NT_SUCCESS(status))
+ return;
+
+ XENBUS_UNPLUG(Reboot,
+ &Adapter->UnplugInterface,
+ __MODULE__);
+
+ XENBUS_UNPLUG(Release, &Adapter->UnplugInterface);
+}
+
static FORCEINLINE VOID
__AdapterEnumerate(
IN PXENVBD_ADAPTER Adapter,
if (NeedInvalidate)
AdapterTargetListChanged(Adapter);
if (NeedReboot)
- DriverRequestReboot();
+ AdapterRequestReboot(Adapter);
}
static DECLSPEC_NOINLINE NTSTATUS
IN PXENVBD_ADAPTER Adapter
)
{
- CHAR Key[] = "XEN:BOOT_EMULATED=";
- PANSI_STRING Option;
- PCHAR Value;
NTSTATUS status;
Adapter->BootEmulated = FALSE;
- status = RegistryQuerySystemStartOption(Key, &Option);
+ status = XENBUS_UNPLUG(Acquire, &Adapter->UnplugInterface);
if (!NT_SUCCESS(status))
return;
- Value = Option->Buffer + sizeof (Key) - 1;
+ Adapter->BootEmulated = XENBUS_UNPLUG(BootEmulated,
+ &Adapter->UnplugInterface);
- if (strcmp(Value, "TRUE") == 0)
- Adapter->BootEmulated = TRUE;
- else if (strcmp(Value, "FALSE") != 0)
- Warning("UNRECOGNIZED VALUE OF %s: %s\n", Key, Value);
-
- RegistryFreeSzValue(Option);
+ XENBUS_UNPLUG(Release, &Adapter->UnplugInterface);
}
__drv_requiresIRQL(PASSIVE_LEVEL)
IN PXENVBD_ADAPTER Adapter
);
+extern VOID
+AdapterRequestReboot(
+ IN PXENVBD_ADAPTER Adapter
+ );
+
extern VOID
AdapterCompleteSrb(
IN PXENVBD_ADAPTER Adapter,
return Driver.StorPortDispatchPower(DeviceObject, Irp);
}
-#define MAXNAMELEN 256
-
-__drv_requiresIRQL(PASSIVE_LEVEL)
-VOID
-DriverRequestReboot(
- VOID
- )
-{
- PANSI_STRING Ansi;
- CHAR RequestKeyName[MAXNAMELEN];
- HANDLE RequestKey;
- HANDLE SubKey;
- NTSTATUS status;
-
- ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
- status = RegistryQuerySzValue(Driver.ParametersKey,
- "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);
-
- RegistryCloseKey(RequestKey);
-
- RegistryFreeSzValue(Ansi);
-
- 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);
-}
-
__drv_dispatchType(IRP_MJ_PNP)
DRIVER_DISPATCH DispatchPnp;
IN PIRP Irp
);
-__drv_requiresIRQL(PASSIVE_LEVEL)
-extern VOID
-DriverRequestReboot(
- VOID
- );
-
// Registry overrides for driver features
typedef enum _XENVBD_FEATURE {
FeatureRemovable = 0,