1
0
Fork 0
libreoffice/setup_native/source/win32/customactions/quickstarter/quickstarter.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

131 lines
4.1 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include "quickstarter.hxx"
#include <psapi.h>
#include <malloc.h>
std::wstring GetOfficeInstallationPathW(MSIHANDLE handle)
{
std::wstring progpath;
DWORD sz = 0;
PWSTR dummy = const_cast<PWSTR>(L"");
if (MsiGetPropertyW(handle, L"INSTALLLOCATION", dummy, &sz) == ERROR_MORE_DATA)
{
sz++; // space for the final '\0'
DWORD nbytes = sz * sizeof(WCHAR);
PWSTR buff = static_cast<PWSTR>(_alloca(nbytes));
ZeroMemory(buff, nbytes);
MsiGetPropertyW(handle, L"INSTALLLOCATION", buff, &sz);
progpath = buff;
}
return progpath;
}
std::wstring GetOfficeProductNameW(MSIHANDLE handle)
{
std::wstring productname;
DWORD sz = 0;
PWSTR dummy = const_cast<PWSTR>(L"");
if (MsiGetPropertyW(handle, L"ProductName", dummy, &sz) == ERROR_MORE_DATA)
{
sz++; // space for the final '\0'
DWORD nbytes = sz * sizeof(WCHAR);
PWSTR buff = static_cast<PWSTR>(_alloca(nbytes));
ZeroMemory(buff, nbytes);
MsiGetPropertyW(handle, L"ProductName", buff, &sz);
productname = buff;
}
return productname;
}
std::wstring GetQuickstarterLinkNameW(MSIHANDLE handle)
{
std::wstring quickstarterlinkname;
DWORD sz = 0;
PWSTR dummy = const_cast<PWSTR>(L"");
if (MsiGetPropertyW(handle, L"Quickstarterlinkname", dummy, &sz) == ERROR_MORE_DATA)
{
sz++; // space for the final '\0'
DWORD nbytes = sz * sizeof(WCHAR);
PWSTR buff = static_cast<PWSTR>(_alloca(nbytes));
ZeroMemory(buff, nbytes);
MsiGetPropertyW(handle, L"Quickstarterlinkname", buff, &sz);
quickstarterlinkname = buff;
}
else if (MsiGetPropertyW(handle, L"ProductName", dummy, &sz) == ERROR_MORE_DATA)
{
sz++; // space for the final '\0'
DWORD nbytes = sz * sizeof(WCHAR);
PWSTR buff = static_cast<PWSTR>(_alloca(nbytes));
ZeroMemory(buff, nbytes);
MsiGetPropertyW(handle, L"ProductName", buff, &sz);
quickstarterlinkname = buff;
}
return quickstarterlinkname;
}
static bool IsValidHandle( HANDLE handle )
{
return nullptr != handle && INVALID_HANDLE_VALUE != handle;
}
static DWORD WINAPI GetModuleFileNameExW_( HANDLE hProcess, HMODULE hModule, PWSTR lpFileName, DWORD nSize )
{
static auto lpProc = []() {
HMODULE hLibrary = LoadLibraryW(L"PSAPI.DLL");
decltype(GetModuleFileNameExW)* pRet = nullptr;
if (hLibrary)
pRet = reinterpret_cast<decltype(GetModuleFileNameExW)*>(
GetProcAddress(hLibrary, "GetModuleFileNameExW"));
return pRet;
}();
if ( lpProc )
return lpProc( hProcess, hModule, lpFileName, nSize );
return 0;
}
std::wstring GetProcessImagePathW( DWORD dwProcessId )
{
std::wstring sImagePath;
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId );
if ( IsValidHandle( hProcess ) )
{
WCHAR szPathBuffer[MAX_PATH] = L"";
if ( GetModuleFileNameExW_( hProcess, nullptr, szPathBuffer, sizeof(szPathBuffer)/sizeof(szPathBuffer[0]) ) )
sImagePath = szPathBuffer;
CloseHandle( hProcess );
}
return sImagePath;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */