|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |