NTSTATUS ShowUpdateDialogThread( _In_ PVOID Parameter ) { PH_AUTO_POOL autoPool; PPH_UPDATER_CONTEXT context; TASKDIALOGCONFIG config = { sizeof(TASKDIALOGCONFIG) }; if (Parameter) context = (PPH_UPDATER_CONTEXT)Parameter; else context = CreateUpdateContext(FALSE); PhInitializeAutoPool(&autoPool); // Start TaskDialog bootstrap config.dwFlags = TDF_ALLOW_DIALOG_CANCELLATION | TDF_CAN_BE_MINIMIZED; config.pszContent = L"Initializing..."; config.lpCallbackData = (LONG_PTR)context; config.pfCallback = TaskDialogBootstrapCallback; TaskDialogIndirect(&config, NULL, NULL, NULL); FreeUpdateContext(context); PhDeleteAutoPool(&autoPool); if (UpdateDialogThreadHandle) { NtClose(UpdateDialogThreadHandle); UpdateDialogThreadHandle = NULL; } PhResetEvent(&InitializedEvent); return STATUS_SUCCESS; }
NTSTATUS UpdateCheckSilentThread( _In_ PVOID Parameter ) { PPH_UPDATER_CONTEXT context = NULL; ULONGLONG currentVersion = 0; ULONGLONG latestVersion = 0; context = CreateUpdateContext(TRUE); #ifndef FORCE_UPDATE_CHECK if (!LastUpdateCheckExpired()) goto CleanupExit; #endif Sleep(5 * 1000); // Clear the application cache directory. PhClearCacheDirectory(); // Query latest update information from the server. if (!QueryUpdateData(context)) goto CleanupExit; currentVersion = ParseVersionString(context->CurrentVersionString); #ifdef FORCE_UPDATE_CHECK latestVersion = MAKE_VERSION_ULONGLONG( 9999, 9999, 9999, 0 ); #else latestVersion = ParseVersionString(context->Version); #endif // Compare the current version against the latest available version if (currentVersion < latestVersion) { // Check if the user hasn't already opened the dialog. if (!UpdateDialogHandle) { // We have data we're going to cache and pass into the dialog context->HaveData = TRUE; // Show the dialog asynchronously on a new thread. ShowUpdateDialog(context); } } CleanupExit: if (!context->HaveData) FreeUpdateContext(context); return STATUS_SUCCESS; }
VOID SetupShowUpdateDialog( VOID ) { PVOID context; TASKDIALOGCONFIG config; PH_AUTO_POOL autoPool; memset(&config, 0, sizeof(TASKDIALOGCONFIG)); PhInitializeAutoPool(&autoPool); context = CreateUpdateContext(); config.cbSize = sizeof(TASKDIALOGCONFIG); config.dwFlags = TDF_POSITION_RELATIVE_TO_WINDOW; config.dwCommonButtons = TDCBF_CANCEL_BUTTON; config.pszWindowTitle = PhApplicationName; config.pfCallback = TaskDialogBootstrapCallback; config.lpCallbackData = (LONG_PTR)context; TaskDialogIndirect(&config, NULL, NULL, NULL); PhDeleteAutoPool(&autoPool); }