[prev in list] [next in list] [prev in thread] [next in thread]
List: nsis-commits
Subject: [NSIS-commits] SF.net SVN: nsis:[7154] NSIS/trunk
From: anders_k--- via NSIS-commits <nsis-commits () lists ! sourceforge ! net>
Date: 2020-03-12 23:43:51
Message-ID: 1584056632.186956.14536 () sfp-scm-7 ! v30 ! lw ! sourceforge ! com
[Download RAW message or body]
Revision: 7154
http://sourceforge.net/p/nsis/code/7154
Author: anders_k
Date: 2020-03-12 23:43:51 +0000 (Thu, 12 Mar 2020)
Log Message:
-----------
Added GetKnownFolderPath
Modified Paths:
--------------
NSIS/trunk/Docs/src/generalpurpose.but
NSIS/trunk/Docs/src/history.but
NSIS/trunk/Include/WinCore.nsh
NSIS/trunk/Source/exehead/exec.c
NSIS/trunk/Source/exehead/fileform.h
NSIS/trunk/Source/exehead/util.c
NSIS/trunk/Source/exehead/util.h
NSIS/trunk/Source/script.cpp
NSIS/trunk/Source/tokens.cpp
NSIS/trunk/Source/tokens.h
Modified: NSIS/trunk/Docs/src/generalpurpose.but
===================================================================
--- NSIS/trunk/Docs/src/generalpurpose.but 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Docs/src/generalpurpose.but 2020-03-12 23:43:51 UTC (rev 7154)
@@ -81,6 +81,17 @@
This is similar to \R{getfiletime}{GetFileTime}, only it acts on the system building \
the installer (it actually compiles into two \R{StrCpy}{StrCpy} commands). Sets the \
two output variables with the file timestamp of the file on the build system.
+\S2{getknownfolderpath} GetKnownFolderPath
+
+\c user_var(output) knownfolderid
+
+Get the path of a \W{https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid}{known \
folder}. The error flag is set and the output variable is empty if the call fails or \
the knownfolderid guid is not available. This function is only able to resolve known \
folders Windows Vista or higher. +
+\c !include WinCore.nsh
+\c GetKnownFolderPath $InstDir ${FOLDERID_UserProgramFiles}
+\c StrCmp $InstDir "" 0 +2
+\c StrCpy $InstDir "$LocalAppData\Programs"
+
\S2{getfullpathname} GetFullPathName
\c [/SHORT] user_var(output) path_or_file
Modified: NSIS/trunk/Docs/src/history.but
===================================================================
--- NSIS/trunk/Docs/src/history.but 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Docs/src/history.but 2020-03-12 23:43:51 UTC (rev 7154)
@@ -12,6 +12,8 @@
\S2{} Major Changes
+\b Added \R{getknownfolderpath}{GetKnownFolderPath}
+
\S2{} Minor Changes
\b Added \R{ifshellvarcontextall}{IfShellVarContextAll} and \
\R{ifrtllanguage}{IfRtlLanguage}
Modified: NSIS/trunk/Include/WinCore.nsh
===================================================================
--- NSIS/trunk/Include/WinCore.nsh 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Include/WinCore.nsh 2020-03-12 23:43:51 UTC (rev 7154)
@@ -227,5 +227,37 @@
+
+
+/**************************************************
+ShlGuid.h
+**************************************************/
+!ifndef __WIN_NOINC_SHLGUID
+!define FOLDERID_Public {DFDF76A2-C82A-4D63-906A-5644AC457385} ; Vista+ \
Fixed=%SystemDrive%\Users\Public +!define FOLDERID_Games \
{CAC52C1A-B53D-4edc-92D7-6B2E8AC19434} ; Vista+ && < 10 (1803) Virtual +!define \
FOLDERID_SavedGames {4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4} ; Vista+ \
PerUser=%USERPROFILE%\Saved Games +!define FOLDERID_GameTasks \
{054FAE61-4DD8-4787-80B6-090220C4B700} ; Vista+ \
PerUser=%LOCALAPPDATA%\Microsoft\Windows\GameExplorer +!define \
FOLDERID_PublicGameTasks {DEBF2536-E1A8-4c59-B6A2-414586476AEA} ; Vista+ \
Common=%ALLUSERSPROFILE%\Microsoft\Windows\GameExplorer +!define FOLDERID_Contacts \
{56784854-C6CB-462b-8169-88E350ACB882} ; Vista+ PerUser=%USERPROFILE%\Contacts \
+!define FOLDERID_Downloads {374DE290-123F-4565-9164-39C4925E467B} ; Vista+ \
PerUser=%USERPROFILE%\Downloads +!define FOLDERID_PublicDownloads \
{3D644C9B-1FB8-4f30-9B45-F670235F79C0} ; Vista+ Common=%PUBLIC%\Downloads +!define \
FOLDERID_UserProfiles {0762D272-C50A-4BB0-A382-697DCD729B80} ; Vista+ \
Fixed=%SystemDrive%\Users +!define FOLDERID_UserProgramFiles \
{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB} ; 7+ PerUser=%LOCALAPPDATA%\Programs +!define \
FOLDERID_UserProgramFilesCommon {BCBD3057-CA5C-4622-B42D-BC56DB0AE516} ; 7+ \
PerUser=%LOCALAPPDATA%\Programs\Common +!define FOLDERID_PublicLibraries \
{48DAF80B-E6CF-4F4E-B800-0E69D84EE384} ; 7+ \
Common=%ALLUSERSPROFILE%\Microsoft\Windows\Libraries +!define FOLDERID_UserPinned \
{9E3995AB-1F9C-4F13-B827-48B24B6C7174} ; 7+ PerUser=%APPDATA%\Microsoft\Internet \
Explorer\Quick Launch\User Pinned +!define FOLDERID_ImplicitAppShortcuts \
{BCB5256F-79F6-4CEE-B725-DC34E402FD46} ; 7+ PerUser=%APPDATA%\Microsoft\Internet \
Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts +!define \
FOLDERID_DeviceMetadataStore {5CE4A5E9-E4EB-479D-B89F-130C02886155} ; 7+ \
Common=%ALLUSERSPROFILE%\Microsoft\Windows\DeviceMetadataStore +!define \
FOLDERID_ApplicationShortcuts {A3918781-E5F2-4890-B3D9-A7E54332328C} ; 8.0+ \
PerUser=%LOCALAPPDATA%\Microsoft\Windows\Application Shortcuts +!define \
FOLDERID_RoamingTiles {00BCFC5A-ED94-4e48-96A1-3F6217F21990} ; 8.0+ \
PerUser=%LOCALAPPDATA%\Microsoft\Windows\RoamingTiles +!define \
FOLDERID_RoamedTileImages {AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E} ; 8.0+ \
PerUser=%LOCALAPPDATA%\Microsoft\Windows\RoamedTileImages +!define \
FOLDERID_PublicUserTiles {0482af6c-08f1-4c34-8c90-e17ec98b1e17} ; 8.0+ \
Common=%PUBLIC%\AccountPictures +!define FOLDERID_AccountPictures \
{008ca0b1-55b4-4c56-b8a8-4de4b299d3be} ; 8.0+ \
PerUser=%APPDATA%\Microsoft\Windows\AccountPictures +!define FOLDERID_Screenshots \
{b7bede81-df94-4682-a7d8-57a52620b86f} ; 8.0+ \
PerUser=%USERPROFILE%\Pictures\Screenshots +!define FOLDERID_SkyDrive \
{A52BBA46-E9E1-435f-B3D9-28DAA648C0F6} ; 8.1+ PerUser=%USERPROFILE%\OneDrive +!define \
FOLDERID_AppDataProgramData {559D40A3-A036-40FA-AF61-84CB430A4D34} ; 10 (1709)+ \
PerUser=%LOCALAPPDATA%\ProgramData +!endif /* __WIN_NOINC_SHLGUID */
+
+
!verbose pop
!endif /* __WIN_WINDOWS__INC */
\ No newline at end of file
Modified: NSIS/trunk/Source/exehead/exec.c
===================================================================
--- NSIS/trunk/Source/exehead/exec.c 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Source/exehead/exec.c 2020-03-12 23:43:51 UTC (rev 7154)
@@ -1390,7 +1390,7 @@
else if (which==EW_FPUTS)
{
GetStringFromParm(0x21); // load string in buf2, convert it to ANSI in \
buf1
- WideCharToMultiByte(CP_ACP, 0, buf2, -1, (LPSTR) buf1, NSIS_MAX_STRLEN, \
NULL, NULL); + StrWideToACP(buf2, (LPSTR) buf1, NSIS_MAX_STRLEN);
l=lstrlenA((LPCSTR)buf1);
}
#endif
@@ -1704,6 +1704,32 @@
break;
#endif//NSIS_CONFIG_COMPONENTPAGE
+ case EW_GETOSINFO:
+ {
+ //switch(parm0)
+ {
+#ifdef NSIS_SUPPORT_FNUTIL
+ //case 0:
+ {
+ TCHAR *outstr = var1;
+ IID kfid;
+ HRESULT(WINAPI*SHGKFP)(REFIID,DWORD,HANDLE,PWSTR*) = \
(HRESULT(WINAPI*)(REFIID,DWORD,HANDLE,PWSTR*)) \
myGetProcAddress(MGA_SHGetKnownFolderPath); + TCHAR *buf2 = \
GetStringFromParm(0x22), succ = FALSE; + if (SHGKFP && \
SUCCEEDED(ComIIDFromString(buf2, &kfid))) + {
+ PWSTR path;
+ HRESULT hr = SHGKFP(&kfid, parm3, NULL, &path);
+ if (SUCCEEDED(hr))
+ strcpyWideToT(outstr, path), CoTaskMemFree(path), ++succ;
+ }
+ if (!succ)
+ exec_error++, *outstr = _T('\0');
+ }
+ //break;
+#endif
+ }
+ }
+ break;
#ifdef NSIS_LOCKWINDOW_SUPPORT
case EW_LOCKWINDOW:
{
Modified: NSIS/trunk/Source/exehead/fileform.h
===================================================================
--- NSIS/trunk/Source/exehead/fileform.h 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Source/exehead/fileform.h 2020-03-12 23:43:51 UTC (rev 7154)
@@ -193,9 +193,8 @@
// InstTypeGetFlags: 3: [idx, 1, output]
#endif
- // instructions not actually implemented in exehead, but used in compiler.
- EW_GETLABELADDR, // both of these get converted to EW_ASSIGNVAR
- EW_GETFUNCTIONADDR,
+ EW_GETOSINFO, // 1+ [operation, ...]
+ EW_RESERVEDOPCODE, // Free slot, feel free to use it for something
#ifdef NSIS_LOCKWINDOW_SUPPORT
EW_LOCKWINDOW,
@@ -207,6 +206,10 @@
EW_FGETWS, // FileReadUTF16LE: 4 [handle, output, maxlen, \
?getchar:gets] #endif//NSIS_SUPPORT_FILEFUNCTIONS
#endif
+
+ // Opcodes listed here are not actually used in exehead. No exehead opcodes should \
be present after these! + EW_GETLABELADDR, // --> EW_ASSIGNVAR
+ EW_GETFUNCTIONADDR, // --> EW_ASSIGNVAR
};
#pragma pack(push, 1) // fileform.cpp assumes no padding/alignment
Modified: NSIS/trunk/Source/exehead/util.c
===================================================================
--- NSIS/trunk/Source/exehead/util.c 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Source/exehead/util.c 2020-03-12 23:43:51 UTC (rev 7154)
@@ -771,6 +771,30 @@
return lstrcat(out, concat);
}
+int StrWideToACP(LPCWSTR Src, char* Dst, int DstCap)
+{
+ return WideCharToMultiByte(CP_ACP, 0, Src, -1, Dst, DstCap, NULL, NULL);
+}
+
+#ifndef UNICODE
+void strcpyWideToT(TCHAR *out, LPCWSTR in)
+{
+ StrWideToACP(in, out, NSIS_MAX_STRLEN);
+}
+#endif
+
+#if !defined(_WIN64) && !defined(UNICODE)
+HRESULT ComIIDFromString(LPCTSTR str, IID*out)
+{
+ WCHAR buf[130];
+ signed char i;
+ for (i = 0; i >= 0; ++i)
+ if (!(buf[i] = str[i]))
+ return IIDFromString(buf, out);
+ return E_FAIL;
+}
+#endif
+
TCHAR ps_tmpbuf[NSIS_MAX_STRLEN*2];
const TCHAR SYSREGKEY[] = _T("Software\\Microsoft\\Windows\\CurrentVersion");
@@ -1145,6 +1169,7 @@
{"ADVAPI32", "RegDeleteKeyExW"},
#endif
{"ADVAPI32", "InitiateShutdownW"},
+ {"SHELL32", "SHGetKnownFolderPath"},
{"SHELL32", (CHAR*) 680}, // IsUserAnAdmin
#ifndef _WIN64
{"SHLWAPI", (CHAR*) 437}, // IsOS
@@ -1163,6 +1188,7 @@
{"KERNEL32", "GetUserDefaultUILanguage"},
{"ADVAPI32", "RegDeleteKeyExA"},
{"ADVAPI32", "InitiateShutdownA"},
+ {"SHELL32", "SHGetKnownFolderPath"},
{"SHELL32", (CHAR*) 680}, // IsUserAnAdmin
#ifndef _WIN64
{"SHLWAPI", (CHAR*) 437}, // IsOS
@@ -1234,7 +1260,7 @@
{
#ifdef _UNICODE
char ansiName[256];
- if (WideCharToMultiByte(CP_ACP, 0, funcName, -1, ansiName, 256, NULL, NULL) != 0)
+ if (StrWideToACP(funcName, ansiName, 256) != 0)
return GetProcAddress(dllHandle, ansiName);
return NULL;
#else
Modified: NSIS/trunk/Source/exehead/util.h
===================================================================
--- NSIS/trunk/Source/exehead/util.h 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Source/exehead/util.h 2020-03-12 23:43:51 UTC (rev 7154)
@@ -40,7 +40,20 @@
int NSISCALL mystrlen(const TCHAR *in);
TCHAR * NSISCALL mystrcat(TCHAR *out, const TCHAR *concat);
TCHAR * NSISCALL mystrstr(TCHAR *a, TCHAR *b);
+int StrWideToACP(LPCWSTR Src, char* Dst, int DstCap);
+#ifdef UNICODE
+#define strcpyWideToT mystrcpy
+#else
+void strcpyWideToT(TCHAR *out, LPCWSTR in);
+#endif
+#ifdef _WIN64
+#define ComIIDFromString(s,out) SHCLSIDFromString((s),(CLSID*)(out))
+#elif defined(UNICODE)
+#define ComIIDFromString(s,out) IIDFromString((s), (IID*)(out))
+#else
+HRESULT ComIIDFromString(LPCTSTR str, IID*out);
+#endif
#ifndef KEY_CREATE_LINK
#define KEY_CREATE_LINK 0x0020
@@ -154,6 +167,7 @@
MGA_RegDeleteKeyEx,
#endif
MGA_InitiateShutdown,
+ MGA_SHGetKnownFolderPath,
MGA_IsUserAnAdmin,
#ifndef _WIN64
MGA_IsOS,
Modified: NSIS/trunk/Source/script.cpp
===================================================================
--- NSIS/trunk/Source/script.cpp 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Source/script.cpp 2020-03-12 23:43:51 UTC (rev 7154)
@@ -4187,6 +4187,12 @@
line.gettoken_str(2+a),line.gettoken_str(1+a),a?_T("sfn"):_T("lfn"));
}
return add_entry(&ent);
+ case TOK_GETKNOWNFOLDERPATH:
+ ent.which=EW_GETOSINFO;
+ ent.offsets[0]=0; // Operation
+ ent.offsets[1]=GetUserVarIndex(line, 1);
+ ent.offsets[2]=add_string(line.gettoken_str(2));
+ return add_entry(&ent);
case TOK_SEARCHPATH:
ent.which=EW_SEARCHPATH;
ent.offsets[0]=GetUserVarIndex(line, 1);
@@ -4198,6 +4204,7 @@
case TOK_SEARCHPATH:
case TOK_GETTEMPFILENAME:
case TOK_GETFULLPATHNAME:
+ case TOK_GETKNOWNFOLDERPATH:
ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_FNUTIL not \
defined.\n"), line.gettoken_str(0)); return PS_ERROR;
#endif //~ NSIS_SUPPORT_FNUTIL
Modified: NSIS/trunk/Source/tokens.cpp
===================================================================
--- NSIS/trunk/Source/tokens.cpp 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Source/tokens.cpp 2020-03-12 23:43:51 UTC (rev 7154)
@@ -110,6 +110,7 @@
{TOK_GETDLGITEM,_T("GetDlgItem"),3,0,_T("$(user_var: handle output) dialog \
item_id"),TP_CODE}, {TOK_GETFULLPATHNAME,_T("GetFullPathName"),2,1,_T("[/SHORT] \
$(user_var: result) path_or_file"),TP_CODE}, \
{TOK_GETTEMPFILENAME,_T("GetTempFileName"),1,1,_T("$(user_var: name output) \
[base_dir]"),TP_CODE}, \
+{TOK_GETKNOWNFOLDERPATH,_T("GetKnownFolderPath"),2,0,_T("$(user_var: result) \
knownfolderid"),TP_CODE}, {TOK_HIDEWINDOW,_T("HideWindow"),0,0,_T(""),TP_CODE},
{TOK_ICON,_T("Icon"),1,0,_T("local_icon.ico"),TP_GLOBAL},
{TOK_IFABORT,_T("IfAbort"),1,1,_T("label_to_goto_if_abort \
[label_to_goto_if_no_abort]"),TP_CODE},
Modified: NSIS/trunk/Source/tokens.h
===================================================================
--- NSIS/trunk/Source/tokens.h 2020-03-10 18:16:39 UTC (rev 7153)
+++ NSIS/trunk/Source/tokens.h 2020-03-12 23:43:51 UTC (rev 7154)
@@ -280,6 +280,7 @@
#endif
TOK_FILESEEK,
TOK_GETFULLPATHNAME,
+ TOK_GETKNOWNFOLDERPATH,
TOK_REBOOT,
TOK_IFREBOOTFLAG,
TOK_SETREBOOTFLAG,
This was sent by the SourceForge.net collaborative development platform, the world's \
largest Open Source development site.
_______________________________________________
NSIS-commits mailing list
NSIS-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nsis-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic