]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
Use new monitor request key
authorPaul Durrant <paul.durrant@citrix.com>
Tue, 9 Aug 2016 13:01:19 +0000 (14:01 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Tue, 9 Aug 2016 13:01:19 +0000 (14:01 +0100)
The monitor service now uses a request key in registry under HKLM/SOFTWARE.
This patch modifies __DriverRequestReboot() to use the new key, which is
now set as a parameter by the INF file.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xenvif.inf
src/xenvif/driver.c

index f230eea6ddab8aeafe8812ee6c06b90ba1e02e55..5e5cbba503e6d97c5d8345470805ba0218e4d2ff 100644 (file)
@@ -73,22 +73,20 @@ xenvif.sys
 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
@@ -101,7 +99,8 @@ HKR,,CoInstallers32,0x00010000,"xenvif_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@M
 
 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 
index 27d4911802c33407fe3eb6447a45285cc8745f2d..66962e0839f0775072087f8c71281b053bdfe877 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <ntddk.h>
 #include <procgrp.h>
+#include <ntstrsafe.h>
 #include <version.h>
 
 #include "registry.h"
@@ -116,55 +117,78 @@ DriverGetParametersKey(
     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);