AddService=xenvif,0x02,XenVif_Service,
[XenVif_Service]
-DisplayName=%XenVifDesc%
+DisplayName=%XenVifName%
ServiceType=%SERVICE_KERNEL_DRIVER%
StartType=%SERVICE_DEMAND_START%
ErrorControl=%SERVICE_ERROR_NORMAL%
ServiceBinary=%12%\xenvif.sys
LoadOrderGroup="NDIS"
-AddReg = XenVif_BootFlags, XenVif_Parameters, XenVif_Interfaces
+AddReg = XenVif_BootFlags, XenVif_Parameters
[XenVif_BootFlags]
HKR,,"BootFlags",0x00010003,0x81
[XenVif_Parameters]
HKR,"Parameters",,0x00000010
-
-[XenVif_Interfaces]
-HKR,"Interfaces",,0x00000010
+HKR,"Parameters","RequestKey",0x00000000,%RequestKey%
[XenVif_Inst.CoInstallers]
CopyFiles=CoInst_CopyFiles
Vendor="@VENDOR_NAME@"
DiskDesc="@PRODUCT_NAME@ PV Network Class Package"
-XenVifDesc="@PRODUCT_NAME@ PV Network Class"
+XenVifName="@PRODUCT_NAME@ PV Network Class"
+RequestKey="SOFTWARE\@VENDOR_NAME@\@PRODUCT_NAME@\PV Driver Monitor\Request"
SERVICE_BOOT_START=0x0
SERVICE_SYSTEM_START=0x1
#include <ntddk.h>
#include <procgrp.h>
+#include <ntstrsafe.h>
#include <version.h>
#include "registry.h"
return __DriverGetParametersKey();
}
-#define SERVICES_PATH "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services"
-
-#define SERVICE_KEY(_Name) \
- SERVICES_PATH ## "\\" ## #_Name
-
-#define REQUEST_KEY \
- SERVICE_KEY(XENBUS_MONITOR) ## "\\Request"
+#define MAXNAMELEN 128
static FORCEINLINE VOID
__DriverRequestReboot(
VOID
)
{
- HANDLE RequestKey;
- ANSI_STRING Ansi[2];
- NTSTATUS status;
+ 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 = RegistryOpenSubKey(NULL,
- REQUEST_KEY,
+ RequestKeyName,
KEY_ALL_ACCESS,
&RequestKey);
if (!NT_SUCCESS(status))
- goto fail1;
-
- RtlZeroMemory(Ansi, sizeof (Ansi));
+ goto fail2;
- RtlInitAnsiString(&Ansi[0], "XENVIF");
+ status = RegistryCreateSubKey(RequestKey,
+ __MODULE__,
+ REG_OPTION_NON_VOLATILE,
+ &SubKey);
+ if (!NT_SUCCESS(status))
+ goto fail3;
- status = RegistryUpdateSzValue(RequestKey,
- "Reboot",
- REG_SZ,
- Ansi);
+ status = RegistryUpdateDwordValue(SubKey,
+ "Reboot",
+ 1);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail4;
- RegistryCloseKey(RequestKey);
+ RegistryCloseKey(SubKey);
+
+ RegistryFreeSzValue(Ansi);
Info("<====\n");
return;
+fail4:
+ Error("fail4\n");
+
+ RegistryCloseKey(SubKey);
+
+fail3:
+ Error("fail3\n");
+
+ RegistryCloseKey(RequestKey);
+
fail2:
Error("fail2\n");
- RegistryCloseKey(RequestKey);
+ RegistryFreeSzValue(Ansi);
fail1:
Error("fail1 (%08x)\n", status);