diff --git a/build/VStudio/installer/CustomActions/CustomActions.cpp b/build/VStudio/installer/CustomActions/CustomActions.cpp new file mode 100644 index 00000000..af09954e --- /dev/null +++ b/build/VStudio/installer/CustomActions/CustomActions.cpp @@ -0,0 +1,83 @@ +/** + * @file CustomActions.cpp + * + * @copyright 2015-2016 Bill Zissimopoulos + */ +/* + * This file is part of WinFsp. + * + * You can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License version 3 as published by the + * Free Software Foundation. + * + * Licensees holding a valid commercial license may use this file in + * accordance with the commercial license agreement provided with the + * software. + */ + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include + +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"); + + 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; +} diff --git a/build/VStudio/installer/CustomActions/CustomActions.def b/build/VStudio/installer/CustomActions/CustomActions.def new file mode 100644 index 00000000..817b3f32 --- /dev/null +++ b/build/VStudio/installer/CustomActions/CustomActions.def @@ -0,0 +1,2 @@ +EXPORTS + ServiceRunning diff --git a/build/VStudio/installer/CustomActions/CustomActions.vcxproj b/build/VStudio/installer/CustomActions/CustomActions.vcxproj new file mode 100644 index 00000000..3584aef2 --- /dev/null +++ b/build/VStudio/installer/CustomActions/CustomActions.vcxproj @@ -0,0 +1,112 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {95C223E6-B5F1-4FD0-9376-41CDBC824445} + CustomActions + Win32Proj + 8.1 + + + + DynamicLibrary + v140 + Unicode + true + + + DynamicLibrary + v140 + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>14.0.25123.0 + + + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + true + + + $(SolutionDir)build\$(Configuration)\ + $(SolutionDir)build\$(ProjectName).build\$(Configuration)\$(PlatformTarget)\ + false + + + + Disabled + $(WIX)sdk\VS2015\inc;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CUSTOMACTIONTEST_EXPORTS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + NotUsing + Level3 + EditAndContinue + false + + + msi.lib;dutil.lib;wcautil.lib;Version.lib;%(AdditionalDependencies) + $(WIX)sdk\VS2015\lib\x86;%(AdditionalLibraryDirectories) + CustomActions.def + true + Windows + MachineX86 + false + false + + + + + MaxSpeed + true + $(WIX)sdk\VS2015\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CUSTOMACTIONTEST_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + NotUsing + Level3 + ProgramDatabase + false + + + msi.lib;dutil.lib;wcautil.lib;Version.lib;%(AdditionalDependencies) + $(WIX)sdk\VS2015\lib\x86;%(AdditionalLibraryDirectories) + CustomActions.def + true + Windows + true + true + MachineX86 + false + + + + + + + + + + + + \ No newline at end of file diff --git a/build/VStudio/installer/CustomActions/CustomActions.vcxproj.filters b/build/VStudio/installer/CustomActions/CustomActions.vcxproj.filters new file mode 100644 index 00000000..44627eb5 --- /dev/null +++ b/build/VStudio/installer/CustomActions/CustomActions.vcxproj.filters @@ -0,0 +1,19 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source + + + + + Source + + + \ No newline at end of file diff --git a/build/VStudio/installer/Product.wxs b/build/VStudio/installer/Product.wxs index 3605dbf3..be268436 100644 --- a/build/VStudio/installer/Product.wxs +++ b/build/VStudio/installer/Product.wxs @@ -190,5 +190,24 @@ Value="WelcomeDlg" Order="10">NOT Installed + + + + + + REMOVE ~= "ALL" + REMOVE ~= "ALL" + + ServiceRunning)]]> + + \ No newline at end of file diff --git a/build/VStudio/winfsp.sln b/build/VStudio/winfsp.sln index 4a838aaf..4b6cbfa4 100644 --- a/build/VStudio/winfsp.sln +++ b/build/VStudio/winfsp.sln @@ -25,13 +25,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "memfs", "testing\memfs.vcxp EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "installer", "installer", "{B464EF06-42AE-4674-81BB-FDDE80204822}" EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "winfsp.msi", "installer\winfsp_msi.wixproj", "{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}" +Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "winfsp_msi", "installer\winfsp_msi.wixproj", "{D53AAC39-4C57-4CA5-A4F3-C2B24888C594}" ProjectSection(ProjectDependencies) = postProject {4A7C0B21-9E10-4C81-92DE-1493EFCF24EB} = {4A7C0B21-9E10-4C81-92DE-1493EFCF24EB} {C85C26BA-8C22-4D30-83DA-46C3548E6332} = {C85C26BA-8C22-4D30-83DA-46C3548E6332} + {95C223E6-B5F1-4FD0-9376-41CDBC824445} = {95C223E6-B5F1-4FD0-9376-41CDBC824445} {AA7190E8-877F-4827-8CDD-E0D85F83C8C1} = {AA7190E8-877F-4827-8CDD-E0D85F83C8C1} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CustomActions", "installer\CustomActions\CustomActions.vcxproj", "{95C223E6-B5F1-4FD0-9376-41CDBC824445}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -76,6 +79,10 @@ Global {D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Debug|x86.ActiveCfg = Debug|x86 {D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Release|x64.ActiveCfg = Release|x86 {D53AAC39-4C57-4CA5-A4F3-C2B24888C594}.Release|x86.ActiveCfg = Release|x86 + {95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|x64.ActiveCfg = Debug|Win32 + {95C223E6-B5F1-4FD0-9376-41CDBC824445}.Debug|x86.ActiveCfg = Debug|Win32 + {95C223E6-B5F1-4FD0-9376-41CDBC824445}.Release|x64.ActiveCfg = Release|Win32 + {95C223E6-B5F1-4FD0-9376-41CDBC824445}.Release|x86.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -84,5 +91,6 @@ Global {262DF8CC-E7A8-4460-A22C-683CBA322C32} = {69439FD1-C07D-4BF1-98DC-3CCFECE53A49} {AA7190E8-877F-4827-8CDD-E0D85F83C8C1} = {69439FD1-C07D-4BF1-98DC-3CCFECE53A49} {D53AAC39-4C57-4CA5-A4F3-C2B24888C594} = {B464EF06-42AE-4674-81BB-FDDE80204822} + {95C223E6-B5F1-4FD0-9376-41CDBC824445} = {B464EF06-42AE-4674-81BB-FDDE80204822} EndGlobalSection EndGlobal