|
|
/*****************************************************************************
* * (C) COPYRIGHT MICROSOFT CORPORATION, 2000 * * TITLE: fusutils.cpp * * VERSION: 1.0 * * AUTHOR: LazarI * * DATE: 14-Feb-2001 * * DESCRIPTION: Fusion utilities * *****************************************************************************/
#include "precomp.h"
#pragma hdrstop
#include "fusutils.h"
#include "coredefs.h"
// open C code brace
#ifdef __cplusplus
extern "C" { #endif
//
// Win32Error2HRESULT: converts Win32 error to HRESULT
//
inline HRESULT Win32Error2HRESULT(DWORD dwError = GetLastError()) { return (ERROR_SUCCESS == dwError) ? E_FAIL : HRESULT_FROM_WIN32(dwError); }
//
// SearchExecutableWrap: HRESULT wrapper around SearchPath
//
// searches for an executable and returns its full path in lpBuffer.
// returns E_INVALIDARG if the executable cannot be found and
// Win32Error2HRESULT(ERROR_INSUFFICIENT_BUFFER) if the
// passed in buffer is too small to hold the full path.
//
inline HRESULT SearchExecutableWrap(LPCTSTR lpszExecutableName, UINT nBufferLength, LPTSTR lpBuffer, LPTSTR *lppFilePart) { DWORD cch = SearchPath(NULL, lpszExecutableName, NULL, nBufferLength, lpBuffer, lppFilePart);
return (0 == cch) ? Win32Error2HRESULT() : (cch >= nBufferLength) ? Win32Error2HRESULT(ERROR_INSUFFICIENT_BUFFER) : S_OK; }
//
// GetExecutableNameWrap: HRESULT wrapper around GetModuleFileName
//
//
// returns the full path of the current process executable (EXE)
// or Win32Error2HRESULT(ERROR_INSUFFICIENT_BUFFER) if the
// passed in buffer is too small to hold the full path.
//
inline HRESULT GetExecutableNameWrap(HMODULE hModule, UINT nBufferLength, LPTSTR lpBuffer) { DWORD cch = GetModuleFileName(hModule, lpBuffer, nBufferLength);
return (0 == cch) ? Win32Error2HRESULT() : (cch >= nBufferLength) ? Win32Error2HRESULT(ERROR_INSUFFICIENT_BUFFER) : S_OK; }
//
// FileExists: checks if the passed in file name exists.
//
inline HRESULT FileExists(LPCTSTR pszFileName, BOOL *pbExists) { HRESULT hr = E_INVALIDARG; if (pszFileName && pbExists) { hr = S_OK; *pbExists = FALSE;
WIN32_FIND_DATA findFileData; HANDLE hFind = FindFirstFile(pszFileName, &findFileData);
if (hFind != INVALID_HANDLE_VALUE) { *pbExists = TRUE; FindClose(hFind); } } return hr; }
static TCHAR g_szManifestExt[] = TEXT(".manifest");
//
// CreateActivationContextFromExecutableEx:
//
// check the passed in executable name for a manifest (if any)
// and creates an activation context from it.
//
HRESULT CreateActivationContextFromExecutableEx(LPCTSTR lpszExecutableName, UINT uResourceID, BOOL bMakeProcessDefault, HANDLE *phActCtx) { HRESULT hr = E_INVALIDARG;
if (phActCtx) { TCHAR szModule[MAX_PATH]; TCHAR szManifest[MAX_PATH]; BOOL bManifestFileFound = FALSE;
// let's try to figure out whether this executable has a manifest file or not
if (lpszExecutableName) { // search the passed in name in the path
hr = SearchExecutableWrap(lpszExecutableName, ARRAYSIZE(szModule), szModule, NULL); } else { // if lpszExecutableName is NULL we assume the current module name
hr = GetExecutableNameWrap(GetModuleHandle(NULL), ARRAYSIZE(szModule), szModule); }
if (SUCCEEDED(hr)) { if ((lstrlen(szModule) + lstrlen(g_szManifestExt)) < ARRAYSIZE(szManifest)) { // create the manifest file name by appending ".manifest" to the executable name
lstrcpy(szManifest, szModule); lstrcat(szManifest, g_szManifestExt); } else { // buffer is too small to hold the manifest file name
hr = Win32Error2HRESULT(ERROR_BUFFER_OVERFLOW); }
if (SUCCEEDED(hr)) { BOOL bFileExists = FALSE; hr = FileExists(szManifest, &bFileExists);
if (SUCCEEDED(hr) && bFileExists) { // an external manifest file found!
bManifestFileFound = TRUE; } } }
// now let's try to create an activation context
ACTCTX act; ::ZeroMemory(&act, sizeof(act)); act.cbSize = sizeof(act);
if (bManifestFileFound) { // the executable has an external manifest file
act.lpSource = szManifest; } else { // if the executable doesn't have an external manifest file,
// so we assume that the it may have a manifest in its resources.
act.dwFlags |= ACTCTX_FLAG_RESOURCE_NAME_VALID; act.lpResourceName = MAKEINTRESOURCE(uResourceID); act.lpSource = szModule; }
if (bMakeProcessDefault) { // the caller has requested to set this activation context as
// sefault for the current process. watch out!
act.dwFlags |= ACTCTX_FLAG_SET_PROCESS_DEFAULT; }
// now let's ask kernel32 to create an activation context
HANDLE hActCtx = CreateActCtx(&act);
if (INVALID_HANDLE_VALUE == hActCtx) { // something failed. create proper HRESULT to return.
hr = Win32Error2HRESULT(); } else { // wow, success!
*phActCtx = hActCtx; hr = S_OK; } }
return hr; }
//
// CreateActivationContextFromExecutable:
//
// check the passed in executable name for a manifest (if any)
// and creates an activation context from it using the defaults
// (i.e. bMakeProcessDefault=FALSE & uResourceID=123)
//
HRESULT CreateActivationContextFromExecutable(LPCTSTR lpszExecutableName, HANDLE *phActCtx) { return CreateActivationContextFromExecutableEx(lpszExecutableName, 123, FALSE, phActCtx); }
// close C code brace
#ifdef __cplusplus
} #endif
|