mirror of https://github.com/UMSKT/xpmgr.git
686 lines
23 KiB
C++
686 lines
23 KiB
C++
/* Copyright (c) 2001-2009, Microsoft Corp. All rights reserved. */
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
#if !defined(RC_INVOKED) /* RC complains about long symbols in #ifs */
|
|
#if defined(ISOLATION_AWARE_ENABLED) && (ISOLATION_AWARE_ENABLED != 0)
|
|
|
|
|
|
#if !defined(ISOLATION_AWARE_USE_STATIC_LIBRARY)
|
|
#define ISOLATION_AWARE_USE_STATIC_LIBRARY 0
|
|
#endif
|
|
|
|
#if !defined(ISOLATION_AWARE_BUILD_STATIC_LIBRARY)
|
|
#define ISOLATION_AWARE_BUILD_STATIC_LIBRARY 0
|
|
#endif
|
|
|
|
#if !defined(ISOLATION_AWARE_INLINE)
|
|
#if ISOLATION_AWARE_BUILD_STATIC_LIBRARY
|
|
#define ISOLATION_AWARE_INLINE /* nothing */
|
|
#else
|
|
#if defined(__cplusplus)
|
|
#define ISOLATION_AWARE_INLINE inline
|
|
#else
|
|
#define ISOLATION_AWARE_INLINE __inline
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if !ISOLATION_AWARE_USE_STATIC_LIBRARY
|
|
|
|
|
|
#ifndef _M_CEE_PURE
|
|
#define IsolationAwarePrivatenCv WINAPI
|
|
#else
|
|
#define IsolationAwarePrivatenCv __clrcall
|
|
#endif
|
|
|
|
/* These wrappers prevent warnings about taking the addresses of __declspec(dllimport) functions. */
|
|
#ifdef _M_IX86
|
|
ISOLATION_AWARE_INLINE HMODULE IsolationAwarePrivatenCv IsolationAwarePrivatezlybNQyVOeNeln(__in PCSTR s) { return LoadLibraryA(s); }
|
|
ISOLATION_AWARE_INLINE HMODULE IsolationAwarePrivatenCv IsolationAwarePrivatezltRgzbQhYRuNaQYRn(__in PCSTR s) { return GetModuleHandleA(s); }
|
|
#endif
|
|
ISOLATION_AWARE_INLINE HMODULE IsolationAwarePrivatenCv IsolationAwarePrivatezlybNQyVOeNelJ(__in PCWSTR s) { return LoadLibraryW(s); }
|
|
ISOLATION_AWARE_INLINE HMODULE IsolationAwarePrivatenCv IsolationAwarePrivatezltRgzbQhYRuNaQYRJ(__in PCWSTR s) { return GetModuleHandleW(s); }
|
|
|
|
BOOL
|
|
IsolationAwarePrivatenCv
|
|
IsolationAwarePrivatenPgViNgRzlnPgpgk(
|
|
ULONG_PTR* pulpCookie
|
|
);
|
|
|
|
/*
|
|
These are private.
|
|
*/
|
|
__declspec(selectany) HANDLE WinbaseIsolationAwarePrivateT_UnPgpgk = INVALID_HANDLE_VALUE;
|
|
#ifdef _M_IX86
|
|
__declspec(selectany) BOOL IsolationAwarePrivateT_SqbjaYRiRY = FALSE;
|
|
#endif
|
|
__declspec(selectany) BOOL WinbaseIsolationAwarePrivateT_SpeRNgRQnPgpgk = FALSE;
|
|
__declspec(selectany) BOOL WinbaseIsolationAwarePrivateT_SpYRNahcpNYYRQ = FALSE;
|
|
|
|
FARPROC IsolationAwarePrivatenCv WinbaseIsolationAwarePrivatetRgCebPnQQeRff_xReaRYQP_QYY(LPCSTR pszProcName);
|
|
|
|
#endif /* ISOLATION_AWARE_USE_STATIC_LIBRARY */
|
|
__out_opt HMODULE IsolationAwarePrivatenCv IsolationAwareLoadLibraryA(__in LPCSTR lpLibFileName);
|
|
__out_opt HMODULE IsolationAwarePrivatenCv IsolationAwareLoadLibraryW(__in LPCWSTR lpLibFileName);
|
|
__out_opt HMODULE IsolationAwarePrivatenCv IsolationAwareLoadLibraryExA(__in LPCSTR lpLibFileName,__reserved HANDLE hFile,__in DWORD dwFlags);
|
|
__out_opt HMODULE IsolationAwarePrivatenCv IsolationAwareLoadLibraryExW(__in LPCWSTR lpLibFileName,__reserved HANDLE hFile,__in DWORD dwFlags);
|
|
__out HANDLE IsolationAwarePrivatenCv IsolationAwareCreateActCtxW(__in PCACTCTXW pActCtx);
|
|
void IsolationAwarePrivatenCv IsolationAwareReleaseActCtx(__inout HANDLE hActCtx);
|
|
BOOL IsolationAwarePrivatenCv IsolationAwareActivateActCtx(__inout_opt HANDLE hActCtx,__out ULONG_PTR*lpCookie);
|
|
BOOL IsolationAwarePrivatenCv IsolationAwareDeactivateActCtx(__in DWORD dwFlags,__in ULONG_PTR ulCookie);
|
|
BOOL IsolationAwarePrivatenCv IsolationAwareFindActCtxSectionStringW(__in DWORD dwFlags,__reserved const GUID*lpExtensionGuid,__in ULONG ulSectionId,__in LPCWSTR lpStringToFind,__out PACTCTX_SECTION_KEYED_DATA ReturnedData);
|
|
BOOL IsolationAwarePrivatenCv IsolationAwareQueryActCtxW(__in DWORD dwFlags,__in HANDLE hActCtx,__in_opt PVOID pvSubInstance,__in ULONG ulInfoClass,__out_bcount_part_opt(cbBuffer,*pcbWrittenOrRequired) PVOID pvBuffer,__in SIZE_T cbBuffer,__out_opt SIZE_T*pcbWrittenOrRequired);
|
|
|
|
#if defined(UNICODE)
|
|
|
|
#define IsolationAwareLoadLibrary IsolationAwareLoadLibraryW
|
|
#define IsolationAwareLoadLibraryEx IsolationAwareLoadLibraryExW
|
|
|
|
#else /* UNICODE */
|
|
|
|
#define IsolationAwareLoadLibrary IsolationAwareLoadLibraryA
|
|
#define IsolationAwareLoadLibraryEx IsolationAwareLoadLibraryExA
|
|
|
|
#endif /* UNICODE */
|
|
|
|
#if !ISOLATION_AWARE_USE_STATIC_LIBRARY
|
|
ISOLATION_AWARE_INLINE __out_opt HMODULE IsolationAwarePrivatenCv IsolationAwareLoadLibraryA(__in LPCSTR lpLibFileName)
|
|
{
|
|
__out_opt HMODULE result = NULL;
|
|
ULONG_PTR ulpCookie = 0;
|
|
const BOOL fActivateActCtxSuccess =
|
|
#ifdef _M_IX86
|
|
IsolationAwarePrivateT_SqbjaYRiRY ||
|
|
#endif
|
|
IsolationAwarePrivatenPgViNgRzlnPgpgk(&ulpCookie);
|
|
if (!fActivateActCtxSuccess)
|
|
return result;
|
|
__try
|
|
{
|
|
result = LoadLibraryA(lpLibFileName);
|
|
}
|
|
__finally
|
|
{
|
|
#ifdef _M_IX86
|
|
if (!IsolationAwarePrivateT_SqbjaYRiRY)
|
|
#endif
|
|
{
|
|
const BOOL fPreserveLastError = (result == NULL);
|
|
const DWORD dwLastError = fPreserveLastError ? GetLastError() : NO_ERROR;
|
|
(void)IsolationAwareDeactivateActCtx(0, ulpCookie);
|
|
if (fPreserveLastError)
|
|
SetLastError(dwLastError);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE __out_opt HMODULE IsolationAwarePrivatenCv IsolationAwareLoadLibraryW(__in LPCWSTR lpLibFileName)
|
|
{
|
|
__out_opt HMODULE result = NULL;
|
|
ULONG_PTR ulpCookie = 0;
|
|
const BOOL fActivateActCtxSuccess =
|
|
#ifdef _M_IX86
|
|
IsolationAwarePrivateT_SqbjaYRiRY ||
|
|
#endif
|
|
IsolationAwarePrivatenPgViNgRzlnPgpgk(&ulpCookie);
|
|
if (!fActivateActCtxSuccess)
|
|
return result;
|
|
__try
|
|
{
|
|
result = LoadLibraryW(lpLibFileName);
|
|
}
|
|
__finally
|
|
{
|
|
#ifdef _M_IX86
|
|
if (!IsolationAwarePrivateT_SqbjaYRiRY)
|
|
#endif
|
|
{
|
|
const BOOL fPreserveLastError = (result == NULL);
|
|
const DWORD dwLastError = fPreserveLastError ? GetLastError() : NO_ERROR;
|
|
(void)IsolationAwareDeactivateActCtx(0, ulpCookie);
|
|
if (fPreserveLastError)
|
|
SetLastError(dwLastError);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE __out_opt HMODULE IsolationAwarePrivatenCv IsolationAwareLoadLibraryExA(__in LPCSTR lpLibFileName,__reserved HANDLE hFile,__in DWORD dwFlags)
|
|
{
|
|
__out_opt HMODULE result = NULL;
|
|
ULONG_PTR ulpCookie = 0;
|
|
const BOOL fActivateActCtxSuccess =
|
|
#ifdef _M_IX86
|
|
IsolationAwarePrivateT_SqbjaYRiRY ||
|
|
#endif
|
|
IsolationAwarePrivatenPgViNgRzlnPgpgk(&ulpCookie);
|
|
if (!fActivateActCtxSuccess)
|
|
return result;
|
|
__try
|
|
{
|
|
result = LoadLibraryExA(lpLibFileName,hFile,dwFlags);
|
|
}
|
|
__finally
|
|
{
|
|
#ifdef _M_IX86
|
|
if (!IsolationAwarePrivateT_SqbjaYRiRY)
|
|
#endif
|
|
{
|
|
const BOOL fPreserveLastError = (result == NULL);
|
|
const DWORD dwLastError = fPreserveLastError ? GetLastError() : NO_ERROR;
|
|
(void)IsolationAwareDeactivateActCtx(0, ulpCookie);
|
|
if (fPreserveLastError)
|
|
SetLastError(dwLastError);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE __out_opt HMODULE IsolationAwarePrivatenCv IsolationAwareLoadLibraryExW(__in LPCWSTR lpLibFileName,__reserved HANDLE hFile,__in DWORD dwFlags)
|
|
{
|
|
__out_opt HMODULE result = NULL;
|
|
ULONG_PTR ulpCookie = 0;
|
|
const BOOL fActivateActCtxSuccess =
|
|
#ifdef _M_IX86
|
|
IsolationAwarePrivateT_SqbjaYRiRY ||
|
|
#endif
|
|
IsolationAwarePrivatenPgViNgRzlnPgpgk(&ulpCookie);
|
|
if (!fActivateActCtxSuccess)
|
|
return result;
|
|
__try
|
|
{
|
|
result = LoadLibraryExW(lpLibFileName,hFile,dwFlags);
|
|
}
|
|
__finally
|
|
{
|
|
#ifdef _M_IX86
|
|
if (!IsolationAwarePrivateT_SqbjaYRiRY)
|
|
#endif
|
|
{
|
|
const BOOL fPreserveLastError = (result == NULL);
|
|
const DWORD dwLastError = fPreserveLastError ? GetLastError() : NO_ERROR;
|
|
(void)IsolationAwareDeactivateActCtx(0, ulpCookie);
|
|
if (fPreserveLastError)
|
|
SetLastError(dwLastError);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE __out HANDLE IsolationAwarePrivatenCv IsolationAwareCreateActCtxW(__in PCACTCTXW pActCtx)
|
|
{
|
|
#ifdef _WIN64
|
|
return CreateActCtxW(pActCtx);
|
|
#else
|
|
__out HANDLE result = INVALID_HANDLE_VALUE;
|
|
typedef __out HANDLE (WINAPI* PFN)(__in PCACTCTXW pActCtx);
|
|
static PFN s_pfn;
|
|
PFN __IsolationAware_pfn = s_pfn;
|
|
if (__IsolationAware_pfn == NULL)
|
|
{
|
|
__IsolationAware_pfn = (PFN) WinbaseIsolationAwarePrivatetRgCebPnQQeRff_xReaRYQP_QYY("CreateActCtxW");
|
|
if (__IsolationAware_pfn == NULL)
|
|
return result;
|
|
s_pfn = __IsolationAware_pfn;
|
|
}
|
|
result = __IsolationAware_pfn(pActCtx);
|
|
return result;
|
|
#endif
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE void IsolationAwarePrivatenCv IsolationAwareReleaseActCtx(__inout HANDLE hActCtx)
|
|
{
|
|
#ifdef _WIN64
|
|
ReleaseActCtx(hActCtx);
|
|
#else
|
|
typedef void (WINAPI* PFN)(__inout HANDLE hActCtx);
|
|
static PFN s_pfn;
|
|
PFN __IsolationAware_pfn = s_pfn;
|
|
if (__IsolationAware_pfn == NULL)
|
|
{
|
|
__IsolationAware_pfn = (PFN) WinbaseIsolationAwarePrivatetRgCebPnQQeRff_xReaRYQP_QYY("ReleaseActCtx");
|
|
if (__IsolationAware_pfn == NULL)
|
|
return;
|
|
s_pfn = __IsolationAware_pfn;
|
|
}
|
|
__IsolationAware_pfn(hActCtx);
|
|
return;
|
|
#endif
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE BOOL IsolationAwarePrivatenCv IsolationAwareActivateActCtx(__inout_opt HANDLE hActCtx,__out ULONG_PTR*lpCookie)
|
|
{
|
|
#ifdef _WIN64
|
|
return ActivateActCtx(hActCtx,lpCookie);
|
|
#else
|
|
BOOL fResult = FALSE;
|
|
typedef BOOL (WINAPI* PFN)(__inout_opt HANDLE hActCtx,__out ULONG_PTR*lpCookie);
|
|
static PFN s_pfn;
|
|
PFN __IsolationAware_pfn = s_pfn;
|
|
if (__IsolationAware_pfn == NULL)
|
|
{
|
|
__IsolationAware_pfn = (PFN) WinbaseIsolationAwarePrivatetRgCebPnQQeRff_xReaRYQP_QYY("ActivateActCtx");
|
|
if (__IsolationAware_pfn == NULL)
|
|
return fResult;
|
|
s_pfn = __IsolationAware_pfn;
|
|
}
|
|
fResult = __IsolationAware_pfn(hActCtx,lpCookie);
|
|
return fResult;
|
|
#endif
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE BOOL IsolationAwarePrivatenCv IsolationAwareDeactivateActCtx(__in DWORD dwFlags,__in ULONG_PTR ulCookie)
|
|
{
|
|
#ifdef _WIN64
|
|
return DeactivateActCtx(dwFlags,ulCookie);
|
|
#else
|
|
BOOL fResult = FALSE;
|
|
typedef BOOL (WINAPI* PFN)(__in DWORD dwFlags,__in ULONG_PTR ulCookie);
|
|
static PFN s_pfn;
|
|
PFN __IsolationAware_pfn = s_pfn;
|
|
if (__IsolationAware_pfn == NULL)
|
|
{
|
|
__IsolationAware_pfn = (PFN) WinbaseIsolationAwarePrivatetRgCebPnQQeRff_xReaRYQP_QYY("DeactivateActCtx");
|
|
if (__IsolationAware_pfn == NULL)
|
|
return fResult;
|
|
s_pfn = __IsolationAware_pfn;
|
|
}
|
|
fResult = __IsolationAware_pfn(dwFlags,ulCookie);
|
|
return fResult;
|
|
#endif
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE BOOL IsolationAwarePrivatenCv IsolationAwareFindActCtxSectionStringW(__in DWORD dwFlags,__reserved const GUID*lpExtensionGuid,__in ULONG ulSectionId,__in LPCWSTR lpStringToFind,__out PACTCTX_SECTION_KEYED_DATA ReturnedData)
|
|
{
|
|
#ifdef _WIN64
|
|
return FindActCtxSectionStringW(dwFlags,lpExtensionGuid,ulSectionId,lpStringToFind,ReturnedData);
|
|
#else
|
|
BOOL fResult = FALSE;
|
|
typedef BOOL (WINAPI* PFN)(__in DWORD dwFlags,__reserved const GUID*lpExtensionGuid,__in ULONG ulSectionId,__in LPCWSTR lpStringToFind,__out PACTCTX_SECTION_KEYED_DATA ReturnedData);
|
|
static PFN s_pfn;
|
|
PFN __IsolationAware_pfn = s_pfn;
|
|
if (__IsolationAware_pfn == NULL)
|
|
{
|
|
__IsolationAware_pfn = (PFN) WinbaseIsolationAwarePrivatetRgCebPnQQeRff_xReaRYQP_QYY("FindActCtxSectionStringW");
|
|
if (__IsolationAware_pfn == NULL)
|
|
return fResult;
|
|
s_pfn = __IsolationAware_pfn;
|
|
}
|
|
fResult = __IsolationAware_pfn(dwFlags,lpExtensionGuid,ulSectionId,lpStringToFind,ReturnedData);
|
|
return fResult;
|
|
#endif
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE BOOL IsolationAwarePrivatenCv IsolationAwareQueryActCtxW(__in DWORD dwFlags,__in HANDLE hActCtx,__in_opt PVOID pvSubInstance,__in ULONG ulInfoClass,__out_bcount_part_opt(cbBuffer,*pcbWrittenOrRequired) PVOID pvBuffer,__in SIZE_T cbBuffer,__out_opt SIZE_T*pcbWrittenOrRequired)
|
|
{
|
|
#ifdef _WIN64
|
|
return QueryActCtxW(dwFlags,hActCtx,pvSubInstance,ulInfoClass,pvBuffer,cbBuffer,pcbWrittenOrRequired);
|
|
#else
|
|
BOOL fResult = FALSE;
|
|
typedef BOOL (WINAPI* PFN)(__in DWORD dwFlags,__in HANDLE hActCtx,__in_opt PVOID pvSubInstance,__in ULONG ulInfoClass,__out_bcount_part_opt(cbBuffer,*pcbWrittenOrRequired) PVOID pvBuffer,__in SIZE_T cbBuffer,__out_opt SIZE_T*pcbWrittenOrRequired);
|
|
static PFN s_pfn;
|
|
PFN __IsolationAware_pfn = s_pfn;
|
|
if (__IsolationAware_pfn == NULL)
|
|
{
|
|
__IsolationAware_pfn = (PFN) WinbaseIsolationAwarePrivatetRgCebPnQQeRff_xReaRYQP_QYY("QueryActCtxW");
|
|
if (__IsolationAware_pfn == NULL)
|
|
return fResult;
|
|
s_pfn = __IsolationAware_pfn;
|
|
}
|
|
fResult = __IsolationAware_pfn(dwFlags,hActCtx,pvSubInstance,ulInfoClass,pvBuffer,cbBuffer,pcbWrittenOrRequired);
|
|
return fResult;
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
#define WINBASE_NUMBER_OF(x) (sizeof(x) / sizeof((x)[0]))
|
|
|
|
typedef struct IsolationAwarePrivate_pBAFGnAG_zBqHyr_vAsB {
|
|
HMODULE (IsolationAwarePrivatenCv * WinbaseIsolationAwarePrivateybNQJ)(__in PCWSTR w);
|
|
PCWSTR WinbaseIsolationAwarePrivateANZRJ;
|
|
#ifdef _M_IX86
|
|
HMODULE (IsolationAwarePrivatenCv * WinbaseIsolationAwarePrivateybNQn)(__in PCSTR w);
|
|
PCSTR WinbaseIsolationAwarePrivateANZRn;
|
|
#endif
|
|
} IsolationAwarePrivatepBAFGnAG_zBqHyr_vAsB;
|
|
typedef const IsolationAwarePrivatepBAFGnAG_zBqHyr_vAsB *IsolationAwarePrivateCpBAFGnAG_zBqHyr_vAsB;
|
|
|
|
typedef struct IsolationAwarePrivate_zHGnoyr_zBqHyr_vAsB {
|
|
HMODULE WinbaseIsolationAwarePrivateybNQRQzbQhYR;
|
|
} IsolationAwarePrivatezHGnoyr_zBqHyr_vAsB, *IsolationAwarePrivateCzHGnoyr_zBqHyr_vAsB;
|
|
|
|
ISOLATION_AWARE_INLINE FARPROC IsolationAwarePrivatenCv
|
|
IsolationAwarePrivatezltRgCebPnQQeRff(
|
|
__in IsolationAwarePrivateCpBAFGnAG_zBqHyr_vAsB c,
|
|
__inout IsolationAwarePrivateCzHGnoyr_zBqHyr_vAsB m,
|
|
__in PCSTR ProcName
|
|
)
|
|
{
|
|
FARPROC Proc = NULL;
|
|
HMODULE hModule;
|
|
#ifdef _M_IX86
|
|
static HMODULE s_moduleUnicows;
|
|
static BOOL s_fUnicowsInitialized;
|
|
|
|
/*
|
|
get unicows.dll loaded on-demand
|
|
*/
|
|
if (!s_fUnicowsInitialized)
|
|
{
|
|
if ((GetVersion() & 0x80000000) != 0)
|
|
{
|
|
GetFileAttributesW(L"???.???");
|
|
s_moduleUnicows = GetModuleHandleA("Unicows.dll");
|
|
}
|
|
s_fUnicowsInitialized = TRUE;
|
|
}
|
|
|
|
/*
|
|
always call GetProcAddress(unicows) before the usual .dll
|
|
*/
|
|
if (s_moduleUnicows != NULL)
|
|
{
|
|
Proc = GetProcAddress(s_moduleUnicows, ProcName);
|
|
if (Proc != NULL)
|
|
goto Exit;
|
|
}
|
|
#endif
|
|
hModule = m->WinbaseIsolationAwarePrivateybNQRQzbQhYR;
|
|
if (hModule == NULL)
|
|
{
|
|
#ifdef _M_IX86
|
|
hModule = (((GetVersion() & 0x80000000) != 0) ? (*c->WinbaseIsolationAwarePrivateybNQn)(c->WinbaseIsolationAwarePrivateANZRn) : (*c->WinbaseIsolationAwarePrivateybNQJ)(c->WinbaseIsolationAwarePrivateANZRJ));
|
|
#else
|
|
hModule = (*c->WinbaseIsolationAwarePrivateybNQJ)(c->WinbaseIsolationAwarePrivateANZRJ);
|
|
#endif
|
|
if (hModule == NULL)
|
|
goto Exit;
|
|
m->WinbaseIsolationAwarePrivateybNQRQzbQhYR = hModule;
|
|
}
|
|
Proc = GetProcAddress(hModule, ProcName);
|
|
Exit:
|
|
return Proc;
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE BOOL IsolationAwarePrivatenCv
|
|
WinbaseIsolationAwarePrivatetRgzlnPgpgk(void)
|
|
/*
|
|
The correctness of this function depends on it being statically
|
|
linked into its clients.
|
|
|
|
This function is private to functions present in this header.
|
|
Do not use it.
|
|
*/
|
|
{
|
|
BOOL fResult = FALSE;
|
|
ACTIVATION_CONTEXT_BASIC_INFORMATION actCtxBasicInfo;
|
|
ULONG_PTR ulpCookie = 0;
|
|
|
|
#ifdef _M_IX86
|
|
if (IsolationAwarePrivateT_SqbjaYRiRY)
|
|
{
|
|
fResult = TRUE;
|
|
goto Exit;
|
|
}
|
|
#endif
|
|
|
|
if (WinbaseIsolationAwarePrivateT_UnPgpgk != INVALID_HANDLE_VALUE)
|
|
{
|
|
fResult = TRUE;
|
|
goto Exit;
|
|
}
|
|
|
|
if (!IsolationAwareQueryActCtxW(
|
|
QUERY_ACTCTX_FLAG_ACTCTX_IS_ADDRESS
|
|
| QUERY_ACTCTX_FLAG_NO_ADDREF,
|
|
&WinbaseIsolationAwarePrivateT_UnPgpgk,
|
|
NULL,
|
|
ActivationContextBasicInformation,
|
|
&actCtxBasicInfo,
|
|
sizeof(actCtxBasicInfo),
|
|
NULL))
|
|
goto Exit;
|
|
|
|
/*
|
|
If QueryActCtxW returns NULL, try CreateActCtx(3).
|
|
*/
|
|
if (actCtxBasicInfo.hActCtx == NULL)
|
|
{
|
|
ACTCTXW actCtx;
|
|
WCHAR rgchFullModulePath[MAX_PATH + 2];
|
|
DWORD dw;
|
|
HMODULE hmodSelf;
|
|
#ifdef _M_IX86
|
|
PGET_MODULE_HANDLE_EXW pfnGetModuleHandleExW = (PGET_MODULE_HANDLE_EXW)WinbaseIsolationAwarePrivatetRgCebPnQQeRff_xReaRYQP_QYY("GetModuleHandleExW");
|
|
if (pfnGetModuleHandleExW == NULL)
|
|
goto Exit;
|
|
#endif
|
|
if (!
|
|
#ifdef _M_IX86
|
|
(*pfnGetModuleHandleExW)
|
|
#else
|
|
GetModuleHandleExW
|
|
#endif
|
|
( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT
|
|
| GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
|
|
(LPCWSTR)&WinbaseIsolationAwarePrivateT_UnPgpgk,
|
|
&hmodSelf))
|
|
goto Exit;
|
|
|
|
rgchFullModulePath[WINBASE_NUMBER_OF(rgchFullModulePath) - 1] = 0;
|
|
rgchFullModulePath[WINBASE_NUMBER_OF(rgchFullModulePath) - 2] = 0;
|
|
dw = GetModuleFileNameW(hmodSelf, rgchFullModulePath, WINBASE_NUMBER_OF(rgchFullModulePath) - 1);
|
|
if (dw == 0)
|
|
goto Exit;
|
|
if (rgchFullModulePath[WINBASE_NUMBER_OF(rgchFullModulePath) - 2] != 0)
|
|
{
|
|
SetLastError(ERROR_BUFFER_OVERFLOW);
|
|
goto Exit;
|
|
}
|
|
|
|
actCtx.cbSize = sizeof(actCtx);
|
|
actCtx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID | ACTCTX_FLAG_HMODULE_VALID;
|
|
actCtx.lpSource = rgchFullModulePath;
|
|
actCtx.lpResourceName = (LPCWSTR)(ULONG_PTR)3;
|
|
actCtx.hModule = hmodSelf;
|
|
actCtxBasicInfo.hActCtx = IsolationAwareCreateActCtxW(&actCtx);
|
|
if (actCtxBasicInfo.hActCtx == INVALID_HANDLE_VALUE)
|
|
{
|
|
const DWORD dwLastError = GetLastError();
|
|
if ((dwLastError != ERROR_RESOURCE_DATA_NOT_FOUND) &&
|
|
(dwLastError != ERROR_RESOURCE_TYPE_NOT_FOUND) &&
|
|
(dwLastError != ERROR_RESOURCE_LANG_NOT_FOUND) &&
|
|
(dwLastError != ERROR_RESOURCE_NAME_NOT_FOUND))
|
|
goto Exit;
|
|
|
|
actCtxBasicInfo.hActCtx = NULL;
|
|
}
|
|
|
|
WinbaseIsolationAwarePrivateT_SpeRNgRQnPgpgk = TRUE;
|
|
}
|
|
|
|
WinbaseIsolationAwarePrivateT_UnPgpgk = actCtxBasicInfo.hActCtx;
|
|
|
|
#define ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION (2)
|
|
|
|
if (IsolationAwareActivateActCtx(actCtxBasicInfo.hActCtx, &ulpCookie))
|
|
{
|
|
__try
|
|
{
|
|
ACTCTX_SECTION_KEYED_DATA actCtxSectionKeyedData;
|
|
|
|
actCtxSectionKeyedData.cbSize = sizeof(actCtxSectionKeyedData);
|
|
if (IsolationAwareFindActCtxSectionStringW(0, NULL, ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, L"Comctl32.dll", &actCtxSectionKeyedData))
|
|
{
|
|
/* get button, edit, etc. registered */
|
|
LoadLibraryW(L"Comctl32.dll");
|
|
}
|
|
}
|
|
__finally
|
|
{
|
|
IsolationAwareDeactivateActCtx(0, ulpCookie);
|
|
}
|
|
}
|
|
|
|
fResult = TRUE;
|
|
Exit:
|
|
return fResult;
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE BOOL IsolationAwarePrivatenCv
|
|
IsolationAwareInit(void)
|
|
/*
|
|
The correctness of this function depends on it being statically
|
|
linked into its clients.
|
|
|
|
Call this from DllMain(DLL_PROCESS_ATTACH) if you use id 3 and wish to avoid a race condition that
|
|
can cause an hActCtx leak.
|
|
Call this from your .exe's initialization if you use id 3 and wish to avoid a race condition that
|
|
can cause an hActCtx leak.
|
|
If you use id 2, this function fetches data from your .dll
|
|
that you do not need to worry about cleaning up.
|
|
*/
|
|
{
|
|
return WinbaseIsolationAwarePrivatetRgzlnPgpgk();
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE void IsolationAwarePrivatenCv
|
|
IsolationAwareCleanup(void)
|
|
/*
|
|
Call this from DllMain(DLL_PROCESS_DETACH), if you use id 3, to avoid a leak.
|
|
Call this from your .exe's cleanup to possibly avoid apparent (but not actual) leaks, if use id 3.
|
|
This function does nothing, safely, if you use id 2.
|
|
*/
|
|
{
|
|
HANDLE hActCtx;
|
|
|
|
if (WinbaseIsolationAwarePrivateT_SpYRNahcpNYYRQ)
|
|
return;
|
|
|
|
/* IsolationAware* calls made from here on out will OutputDebugString
|
|
and use the process default activation context instead of id 3 or will
|
|
continue to successfully use id 2 (but still OutputDebugString).
|
|
*/
|
|
WinbaseIsolationAwarePrivateT_SpYRNahcpNYYRQ = TRUE;
|
|
|
|
/* There is no cleanup to do if we did not CreateActCtx but only called QueryActCtx.
|
|
*/
|
|
if (!WinbaseIsolationAwarePrivateT_SpeRNgRQnPgpgk)
|
|
return;
|
|
|
|
hActCtx = WinbaseIsolationAwarePrivateT_UnPgpgk;
|
|
WinbaseIsolationAwarePrivateT_UnPgpgk = NULL; /* process default */
|
|
|
|
if (hActCtx == INVALID_HANDLE_VALUE)
|
|
return;
|
|
if (hActCtx == NULL)
|
|
return;
|
|
IsolationAwareReleaseActCtx(hActCtx);
|
|
}
|
|
|
|
ISOLATION_AWARE_INLINE
|
|
BOOL
|
|
IsolationAwarePrivatenCv
|
|
IsolationAwarePrivatenPgViNgRzlnPgpgk(
|
|
ULONG_PTR* pulpCookie
|
|
)
|
|
/*
|
|
This function is private to functions present in this header and other headers.
|
|
*/
|
|
{
|
|
BOOL fResult = FALSE;
|
|
|
|
if (WinbaseIsolationAwarePrivateT_SpYRNahcpNYYRQ)
|
|
{
|
|
const static char debugString[] = "IsolationAware function called after IsolationAwareCleanup\n";
|
|
OutputDebugStringA(debugString);
|
|
}
|
|
|
|
#ifdef _M_IX86
|
|
if (IsolationAwarePrivateT_SqbjaYRiRY)
|
|
{
|
|
fResult = TRUE;
|
|
goto Exit;
|
|
}
|
|
#endif
|
|
|
|
/* Do not call Init if Cleanup has been called. */
|
|
if (!WinbaseIsolationAwarePrivateT_SpYRNahcpNYYRQ)
|
|
{
|
|
if (!WinbaseIsolationAwarePrivatetRgzlnPgpgk())
|
|
goto Exit;
|
|
}
|
|
/* If Cleanup has been called and id3 was in use, this will activate NULL. */
|
|
if (!IsolationAwareActivateActCtx(WinbaseIsolationAwarePrivateT_UnPgpgk, pulpCookie))
|
|
goto Exit;
|
|
|
|
fResult = TRUE;
|
|
Exit:
|
|
#ifdef _M_IX86
|
|
if (!fResult)
|
|
{
|
|
const DWORD dwLastError = GetLastError();
|
|
if (dwLastError == ERROR_PROC_NOT_FOUND
|
|
|| dwLastError == ERROR_MOD_NOT_FOUND
|
|
|| dwLastError == ERROR_CALL_NOT_IMPLEMENTED)
|
|
{
|
|
IsolationAwarePrivateT_SqbjaYRiRY = TRUE;
|
|
fResult = TRUE;
|
|
}
|
|
}
|
|
#endif
|
|
return fResult;
|
|
}
|
|
|
|
#undef WINBASE_NUMBER_OF
|
|
|
|
ISOLATION_AWARE_INLINE FARPROC IsolationAwarePrivatenCv WinbaseIsolationAwarePrivatetRgCebPnQQeRff_xReaRYQP_QYY(LPCSTR pszProcName)
|
|
/* This function is shared by the other stubs in this header. */
|
|
{
|
|
static HMODULE s_module;
|
|
/* Use GetModuleHandle instead of LoadLibrary on kernel32.dll because */
|
|
/* we already necessarily have a reference on kernel32.dll. */
|
|
const static IsolationAwarePrivatepBAFGnAG_zBqHyr_vAsB
|
|
c = { IsolationAwarePrivatezltRgzbQhYRuNaQYRJ, L"Kernel32.dll"
|
|
#ifdef _M_IX86
|
|
, IsolationAwarePrivatezltRgzbQhYRuNaQYRn, "Kernel32.dll"
|
|
#endif
|
|
};
|
|
static IsolationAwarePrivatezHGnoyr_zBqHyr_vAsB m;
|
|
|
|
return IsolationAwarePrivatezltRgCebPnQQeRff(&c, &m, pszProcName);
|
|
}
|
|
|
|
#endif /* ISOLATION_AWARE_USE_STATIC_LIBRARY */
|
|
|
|
#define ActivateActCtx IsolationAwareActivateActCtx
|
|
#define CreateActCtxW IsolationAwareCreateActCtxW
|
|
#define DeactivateActCtx IsolationAwareDeactivateActCtx
|
|
#define FindActCtxSectionStringW IsolationAwareFindActCtxSectionStringW
|
|
#define LoadLibraryA IsolationAwareLoadLibraryA
|
|
#define LoadLibraryExA IsolationAwareLoadLibraryExA
|
|
#define LoadLibraryExW IsolationAwareLoadLibraryExW
|
|
#define LoadLibraryW IsolationAwareLoadLibraryW
|
|
#define QueryActCtxW IsolationAwareQueryActCtxW
|
|
#define ReleaseActCtx IsolationAwareReleaseActCtx
|
|
|
|
#endif /* ISOLATION_AWARE_ENABLED */
|
|
#endif /* RC */
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
} /* __cplusplus */
|
|
#endif
|
|
|