1
0
mirror of https://github.com/valinet/ExplorerPatcher.git synced 2025-02-20 20:41:26 +01:00

Update success notification is displayed correctly for all settings; fixed posible null dereferencing in the updater

This commit is contained in:
Valentin Radu 2021-12-23 01:50:54 +02:00
parent 30b36b08c2
commit 277f235810
3 changed files with 143 additions and 91 deletions

View File

@ -240,9 +240,44 @@ DWORD CheckForUpdatesThread(LPVOID unused)
hEvents[1] = CreateEventW(NULL, FALSE, FALSE, L"EP_Ev_InstallUpdates_" _T(EP_CLSID));
if (hEvents[0] && hEvents[1])
{
if (bShowUpdateToast)
{
ShowUpdateSuccessNotification(hModule, notifier, notifFactory, &toast);
HKEY hKey = NULL;
RegCreateKeyExW(
HKEY_CURRENT_USER,
TEXT(REGPATH),
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WOW64_64KEY | KEY_WRITE,
NULL,
&hKey,
NULL
);
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
{
hKey = NULL;
}
if (hKey)
{
bShowUpdateToast = FALSE;
RegSetValueExW(
hKey,
TEXT("IsUpdatePending"),
0,
REG_DWORD,
&bShowUpdateToast,
sizeof(DWORD)
);
RegCloseKey(hKey);
}
}
if (dwUpdatePolicy != UPDATE_POLICY_MANUAL)
{
InstallUpdatesIfAvailable(hModule, bShowUpdateToast, notifier, notifFactory, &toast, UPDATES_OP_DEFAULT, bAllocConsole, dwUpdatePolicy);
InstallUpdatesIfAvailable(hModule, notifier, notifFactory, &toast, UPDATES_OP_DEFAULT, bAllocConsole, dwUpdatePolicy);
}
DWORD dwRet = 0;
while (TRUE)
@ -251,12 +286,12 @@ DWORD CheckForUpdatesThread(LPVOID unused)
{
case WAIT_OBJECT_0:
{
InstallUpdatesIfAvailable(hModule, bShowUpdateToast, notifier, notifFactory, &toast, UPDATES_OP_CHECK, bAllocConsole, dwUpdatePolicy);
InstallUpdatesIfAvailable(hModule, notifier, notifFactory, &toast, UPDATES_OP_CHECK, bAllocConsole, dwUpdatePolicy);
break;
}
case WAIT_OBJECT_0 + 1:
{
InstallUpdatesIfAvailable(hModule, bShowUpdateToast, notifier, notifFactory, &toast, UPDATES_OP_INSTALL, bAllocConsole, dwUpdatePolicy);
InstallUpdatesIfAvailable(hModule, notifier, notifFactory, &toast, UPDATES_OP_INSTALL, bAllocConsole, dwUpdatePolicy);
break;
}
default:

View File

@ -320,7 +320,10 @@ BOOL IsUpdateAvailableHelper(
if (*toast)
{
notifier->lpVtbl->Hide(notifier, *toast);
if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast));
(*toast) = NULL;
}
@ -636,9 +639,67 @@ BOOL UpdateProduct(
);
}
BOOL ShowUpdateSuccessNotification(
HMODULE hModule,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* notifier,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* notifFactory,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotification** toast
)
{
wchar_t buf[TOAST_BUFSIZ];
DWORD dwLeftMost = 0;
DWORD dwSecondLeft = 0;
DWORD dwSecondRight = 0;
DWORD dwRightMost = 0;
QueryVersionInfo(hModule, VS_VERSION_INFO, &dwLeftMost, &dwSecondLeft, &dwSecondRight, &dwRightMost);
__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* inputXml = NULL;
const wchar_t text[] =
L"<toast displayTimestamp=\"2021-08-29T00:00:00.000Z\" scenario=\"reminder\" "
L"activationType=\"protocol\" launch=\"" _T(UPDATES_RELEASE_INFO_URL) L"\" duration=\"short\">\r\n"
L" <visual>\r\n"
L" <binding template=\"ToastGeneric\">\r\n"
L" <text><![CDATA[Update successful]]></text>\r\n"
L" <text><![CDATA[Installed version: %d.%d.%d.%d]]></text>\r\n"
L" <text placement=\"attribution\"><![CDATA[ExplorerPatcher]]></text>\r\n"
L" </binding>\r\n"
L" </visual>\r\n"
L" <audio src=\"ms-winsoundevent:Notification.Default\" loop=\"false\" silent=\"false\"/>\r\n"
L"</toast>\r\n";
swprintf_s(buf, TOAST_BUFSIZ, text, dwLeftMost, dwSecondLeft, dwSecondRight, dwRightMost);
String2IXMLDocument(
buf,
wcslen(buf),
&inputXml,
NULL
);
if (*toast)
{
if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast));
(*toast) = NULL;
}
if (notifFactory)
{
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
}
if ((*toast) && notifier)
{
notifier->lpVtbl->Show(notifier, *toast);
}
if (inputXml)
{
inputXml->lpVtbl->Release(inputXml);
}
SwitchToThread();
}
BOOL InstallUpdatesIfAvailable(
HMODULE hModule,
BOOL bIsPostUpdate,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* notifier,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* notifFactory,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotification** toast,
@ -657,79 +718,6 @@ BOOL InstallUpdatesIfAvailable(
DWORD dwRightMost = 0;
QueryVersionInfo(hModule, VS_VERSION_INFO, &dwLeftMost, &dwSecondLeft, &dwSecondRight, &dwRightMost);
if (bIsPostUpdate)
{
__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* inputXml = NULL;
const wchar_t text[] =
L"<toast displayTimestamp=\"2021-08-29T00:00:00.000Z\" scenario=\"reminder\" "
L"activationType=\"protocol\" launch=\"" _T(UPDATES_RELEASE_INFO_URL) L"\" duration=\"short\">\r\n"
L" <visual>\r\n"
L" <binding template=\"ToastGeneric\">\r\n"
L" <text><![CDATA[Update successful]]></text>\r\n"
L" <text><![CDATA[Installed version: %d.%d.%d.%d]]></text>\r\n"
L" <text placement=\"attribution\"><![CDATA[ExplorerPatcher]]></text>\r\n"
L" </binding>\r\n"
L" </visual>\r\n"
L" <audio src=\"ms-winsoundevent:Notification.Default\" loop=\"false\" silent=\"false\"/>\r\n"
L"</toast>\r\n";
swprintf_s(buf, TOAST_BUFSIZ, text, dwLeftMost, dwSecondLeft, dwSecondRight, dwRightMost);
String2IXMLDocument(
buf,
wcslen(buf),
&inputXml,
NULL
);
if (*toast)
{
notifier->lpVtbl->Hide(notifier, *toast);
(*toast)->lpVtbl->Release((*toast));
(*toast) = NULL;
}
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
if (*toast)
{
notifier->lpVtbl->Show(notifier, *toast);
}
if (inputXml)
{
inputXml->lpVtbl->Release(inputXml);
}
HKEY hKey = NULL;
DWORD dwSize = 0;
RegCreateKeyExW(
HKEY_CURRENT_USER,
TEXT(REGPATH),
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WOW64_64KEY | KEY_WRITE,
NULL,
&hKey,
NULL
);
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
{
hKey = NULL;
}
if (hKey)
{
dwSize = FALSE;
RegSetValueExW(
hKey,
TEXT("IsUpdatePending"),
0,
REG_DWORD,
&dwSize,
sizeof(DWORD)
);
RegCloseKey(hKey);
}
SwitchToThread();
}
if (bAllocConsole)
{
switch (dwUpdatePolicy)
@ -804,12 +792,18 @@ BOOL InstallUpdatesIfAvailable(
{
if (*toast)
{
notifier->lpVtbl->Hide(notifier, *toast);
if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast));
(*toast) = NULL;
}
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
if ((*toast))
if (notifFactory)
{
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
}
if ((*toast) && notifier)
{
notifier->lpVtbl->Show(notifier, *toast);
}
@ -863,12 +857,18 @@ BOOL InstallUpdatesIfAvailable(
{
if (*toast)
{
notifier->lpVtbl->Hide(notifier, *toast);
if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast));
(*toast) = NULL;
}
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
if ((*toast))
if (notifFactory)
{
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
}
if ((*toast) && notifier)
{
notifier->lpVtbl->Show(notifier, *toast);
}
@ -902,12 +902,18 @@ BOOL InstallUpdatesIfAvailable(
);
if (*toast)
{
notifier->lpVtbl->Hide(notifier, *toast);
if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast));
(*toast) = NULL;
}
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
if ((*toast))
if (notifFactory)
{
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
}
if ((*toast) && notifier)
{
notifier->lpVtbl->Show(notifier, *toast);
}
@ -964,12 +970,18 @@ BOOL InstallUpdatesIfAvailable(
);
if (*toast)
{
notifier->lpVtbl->Hide(notifier, *toast);
if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast));
(*toast) = NULL;
}
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
if ((*toast))
if (notifFactory)
{
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
}
if ((*toast) && notifier)
{
notifier->lpVtbl->Show(notifier, *toast);
}

View File

@ -37,9 +37,14 @@ typedef struct IsUpdateAvailableParameters
};
BOOL IsUpdatePolicy(LPCWSTR wszDataStore, DWORD dwUpdatePolicy);
BOOL ShowUpdateSuccessNotification(
HMODULE hModule,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* notifier,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* notifFactory,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotification** toast
);
BOOL InstallUpdatesIfAvailable(
HMODULE hModule,
BOOL bIsPostUpdate,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* notifier,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* notifFactory,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotification** toast,