diff --git a/Contrib/Banner/Banner.c b/Contrib/Banner/Banner.c index 3b704489..3fc1824f 100644 --- a/Contrib/Banner/Banner.c +++ b/Contrib/Banner/Banner.c @@ -4,16 +4,6 @@ // Unicode support added by Jim Park -- 08/02/2007 -// Turn a pair of chars into a word -// Turn four chars into a dword -#ifdef __BIG_ENDIAN__ // Not very likely, but, still... -#define CHAR2_TO_WORD(a,b) (((WORD)(b))|((a)<<8)) -#define CHAR4_TO_DWORD(a,b,c,d) (((DWORD)CHAR2_TO_WORD(c,d))|(CHAR2_TO_WORD(a,b)<<16)) -#else -#define CHAR2_TO_WORD(a,b) (((WORD)(a))|((b)<<8)) -#define CHAR4_TO_DWORD(a,b,c,d) (((DWORD)CHAR2_TO_WORD(a,b))|(CHAR2_TO_WORD(c,d)<<16)) -#endif - HINSTANCE hInstance; HWND hwBanner; HANDLE hThread; diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index d8e03b54..88e75503 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -48,16 +48,6 @@ TCHAR *WINAPI STRDUP(const TCHAR *c) return lstrcpy(t,c); } -// Turn a pair of chars into a word -// Turn four chars into a dword -#ifdef __BIG_ENDIAN__ // Not very likely, but, still... -#define CHAR2_TO_WORD(a,b) (((WORD)(b))|((a)<<8)) -#define CHAR4_TO_DWORD(a,b,c,d) (((DWORD)CHAR2_TO_WORD(c,d))|(CHAR2_TO_WORD(a,b)<<16)) -#else -#define CHAR2_TO_WORD(a,b) (((WORD)(a))|((b)<<8)) -#define CHAR4_TO_DWORD(a,b,c,d) (((DWORD)CHAR2_TO_WORD(a,b))|(CHAR2_TO_WORD(c,d)<<16)) -#endif - // Field types // NB - the order of this list is important - see below diff --git a/Contrib/nsExec/nsexec.c b/Contrib/nsExec/nsexec.c index 19c9a7c1..da5ead0a 100644 --- a/Contrib/nsExec/nsexec.c +++ b/Contrib/nsExec/nsexec.c @@ -75,16 +75,6 @@ BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { #define TAB_REPLACE _T(" ") #define TAB_REPLACE_SIZE (sizeof(TAB_REPLACE)-1) -// Turn a pair of chars into a word -// Turn four chars into a dword -#ifdef __BIG_ENDIAN__ // Not very likely, but, still... -#define CHAR2_TO_WORD(a,b) (((WORD)(b))|((a)<<8)) -#define CHAR4_TO_DWORD(a,b,c,d) (((DWORD)CHAR2_TO_WORD(c,d))|(CHAR2_TO_WORD(a,b)<<16)) -#else -#define CHAR2_TO_WORD(a,b) (((WORD)(a))|((b)<<8)) -#define CHAR4_TO_DWORD(a,b,c,d) (((DWORD)CHAR2_TO_WORD(a,b))|(CHAR2_TO_WORD(c,d)<<16)) -#endif - BOOL IsWOW64() { typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); BOOL wow64; diff --git a/Source/exehead/Main.c b/Source/exehead/Main.c index 7fd3e2cb..d488a54e 100644 --- a/Source/exehead/Main.c +++ b/Source/exehead/Main.c @@ -153,11 +153,11 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPTSTR lpszCmdPara cl_flags |= FH_FLAGS_SILENT; #endif//NSIS_CONFIG_SILENT_SUPPORT && NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_CRC_SUPPORT - if (*(LPDWORD)cmdline == CHAR4_TO_DWORD(_T('N'),_T('C'),_T('R'),_T('C')) && END_OF_ARG(cmdline[4])) + if (CMP4CHAR(cmdline, _T("NCRC")) && END_OF_ARG(cmdline[4])) cl_flags |= FH_FLAGS_NO_CRC; #endif//NSIS_CONFIG_CRC_SUPPORT - if (*(LPDWORD)(cmdline-2) == CHAR4_TO_DWORD(_T(' '), _T('/'), _T('D'),_T('='))) + if (CMP4CHAR(cmdline-2, _T(" /D="))) { *(LPDWORD)(cmdline-2)=0; // keep this from being passed to uninstaller if necessary mystrcpy(state_install_directory,cmdline+2); @@ -194,7 +194,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPTSTR lpszCmdPara // state_command_line has state_install_directory right after it in memory, so reading // a bit over state_command_line won't do any harm - while (p >= state_command_line && *(LPDWORD)p != CHAR4_TO_DWORD(_T(' '), _T('_'), _T('?'), _T('='))) p--; + while (p >= state_command_line && !CMP4CHAR(p, _T(" _?="))) p--; m_Err = _LANG_UNINSTINITERROR; @@ -231,7 +231,7 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPTSTR lpszCmdPara mystrcpy(state_install_directory,state_exe_directory); mystrcpy(g_usrvars[0], realcmds); - *(LPWORD)g_usrvars[1] = CHAR2_TO_WORD(_T('A'),0); + SET2CHAR(g_usrvars[1], _T("A\0")); for (x = 0; x < 26; x ++) { diff --git a/Source/exehead/util.h b/Source/exehead/util.h index 71f8cac0..43c4c3d4 100644 --- a/Source/exehead/util.h +++ b/Source/exehead/util.h @@ -139,11 +139,29 @@ void * NSISCALL NSISGetProcAddress(HANDLE dllHandle, TCHAR* funcName); // Turn a pair of chars into a word // Turn four chars into a dword #ifdef __BIG_ENDIAN__ // Not very likely, but, still... -#define CHAR2_TO_WORD(a,b) (((WORD)(b))|((a)<<8)) -#define CHAR4_TO_DWORD(a,b,c,d) (((DWORD)CHAR2_TO_WORD(c,d))|(CHAR2_TO_WORD(a,b)<<16)) +#ifdef _UNICODE +#ifdef _NSIS_NO_INT64_SHR +#define CMP4CHAR(mem, const4) ((((LPDWORD)(mem))[0] == (const4[3]|const4[2]<<16)) && (((LPDWORD)(mem))[1] == (const4[1]|const4[0]<<16))) #else -#define CHAR2_TO_WORD(a,b) (((WORD)(a))|((b)<<8)) -#define CHAR4_TO_DWORD(a,b,c,d) (((DWORD)CHAR2_TO_WORD(a,b))|(CHAR2_TO_WORD(c,d)<<16)) +#define CMP4CHAR(mem, const4) (*(PDWORD64)(mem) == (const4[3]|const4[2]<<16|(DWORD64)const4[1]<<32|(DWORD64)const4[0]<<48)) +#endif +#define SET2CHAR(mem, const2) (*(LPDWORD)(mem) = (const2[1]|const2[0]<<16)) +#else +#define CMP4CHAR(mem, const4) (*(LPDWORD)(mem) == (const4[3]|const4[2]<<8|const4[1]<<16|const4[0]<<24)) +#define SET2CHAR(mem, const2) (*(LPWORD)(mem) = (const2[1]|const2[0]<<8)) +#endif +#else +#ifdef _UNICODE +#ifdef _NSIS_NO_INT64_SHR +#define CMP4CHAR(mem, const4) ((((LPDWORD)(mem))[0] == (const4[0]|const4[1]<<16)) && (((LPDWORD)(mem))[1] == (const4[2]|const4[3]<<16))) +#else +#define CMP4CHAR(mem, const4) (*(PDWORD64)(mem) == (const4[0]|const4[1]<<16|(DWORD64)const4[2]<<32|(DWORD64)const4[3]<<48)) +#endif +#define SET2CHAR(mem, const2) (*(LPDWORD)(mem) = (const2[0]|const2[1]<<16)) +#else +#define CMP4CHAR(mem, const4) (*(LPDWORD)(mem) == (const4[0]|const4[1]<<8|const4[2]<<16|const4[3]<<24)) +#define SET2CHAR(mem, const2) (*(LPWORD)(mem) = (const2[0]|const2[1]<<8)) +#endif #endif #endif//!___NSIS_UTIL_H___