[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] monitor: get dialog paramaters from the registry
It is easier to localise the monitor dialog if it picks up the reboot dialog title and message from registry parameters rather than having the hardcoded or in a string table. This patch does this and sets default values in the the INF file. This patchs also adds a call to wait for driver installations to complete before initialiating a reboot. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/monitor/monitor.c | 177 ++++++++++++++++++++++++--- src/monitor/strings.h | 37 ------ src/monitor/strings.rc | 37 ------ src/monitor/xenbus_monitor.rc | 1 - src/xenbus.inf | 4 + vs2012/xenbus_monitor/xenbus_monitor.vcxproj | 2 +- vs2013/xenbus_monitor/xenbus_monitor.vcxproj | 2 +- 7 files changed, 163 insertions(+), 97 deletions(-) delete mode 100644 src/monitor/strings.h delete mode 100644 src/monitor/strings.rc diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c index e2e8e20..0bfdaaf 100644 --- a/src/monitor/monitor.c +++ b/src/monitor/monitor.c @@ -34,13 +34,13 @@ #include <stdlib.h> #include <strsafe.h> #include <wtsapi32.h> +#include <cfgmgr32.h> #include <malloc.h> #include <assert.h> #include <version.h> #include "messages.h" -#include "strings.h" #define MONITOR_NAME __MODULE__ #define MONITOR_DISPLAYNAME MONITOR_NAME @@ -53,6 +53,8 @@ typedef struct _MONITOR_CONTEXT { HANDLE StopEvent; HANDLE RequestEvent; HKEY RequestKey; + PTCHAR Title; + PTCHAR Message; BOOL RebootPending; } MONITOR_CONTEXT, *PMONITOR_CONTEXT; @@ -296,6 +298,12 @@ DoReboot( VOID ) { + Log("waiting for pending install events..."); + + (VOID) CM_WaitNoPendingInstallEvents(INFINITE); + + Log("initiating shutdown..."); + (VOID) InitiateSystemShutdownEx(NULL, NULL, 0, @@ -340,17 +348,18 @@ PromptForReboot( ) { PMONITOR_CONTEXT Context = &MonitorContext; + PTCHAR Title; + DWORD TitleLength; HRESULT Result; TCHAR ServiceKeyName[MAX_PATH]; HKEY ServiceKey; DWORD MaxValueLength; DWORD DisplayNameLength; PTCHAR DisplayName; - PTCHAR Description; DWORD Type; - TCHAR Title[] = TEXT(VENDOR_NAME_STR); - TCHAR Message[MAXIMUM_BUFFER_SIZE]; - DWORD Length; + PTCHAR Description; + PTCHAR Message; + DWORD MessageLength; PWTS_SESSION_INFO SessionInfo; DWORD Count; DWORD Index; @@ -359,6 +368,10 @@ PromptForReboot( Log("====> (%s)", DriverName); + Title = Context->Title; + TitleLength = (DWORD)((_tcslen(Context->Title) + + 1) * sizeof (TCHAR)); + Result = StringCbPrintf(ServiceKeyName, MAX_PATH, SERVICES_KEY "\\%s", @@ -420,27 +433,27 @@ PromptForReboot( else Description++; - Result = StringCbPrintf(Message, - MAXIMUM_BUFFER_SIZE, - TEXT("%s "), - Description); - assert(SUCCEEDED(Result)); + MessageLength = (DWORD)((_tcslen(Description) + + 1 + // ' ' + _tcslen(Context->Message) + + 1) * sizeof (TCHAR)); - Length = (DWORD)_tcslen(Message); - - Length = LoadString(GetModuleHandle(NULL), - IDS_DIALOG, - Message + Length, - ARRAYSIZE(Message) - Length); - if (Length == 0) + Message = calloc(1, MessageLength); + if (Message == NULL) goto fail6; + Result = StringCbPrintf(Message, + MessageLength, + TEXT("%s %s"), + Description, + Context->Message); + assert(SUCCEEDED(Result)); + Success = WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &SessionInfo, &Count); - if (!Success) goto fail7; @@ -464,9 +477,9 @@ PromptForReboot( Success = WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, SessionId, Title, - sizeof (Title), + TitleLength, Message, - sizeof (Message), + MessageLength, MB_YESNO | MB_ICONEXCLAMATION, Timeout, &Response, @@ -834,6 +847,118 @@ fail1: return FALSE; } +static BOOL +GetDialogParameters( + VOID + ) +{ + PMONITOR_CONTEXT Context = &MonitorContext; + DWORD MaxValueLength; + DWORD TitleLength; + DWORD MessageLength; + DWORD Type; + HRESULT Error; + + Error = RegQueryInfoKey(Context->ParametersKey, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &MaxValueLength, + NULL, + NULL); + if (Error != ERROR_SUCCESS) { + SetLastError(Error); + goto fail1; + } + + TitleLength = MaxValueLength + sizeof (TCHAR); + + Context->Title = calloc(1, TitleLength); + if (Context == NULL) + goto fail2; + + Error = RegQueryValueEx(Context->ParametersKey, + "DialogTitle", + NULL, + &Type, + (LPBYTE)Context->Title, + &TitleLength); + if (Error != ERROR_SUCCESS) { + SetLastError(Error); + goto fail3; + } + + if (Type != REG_SZ) { + SetLastError(ERROR_BAD_FORMAT); + goto fail4; + } + + MessageLength = MaxValueLength + sizeof (TCHAR); + + Context->Message = calloc(1, MessageLength); + if (Context == NULL) + goto fail5; + + Error = RegQueryValueEx(Context->ParametersKey, + "DialogMessage", + NULL, + &Type, + (LPBYTE)Context->Message, + &MessageLength); + if (Error != ERROR_SUCCESS) { + SetLastError(Error); + goto fail6; + } + + if (Type != REG_SZ) { + SetLastError(ERROR_BAD_FORMAT); + goto fail7; + } + + return TRUE; + +fail7: + Log("fail7"); + +fail6: + Log("fail6"); + + free(Context->Message); + +fail5: + Log("fail5"); + +fail4: + Log("fail4"); + +fail3: + Log("fail3"); + + free(Context->Title); + +fail2: + Log("fail2"); + +fail1: + Error = GetLastError(); + + { + PTCHAR Message; + Message = GetErrorMessage(Error); + Log("fail1 (%s)", Message); + LocalFree(Message); + } + + return FALSE; +} + + + VOID WINAPI MonitorMain( _In_ DWORD argc, @@ -905,6 +1030,10 @@ MonitorMain( if (Error != ERROR_SUCCESS) goto fail8; + Success = GetDialogParameters(); + if (!Success) + goto fail9; + SetEvent(Context->RequestEvent); ReportStatus(SERVICE_RUNNING, NO_ERROR, 0); @@ -941,7 +1070,10 @@ MonitorMain( done: (VOID) RegDeleteTree(Context->RequestKey, NULL); + free(Context->Message); + free(Context->Title); CloseHandle(Context->RequestKey); + free(RequestKeyName); CloseHandle(Context->RequestEvent); CloseHandle(Context->StopEvent); @@ -955,6 +1087,11 @@ done: return; +fail9: + Log("fail9"); + + CloseHandle(Context->RequestKey); + fail8: Log("fail8"); diff --git a/src/monitor/strings.h b/src/monitor/strings.h deleted file mode 100644 index 76ef975..0000000 --- a/src/monitor/strings.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef _MONITOR_STRINGS_H_ -#define _MONITOR_STRINGS_H_ - -#define IDS_DIALOG 1 - -#endif // _MONITOR_STRINGS_H_ diff --git a/src/monitor/strings.rc b/src/monitor/strings.rc deleted file mode 100644 index 99d4fc1..0000000 --- a/src/monitor/strings.rc +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "strings.h" - -STRINGTABLE -{ - IDS_DIALOG, "needs to restart the system to complete installation.\nPress 'Yes' to restart the system now or 'No' if you plan to restart the system later." -} \ No newline at end of file diff --git a/src/monitor/xenbus_monitor.rc b/src/monitor/xenbus_monitor.rc index 96247e3..090e5c8 100644 --- a/src/monitor/xenbus_monitor.rc +++ b/src/monitor/xenbus_monitor.rc @@ -54,4 +54,3 @@ #include "common.ver" #include "messages.rc" -#include "strings.rc" diff --git a/src/xenbus.inf b/src/xenbus.inf index dc4e71d..35343b2 100644 --- a/src/xenbus.inf +++ b/src/xenbus.inf @@ -132,6 +132,8 @@ AddReg = Monitor_Parameters, Monitor_Request [Monitor_Parameters] HKR,"Parameters",,0x00000010 HKR,"Parameters","RequestKey",0x00000000,%RequestKey% +HKR,"Parameters","DialogTitle",0x00000000,%DialogTitle% +HKR,"Parameters","DialogMessage",0x00000000,%DialogMessage% [Monitor_Request] HKLM,%RequestKey% ,,0x00000010 @@ -159,6 +161,8 @@ XenFiltName="@PRODUCT_NAME@ Generic Bus Filter" MonitorName="@PRODUCT_NAME@ PV Driver Monitor" MonitorDesc="Provides support for @PRODUCT_NAME@ PV drivers" RequestKey="SOFTWARE\@VENDOR_NAME@\@PRODUCT_NAME@\PV Driver Monitor\Request" +DialogTitle="@PRODUCT_NAME@" +DialogMessage="needs to restart the system to complete installation. Press 'Yes' to restart the system now or 'No' if you plan to restart the system later." SERVICE_BOOT_START=0x0 SERVICE_SYSTEM_START=0x1 diff --git a/vs2012/xenbus_monitor/xenbus_monitor.vcxproj b/vs2012/xenbus_monitor/xenbus_monitor.vcxproj index 2d8f801..96b21ce 100644 --- a/vs2012/xenbus_monitor/xenbus_monitor.vcxproj +++ b/vs2012/xenbus_monitor/xenbus_monitor.vcxproj @@ -37,7 +37,7 @@ <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> </ClCompile> <Link> - <AdditionalDependencies>wtsapi32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>wtsapi32.lib;cfgmgr32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir)..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> diff --git a/vs2013/xenbus_monitor/xenbus_monitor.vcxproj b/vs2013/xenbus_monitor/xenbus_monitor.vcxproj index 5575c7e..edb0c50 100644 --- a/vs2013/xenbus_monitor/xenbus_monitor.vcxproj +++ b/vs2013/xenbus_monitor/xenbus_monitor.vcxproj @@ -37,7 +37,7 @@ <RuntimeLibrary Condition="'$(UseDebugLibraries)'=='false'">MultiThreaded</RuntimeLibrary> </ClCompile> <Link> - <AdditionalDependencies>wtsapi32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>wtsapi32.lib;cfgmgr32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> <ResourceCompile> <AdditionalIncludeDirectories>$(SolutionDir)..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> -- 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 |