1
0
mirror of https://github.com/valinet/ExplorerPatcher.git synced 2024-11-23 23:21:08 +01:00

Weather: Rearchitected component lifetime

This commit is contained in:
Valentin Radu 2022-02-17 23:42:13 +02:00
parent 668c234207
commit b7a1ced429
6 changed files with 107 additions and 18 deletions

View File

@ -1322,6 +1322,11 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
HWND hShellTrayWnd = FindWindowW(L"Shell_TrayWnd", NULL);
if (hShellTrayWnd)
{
HANDLE hEvent = NULL;
if (GetAsyncKeyState(VK_SHIFT))
{
hEvent = CreateEventW(NULL, FALSE, FALSE, _T(EP_SETUP_EVENTNAME));
}
WCHAR wszPath[MAX_PATH];
ZeroMemory(wszPath, MAX_PATH * sizeof(WCHAR));
PDWORD_PTR res = -1;
@ -1362,6 +1367,10 @@ static BOOL GUI_Build(HDC hDC, HWND hwnd, POINT pt)
wcscat_s(wszPath, MAX_PATH, L"\\explorer.exe");
Sleep(1000);
GUI_RegSetValueExW(NULL, L"Virtualized_" _T(EP_CLSID) L"_TaskbarPosition", NULL, NULL, &dwTaskbarPosition, NULL);
if (hEvent)
{
CloseHandle(hEvent);
}
ShellExecuteW(
NULL,
L"open",

View File

@ -18,4 +18,5 @@
#define EP_SETUP_HELPER_SWITCH "/CreateExplorerShellUnelevatedAfterServicing"
#define EP_DWM_SERVICENAME "ep_dwm_" EP_CLSID_LITE
#define EP_DWM_EVENTNAME "Global\\ep_dwm_2_" EP_CLSID_LITE
#define EP_SETUP_EVENTNAME "Global\\ep_setup_" EP_CLSID_LITE
#endif

View File

@ -8110,9 +8110,25 @@ DWORD Inject(BOOL bIsExplorer)
wszEPWeatherKillswitch = calloc(sizeof(WCHAR), MAX_PATH);
rand_string(wszEPWeatherKillswitch, MAX_PATH / 2);
wcscat_s(wszEPWeatherKillswitch, MAX_PATH, _T(EP_Weather_Killswitch));
srand(time(NULL));
rand_string(wszEPWeatherKillswitch, MAX_PATH / 2 - 1);
swprintf_s(wszEPWeatherKillswitch, sizeof(_T(EP_Weather_Killswitch)) / sizeof(WCHAR), L"%s", _T(EP_Weather_Killswitch));
wszEPWeatherKillswitch[wcslen(wszEPWeatherKillswitch)] = L'_';
//wprintf(L"%s\n", wszEPWeatherKillswitch);
hEPWeatherKillswitch = CreateMutexW(NULL, TRUE, wszEPWeatherKillswitch);
/*while (TRUE)
{
hEPWeatherKillswitch = CreateMutexW(NULL, TRUE, wszEPWeatherKillswitch);
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
WaitForSingleObject(hEPWeatherKillswitch, INFINITE);
CloseHandle(hEPWeatherKillswitch);
}
else
{
break;
}
}*/
#ifdef _WIN64

View File

@ -540,6 +540,8 @@ int WINAPI wWinMain(
exit(0);
}
CreateEventW(NULL, FALSE, FALSE, _T(EP_SETUP_EVENTNAME));
SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath);
wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH));
bOk = CreateDirectoryW(wszPath, NULL);

View File

@ -3,9 +3,17 @@
#include "ep_weather_provider_google_script.h"
#include "ep_weather_error_html.h"
EPWeather* EPWeather_Instance;
EPWeather* EPWeather_Instance = NULL;
SRWLOCK Lock_EPWeather_Instance = { .Ptr = SRWLOCK_INIT };
FARPROC SHRegGetValueFromHKCUHKLMFunc;
static DWORD epw_Weather_ReleaseBecauseClientDiedThread(EPWeather* _this)
{
Sleep(5000);
while (_this->lpVtbl->Release(_this));
return 0;
}
static void epw_Weather_SetTextScaleFactorFromRegistry(EPWeather* _this, HKEY hKey, BOOL bRefresh)
{
DWORD dwTextScaleFactor = 100, dwSize = sizeof(DWORD);
@ -57,6 +65,7 @@ ULONG STDMETHODCALLTYPE INetworkListManagerEvents_AddRefRelease(void* _this)
HRESULT STDMETHODCALLTYPE INetworkListManagerEvents_ConnectivityChanged(void* _this2, NLM_CONNECTIVITY newConnectivity)
{
AcquireSRWLockShared(&Lock_EPWeather_Instance);
EPWeather* _this = EPWeather_Instance; // GetWindowLongPtrW(FindWindowW(_T(EPW_WEATHER_CLASSNAME), NULL), GWLP_USERDATA);
if (_this)
{
@ -75,6 +84,7 @@ HRESULT STDMETHODCALLTYPE INetworkListManagerEvents_ConnectivityChanged(void* _t
printf("[Network Events] Killed refresh timer.\n");
}
}
ReleaseSRWLockShared(&Lock_EPWeather_Instance);
return S_OK;
}
@ -132,7 +142,9 @@ HRESULT STDMETHODCALLTYPE ICoreWebView2_get_AllowSingleSignOnUsingOSPrimaryAccou
HRESULT STDMETHODCALLTYPE ICoreWebView2_CreateCoreWebView2EnvironmentCompleted(ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler* _this, HRESULT hr, ICoreWebView2Environment* pCoreWebView2Environemnt)
{
AcquireSRWLockShared(&Lock_EPWeather_Instance);
pCoreWebView2Environemnt->lpVtbl->CreateCoreWebView2Controller(pCoreWebView2Environemnt, EPWeather_Instance->hWnd /* FindWindowW(_T(EPW_WEATHER_CLASSNAME), NULL) */, &EPWeather_ICoreWebView2CreateCoreWebView2ControllerCompletedHandler);
ReleaseSRWLockShared(&Lock_EPWeather_Instance);
return S_OK;
}
@ -263,6 +275,8 @@ HRESULT STDMETHODCALLTYPE _ep_weather_ReboundBrowser(EPWeather* _this, LONG64 dw
HRESULT STDMETHODCALLTYPE ICoreWebView2_CreateCoreWebView2ControllerCompleted(ICoreWebView2CreateCoreWebView2ControllerCompletedHandler* _this2, HRESULT hr, ICoreWebView2Controller* pCoreWebView2Controller)
{
AcquireSRWLockShared(&Lock_EPWeather_Instance);
EPWeather* _this = EPWeather_Instance; // GetWindowLongPtrW(FindWindowW(_T(EPW_WEATHER_CLASSNAME), NULL), GWLP_USERDATA);
if (!_this->pCoreWebView2Controller)
{
@ -318,11 +332,14 @@ HRESULT STDMETHODCALLTYPE ICoreWebView2_CreateCoreWebView2ControllerCompleted(IC
_epw_Weather_NavigateToProvider(_this);
ReleaseSRWLockShared(&Lock_EPWeather_Instance);
return S_OK;
}
HRESULT STDMETHODCALLTYPE ICoreWebView2_CallDevToolsProtocolMethodCompleted(ICoreWebView2CallDevToolsProtocolMethodCompletedHandler* _this, HRESULT errorCode, LPCWSTR returnObjectAsJson)
{
AcquireSRWLockShared(&Lock_EPWeather_Instance);
if (EPWeather_Instance)
{
wprintf(L"[CallDevToolsProtocolMethodCompleted] 0x%x [[ %s ]]\n", errorCode, returnObjectAsJson);
@ -338,11 +355,13 @@ HRESULT STDMETHODCALLTYPE ICoreWebView2_CallDevToolsProtocolMethodCompleted(ICor
}
CoTaskMemFree(uri);
}
ReleaseSRWLockShared(&Lock_EPWeather_Instance);
return S_OK;
}
HRESULT STDMETHODCALLTYPE ICoreWebView2_NavigationCompleted(ICoreWebView2NavigationCompletedEventHandler* _this2, ICoreWebView2* pCoreWebView2, ICoreWebView2NavigationCompletedEventArgs* pCoreWebView2NavigationCompletedEventArgs)
{
AcquireSRWLockShared(&Lock_EPWeather_Instance);
EPWeather* _this = EPWeather_Instance; // GetWindowLongPtrW(FindWindowW(_T(EPW_WEATHER_CLASSNAME), NULL), GWLP_USERDATA);
BOOL bIsSuccess = FALSE;
pCoreWebView2NavigationCompletedEventArgs->lpVtbl->get_IsSuccess(pCoreWebView2NavigationCompletedEventArgs, &bIsSuccess);
@ -365,11 +384,13 @@ HRESULT STDMETHODCALLTYPE ICoreWebView2_NavigationCompleted(ICoreWebView2Navigat
}
_this->pCoreWebView2Controller->lpVtbl->put_IsVisible(_this->pCoreWebView2Controller, FALSE);
_this->pCoreWebView2Controller->lpVtbl->put_IsVisible(_this->pCoreWebView2Controller, TRUE);
ReleaseSRWLockShared(&Lock_EPWeather_Instance);
return S_OK;
}
HRESULT STDMETHODCALLTYPE ICoreWebView2_ExecuteScriptCompleted(ICoreWebView2ExecuteScriptCompletedHandler* _this2, HRESULT hr, LPCWSTR pResultObjectAsJson)
{
AcquireSRWLockShared(&Lock_EPWeather_Instance);
EPWeather* _this = EPWeather_Instance; // GetWindowLongPtrW(FindWindowW(_T(EPW_WEATHER_CLASSNAME), NULL), GWLP_USERDATA);
if (_this)
{
@ -394,6 +415,7 @@ HRESULT STDMETHODCALLTYPE ICoreWebView2_ExecuteScriptCompleted(ICoreWebView2Exec
printf("consent granted\n");
PostMessageW(EPWeather_Instance->hWnd, EP_WEATHER_WM_FETCH_DATA, 0, 0);
SetTimer(EPWeather_Instance->hWnd, EP_WEATHER_TIMER_REQUEST_REFRESH, EP_WEATHER_TIMER_REQUEST_REFRESH_DELAY * 5, NULL);
ReleaseSRWLockShared(&Lock_EPWeather_Instance);
return S_OK;
}
else
@ -522,11 +544,13 @@ HRESULT STDMETHODCALLTYPE ICoreWebView2_ExecuteScriptCompleted(ICoreWebView2Exec
SetTimer(_this->hWnd, EP_WEATHER_TIMER_REQUEST_REPAINT, EP_WEATHER_TIMER_REQUEST_REPAINT_DELAY, NULL);
}
}
ReleaseSRWLockShared(&Lock_EPWeather_Instance);
return S_OK;
}
HRESULT STDMETHODCALLTYPE ICoreWebView2_PermissionRequested(ICoreWebView2PermissionRequestedEventHandler* _this2, ICoreWebView2* pCoreWebView2, ICoreWebView2PermissionRequestedEventArgs* pCoreWebView2PermissionRequestedEventArgs)
{
AcquireSRWLockShared(&Lock_EPWeather_Instance);
COREWEBVIEW2_PERMISSION_KIND kind;
pCoreWebView2PermissionRequestedEventArgs->lpVtbl->get_PermissionKind(pCoreWebView2PermissionRequestedEventArgs, &kind);
if (kind == COREWEBVIEW2_PERMISSION_KIND_GEOLOCATION)
@ -535,17 +559,22 @@ HRESULT STDMETHODCALLTYPE ICoreWebView2_PermissionRequested(ICoreWebView2Permiss
printf("[Permissions] Geolocation permission request: %d\n", r);
pCoreWebView2PermissionRequestedEventArgs->lpVtbl->put_State(pCoreWebView2PermissionRequestedEventArgs, r ? COREWEBVIEW2_PERMISSION_STATE_ALLOW : COREWEBVIEW2_PERMISSION_STATE_DENY);
}
ReleaseSRWLockShared(&Lock_EPWeather_Instance);
return S_OK;
}
ULONG STDMETHODCALLTYPE epw_Weather_AddRef(EPWeather* _this)
{
return InterlockedIncrement64(&(_this->cbCount));
ULONG value = InterlockedIncrement64(&(_this->cbCount));
printf("[General] AddRef: %d\n", value);
return value;
}
ULONG STDMETHODCALLTYPE epw_Weather_Release(EPWeather* _this)
{
ULONG value = InterlockedDecrement64(&(_this->cbCount));
printf("[General] Release: %d\n", value);
if (value == 0)
{
if (_this->hMainThread)
@ -606,8 +635,21 @@ ULONG STDMETHODCALLTYPE epw_Weather_Release(EPWeather* _this)
if (!dwOutstandingObjects && !dwOutstandingLocks)
{
}
printf("[General] Outstanding objects: %d, outstanding locks: %d\n", dwOutstandingObjects, dwOutstandingLocks);
TerminateProcess(GetCurrentProcess(), 0);
#if defined(DEBUG) | defined(_DEBUG)
printf("\nDumping memory leaks:\n");
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
_CrtDumpMemoryLeaks();
printf("Memory dump complete.\n\n");
#endif
//TerminateProcess(GetCurrentProcess(), 0);
return(0);
}
@ -947,6 +989,7 @@ HRESULT STDMETHODCALLTYPE epw_Weather_SetWindowCornerPreference(EPWeather* _this
DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
{
HRESULT hr = S_OK;
BOOL bShouldReleaseBecauseClientDied = FALSE;
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
@ -978,8 +1021,8 @@ DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
if (!RegisterClassW(&wc))
{
_this->hrLastError = HRESULT_FROM_WIN32(GetLastError());
goto cleanup;
//_this->hrLastError = HRESULT_FROM_WIN32(GetLastError());
//goto cleanup;
}
_this->hWnd = CreateWindowExW(0, _T(EPW_WEATHER_CLASSNAME), L"", WS_OVERLAPPED | WS_CAPTION, _this->rc.left, _this->rc.top, _this->rc.right - _this->rc.left, _this->rc.bottom - _this->rc.top, NULL, NULL, epw_hModule, _this); // 1030, 630
@ -1081,12 +1124,23 @@ DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
break;
}
}
else if (dwRes == WAIT_ABANDONED_0 + 1 || dwRes == WAIT_OBJECT_0 + 1)
else if (dwRes == WAIT_ABANDONED_0 + 1)// || dwRes == WAIT_OBJECT_0 + 1)
{
if (dwRes == WAIT_OBJECT_0 + 1) ReleaseMutex(_this->hSignalKillSwitch);
CloseHandle(_this->hSignalKillSwitch);
printf("[General] Client has died.\n");
if (OpenEventW(READ_CONTROL, FALSE, _T(EP_SETUP_EVENTNAME)))
{
printf("[General] Servicing is in progress, terminating...\n");
TerminateProcess(GetCurrentProcess(), 0);
}
//if (dwRes == WAIT_OBJECT_0 + 1) ReleaseMutex(_this->hSignalKillSwitch);
CloseHandle(_this->hSignalKillSwitch);
//TerminateProcess(GetCurrentProcess(), 0);
_this->hSignalKillSwitch = NULL;
bShouldReleaseBecauseClientDied = TRUE;
break;
}
else if (dwRes == WAIT_OBJECT_0 + 2)
{
epw_Weather_SetTextScaleFactorFromRegistry(_this, HKEY_CURRENT_USER, TRUE);
@ -1128,23 +1182,23 @@ DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
{
_this->pCoreWebView2Controller->lpVtbl->Release(_this->pCoreWebView2Controller);
}
if (_this->cbTemperature && _this->wszTemperature)
if (_this->wszTemperature)
{
free(_this->wszTemperature);
}
if (_this->cbUnit && _this->wszUnit)
if (_this->wszUnit)
{
free(_this->wszUnit);
}
if (_this->cbCondition && _this->wszCondition)
if (_this->wszCondition)
{
free(_this->wszCondition);
}
if (_this->cbImage && _this->pImage)
if (_this->pImage)
{
free(_this->pImage);
}
if (_this->cbLocation && _this->wszLocation)
if (_this->wszLocation)
{
free(_this->wszLocation);
}
@ -1152,13 +1206,17 @@ DWORD WINAPI epw_Weather_MainThread(EPWeather* _this)
{
DestroyWindow(_this->hWnd);
}
UnregisterClassW(_T(EPW_WEATHER_CLASSNAME), epw_hModule);
//UnregisterClassW(_T(EPW_WEATHER_CLASSNAME), epw_hModule);
if (_this->pTaskList)
{
_this->pTaskList->lpVtbl->Release(_this->pTaskList);
}
CoUninitialize();
SetEvent(_this->hInitializeEvent);
if (bShouldReleaseBecauseClientDied)
{
//SHCreateThread(epw_Weather_ReleaseBecauseClientDiedThread, _this, CTF_NOADDREFLIB, NULL);
}
return 0;
}
@ -1177,11 +1235,13 @@ HRESULT STDMETHODCALLTYPE epw_Weather_Initialize(EPWeather* _this, WCHAR wszName
);
}
if (EPWeather_Instance)
/*if (EPWeather_Instance)
{
return E_FAIL;
}
}*/
AcquireSRWLockExclusive(&Lock_EPWeather_Instance);
EPWeather_Instance = _this;
ReleaseSRWLockExclusive(&Lock_EPWeather_Instance);
if (dwUpdateSchedule < 0)
{

View File

@ -3,6 +3,7 @@
#include "ep_weather.h"
#include "ep_weather_utility.h"
#include "../ep_weather_host_stub/ep_weather_host_h.h"
#include "../ExplorerPatcher/def.h"
#include <windowsx.h>
#include <ShlObj.h>
#include <Shobjidl.h>