PDRIVER_OBJECT DriverObject;
HANDLE ParametersKey;
HANDLE AddressesKey;
+ HANDLE StatusKey;
} XENVIF_DRIVER, *PXENVIF_DRIVER;
static XENVIF_DRIVER Driver;
return __DriverGetAddressesKey();
}
+static FORCEINLINE VOID
+__DriverSetStatusKey(
+ IN HANDLE Key
+ )
+{
+ Driver.StatusKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetStatusKey(
+ VOID
+ )
+{
+ return Driver.StatusKey;
+}
+
+HANDLE
+DriverGetStatusKey(
+ VOID
+ )
+{
+ return __DriverGetStatusKey();
+}
+
DRIVER_UNLOAD DriverUnload;
VOID
{
HANDLE AddressesKey;
HANDLE ParametersKey;
+ HANDLE StatusKey;
ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
if (*InitSafeBootMode > 0)
goto done;
- AddressesKey = __DriverGetParametersKey();
+ StatusKey = __DriverGetStatusKey();
+ __DriverSetStatusKey(NULL);
+
+ RegistryCloseKey(StatusKey);
+
+ AddressesKey = __DriverGetAddressesKey();
__DriverSetAddressesKey(NULL);
RegistryCloseKey(AddressesKey);
HANDLE ServiceKey;
HANDLE ParametersKey;
HANDLE AddressesKey;
+ HANDLE StatusKey;
ULONG Index;
NTSTATUS status;
__DriverSetAddressesKey(AddressesKey);
+ status = RegistryCreateSubKey(ServiceKey,
+ "Status",
+ REG_OPTION_VOLATILE,
+ &StatusKey);
+ if (!NT_SUCCESS(status))
+ goto fail5;
+
+ __DriverSetStatusKey(StatusKey);
+
RegistryCloseKey(ServiceKey);
DriverObject->DriverExtension->AddDevice = AddDevice;
return STATUS_SUCCESS;
+fail5:
+ Error("fail5\n");
+
+ __DriverSetAddressesKey(NULL);
+
+ RegistryCloseKey(AddressesKey);
+
fail4:
Error("fail4\n");
Trace("(%s) <====\n", __PdoGetName(Pdo));
}
+static VOID
+PdoRequestReboot(
+ IN PXENVIF_PDO Pdo
+ )
+{
+ HANDLE StatusKey;
+
+ UNREFERENCED_PARAMETER(Pdo);
+
+ Info("<===>\n");
+
+ ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+ StatusKey = DriverGetStatusKey();
+
+ (VOID) RegistryUpdateDwordValue(StatusKey,
+ "NeedReboot",
+ 1);
+}
+
static DECLSPEC_NOINLINE NTSTATUS
PdoStartDevice(
IN PXENVIF_PDO Pdo,
fail5:
Error("fail5\n");
+ goto fail3;
+
fail4:
Error("fail4\n");
+ PdoRequestReboot(Pdo);
__FreeMibTable(Table);
fail3: