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
This commit is contained in:
anders_k 2010-08-19 21:10:30 +00:00
parent 73501896d4
commit accab7bdbd
3 changed files with 44 additions and 5 deletions

View file

@ -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);

View file

@ -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

View file

@ -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);