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:
parent
73501896d4
commit
accab7bdbd
3 changed files with 44 additions and 5 deletions
|
@ -174,11 +174,47 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPTSTR lpszCmdPara
|
||||||
GetTempPath(NSIS_MAX_STRLEN, state_temp_dir);
|
GetTempPath(NSIS_MAX_STRLEN, state_temp_dir);
|
||||||
if (!ValidateTempDir())
|
if (!ValidateTempDir())
|
||||||
{
|
{
|
||||||
|
LPTSTR tstrslashtemp = _T("\\Temp");
|
||||||
GetWindowsDirectory(state_temp_dir, NSIS_MAX_STRLEN - 5); // leave space for \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())
|
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);
|
DeleteFile(state_language);
|
||||||
|
|
|
@ -1005,7 +1005,8 @@ struct MGA_FUNC MGA_FUNCS[] = {
|
||||||
{"ADVAPI32", "AdjustTokenPrivileges"},
|
{"ADVAPI32", "AdjustTokenPrivileges"},
|
||||||
{"KERNEL32", "GetUserDefaultUILanguage"},
|
{"KERNEL32", "GetUserDefaultUILanguage"},
|
||||||
{"SHLWAPI", "SHAutoComplete"},
|
{"SHLWAPI", "SHAutoComplete"},
|
||||||
{"SHFOLDER", "SHGetFolderPathW"}
|
{"SHFOLDER", "SHGetFolderPathW"},
|
||||||
|
{"SHELL32", "SHGetKnownFolderPath"}
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
struct MGA_FUNC MGA_FUNCS[] = {
|
struct MGA_FUNC MGA_FUNCS[] = {
|
||||||
|
@ -1017,7 +1018,8 @@ struct MGA_FUNC MGA_FUNCS[] = {
|
||||||
{"ADVAPI32", "AdjustTokenPrivileges"},
|
{"ADVAPI32", "AdjustTokenPrivileges"},
|
||||||
{"KERNEL32", "GetUserDefaultUILanguage"},
|
{"KERNEL32", "GetUserDefaultUILanguage"},
|
||||||
{"SHLWAPI", "SHAutoComplete"},
|
{"SHLWAPI", "SHAutoComplete"},
|
||||||
{"SHFOLDER", "SHGetFolderPathA"}
|
{"SHFOLDER", "SHGetFolderPathA"},
|
||||||
|
{"SHELL32", "SHGetKnownFolderPath"}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -118,7 +118,8 @@ enum myGetProcAddressFunctions {
|
||||||
MGA_AdjustTokenPrivileges,
|
MGA_AdjustTokenPrivileges,
|
||||||
MGA_GetUserDefaultUILanguage,
|
MGA_GetUserDefaultUILanguage,
|
||||||
MGA_SHAutoComplete,
|
MGA_SHAutoComplete,
|
||||||
MGA_SHGetFolderPath
|
MGA_SHGetFolderPath,
|
||||||
|
MGA_SHGetKnownFolderPath
|
||||||
};
|
};
|
||||||
|
|
||||||
void * NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func);
|
void * NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue