From accab7bdbd42462169bc420b6b7d53ddbaea3c24 Mon Sep 17 00:00:00 2001 From: anders_k Date: Thu, 19 Aug 2010 21:10:30 +0000 Subject: [PATCH] Try FOLDERID_LocalAppDataLow\Temp as last ValidateTempDir() attempt for Low IL aka Protected IE git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6121 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/exehead/Main.c | 40 ++++++++++++++++++++++++++++++++++++++-- Source/exehead/util.c | 6 ++++-- Source/exehead/util.h | 3 ++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/Source/exehead/Main.c b/Source/exehead/Main.c index 214bed9c..7c121160 100644 --- a/Source/exehead/Main.c +++ b/Source/exehead/Main.c @@ -174,11 +174,47 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPTSTR lpszCmdPara GetTempPath(NSIS_MAX_STRLEN, state_temp_dir); if (!ValidateTempDir()) { + LPTSTR tstrslashtemp = _T("\\Temp"); GetWindowsDirectory(state_temp_dir, NSIS_MAX_STRLEN - 5); // leave space for \Temp - mystrcat(state_temp_dir, _T("\\Temp")); + mystrcat(state_temp_dir, tstrslashtemp); if (!ValidateTempDir()) { - goto end; + const int myKF_FLAG_CREATE=0x00008000; + const GUID myFOLDERID_LocalAppDataLow={0xA520A1A4,0x1780,0x4FF6,{0xBD,0x18,0x16,0x73,0x43,0xC5,0xAF,0x16}}; + void* pfnSHGetKnownFolderPath=myGetProcAddress(MGA_SHGetKnownFolderPath); + WCHAR* localapplow; + HRESULT hr = E_NOTIMPL; + if (pfnSHGetKnownFolderPath) + { + // There does not seem to be a API to get the low temp dir directly, so we build the path on our own + hr = ((HRESULT(WINAPI*)(void*,DWORD,HANDLE,WCHAR**))pfnSHGetKnownFolderPath)((void*)&myFOLDERID_LocalAppDataLow, myKF_FLAG_CREATE, NULL, &localapplow); + } + if (S_OK == hr) + { +#ifdef _UNICODE + if (mystrlen(localapplow) < NSIS_MAX_STRLEN - 5) + { + addtrailingslash(state_temp_dir); + mystrcat(state_temp_dir, &tstrslashtemp[1]); + } +#else + if (lstrlenW(localapplow) < NSIS_MAX_STRLEN - 5) + { + BOOL useddefchar=FALSE; + WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, localapplow, -1, state_temp_dir, NSIS_MAX_STRLEN, NULL, &useddefchar); + if (!useddefchar) + { + addtrailingslash(state_temp_dir); + mystrcat(state_temp_dir, &tstrslashtemp[1]); + } + } +#endif + CoTaskMemFree(localapplow); + } + if (!ValidateTempDir()) + { + goto end; + } } } DeleteFile(state_language); diff --git a/Source/exehead/util.c b/Source/exehead/util.c index 729b14a4..37e4fba8 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -1005,7 +1005,8 @@ struct MGA_FUNC MGA_FUNCS[] = { {"ADVAPI32", "AdjustTokenPrivileges"}, {"KERNEL32", "GetUserDefaultUILanguage"}, {"SHLWAPI", "SHAutoComplete"}, - {"SHFOLDER", "SHGetFolderPathW"} + {"SHFOLDER", "SHGetFolderPathW"}, + {"SHELL32", "SHGetKnownFolderPath"} }; #else struct MGA_FUNC MGA_FUNCS[] = { @@ -1017,7 +1018,8 @@ struct MGA_FUNC MGA_FUNCS[] = { {"ADVAPI32", "AdjustTokenPrivileges"}, {"KERNEL32", "GetUserDefaultUILanguage"}, {"SHLWAPI", "SHAutoComplete"}, - {"SHFOLDER", "SHGetFolderPathA"} + {"SHFOLDER", "SHGetFolderPathA"}, + {"SHELL32", "SHGetKnownFolderPath"} }; #endif diff --git a/Source/exehead/util.h b/Source/exehead/util.h index d43fc06a..6ded0332 100644 --- a/Source/exehead/util.h +++ b/Source/exehead/util.h @@ -118,7 +118,8 @@ enum myGetProcAddressFunctions { MGA_AdjustTokenPrivileges, MGA_GetUserDefaultUILanguage, MGA_SHAutoComplete, - MGA_SHGetFolderPath + MGA_SHGetFolderPath, + MGA_SHGetKnownFolderPath }; void * NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func);