summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndras Timar <atimar@suse.com>2011-11-24 23:10:30 +0100
committerFridrich Štrba <fridrich.strba@bluewin.ch>2011-11-25 10:02:34 +0100
commit2408d229104c3e198ce79e72bb89ce360575aa36 (patch)
tree03682c33de2b7dad3a8b6239e2d44f95d8fabf73
parentc726de0c282cab62b9f1a3b51249e37224325fe9 (diff)
change logic of IsOfficeRunning custom action fdo#36677
instead of trying to rename a file or folder in Program Files directory - which is write protected anyway normally - installer checks the process list, if there is a process called "soffice.bin". Signed-off-by: Fridrich Štrba <fridrich.strba@bluewin.ch>
-rw-r--r--setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx205
-rw-r--r--setup_native/source/win32/customactions/shellextensions/makefile.mk3
2 files changed, 27 insertions, 181 deletions
diff --git a/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx b/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
index 0cf845822..3432ddda0 100644
--- a/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
@@ -53,6 +53,10 @@
#include <stdio.h>
#include <sal/macros.h>
+// works with Windows XP as well as with Windows 7
+#define PSAPI_VERSION 1
+#include <psapi.h>
+
#include <systools/win32/uwinapi.h>
#include <../tools/seterror.hxx>
@@ -93,201 +97,42 @@ static std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sPro
return result;
}
-static inline bool IsSetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty)
-{
- std::_tstring value = GetMsiProperty(handle, sProperty);
- return (value.length() > 0);
-}
-
-static inline void UnsetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty)
+extern "C" UINT __stdcall IsOfficeRunning( MSIHANDLE handle )
{
- MsiSetProperty(handle, sProperty.c_str(), NULL);
-}
+ std::_tstring sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
+ // Property empty -> no office installed
+ if ( sOfficeInstallPath.length() == 0 )
+ return ERROR_SUCCESS;
-static inline void SetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty)
-{
- MsiSetProperty(handle, sProperty.c_str(), TEXT("1"));
-}
+ DWORD aProcesses[1024], cbNeeded, cProcesses; /* 1024 processses ought to be enough for anybody */
-static BOOL MoveFileEx9x( LPCSTR lpExistingFileNameA, LPCSTR lpNewFileNameA, DWORD dwFlags )
-{
- BOOL fSuccess = FALSE; // assume failure
+ if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
+ return ERROR_INSTALL_FAILURE;
- // Windows 9x has a special mechanism to move files after reboot
+ cProcesses = cbNeeded / sizeof(DWORD);
- if ( dwFlags & MOVEFILE_DELAY_UNTIL_REBOOT )
+ // Check if there is "soffice.bin" among the processes
+ for ( unsigned int i = 0; i < cProcesses; i++ )
{
- CHAR szExistingFileNameA[MAX_PATH];
- CHAR szNewFileNameA[MAX_PATH] = "NUL";
-
- // Path names in WININIT.INI must be in short path name form
-
- if (
- GetShortPathNameA( lpExistingFileNameA, szExistingFileNameA, MAX_PATH ) &&
- (!lpNewFileNameA || GetShortPathNameA( lpNewFileNameA, szNewFileNameA, MAX_PATH ))
- )
+ if( aProcesses[i] != 0 )
{
- CHAR szBuffer[32767]; // The buffer size must not exceed 32K
- DWORD dwBufLen = GetPrivateProfileSectionA( RENAME_SECTION, szBuffer, SAL_N_ELEMENTS(szBuffer), WININIT_FILENAME );
-
- CHAR szRename[MAX_PATH]; // This is enough for at most to times 67 chracters
- strcpy( szRename, szNewFileNameA );
- strcat( szRename, "=" );
- strcat( szRename, szExistingFileNameA );
- size_t lnRename = strlen(szRename);
-
- if ( dwBufLen + lnRename + 2 <= SAL_N_ELEMENTS(szBuffer) )
+ TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
+ HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i] );
+ if (NULL != hProcess )
{
- CopyMemory( &szBuffer[dwBufLen], szRename, lnRename );
- szBuffer[dwBufLen + lnRename ] = 0;
- szBuffer[dwBufLen + lnRename + 1 ] = 0;
-
- fSuccess = WritePrivateProfileSectionA( RENAME_SECTION, szBuffer, WININIT_FILENAME );
+ HMODULE hMod;
+ if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
+ GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
}
- else
- SetLastError( ERROR_BUFFER_OVERFLOW );
- }
- }
- else
- {
-
- fSuccess = MoveFileA( lpExistingFileNameA, lpNewFileNameA );
-
- if ( !fSuccess && GetLastError() != ERROR_ACCESS_DENIED &&
- 0 != (dwFlags & (MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING)) )
- {
- BOOL bFailIfExist = 0 == (dwFlags & MOVEFILE_REPLACE_EXISTING);
-
- fSuccess = CopyFileA( lpExistingFileNameA, lpNewFileNameA, bFailIfExist );
-
- if ( fSuccess )
- fSuccess = DeleteFileA( lpExistingFileNameA );
- }
-
- }
-
- return fSuccess;
-}
-
-static BOOL MoveFileExImpl( LPCSTR lpExistingFileNameA, LPCSTR lpNewFileNameA, DWORD dwFlags )
-{
- if ( 0 > ((LONG)GetVersion())) // High order bit indicates Win 9x
- return MoveFileEx9x( lpExistingFileNameA, lpNewFileNameA, dwFlags );
- else
- return MoveFileExA( lpExistingFileNameA, lpNewFileNameA, dwFlags );
-}
-
-extern "C" UINT __stdcall IsOfficeRunning( MSIHANDLE handle )
-{
- OSVERSIONINFO osverinfo;
- osverinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx( &osverinfo );
-
- // renaming the vcl resource doesn't work reliable with OS >= Windows Vista
- if (osverinfo.dwMajorVersion < 6 )
- {
- std::_tstring sInstDir = GetMsiProperty( handle, TEXT("INSTALLLOCATION") );
- // Property empty -> no office installed
- if ( sInstDir.length() == 0 )
- return ERROR_SUCCESS;
-
- std::_tstring sResourceDir = sInstDir + TEXT("Basis\\program\\resource\\");
- std::_tstring sPattern = sResourceDir + TEXT("vcl*.res");
-
-// std::_tstring mystr;
-// mystr = "IsOfficeRunning start. Checking file in dir: " + sResourceDir;
-// MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK );
-
- WIN32_FIND_DATA aFindFileData;
- HANDLE hFind = FindFirstFile( sPattern.c_str(), &aFindFileData );
-
- if ( IsValidHandle(hFind) )
- {
- BOOL fSuccess = false;
- bool fRenameSucceeded;
-
- do
+ CloseHandle( hProcess );
+ if ( _tcscmp( szProcessName, TEXT("soffice.bin") ) == 0 )
{
- std::_tstring sResourceFile = sResourceDir + aFindFileData.cFileName;
- std::_tstring sIntermediate = sResourceFile + TEXT(".tmp");
-
- fRenameSucceeded = MoveFileExImpl( sResourceFile.c_str(), sIntermediate.c_str(), MOVEFILE_REPLACE_EXISTING );
- if ( fRenameSucceeded )
- {
- MoveFileExImpl( sIntermediate.c_str(), sResourceFile.c_str(), 0 );
- fSuccess = FindNextFile( hFind, &aFindFileData );
- }
- } while ( fSuccess && fRenameSucceeded );
-
- if ( !fRenameSucceeded )
- {
- MsiSetProperty(handle, TEXT("OFFICERUNS"), TEXT("1"));
+ MsiSetProperty( handle, TEXT("OFFICERUNS"), TEXT("1") );
SetMsiErrorCode( MSI_ERROR_OFFICE_IS_RUNNING );
-
-// mystr = "Office is running";
-// MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK );
}
-
- FindClose( hFind );
}
-// mystr = "IsOfficeRunning end";
-// MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK );
}
- else
- {
- std::_tstring sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
- // Property empty -> no office installed
- if ( sOfficeInstallPath.length() == 0 )
- return ERROR_SUCCESS;
-
- std::_tstring sRenameSrc = sOfficeInstallPath + TEXT("program");
- std::_tstring sRenameDst = sOfficeInstallPath + TEXT("program_test");
-
- bool bSuccess = MoveFile( sRenameSrc.c_str(), sRenameDst.c_str() );
-
- if ( bSuccess )
- {
- MoveFile( sRenameDst.c_str(), sRenameSrc.c_str() );
- }
- else
- {
- DWORD dwError = GetLastError();
- LPVOID lpMsgBuf;
- // When there is no program folder, there could be no running office
- if ( dwError == ERROR_FILE_NOT_FOUND )
- return ERROR_SUCCESS;
- if ( dwError == ERROR_PATH_NOT_FOUND )
- return ERROR_SUCCESS;
-
- // The destination folder should never exist, don't know what to do here
- if ( dwError == ERROR_ALREADY_EXISTS )
- return ERROR_SUCCESS;
-
- if ( FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf,
- 0,
- NULL ))
- {
- OutputDebugStringFormat( TEXT("Error Code %d: %s"), dwError, lpMsgBuf );
- LocalFree( lpMsgBuf );
- }
- else
- OutputDebugStringFormat( TEXT("Error Code %d: Unknown"), dwError );
-
- MsiSetProperty( handle, TEXT("OFFICERUNS"), TEXT("1") );
- SetMsiErrorCode( MSI_ERROR_OFFICE_IS_RUNNING );
- }
- }
-
return ERROR_SUCCESS;
}
-
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/setup_native/source/win32/customactions/shellextensions/makefile.mk b/setup_native/source/win32/customactions/shellextensions/makefile.mk
index de8f94332..579527b4c 100644
--- a/setup_native/source/win32/customactions/shellextensions/makefile.mk
+++ b/setup_native/source/win32/customactions/shellextensions/makefile.mk
@@ -69,7 +69,8 @@ SLOFILES = \
STDSHL += \
$(ADVAPI32LIB)\
$(MSILIB)\
- $(SHELL32LIB)
+ $(SHELL32LIB)\
+ psapi.lib
.IF "$(COM)"=="GCC"
STDSHL+= \