[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 |