[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH 2/2] Remove reboot request from the co-installer...



...and use the XENBUS_MONITOR service instead.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 src/coinst/coinst.c | 129 +---------------------------------------------------
 src/xenvbd/driver.c |  71 +++++++++++++++++++----------
 src/xenvbd/driver.h |   2 +-
 src/xenvbd/fdo.c    |   2 +-
 4 files changed, 52 insertions(+), 152 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 1bdcbc6..f972822 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -570,124 +570,6 @@ fail1:
     return FALSE;
 }
 
-static BOOLEAN
-CheckStatus(
-    OUT PBOOLEAN    NeedReboot
-    )
-{
-    HKEY            StatusKey;
-    HRESULT         Error;
-    DWORD           ValueLength;
-    DWORD           Value;
-    DWORD           Type;
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         STATUS_KEY,
-                         0,
-                         KEY_READ,
-                         &StatusKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    ValueLength = sizeof (Value);
-
-    Error = RegQueryValueEx(StatusKey,
-                            "NeedReboot",
-                            NULL,
-                            &Type,
-                            (LPBYTE)&Value,
-                            &ValueLength);
-    if (Error != ERROR_SUCCESS) {
-        if (Error == ERROR_FILE_NOT_FOUND) {
-            Type = REG_DWORD;
-            Value = 0;
-        } else {
-            SetLastError(Error);
-            goto fail2;
-        }
-    }
-
-    if (Type != REG_DWORD) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    *NeedReboot = (Value != 0) ? TRUE : FALSE;
-
-    if (*NeedReboot)
-        Log("NeedReboot");
-
-    RegCloseKey(StatusKey);
-
-    return TRUE;
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(StatusKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-RequestReboot(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData
-    )
-{
-    SP_DEVINSTALL_PARAMS    DeviceInstallParams;
-    HRESULT                 Error;
-
-    DeviceInstallParams.cbSize = sizeof (DeviceInstallParams);
-
-    if (!SetupDiGetDeviceInstallParams(DeviceInfoSet,
-                                       DeviceInfoData,
-                                       &DeviceInstallParams))
-        goto fail1;
-
-    DeviceInstallParams.Flags |= DI_NEEDREBOOT;
-
-    Log("Flags = %08x", DeviceInstallParams.Flags);
-
-    if (!SetupDiSetDeviceInstallParams(DeviceInfoSet,
-                                       DeviceInfoData,
-                                       &DeviceInstallParams))
-        goto fail2;
-
-    return TRUE;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static FORCEINLINE HRESULT
 __DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -742,9 +624,8 @@ __DifInstallPostProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    BOOLEAN                         Success;
-    BOOLEAN                         NeedReboot;
-
+    UNREFERENCED_PARAMETER(DeviceInfoSet);
+    UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
     Log("====>");
@@ -753,12 +634,6 @@ __DifInstallPostProcess(
     (VOID) OverrideSanPolicy();
     (VOID) IncreaseDiskTimeOut();
 
-    NeedReboot = FALSE;
-
-    Success = CheckStatus(&NeedReboot);
-    if (Success && NeedReboot)
-        (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
-
     Log("<====");
 
     return NO_ERROR;
diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
index 6e7b635..33de481 100644
--- a/src/xenvbd/driver.c
+++ b/src/xenvbd/driver.c
@@ -279,49 +279,74 @@ __DriverGetFdo(
     return IsFdo;
 }
 
+#define SERVICES_PATH 
"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services"
+
+#define SERVICE_KEY(_Name) \
+        SERVICES_PATH ## "\\" ## #_Name
+
+#define REQUEST_KEY \
+        SERVICE_KEY(XENBUS_MONITOR) ## "\\Request"
+
 VOID
-DriverNotifyInstaller(
+DriverRequestReboot(
     VOID
     )
 {
-    UNICODE_STRING                  Unicode;
-    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  KeyName;
+    UNICODE_STRING                  ValueName;
+    WCHAR                           Value[] = L"XENVBD";
+    OBJECT_ATTRIBUTES               Attributes;
+    HANDLE                          Key;
     NTSTATUS                        status;
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
 
-    Partial = __AllocateNonPagedPoolWithTag(__FUNCTION__,
-                                            __LINE__,
-                                            
FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) +
-                                            sizeof (ULONG),
-                                            XENVBD_POOL_TAG);
-    status = STATUS_NO_MEMORY;
-    if (Partial == NULL)
-        goto fail1;
+    RtlInitAnsiString(&Ansi, REQUEST_KEY);
 
-    Partial->TitleIndex = 0;
-    Partial->Type = REG_DWORD;
-    Partial->DataLength = sizeof (ULONG);
-    *(PULONG)Partial->Data = 1;
+    status = RtlAnsiStringToUnicodeString(&KeyName, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
 
-    RtlInitUnicodeString(&Unicode, L"NeedReboot");
+    InitializeObjectAttributes(&Attributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               NULL,
+                               NULL);
 
-    status = ZwSetValueKey(Driver.StatusKey,
-                           &Unicode,
-                           Partial->TitleIndex,
-                           Partial->Type,
-                           Partial->Data,
-                           Partial->DataLength);
+    status = ZwOpenKey(&Key,
+                       KEY_ALL_ACCESS,
+                       &Attributes);
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    __FreePoolWithTag(Partial, XENVBD_POOL_TAG);
+    RtlInitUnicodeString(&ValueName, L"Reboot");
+
+    status = ZwSetValueKey(Key,
+                           &ValueName,
+                           0,
+                           REG_SZ,
+                           Value,
+                           sizeof(Value));
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    ZwClose(Key);
+
+    RtlFreeUnicodeString(&KeyName);
 
     return;
 
+fail3:
+    Error("fail3\n");
+
+    ZwClose(Key);
+
 fail2:
     Error("fail2\n");
 
+    RtlFreeUnicodeString(&KeyName);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 }
diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
index 79260cd..cf55330 100644
--- a/src/xenvbd/driver.h
+++ b/src/xenvbd/driver.h
@@ -81,7 +81,7 @@ DriverUnlinkFdo(
     );
 
 extern VOID
-DriverNotifyInstaller(
+DriverRequestReboot(
     VOID
     );
 
diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 5f1778b..deac224 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -830,7 +830,7 @@ FdoScanTargets(
         StorPortNotification(BusChangeDetected, Fdo, 0);
     }
     if (NeedReboot) {
-        DriverNotifyInstaller();
+        DriverRequestReboot();
     }
 }
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.