#ifndef __APPHELP_LIB_H #define __APPHELP_LIB_H #include #include #include #include #include #include #include #include #include #include #include #include "shimdb.h" #if DBG // make sure that apphelp_tools is defined when compiling checked #ifndef APPHELP_TOOLS #define APPHELP_TOOLS #endif #endif // // Routines in ahcache.c // BOOL BaseUpdateAppcompatCache( LPCWSTR pwszPath, HANDLE hFile, BOOL bRemove ); BOOL BaseFlushAppcompatCache( VOID ); BOOL BaseCheckAppcompatCache( LPCWSTR pwszPath, HANDLE hFile, PVOID pEnvironment, DWORD* dwReason ); VOID BaseDumpAppcompatCache( VOID ); // // Apphelp api to update the cache // // BOOL WINAPI ApphelpUpdateCacheEntry( LPCWSTR pwszPath, // nt path or dos path (see bNTPath) HANDLE hFile, // file handle (or INVALID_HANDLE_VALUE if not needed) BOOL bDeleteEntry, // TRUE if we are to delete the entry BOOL bNTPath // if TRUE -- NT path, FALSE - dos path ); // // Reasons: // #define SHIM_CACHE_NOT_FOUND 0x00000001 #define SHIM_CACHE_BYPASS 0x00000002 // bypass cache (either removable media or temp dir) #define SHIM_CACHE_LAYER_ENV 0x00000004 // layer env variable set #define SHIM_CACHE_MEDIA 0x00000008 #define SHIM_CACHE_TEMP 0x00000010 #define SHIM_CACHE_NOTAVAIL 0x00000020 // // Routines in check.c // INT_PTR CALLBACK AppCompatDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); DWORD ShowApphelpDialog( PAPPHELP_DATA pApphelpData ); // in apphelppath.c BOOL ConvertToDosPath( OUT LPWSTR* ppDosPath, IN LPCWSTR pwszPath ); BOOL CheckStringPrefixUnicode( PUNICODE_STRING pStrPrefix, PUNICODE_STRING pString, BOOL CaseInSensitive); // this function is used to free the dos path // it checks whether the path was allocated or // the static buffer was used VOID FreeDosPath(WCHAR* pDosPath); // // in matchApphelp.c // BOOL GetExeSxsData( HSDB hSDB, TAGREF trExe, PVOID* ppSxsData, DWORD* pcbSxsData ); // // in apphelpcache.c // VOID ShimUpdateCache(LPCWSTR pwszPath, PSDBQUERYRESULT psdbQuery); VOID ShimCacheProcessCleanup(VOID); VOID ShimCacheThreadCleanup(VOID); BOOL ShimCacheProcessInit(VOID); VOID ShimInitCache(PVOID pCache); VOID ShimRemoveExeFromCache(LPCWSTR pwszPath); BOOL LookupCache( LPCWSTR pwszPath, PSDBQUERYRESULT psdbQuery ); BOOL BypassCache( LPCWSTR pwszPath, WCHAR* pEnvironment, BOOL* pbLayer ); // // in apphelpcheck.c // // DWORD ShowApphelp( IN OUT PAPPHELP_DATA pApphelpData, IN LPCWSTR pwszDetailsDatabasePath, IN PDB pdbDetails ); // // same is in shell/published and also the same as used in shimdbc // #define APPTYPE_TYPE_MASK 0x000000FF #define APPTYPE_INC_NOBLOCK 0x00000001 #define APPTYPE_INC_HARDBLOCK 0x00000002 #define APPTYPE_MINORPROBLEM 0x00000003 #define APPTYPE_REINSTALL 0x00000004 #define APPTYPE_VERSIONSUB 0x00000005 #define APPTYPE_SHIM 0x00000006 #define APPTYPE_NONE 0x00000000 enum ShimAppHelpSeverityType { APPHELP_MINORPROBLEM = APPTYPE_MINORPROBLEM, APPHELP_HARDBLOCK = APPTYPE_INC_HARDBLOCK, APPHELP_NOBLOCK = APPTYPE_INC_NOBLOCK, APPHELP_VERSIONSUB = APPTYPE_VERSIONSUB, APPHELP_SHIM = APPTYPE_SHIM, APPHELP_REINSTALL = APPTYPE_REINSTALL, APPHELP_NONE = APPTYPE_NONE }; // // SDBAPI internal functions that we use to obtain flags for ntvdm // BOOL SDBAPI SdbpPackCmdLineInfo( IN PVOID pvFlagInfoList, OUT PVOID* ppFlagInfo ); BOOL SDBAPI SdbpFreeFlagInfoList( IN PVOID pvFlagInfoList ); // // Alloc/free routines from dblib // extern void* SdbAlloc(size_t); extern void SdbFree(void*); // // Stack allocation routine // #ifndef STACK_ALLOC // // // Exact same definition for stack-related routines is found in sdbp.h // VOID SdbResetStackOverflow( VOID ); #if DBG | defined(_WIN64) #define STACK_ALLOC(ptrVar, nSize) \ { \ PVOID* ppVar = (PVOID*)&(ptrVar); \ *ppVar = SdbAlloc(nSize); \ } #define STACK_FREE(pMemory) \ SdbFree(pMemory) #else // !DBG // // HACK ALERT // // The code below works because when we hit a stack overflow - we catch the exception // and subsequently fix the stack up using a crt routine // // // this routine lives in sdbapi, semi-private api // #define STACK_ALLOC(ptrVar, nSize) \ __try { \ PVOID* ppVar = (PVOID*)&(ptrVar); \ *ppVar = _alloca(nSize); \ } __except (GetExceptionCode() == EXCEPTION_STACK_OVERFLOW ? \ EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH) { \ (ptrVar) = NULL; \ } \ \ if (ptrVar == NULL) { \ SdbResetStackOverflow(); \ } #define STACK_FREE(pMemory) #endif // DBG #endif // !defined(STACK_ALLOC) #endif