/** * @file CustomActions.cpp * * @copyright 2015-2022 Bill Zissimopoulos */ /* * This file is part of WinFsp. * * You can redistribute it and/or modify it under the terms of the GNU * General Public License version 3 as published by the Free Software * Foundation. * * Licensees holding a valid commercial license may use this software * in accordance with the commercial license agreement provided in * conjunction with the software. The terms and conditions of any such * commercial license agreement shall govern, supersede, and render * ineffective any application of the GPLv3 license to this software, * notwithstanding of any reference thereto in the software or * associated repository. */ #define WIN32_LEAN_AND_MEAN #include #include #include #include UINT __stdcall InstanceID(MSIHANDLE MsiHandle) { #if 0 WCHAR MessageBuf[64]; wsprintfW(MessageBuf, L"PID=%ld", GetCurrentProcessId()); MessageBoxW(0, MessageBuf, L"" __FUNCTION__ " Break", MB_OK); #endif HRESULT hr = S_OK; UINT err = ERROR_SUCCESS; SYSTEMTIME SystemTime; WCHAR Result[32+1]; hr = WcaInitialize(MsiHandle, __FUNCTION__); ExitOnFailure(hr, "Failed to initialize"); WcaLog(LOGMSG_STANDARD, "Initialized"); GetSystemTime(&SystemTime); wsprintfW(Result, L"%04u%02u%02uT%02u%02u%02uZ", SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond); /* * Sleep 1 second to ensure timestamp uniqueness. * * Note that this assumes that time is monotonic and users do not change time. * Disable for now as it is assumed that the installation takes more than 1 second to complete. */ //Sleep(1000); WcaSetProperty(L"" __FUNCTION__, Result); LExit: err = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; return WcaFinalize(err); } UINT __stdcall ServiceRunning(MSIHANDLE MsiHandle) { #if 0 WCHAR MessageBuf[64]; wsprintfW(MessageBuf, L"PID=%ld", GetCurrentProcessId()); MessageBoxW(0, MessageBuf, L"" __FUNCTION__ " Break", MB_OK); #endif HRESULT hr = S_OK; UINT err = ERROR_SUCCESS; PWSTR ServiceName = 0; SC_HANDLE ScmHandle = 0; SC_HANDLE SvcHandle = 0; SERVICE_STATUS ServiceStatus; int Result = 0; hr = WcaInitialize(MsiHandle, __FUNCTION__); ExitOnFailure(hr, "Failed to initialize"); hr = WcaGetProperty(L"" __FUNCTION__, &ServiceName); ExitOnFailure(hr, "Failed to get ServiceName"); WcaLog(LOGMSG_STANDARD, "Initialized: \"%S\"", ServiceName); ScmHandle = OpenSCManagerW(0, 0, 0); ExitOnNullWithLastError(ScmHandle, hr, "Failed to open SCM"); SvcHandle = OpenServiceW(ScmHandle, ServiceName, SERVICE_QUERY_STATUS); if (0 != SvcHandle && QueryServiceStatus(SvcHandle, &ServiceStatus)) Result = SERVICE_STOPPED != ServiceStatus.dwCurrentState; WcaSetIntProperty(L"" __FUNCTION__, Result); LExit: if (0 != SvcHandle) CloseServiceHandle(SvcHandle); if (0 != ScmHandle) CloseServiceHandle(ScmHandle); ReleaseStr(ServiceName); err = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; return WcaFinalize(err); } extern "C" BOOL WINAPI DllMain(HINSTANCE Instance, DWORD Reason, PVOID Reserved) { switch(Reason) { case DLL_PROCESS_ATTACH: WcaGlobalInitialize(Instance); break; case DLL_PROCESS_DETACH: WcaGlobalFinalize(); break; } return TRUE; }