From 3c2a937cab8208c0b5b67783a26ac53785aa5e9d Mon Sep 17 00:00:00 2001 From: anders_k Date: Fri, 15 Aug 2014 19:15:06 +0000 Subject: [PATCH] Added PEDllCharacteristics attribute and changed default DllCharacteristics to TS_AWARE+NO_SEH+NX_COMPAT+DYNAMIC_BASE git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6537 212acab6-be3b-0410-9dea-997c60f758d6 --- Docs/src/history.but | 4 ++++ Source/Platform.h | 9 +++++++++ Source/build.cpp | 9 +++++---- Source/build.h | 1 + Source/script.cpp | 10 ++++++++++ Source/tokens.cpp | 1 + Source/tokens.h | 1 + 7 files changed, 31 insertions(+), 4 deletions(-) diff --git a/Docs/src/history.but b/Docs/src/history.but index 36eb3c59..c4919226 100644 --- a/Docs/src/history.but +++ b/Docs/src/history.but @@ -26,6 +26,10 @@ Released on ?, 2014 \b Added WX compiler switch +\b Added PEDllCharacteristics attribute + +\b Changed default DllCharacteristics to TS_AWARE+NO_SEH+NX_COMPAT+DYNAMIC_BASE + \b Fixed POSIX !searchparse bug (\W{http://sf.net/p/nsis/patches/251}{patch #251}) \b Fixed !macroundef diff --git a/Source/Platform.h b/Source/Platform.h index 26920cf4..6a8273d4 100644 --- a/Source/Platform.h +++ b/Source/Platform.h @@ -776,6 +776,15 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG; # define IMAGE_DIRECTORY_ENTRY_EXPORT 0 # define IMAGE_SIZEOF_SHORT_NAME 8 #endif +#ifndef IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE +#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 +#endif +#ifndef IMAGE_DLLCHARACTERISTICS_NX_COMPAT +#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 +#endif +#ifndef IMAGE_DLLCHARACTERISTICS_NO_SEH +#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 +#endif #ifndef IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000 #endif diff --git a/Source/build.cpp b/Source/build.cpp index 7cc16780..09a4a6fc 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -277,6 +277,7 @@ CEXEBuild::CEXEBuild(signed char pponly) : res_editor=0; + PEDllCharacteristics = IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE|IMAGE_DLLCHARACTERISTICS_NO_SEH|IMAGE_DLLCHARACTERISTICS_NX_COMPAT|IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE; //forums.winamp.com/showthread.php?t=344755 manifest_comctl = manifest::comctl_old; manifest_exec_level = manifest::exec_level_none; manifest_dpiaware = manifest::dpiaware_notset; @@ -2401,10 +2402,10 @@ int CEXEBuild::UpdatePEHeader() try { PIMAGE_NT_HEADERS headers = CResourceEditor::GetNTHeaders(m_exehead); // workaround for bug #2697027, #2725883, #2803097 - headers->OptionalHeader.MajorImageVersion = 6; - headers->OptionalHeader.MinorImageVersion = 0; - // terminal services aware - headers->OptionalHeader.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE; + headers->OptionalHeader.MajorImageVersion = FIX_ENDIAN_INT16(6); + headers->OptionalHeader.MinorImageVersion = FIX_ENDIAN_INT16(0); + // DllCharacteristics + headers->OptionalHeader.DllCharacteristics = FIX_ENDIAN_INT16(PEDllCharacteristics); } catch (std::runtime_error& err) { ERROR_MSG(_T("Error updating PE headers: %") NPRIs _T("\n"), CtoTStrParam(err.what())); return PS_ERROR; diff --git a/Source/build.h b/Source/build.h index f9467690..689727e6 100644 --- a/Source/build.h +++ b/Source/build.h @@ -531,6 +531,7 @@ class CEXEBuild { int deflateToFile(FILE *fp, char *buf, int len); // len==0 to flush #endif + WORD PEDllCharacteristics; manifest::comctl manifest_comctl; manifest::exec_level manifest_exec_level; manifest::dpiaware manifest_dpiaware; diff --git a/Source/script.cpp b/Source/script.cpp index ef6879e1..4dadd344 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -2808,6 +2808,16 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return PS_ERROR; #endif// NSIS_CONFIG_VISIBLE_SUPPORT + case TOK_PEDLLCHARACTERISTICS: + { + int s1, s2; + WORD add = (WORD)line.gettoken_int(1, &s1), del = (WORD)line.gettoken_int(2, &s2), org = PEDllCharacteristics; + if (!s1 || !s2) PRINTHELP(); + PEDllCharacteristics &= ~del, PEDllCharacteristics |= add; + SCRIPT_MSG(_T("PEDllCharacteristics: 0x%.4x -> 0x%.4x\n"), org, PEDllCharacteristics); + } + return PS_OK; + case TOK_REQEXECLEVEL: switch (line.gettoken_enum(1,_T("none\0user\0highest\0admin\0"))) { diff --git a/Source/tokens.cpp b/Source/tokens.cpp index 58438e67..9dfc7eba 100644 --- a/Source/tokens.cpp +++ b/Source/tokens.cpp @@ -238,6 +238,7 @@ static tokenType tokenlist[TOK__LAST] = {TOK_WRITEREGSTR,_T("WriteRegStr"),4,0,_T("rootkey subkey entry_name new_value_string\n root_key=(HKCR|HKLM|HKCU|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_WRITEREGEXPANDSTR,_T("WriteRegExpandStr"),4,0,_T("rootkey subkey entry_name new_value_string\n root_key=(HKCR|HKLM|HKCU|HKU|HKCC|HKDD|HKPD|SHCTX)"),TP_CODE}, {TOK_WRITEUNINSTALLER,_T("WriteUninstaller"),1,0,_T("uninstall_exe_name"),TP_CODE}, +{TOK_PEDLLCHARACTERISTICS, _T("PEDllCharacteristics"),2,0,_T("addbits removebits"),TP_GLOBAL}, {TOK_XPSTYLE, _T("XPStyle"),1,0,_T("(on|off)"),TP_GLOBAL}, {TOK_REQEXECLEVEL, _T("RequestExecutionLevel"),1,0,_T("none|user|highest|admin"),TP_GLOBAL}, {TOK_MANIFEST_DPIAWARE,_T("ManifestDPIAware"),1,0,_T("notset|true|false"),TP_GLOBAL}, diff --git a/Source/tokens.h b/Source/tokens.h index f424d11c..e14eecb7 100644 --- a/Source/tokens.h +++ b/Source/tokens.h @@ -59,6 +59,7 @@ enum TOK_BRANDINGTEXT, TOK_FILEERRORTEXT, TOK_INSTPROGRESSFLAGS, + TOK_PEDLLCHARACTERISTICS, TOK_XPSTYLE, TOK_REQEXECLEVEL, TOK_MANIFEST_DPIAWARE,