Browse Source

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

pull/886/head 22000.376.40.16_277f235
Valentin Radu 4 years ago
parent
commit
277f235810
  1. 41
      ExplorerPatcher/dllmain.c
  2. 186
      ExplorerPatcher/updates.c
  3. 7
      ExplorerPatcher/updates.h

41
ExplorerPatcher/dllmain.c

@ -240,9 +240,44 @@ DWORD CheckForUpdatesThread(LPVOID unused)
hEvents[1] = CreateEventW(NULL, FALSE, FALSE, L"EP_Ev_InstallUpdates_" _T(EP_CLSID)); hEvents[1] = CreateEventW(NULL, FALSE, FALSE, L"EP_Ev_InstallUpdates_" _T(EP_CLSID));
if (hEvents[0] && hEvents[1]) 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) 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; DWORD dwRet = 0;
while (TRUE) while (TRUE)
@ -251,12 +286,12 @@ DWORD CheckForUpdatesThread(LPVOID unused)
{ {
case WAIT_OBJECT_0: 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; break;
} }
case WAIT_OBJECT_0 + 1: 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; break;
} }
default: default:

186
ExplorerPatcher/updates.c

@ -320,7 +320,10 @@ BOOL IsUpdateAvailableHelper(
if (*toast) if (*toast)
{ {
notifier->lpVtbl->Hide(notifier, *toast); if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast)); (*toast)->lpVtbl->Release((*toast));
(*toast) = NULL; (*toast) = NULL;
} }
@ -636,20 +639,13 @@ BOOL UpdateProduct(
); );
} }
BOOL InstallUpdatesIfAvailable( BOOL ShowUpdateSuccessNotification(
HMODULE hModule, HMODULE hModule,
BOOL bIsPostUpdate,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* notifier, __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* notifier,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* notifFactory, __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* notifFactory,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotification** toast, __x_ABI_CWindows_CUI_CNotifications_CIToastNotification** toast
DWORD dwOperation,
DWORD bAllocConsole,
DWORD dwUpdatePolicy
) )
{ {
wchar_t wszInfoURL[MAX_PATH];
ZeroMemory(wszInfoURL, MAX_PATH * sizeof(wchar_t));
wcscat_s(wszInfoURL, MAX_PATH, _T(UPDATES_RELEASE_INFO_URL_STABLE));
wchar_t buf[TOAST_BUFSIZ]; wchar_t buf[TOAST_BUFSIZ];
DWORD dwLeftMost = 0; DWORD dwLeftMost = 0;
DWORD dwSecondLeft = 0; DWORD dwSecondLeft = 0;
@ -657,78 +653,70 @@ BOOL InstallUpdatesIfAvailable(
DWORD dwRightMost = 0; DWORD dwRightMost = 0;
QueryVersionInfo(hModule, VS_VERSION_INFO, &dwLeftMost, &dwSecondLeft, &dwSecondRight, &dwRightMost); 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)
{ {
__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* inputXml = NULL; if (notifier)
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); notifier->lpVtbl->Hide(notifier, *toast);
(*toast)->lpVtbl->Release((*toast));
(*toast) = NULL;
} }
(*toast)->lpVtbl->Release((*toast));
(*toast) = NULL;
}
if (notifFactory)
{
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast); notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
if (*toast) }
{ if ((*toast) && notifier)
notifier->lpVtbl->Show(notifier, *toast); {
} notifier->lpVtbl->Show(notifier, *toast);
if (inputXml) }
{ if (inputXml)
inputXml->lpVtbl->Release(inputXml); {
} inputXml->lpVtbl->Release(inputXml);
}
HKEY hKey = NULL;
DWORD dwSize = 0;
RegCreateKeyExW( SwitchToThread();
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(); BOOL InstallUpdatesIfAvailable(
} HMODULE hModule,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* notifier,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* notifFactory,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotification** toast,
DWORD dwOperation,
DWORD bAllocConsole,
DWORD dwUpdatePolicy
)
{
wchar_t wszInfoURL[MAX_PATH];
ZeroMemory(wszInfoURL, MAX_PATH * sizeof(wchar_t));
wcscat_s(wszInfoURL, MAX_PATH, _T(UPDATES_RELEASE_INFO_URL_STABLE));
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);
if (bAllocConsole) if (bAllocConsole)
{ {
@ -804,12 +792,18 @@ BOOL InstallUpdatesIfAvailable(
{ {
if (*toast) if (*toast)
{ {
notifier->lpVtbl->Hide(notifier, *toast); if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast)); (*toast)->lpVtbl->Release((*toast));
(*toast) = NULL; (*toast) = NULL;
} }
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast); if (notifFactory)
if ((*toast)) {
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
}
if ((*toast) && notifier)
{ {
notifier->lpVtbl->Show(notifier, *toast); notifier->lpVtbl->Show(notifier, *toast);
} }
@ -863,12 +857,18 @@ BOOL InstallUpdatesIfAvailable(
{ {
if (*toast) if (*toast)
{ {
notifier->lpVtbl->Hide(notifier, *toast); if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast)); (*toast)->lpVtbl->Release((*toast));
(*toast) = NULL; (*toast) = NULL;
} }
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast); if (notifFactory)
if ((*toast)) {
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
}
if ((*toast) && notifier)
{ {
notifier->lpVtbl->Show(notifier, *toast); notifier->lpVtbl->Show(notifier, *toast);
} }
@ -902,12 +902,18 @@ BOOL InstallUpdatesIfAvailable(
); );
if (*toast) if (*toast)
{ {
notifier->lpVtbl->Hide(notifier, *toast); if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast)); (*toast)->lpVtbl->Release((*toast));
(*toast) = NULL; (*toast) = NULL;
} }
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast); if (notifFactory)
if ((*toast)) {
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
}
if ((*toast) && notifier)
{ {
notifier->lpVtbl->Show(notifier, *toast); notifier->lpVtbl->Show(notifier, *toast);
} }
@ -964,12 +970,18 @@ BOOL InstallUpdatesIfAvailable(
); );
if (*toast) if (*toast)
{ {
notifier->lpVtbl->Hide(notifier, *toast); if (notifier)
{
notifier->lpVtbl->Hide(notifier, *toast);
}
(*toast)->lpVtbl->Release((*toast)); (*toast)->lpVtbl->Release((*toast));
(*toast) = NULL; (*toast) = NULL;
} }
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast); if (notifFactory)
if ((*toast)) {
notifFactory->lpVtbl->CreateToastNotification(notifFactory, inputXml, toast);
}
if ((*toast) && notifier)
{ {
notifier->lpVtbl->Show(notifier, *toast); notifier->lpVtbl->Show(notifier, *toast);
} }

7
ExplorerPatcher/updates.h

@ -37,9 +37,14 @@ typedef struct IsUpdateAvailableParameters
}; };
BOOL IsUpdatePolicy(LPCWSTR wszDataStore, DWORD dwUpdatePolicy); 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( BOOL InstallUpdatesIfAvailable(
HMODULE hModule, HMODULE hModule,
BOOL bIsPostUpdate,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* notifier, __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* notifier,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* notifFactory, __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* notifFactory,
__x_ABI_CWindows_CUI_CNotifications_CIToastNotification** toast, __x_ABI_CWindows_CUI_CNotifications_CIToastNotification** toast,

Loading…
Cancel
Save