From d799ee53d70b1c2d11783b2af86e2517b35a8319 Mon Sep 17 00:00:00 2001 From: anders_k Date: Sat, 8 Feb 2014 00:13:52 +0000 Subject: [PATCH] Basic Win64 support (MSVC) git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6439 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/AdvSplash/advsplash.c | 7 +- Contrib/ExDLL/nsis_tchar.h | 2 +- Contrib/InstallOptions/InstallerOptions.cpp | 18 ++--- Contrib/LangDLL/LangDLL.c | 14 ++-- Contrib/Library/RegTool/RegTool.c | 2 +- Contrib/Makensisw/jnetlib/connection.cpp | 2 +- Contrib/Makensisw/makensisw.cpp | 6 +- Contrib/Makensisw/toolbar.cpp | 11 ++- Contrib/NSISdl/connection.cpp | 2 +- Contrib/NSISdl/nsisdl.cpp | 6 +- Contrib/StartMenu/StartMenu.c | 2 +- Contrib/System/SConscript | 4 +- Contrib/System/Source/Buffers.c | 6 +- Contrib/System/Source/System.c | 14 ++-- Contrib/System/Source/System.h | 2 +- Contrib/UIs/ui.c | 2 +- Contrib/UserInfo/UserInfo.c | 4 ++ Contrib/nsDialogs/nsDialogs.c | 2 +- Contrib/nsExec/nsexec.c | 4 +- Contrib/zip2exe/main.cpp | 2 +- Include/Sections.nsh | 2 +- SCons/Config/ms | 34 +++++++--- SConstruct | 8 ++- Source/7zip/7zip/Compress/LZ/LZInWindow.h | 4 +- Source/DialogTemplate.cpp | 4 +- Source/Platform.h | 14 +++- Source/Plugins.cpp | 2 +- Source/ResourceEditor.cpp | 12 ++-- Source/ResourceEditor.h | 2 +- Source/build.cpp | 74 ++++++++++++--------- Source/build.h | 6 +- Source/bzip2/compress.c | 2 +- Source/exehead/Main.c | 7 ++ Source/exehead/Ui.c | 33 +++++---- Source/exehead/exec.c | 7 +- Source/exehead/fileform.c | 6 +- Source/exehead/fileform.h | 24 ++++++- Source/exehead/util.c | 24 ++++--- Source/exehead/util.h | 14 ++-- Source/fileform.cpp | 25 +++++-- Source/fileform.h | 15 ++++- Source/icon.cpp | 14 ++-- Source/lang.cpp | 4 +- Source/script.cpp | 37 +++++------ Source/strlist.cpp | 27 ++++---- Source/strlist.h | 68 +++++++++---------- Source/tchar.h | 6 +- Source/utf.cpp | 12 ++-- Source/util.cpp | 14 ++-- Source/winchar.cpp | 2 +- Source/writer.cpp | 11 ++- Source/writer.h | 1 + 52 files changed, 380 insertions(+), 247 deletions(-) diff --git a/Contrib/AdvSplash/advsplash.c b/Contrib/AdvSplash/advsplash.c index e5d3535f..1d7b2260 100644 --- a/Contrib/AdvSplash/advsplash.c +++ b/Contrib/AdvSplash/advsplash.c @@ -132,8 +132,7 @@ BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, return TRUE; } -void CALLBACK TimeProc(UINT uID, - UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) +void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) { int call = -1; switch (state) { @@ -251,11 +250,15 @@ void __declspec(dllexport) show(HWND hwndParent, int string_size, // Set transparency / key color if (nt50) { + #ifndef _WIN64 // Get blending proc address HANDLE user32 = GetModuleHandle(_T("user32")); SetLayeredWindowAttributesProc = (_tSetLayeredWindowAttributesProc) GetProcAddress(user32, "SetLayeredWindowAttributes"); + #else + #define SetLayeredWindowAttributesProc SetLayeredWindowAttributes + #endif // Use win2k method SetLayeredWindowAttributesProc(myWnd, keycolor, (BYTE) ((fadein_val > 0) ? (0) : (255)), diff --git a/Contrib/ExDLL/nsis_tchar.h b/Contrib/ExDLL/nsis_tchar.h index 3e02d12f..e622063d 100644 --- a/Contrib/ExDLL/nsis_tchar.h +++ b/Contrib/ExDLL/nsis_tchar.h @@ -40,7 +40,7 @@ typedef wchar_t TCHAR; // printfs #define _ftprintf fwprintf #define _sntprintf _snwprintf -#if (defined(_MSC_VER) && (_MSC_VER<=1310)) || defined(__MINGW32__) +#if (defined(_MSC_VER) && (_MSC_VER<=1310||_MSC_FULL_VER<=140040310)) || defined(__MINGW32__) # define _stprintf swprintf #else # define _stprintf _swprintf diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index 609ba317..d204ccb3 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -221,7 +221,7 @@ int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) { bool INLINE ValidateFields() { int nIdx; - int nLength; + INT_PTR nLength; // In the unlikely event we can't allocate memory, go ahead and return true so we can get out of here. // May cause problems for the install script, but no memory is problems for us. @@ -290,7 +290,7 @@ bool WINAPI SaveSettings(void) { if (!pszItem) return false; *pszBuffer = _T('\0'); - int nNumItems = mySendMessage(hwnd, LB_GETCOUNT, 0, 0); + INT_PTR nNumItems = mySendMessage(hwnd, LB_GETCOUNT, 0, 0); for (int nIdx2 = 0; nIdx2 < nNumItems; nIdx2++) { if (mySendMessage(hwnd, LB_GETSEL, nIdx2, 0) > 0) { if (*pszBuffer) lstrcat(pszBuffer, _T("|")); @@ -308,7 +308,7 @@ bool WINAPI SaveSettings(void) { case FIELD_DIRREQUEST: case FIELD_COMBOBOX: { - int nLength = mySendMessage(pField->hwnd, WM_GETTEXTLENGTH, 0, 0); + int nLength = (int) mySendMessage(pField->hwnd, WM_GETTEXTLENGTH, 0, 0); if (nLength > nBufLen) { FREE(pszBuffer); // add a bit extra so we do this less often @@ -346,7 +346,7 @@ bool WINAPI SaveSettings(void) { // CharNext()'s behavior at terminating null char. But still // definitely, unsafe. default: - lstrcpyn(p2, p1, CharNext(p1) - p1 + 1); + lstrcpyn(p2, p1, (int)(CharNext(p1) - p1) + 1); break; } } @@ -820,7 +820,7 @@ INT_PTR CALLBACK cfgDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara #endif // pFields[nIdx].nParentIdx is used to store original windowproc -int WINAPI StaticLINKWindowProc(HWND hWin, UINT uMsg, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK StaticLINKWindowProc(HWND hWin, UINT uMsg, WPARAM wParam, LPARAM lParam) { int StaticField = FindControlIdx(GetDlgCtrlID(hWin)); if (StaticField < 0) @@ -869,7 +869,7 @@ int WINAPI StaticLINKWindowProc(HWND hWin, UINT uMsg, WPARAM wParam, LPARAM lPar } #endif -int WINAPI NumbersOnlyPasteWndProc(HWND hWin, UINT uMsg, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK NumbersOnlyPasteWndProc(HWND hWin, UINT uMsg, WPARAM wParam, LPARAM lParam) { int nIdx = FindControlIdx(GetDlgCtrlID(hWin)); if (nIdx < 0) @@ -1275,7 +1275,7 @@ int WINAPI createCfgDlg() *pszEnd = _T('\0'); if (*pszStart) { - int nItem = mySendMessage(hwCtrl, LB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)pszStart); + INT_PTR nItem = mySendMessage(hwCtrl, LB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)pszStart); if (nItem != LB_ERR) mySendMessage(hwCtrl, LB_SETSEL, TRUE, nItem); } @@ -1288,7 +1288,7 @@ int WINAPI createCfgDlg() } } else { - int nItem = mySendMessage(hwCtrl, nFindMsg, (WPARAM)-1, (LPARAM)pField->pszState); + INT_PTR nItem = mySendMessage(hwCtrl, nFindMsg, (WPARAM)-1, (LPARAM)pField->pszState); if (nItem != CB_ERR) { // CB_ERR == LB_ERR == -1 mySendMessage(hwCtrl, nSetSelMsg, nItem, 0); } @@ -1300,7 +1300,7 @@ int WINAPI createCfgDlg() case FIELD_ICON: case FIELD_BITMAP: { - WPARAM nImageType = pField->nType == FIELD_BITMAP ? IMAGE_BITMAP : IMAGE_ICON; + UINT nImageType = pField->nType == FIELD_BITMAP ? IMAGE_BITMAP : IMAGE_ICON; LPARAM nImage = 0; if (pField->pszText) { diff --git a/Contrib/LangDLL/LangDLL.c b/Contrib/LangDLL/LangDLL.c index c9d02f0e..17a97397 100644 --- a/Contrib/LangDLL/LangDLL.c +++ b/Contrib/LangDLL/LangDLL.c @@ -14,6 +14,7 @@ #include // nsis plugin +#define NSIS_DECLSPEC_DLLEXPORT __declspec(dllexport) // BUGBUG: Compiler specific HINSTANCE g_hInstance; HWND g_hwndParent; @@ -34,14 +35,15 @@ struct lang { INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - int i, size; + INT_PTR i; + int size; TCHAR *selected_language = NULL; static HFONT font; switch (uMsg) { - case WM_INITDIALOG: + case WM_INITDIALOG: // add languages for (i = visible_langs_num - 1; i >= 0; i--) { - int cbi; + INT_PTR cbi; cbi = SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_ADDSTRING, 0, (LPARAM) langs[i].name); SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_SETITEMDATA, cbi, (LPARAM) langs[i].id); @@ -82,7 +84,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara break; case WM_COMMAND: switch (LOWORD(wParam)) { - case IDOK: + case IDOK: // push result on the stack i = SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_GETCURSEL, 0, 0); i = SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_GETITEMDATA, i, 0); @@ -113,7 +115,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara return TRUE; // message processed } -void __declspec(dllexport) LangDialog(HWND hwndParent, int string_size, +void NSIS_DECLSPEC_DLLEXPORT LangDialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { g_hwndParent=hwndParent; @@ -240,5 +242,5 @@ void __declspec(dllexport) LangDialog(HWND hwndParent, int string_size, BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { g_hInstance=hInst; - return TRUE; + return TRUE; } diff --git a/Contrib/Library/RegTool/RegTool.c b/Contrib/Library/RegTool/RegTool.c index e9676936..d9fd981d 100644 --- a/Contrib/Library/RegTool/RegTool.c +++ b/Contrib/Library/RegTool/RegTool.c @@ -345,7 +345,7 @@ void RenameViaWininit(const TCHAR* prevName, const TCHAR* newName) *pEnd-- = *p--; } - dwRenameLinePos = pszNextSec - pszWinInit + 1; // +1 for the \n + dwRenameLinePos = BUGBUG64TRUNCATE(DWORD, pszNextSec - pszWinInit) + 1; // +1 for the \n } // rename section is last, stick item at end of file else dwRenameLinePos = dwFileSize; diff --git a/Contrib/Makensisw/jnetlib/connection.cpp b/Contrib/Makensisw/jnetlib/connection.cpp index 30f3d06b..0dba5441 100644 --- a/Contrib/Makensisw/jnetlib/connection.cpp +++ b/Contrib/Makensisw/jnetlib/connection.cpp @@ -157,7 +157,7 @@ void JNL_Connection::run(int max_send_bytes, int max_recv_bytes, int *bytes_sent FD_SET(m_socket,&f[2]); struct timeval tv; memset(&tv,0,sizeof(tv)); - if (select(m_socket+1,&f[0],&f[1],&f[2],&tv)==-1) + if (select((int)(m_socket+1),&f[0],&f[1],&f[2],&tv)==-1) { m_errorstr="connecting to host (calling select())"; m_state=STATE_ERROR; diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp index 80703185..04a64674 100644 --- a/Contrib/Makensisw/makensisw.cpp +++ b/Contrib/Makensisw/makensisw.cpp @@ -605,11 +605,13 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam case IDM_EDITSCRIPT: { if (g_sdata.input_script) { - if ((int)ShellExecute(g_sdata.hwnd,_T("open"),g_sdata.input_script,NULL,NULL,SW_SHOWNORMAL)<=32) { + LPCTSTR verb = _T("open"); // BUGBUG: Should not force the open verb? + HINSTANCE hi = ShellExecute(g_sdata.hwnd,verb,g_sdata.input_script,NULL,NULL,SW_SHOWNORMAL); + if ((UINT_PTR)hi <= 32) { TCHAR path[MAX_PATH]; if (GetWindowsDirectory(path,sizeof(path))) { lstrcat(path,_T("\\notepad.exe")); - ShellExecute(g_sdata.hwnd,_T("open"),path,g_sdata.input_script,NULL,SW_SHOWNORMAL); + ShellExecute(g_sdata.hwnd,verb,path,g_sdata.input_script,NULL,SW_SHOWNORMAL); } } } diff --git a/Contrib/Makensisw/toolbar.cpp b/Contrib/Makensisw/toolbar.cpp index d47f2790..d7e65050 100644 --- a/Contrib/Makensisw/toolbar.cpp +++ b/Contrib/Makensisw/toolbar.cpp @@ -75,9 +75,15 @@ void CreateToolBar() SendMessage(g_toolbar.hwnd, TB_ADDBUTTONS, BUTTONCOUNT, (LPARAM) &tbbs); // For Comctl32.dll version detection + #ifndef _WIN64 HMODULE hMod = GetModuleHandle(_T("comctl32.dll")); + const FARPROC hasCC4_70 = GetProcAddress(hMod, "InitCommonControlsEx"); + const FARPROC hasCC4_71 = GetProcAddress(hMod, "DllGetVersion"); + #else + const bool hasCC4_70 = true, hasCC4_71 = true; + #endif - if (GetProcAddress(hMod, "InitCommonControlsEx")) { // Version 4.70 + if (hasCC4_70) { // Version 4.70 // Modern toolbar, 24-bit bitmaps g_toolbar.imagelist = ImageList_LoadImage(g_sdata.hInstance, MAKEINTRESOURCE(IDB_TOOLBAR24), 16, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION); @@ -88,8 +94,7 @@ void CreateToolBar() SendMessage(g_toolbar.hwnd, TB_SETDISABLEDIMAGELIST, 0, (LPARAM) g_toolbar.imagelistd); SendMessage(g_toolbar.hwnd, TB_SETHOTIMAGELIST, 0, (LPARAM) g_toolbar.imagelisth); - // Version 4.71 - if (GetProcAddress(hMod, "DllGetVersion")) { + if (hasCC4_71) { // Version 4.71 SendMessage(g_toolbar.hwnd, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS); } diff --git a/Contrib/NSISdl/connection.cpp b/Contrib/NSISdl/connection.cpp index 7294b996..c7dade81 100644 --- a/Contrib/NSISdl/connection.cpp +++ b/Contrib/NSISdl/connection.cpp @@ -155,7 +155,7 @@ void JNL_Connection::run(int max_send_bytes, int max_recv_bytes, int *bytes_sent FD_SET(m_socket,&f[2]); struct timeval tv; memset(&tv,0,sizeof(tv)); - if (select(m_socket+1,&f[0],&f[1],&f[2],&tv)==-1) + if (select((int)(m_socket+1),&f[0],&f[1],&f[2],&tv)==-1) { m_errorstr="connecting to host (calling select())"; m_state=STATE_ERROR; diff --git a/Contrib/NSISdl/nsisdl.cpp b/Contrib/NSISdl/nsisdl.cpp index 1aa31cf7..b322ecca 100644 --- a/Contrib/NSISdl/nsisdl.cpp +++ b/Contrib/NSISdl/nsisdl.cpp @@ -118,9 +118,7 @@ static LRESULT CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LP NULL ); - long c; - - c = SendMessage(hwndP, PBM_SETBARCOLOR, 0, 0); + LRESULT c = SendMessage(hwndP, PBM_SETBARCOLOR, 0, 0); SendMessage(hwndP, PBM_SETBARCOLOR, 0, c); SendMessage(pb, PBM_SETBARCOLOR, 0, c); @@ -129,7 +127,7 @@ static LRESULT CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LP SendMessage(pb, PBM_SETBKCOLOR, 0, c); // set font - long hFont = SendMessage((HWND) lParam, WM_GETFONT, 0, 0); + LRESULT hFont = SendMessage((HWND) lParam, WM_GETFONT, 0, 0); SendMessage(pb, WM_SETFONT, hFont, 0); SendMessage(s, WM_SETFONT, hFont, 0); diff --git a/Contrib/StartMenu/StartMenu.c b/Contrib/StartMenu/StartMenu.c index 4a3a7e3d..dc1d24e4 100644 --- a/Contrib/StartMenu/StartMenu.c +++ b/Contrib/StartMenu/StartMenu.c @@ -171,7 +171,7 @@ static INT_PTR CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LP void AddRTLStyle(HWND hWnd, long dwStyle) { - long s; + LONG_PTR s; s = GetWindowLongPtr(hWnd, GWL_STYLE); SetWindowLongPtr(hWnd, GWL_STYLE, s | dwStyle); diff --git a/Contrib/System/SConscript b/Contrib/System/SConscript index 3ce52ac9..6839f889 100644 --- a/Contrib/System/SConscript +++ b/Contrib/System/SConscript @@ -33,10 +33,10 @@ if env['TARGET_ARCH'] != 'amd64': elif conf.TryCompile('.end', '.sx'): files += ['Source/Call.sx'] else: - print 'WARNING: unable to find assembler for Call.S' + print 'WARNING: System.dll: unable to find assembler for Call.S' conf.Finish() else: - print 'WARNING: missing Win64 code, dynamic function calls not supported' + print 'WARNING: System.dll: missing Win64 code, dynamic function calls not supported' BuildPlugin( target, diff --git a/Contrib/System/Source/Buffers.c b/Contrib/System/Source/Buffers.c index ab9d3fbc..dfa74685 100644 --- a/Contrib/System/Source/Buffers.c +++ b/Contrib/System/Source/Buffers.c @@ -38,7 +38,7 @@ PLUGINFUNCTIONEND PLUGINFUNCTIONSHORT(Copy) { - int size = 0; + SIZE_T size = 0; HANDLE source, dest; TCHAR *str; // Get the string @@ -47,10 +47,10 @@ PLUGINFUNCTIONSHORT(Copy) // Check for size option if (str[0] == _T('/')) { - size = (SIZE_T) myatoi(str+1); + size = (SIZE_T) StrToIntPtr(str+1); dest = (HANDLE) popintptr(); } - else dest = (HANDLE) myatoi(str); + else dest = (HANDLE) StrToIntPtr(str); source = (HANDLE) popintptr(); // Ok, check the size diff --git a/Contrib/System/Source/System.c b/Contrib/System/Source/System.c index 6068ae67..678b3503 100644 --- a/Contrib/System/Source/System.c +++ b/Contrib/System/Source/System.c @@ -273,9 +273,9 @@ PLUGINFUNCTION(Get) /* TODO: CallProc/Back not implemeted. Fake the behavior of the System plugin for the LoadImage API function so MUI works. -BUGBUG: Leaking DeleteObject and failing GetClientRect +BUGBUG: MUI is leaking DeleteObject and failing GetClientRect */ -static SystemProc* CallProc(SystemProc *proc) +SystemProc* CallProc(SystemProc *proc) { INT_PTR ret, *place; LastError = lstrcmp(proc->ProcName, sizeof(TCHAR) > 1 ? _T("LoadImageW") : _T("LoadImageA")); @@ -294,7 +294,7 @@ static SystemProc* CallProc(SystemProc *proc) if (place) *place = ret; return proc; } -static SystemProc* CallBack(SystemProc *proc) +SystemProc* CallBack(SystemProc *proc) { proc->ProcResult = PR_ERROR; return proc; @@ -741,10 +741,10 @@ SystemProc *PrepareProc(BOOL NeedForCall) // it may contain previous inline input if (!((proc->Params[ParamIndex].Input > -1) && (proc->Params[ParamIndex].Input <= __INST_LAST))) GlobalFree((HANDLE) proc->Params[ParamIndex].Input); - proc->Params[ParamIndex].Input = temp4; + proc->Params[ParamIndex].Input = BUGBUG64(int) temp4; } if (temp3 == 1) - proc->Params[ParamIndex].Output = temp4; + proc->Params[ParamIndex].Output = BUGBUG64(int) temp4; // Next parameter is output or something else #ifdef __GNUC__ #pragma GCC diagnostic push @@ -985,7 +985,7 @@ void ParamsIn(SystemProc *proc) case PAT_CALLBACK: // Generate new or use old callback if (lstrlen(realbuf) > 0) - par->Value = BUGBUG64(int) CreateCallback((SystemProc*) StrToIntPtr(realbuf)); + par->Value = (INT_PTR) CreateCallback((SystemProc*) StrToIntPtr(realbuf)); break; } GlobalFree(realbuf); @@ -1254,7 +1254,7 @@ void CallStruct(SystemProc *proc) SYSTEM_LOG_POST; // Proc virtual return - pointer to memory struct - proc->Params[0].Value = BUGBUG64(int) proc->Proc; + proc->Params[0].Value = (INT_PTR) proc->Proc; } /* diff --git a/Contrib/System/Source/System.h b/Contrib/System/Source/System.h index 9527f7e3..4c9ac27f 100644 --- a/Contrib/System/Source/System.h +++ b/Contrib/System/Source/System.h @@ -3,7 +3,7 @@ // This should probably be moved to platform.h at some point -#if defined(_M_X64) || defined(__amd64__) +#if defined(_M_X64) || defined(_M_AMD64) || defined(__amd64__) # define SYSTEM_X64 #elif defined(_M_IX86) || defined(__i386__) || defined(_X86_) # define SYSTEM_X86 diff --git a/Contrib/UIs/ui.c b/Contrib/UIs/ui.c index aabb4d4e..2ae81c00 100644 --- a/Contrib/UIs/ui.c +++ b/Contrib/UIs/ui.c @@ -86,6 +86,6 @@ int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hOldInst,LPTSTR CmdLineParams,int InitCommonControls(); g_hInstance = hInst; LoadLibrary(_T("RichEd32.dll")); - return DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_INST),0,DialogProc); + return (int) DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_INST),0,DialogProc); } diff --git a/Contrib/UserInfo/UserInfo.c b/Contrib/UserInfo/UserInfo.c index 0129e57c..609344f4 100644 --- a/Contrib/UserInfo/UserInfo.c +++ b/Contrib/UserInfo/UserInfo.c @@ -67,8 +67,12 @@ TCHAR* GetAccountTypeHelper(BOOL CheckTokenForGroupDeny) if (CheckTokenForGroupDeny) // GetUserName is in advapi32.dll so we can avoid Load/Freelibrary _CheckTokenMembership= + #ifndef _WIN64 (CHECKTOKENMEMBERSHIP) GetProcAddress( GetModuleHandle(_T("ADVAPI32")), "CheckTokenMembership"); + #else + _CheckTokenMembership = CheckTokenMembership; + #endif // Use "old school" membership check? if (!CheckTokenForGroupDeny || _CheckTokenMembership == NULL) diff --git a/Contrib/nsDialogs/nsDialogs.c b/Contrib/nsDialogs/nsDialogs.c index 6ce7d1e8..39a70a9b 100644 --- a/Contrib/nsDialogs/nsDialogs.c +++ b/Contrib/nsDialogs/nsDialogs.c @@ -466,7 +466,7 @@ void __declspec(dllexport) GetUserData(HWND hwndParent, int string_size, TCHAR * void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { // we use a timer proc instead of WM_TIMER to make sure no one messes with the ids but us - g_pluginParms->ExecuteCodeSegment(idEvent - 1, 0); + g_pluginParms->ExecuteCodeSegment((int)(idEvent - 1), 0); } void __declspec(dllexport) CreateTimer(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) diff --git a/Contrib/nsExec/nsexec.c b/Contrib/nsExec/nsexec.c index d9a55f05..a2e98059 100644 --- a/Contrib/nsExec/nsexec.c +++ b/Contrib/nsExec/nsexec.c @@ -176,7 +176,7 @@ void ExecScript(int log) { // WinMain will have the address of the WinMain function in memory. // Getting the difference gets you the relative location of the // WinMain function. - pNTHeaders->OptionalHeader.AddressOfEntryPoint = (DWORD_PTR)AsExeWinMain - (DWORD_PTR)g_hInst; + pNTHeaders->OptionalHeader.AddressOfEntryPoint = (DWORD) ((DWORD_PTR)AsExeWinMain - (DWORD_PTR)g_hInst); UnmapViewOfFile(pMapView); } CloseHandle(hMapping); @@ -414,7 +414,7 @@ void LogMessage(const TCHAR *pStr, BOOL bOEM) { #ifndef _UNICODE if (bOEM == TRUE) OemToCharBuff(pStr, (char*)pStr, lstrlen(pStr)); #endif - nItemCount=SendMessage(g_hwndList, LVM_GETITEMCOUNT, 0, 0); + nItemCount=(int) SendMessage(g_hwndList, LVM_GETITEMCOUNT, 0, 0); item.mask=LVIF_TEXT; item.pszText=(TCHAR *)pStr; item.cchTextMax=0; diff --git a/Contrib/zip2exe/main.cpp b/Contrib/zip2exe/main.cpp index c2e6c39c..4a5f72a6 100644 --- a/Contrib/zip2exe/main.cpp +++ b/Contrib/zip2exe/main.cpp @@ -203,7 +203,7 @@ int tempzip_make(HWND hwndDlg, TCHAR *fn) // was zip created on MS-DOS/Windows? if ((info.version & 0xFF00) == 0) { - OemToCharBuffA(filenameA, filenameA, strlen(filenameA)); + OemToCharBuffA(filenameA, filenameA, (DWORD)strlen(filenameA)); } #ifdef _UNICODE diff --git a/Include/Sections.nsh b/Include/Sections.nsh index 5c85a8b3..633c4c72 100644 --- a/Include/Sections.nsh +++ b/Include/Sections.nsh @@ -150,7 +150,7 @@ ; ; For details, see http://nsis.sourceforge.net/wiki/SetSectionInInstType%2C_ClearSectionInInstType ; -; Use the defines below for the WANTED_INSTTYPE paramter. +; Use the defines below for the WANTED_INSTTYPE parameter. !define INSTTYPE_1 1 !define INSTTYPE_2 2 diff --git a/SCons/Config/ms b/SCons/Config/ms index 006a6aee..8072fba9 100644 --- a/SCons/Config/ms +++ b/SCons/Config/ms @@ -145,6 +145,9 @@ if defenv['UNICODE']: plugin_env = defenv.Clone(no_import_lib = 1) +if defenv['TARGET_ARCH'] == 'amd64': + plugin_env.Append(LINKFLAGS = ['/MACHINE:AMD64']) # Contrib\System\Resource will not link without this + if not defenv['DEBUG']: plugin_env.Append(CCFLAGS = ['/O1']) # optimize for size plugin_env.Append(CCFLAGS = ['/W3']) # level 3 warnings @@ -201,7 +204,9 @@ def check_requirement(ctx, func, trigger): return result -def add_file_to_emitter(env, emitter_name, file): +def add_file_to_emitter(env, emitter_name, file, obj_name=None): + if obj_name is None: + obj_name = emitter_name try: original_emitter = env[emitter_name] if type(original_emitter) == list: @@ -216,17 +221,17 @@ def add_file_to_emitter(env, emitter_name, file): if '$NODEFLIBS_FLAG' not in env['LINKFLAGS']: return target, source - return target, source + env.Object(emitter_name, file) + return target, source + env.Object(obj_name, file) env[emitter_name] = emitter -def add_file(file): +def add_file(file, obj_name=None): file = File(file) - add_file_to_emitter(stub_env, 'PROGEMITTER', file) - add_file_to_emitter(stub_uenv, 'PROGEMITTER', file) - add_file_to_emitter(util_env, 'PROGEMITTER', file) - add_file_to_emitter(plugin_env, 'SHLIBEMITTER', file) - add_file_to_emitter(plugin_uenv, 'SHLIBEMITTER', file) + add_file_to_emitter(stub_env, 'PROGEMITTER', file, obj_name) + add_file_to_emitter(stub_uenv, 'PROGEMITTER', file, obj_name) + add_file_to_emitter(util_env, 'PROGEMITTER', file, obj_name) + add_file_to_emitter(plugin_env, 'SHLIBEMITTER', file, obj_name) + add_file_to_emitter(plugin_uenv, 'SHLIBEMITTER', file, obj_name) # # MSVC 6 SP6 doesn't like direct shifting of 64-bit integers. @@ -253,12 +258,21 @@ conf.Finish() # # MSVC 2005 requires the memset CRT function to be present +# and the stubs might need memcpy (entry struct copy on x64) +# BUGBUG: The tests are currently broken on x64 and designed to fail! # conf = defenv.Configure(custom_tests = { 'CheckRequirement' : check_requirement }) +if conf.CheckRequirement('memset', 'char c[128] = "test";switch(sizeof(void*)){case 8:break;case sizeof(void*):return 1;}'): + add_file('memset.c', 'memset') -if conf.CheckRequirement('memset', 'char c[128] = "test";'): - add_file('memset.c') +memcpy_test = """ +switch(sizeof(void*)){case 8:break;case sizeof(void*):return 1;} +""" +if conf.CheckRequirement('memcpy', memcpy_test): + add_file('memcpy.c', 'memcpy') + stub_env.Append(CPPDEFINES = ['_NSIS_NODEFLIB_CRTMEMCPY']) + stub_uenv.Append(CPPDEFINES = ['_NSIS_NODEFLIB_CRTMEMCPY']) conf.Finish() diff --git a/SConstruct b/SConstruct index bc0c7b7b..484a686e 100644 --- a/SConstruct +++ b/SConstruct @@ -1,5 +1,5 @@ EnsureSConsVersion(1,2) - + stubs = [ 'bzip2', 'lzma', @@ -260,7 +260,7 @@ if (not defenv.has_key('VER_PACKED')) and defenv.has_key('VER_MAJOR') and defenv if defenv.has_key('VER_PACKED'): f.write('#define NSIS_PACKEDVERSION _T("%s")\n' % defenv['VER_PACKED']) -if defenv.has_key('VER_MAJOR') and not defenv.has_key('VERSION'): +if defenv.has_key('VER_MAJOR') and defenv.get('VERSION','') == '': defenv['VERSION'] = defenv['VER_MAJOR'] if defenv.has_key('VER_MINOR'): defenv['VERSION'] += '.' + defenv['VER_MINOR'] @@ -694,7 +694,9 @@ for plugin in plugin_libs + plugins: srcpath = 'Contrib/' + plugin build_dir = '$BUILD_PREFIX/' + plugin - pvariants = [{'e':plugin_env.Clone()}] # BUGBUG64: Only build unicode plugins + pvariants = [] + if GetArcCPU(defenv) == 'x86': + pvariants += [{'e':plugin_env.Clone()}] if defenv['UNICODE']: pvariants += [{'e':plugin_uenv.Clone()}] for pvariant in pvariants: diff --git a/Source/7zip/7zip/Compress/LZ/LZInWindow.h b/Source/7zip/7zip/Compress/LZ/LZInWindow.h index 79116107..dbd586a1 100644 --- a/Source/7zip/7zip/Compress/LZ/LZInWindow.h +++ b/Source/7zip/7zip/Compress/LZ/LZInWindow.h @@ -92,9 +92,9 @@ public: _streamPos -= subValue; } - bool NeedMove(UInt32 numCheckBytes) + bool NeedMove(size_t numCheckBytes) { - UInt32 reserv = _pointerToLastSafePosition - (_buffer + _pos); + size_t reserv = _pointerToLastSafePosition - (_buffer + _pos); return (reserv <= numCheckBytes); } }; diff --git a/Source/DialogTemplate.cpp b/Source/DialogTemplate.cpp index cd845dab..8523864d 100644 --- a/Source/DialogTemplate.cpp +++ b/Source/DialogTemplate.cpp @@ -85,7 +85,7 @@ void ReadVarLenArr(LPBYTE &seeker, WINWCHAR* &readInto, unsigned int uCodePage) seeker += sizeof(WORD); // A macro that adds the size of x (which can be a string a number, or nothing) to dwSize -#define AddStringOrIdSize(x) dwSize += x ? (IS_INTRESOURCE(x) ? sizeof(DWORD) : (WinWStrLen(x) + 1) * sizeof(WINWCHAR)) : sizeof(WORD) +#define AddStringOrIdSize(x) dwSize += x ? (IS_INTRESOURCE(x) ? sizeof(DWORD) : (DWORD)((WinWStrLen(x) + 1) * sizeof(WINWCHAR))) : sizeof(WORD) ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -381,7 +381,7 @@ SIZE CDialogTemplate::GetStringSize(WORD id, TCHAR *str) { SelectObject(memDC, font); SIZE size; - GetTextExtentPoint32(memDC, str, _tcslen(str), &size); + GetTextExtentPoint32(memDC, str, (int) _tcslen(str), &size); DestroyWindow(hDlg); DeleteObject(font); diff --git a/Source/Platform.h b/Source/Platform.h index c2d46572..328ffd69 100644 --- a/Source/Platform.h +++ b/Source/Platform.h @@ -130,7 +130,7 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG; #ifdef __cplusplus #include -#if defined(_MSC_VER) && _MSC_VER <= 1200 +#if defined(_MSC_VER) && (_MSC_VER <= 1200 || (defined(_MIN)&&_MSC_FULL_VER<=140040310)) #define STD_MIN std::_MIN #define STD_MAX std::_MAX #else @@ -146,16 +146,27 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG; #endif #ifndef __BIG_ENDIAN__ +# define FIX_ENDIAN_INT64(x) (x) # define FIX_ENDIAN_INT32_INPLACE(x) ((void)(x)) # define FIX_ENDIAN_INT32(x) (x) # define FIX_ENDIAN_INT16_INPLACE(x) ((void)(x)) # define FIX_ENDIAN_INT16(x) (x) #else +# define FIX_ENDIAN_INT64(x) SWAP_ENDIAN_INT64(x) # define FIX_ENDIAN_INT32_INPLACE(x) ((x) = SWAP_ENDIAN_INT32(x)) # define FIX_ENDIAN_INT32(x) SWAP_ENDIAN_INT32(x) # define FIX_ENDIAN_INT16_INPLACE(x) ((x) = SWAP_ENDIAN_INT16(x)) # define FIX_ENDIAN_INT16(x) SWAP_ENDIAN_INT16(x) #endif +#define SWAP_ENDIAN_INT64(x) ( \ + (((x)&0xFF00000000000000) >> 56) | \ + (((x)&0x00FF000000000000) >> 40) | \ + (((x)&0x0000FF0000000000) >> 24) | \ + (((x)&0x000000FF00000000) >> 8) | \ + (((x)&0x00000000FF000000) << 8) | \ + (((x)&0x0000000000FF0000) << 24) | \ + (((x)&0x000000000000FF00) << 40) | \ + (((x)&0x00000000000000FF) << 56) ) #define SWAP_ENDIAN_INT32(x) ( \ (((x)&0xFF000000) >> 24) | \ (((x)&0x00FF0000) >> 8) | \ @@ -993,6 +1004,7 @@ typedef struct tagVS_FIXEDFILEINFO { #define NSIS_CXX_THROWSPEC(ignoredthrowspec) // Ignore c++ exception specifications +#define BUGBUG64TRUNCATE(cast,xpr) ( (cast) (xpr) ) /* _tprintf on Windows/MSVCRT treats %s as TCHAR* and on POSIX %s is always char*! diff --git a/Source/Plugins.cpp b/Source/Plugins.cpp index 07a5767c..e6ce853a 100644 --- a/Source/Plugins.cpp +++ b/Source/Plugins.cpp @@ -129,7 +129,7 @@ void read_file(const tstring& filename, vector& data) rewind(file); data.resize(filesize); size_t cbio = fread(reinterpret_cast(&data[0]), 1, filesize, file); - succ = cbio == (unsigned)filesize; + succ = cbio == (size_t)filesize; } if (!succ) throw NSISException(_T("Couldn't read entire file '") + filename + _T("'")); } diff --git a/Source/ResourceEditor.cpp b/Source/ResourceEditor.cpp index edd591ec..8f4a9b74 100644 --- a/Source/ResourceEditor.cpp +++ b/Source/ResourceEditor.cpp @@ -669,7 +669,7 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) { crd->m_ulWrittenAt = (ULONG_PTR)(seeker); seeker += sizeof(IMAGE_RESOURCE_DIRECTORY); - for (int i = 0; i < crd->CountEntries(); i++) { + for (unsigned int i = 0; i < crd->CountEntries(); i++) { if (crd->GetEntry(i)->HasName()) qStrings.push(crd->GetEntry(i)); if (crd->GetEntry(i)->IsDataDirectory()) @@ -718,7 +718,7 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) { PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_ulWrittenAt)->UName.NameString.NameOffset = ConvertEndianness((DWORD) (seeker - pbRsrcSec)); WINWCHAR* szName = cRDirE->GetName(); - WORD iLen = WinWStrLen(szName) + 1; + WORD iLen = (WORD) WinWStrLen(szName) + 1; *(WORD*)seeker = ConvertEndianness(iLen); CopyMemory(seeker + sizeof(WORD), szName, iLen*sizeof(WINWCHAR)); @@ -751,7 +751,7 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) { // Sets the offsets in directory entries void CResourceEditor::SetOffsets(CResourceDirectory* resDir, ULONG_PTR newResDirAt) { - for (int i = 0; i < resDir->CountEntries(); i++) { + for (unsigned int i = 0; i < resDir->CountEntries(); i++) { PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY rde = PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_ulWrittenAt); if (resDir->GetEntry(i)->IsDataDirectory()) { rde->UOffset.DirectoryOffset.DataIsDirectory = 1; @@ -860,8 +860,8 @@ void CResourceDirectory::RemoveEntry(int i) { m_vEntries.erase(m_vEntries.begin() + i); } -int CResourceDirectory::CountEntries() { - return m_vEntries.size(); +unsigned int CResourceDirectory::CountEntries() { + return BUGBUG64TRUNCATE(unsigned int,m_vEntries.size()); } // Returns the index of a directory entry with the specified name @@ -987,7 +987,7 @@ WINWCHAR* CResourceDirectoryEntry::GetName() { } int CResourceDirectoryEntry::GetNameLength() { - return WinWStrLen(m_szName); + return (int) WinWStrLen(m_szName); } WORD CResourceDirectoryEntry::GetId() { diff --git a/Source/ResourceEditor.h b/Source/ResourceEditor.h index efbb4357..d91f32b0 100644 --- a/Source/ResourceEditor.h +++ b/Source/ResourceEditor.h @@ -212,7 +212,7 @@ public: CResourceDirectoryEntry* GetEntry(unsigned int i); bool AddEntry(CResourceDirectoryEntry* entry); void RemoveEntry(int i); - int CountEntries(); + unsigned int CountEntries(); int Find(const WINWCHAR* szName); int Find(WORD wId); diff --git a/Source/build.cpp b/Source/build.cpp index 80def597..64a69e05 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -131,9 +131,12 @@ CEXEBuild::CEXEBuild() : definedlist.add(_T("NSIS_PACKEDVERSION"), NSIS_PACKEDVERSION); #endif - build_unicode=false; - build_lockedunicodetarget=false; m_target_type=TARGET_X86ANSI; +#ifdef _WIN32 + if (sizeof(void*) > 4) m_target_type = TARGET_AMD64; // BUGBUG: There is no instuction to select it so we force +#endif + build_unicode=TARGET_X86ANSI != m_target_type; + build_lockedunicodetarget=false; // automatically generated header file containing all defines #include @@ -379,7 +382,6 @@ CEXEBuild::CEXEBuild() : set_uninstall_mode(0); set_code_type_predefines(); - set_target_architecture_predefines(); } void CEXEBuild::initialize(const TCHAR *makensis_path) @@ -403,7 +405,7 @@ void CEXEBuild::initialize(const TCHAR *makensis_path) stubs_dir = nsis_dir; stubs_dir += PLATFORM_PATH_SEPARATOR_STR _T("Stubs"); - if (set_compressor(_T("zlib"), false) != PS_OK) + if (set_compressor(_T("zlib"), false) != PS_OK || set_target_architecture_data() != PS_OK) { throw runtime_error("error setting default stub"); } @@ -2303,7 +2305,7 @@ void CEXEBuild::PrepareHeaders(IGrowBuf *hdrbuf) lang_table_writer::write_block(cur_langtables, &sink, cur_header->langtable_size); cur_header->blocks[NB_CTLCOLORS].offset = sizeof(header) + blocks_buf.getlen(); - ctlcolors_writer::write_block(cur_ctlcolors, &sink); + ctlcolors_writer::write_block(cur_ctlcolors, &sink, build_unicode, is_target_64bit()); #ifdef NSIS_SUPPORT_BGBG if (cur_header->bg_color1 != -1) @@ -2357,7 +2359,7 @@ int CEXEBuild::SetManifest() return PS_OK; // Saved directly as binary into the exe. - res_editor->UpdateResource(MAKEINTRESOURCE(24), 1, NSIS_DEFAULT_LANG, (LPBYTE) manifest.c_str(), manifest.length()); + res_editor->UpdateResource(MAKEINTRESOURCE(24), 1, NSIS_DEFAULT_LANG, (LPBYTE) manifest.c_str(), (DWORD)manifest.length()); } catch (exception& err) { ERROR_MSG(_T("Error setting manifest: %") NPRIs _T("\n"), CtoTStrParam(err.what())); @@ -2520,6 +2522,7 @@ int CEXEBuild::pack_exe_header() int CEXEBuild::write_output(void) { + if (sizeof(void*)>4 && lowercase(get_file_name(stub_filename)).c_str()[0]=='z') warning(_T("ZLIB is broken?!\n")); #ifndef NSIS_CONFIG_CRC_SUPPORT build_crcchk=0; #endif @@ -2618,9 +2621,9 @@ int CEXEBuild::write_output(void) #ifdef NSIS_CONFIG_CRC_SUPPORT #ifdef NSIS_CONFIG_CRC_ANAL - crc=CRC32(crc,m_exehead,m_exehead_size); + crc=CRC32(crc,m_exehead,(DWORD)m_exehead_size); #else - crc=CRC32(crc,m_exehead+512,m_exehead_size-512); + crc=CRC32(crc,m_exehead+512,(DWORD)m_exehead_size-512); #endif #endif @@ -2776,8 +2779,8 @@ int CEXEBuild::write_output(void) if (db_opt_save) { - int total_out_size_estimate= - m_exehead_size+sizeof(fh)+build_datablock.getlen()+(build_crcchk?sizeof(crc32_t):0); + int total_out_size_estimate=BUGBUG64TRUNCATE(int, // BUGBUG: This should be UINT64 or at least unsigned + m_exehead_size+sizeof(fh)+build_datablock.getlen()+(build_crcchk?sizeof(crc32_t):0)); int pc=(int)(((INT64)db_opt_save*1000)/(db_opt_save+total_out_size_estimate)); INFO_MSG(_T("Datablock optimizer saved %d bytes (~%d.%d%%).\n"),db_opt_save, pc/10,pc%10); @@ -2787,7 +2790,7 @@ int CEXEBuild::write_output(void) INFO_MSG(_T("\nUsing %") NPRIs _T("%") NPRIs _T(" compression.\n\n"), compressor->GetName(), build_compress_whole?_T(" (compress whole)"):_T("")); #endif - unsigned int total_usize=m_exehead_original_size; + unsigned int total_usize=(unsigned int) m_exehead_original_size; INFO_MSG(_T("EXE header size: %10u / %u bytes\n"),m_exehead_size,m_exehead_original_size); @@ -2912,7 +2915,7 @@ int CEXEBuild::write_output(void) for (;;) { char buf[32768]; - int l=fread(buf,1,sizeof(buf),fp); + unsigned int l=(unsigned int)fread(buf,1,sizeof(buf),fp); if (!l) break; crc=CRC32(crc,(unsigned char *)buf,l); } @@ -2949,7 +2952,7 @@ int CEXEBuild::write_output(void) TCHAR *arg = _tcsstr(cmdstr, _T("%1")); if (arg) // if found, replace %1 by build_output_filename { - const UINT cchbldoutfile = _tcslen(build_output_filename); + const size_t cchbldoutfile = _tcslen(build_output_filename); cmdstrbuf = (TCHAR*) malloc( (_tcslen(cmdstr) + cchbldoutfile + 1)*sizeof(TCHAR) ); if (!cmdstrbuf) { @@ -3000,7 +3003,7 @@ int CEXEBuild::deflateToFile(FILE *fp, char *buf, int len) // len==0 to flush int l=compressor->GetNextOut()-obuf; if (l) { - if (fwrite(obuf,1,l,fp) != (unsigned)l) + if (fwrite(obuf,1,l,fp) != (size_t)l) { ERROR_MSG(_T("Error: deflateToFile fwrite(%d) failed\n"),l); return 1; @@ -3062,7 +3065,7 @@ int CEXEBuild::uninstall_generate() if (ent->which == EW_WRITEUNINSTALLER) { ent->offsets[1] = uninstdata_offset; - ent->offsets[2] = m_unicon_size; + ent->offsets[2] = (int) m_unicon_size; uns--; if (!uns) break; @@ -3099,9 +3102,9 @@ int CEXEBuild::uninstall_generate() delete [] unicon_data; #ifdef NSIS_CONFIG_CRC_ANAL - crc=CRC32(crc, uninst_header, m_exehead_size); + crc=CRC32(crc, uninst_header, (DWORD)m_exehead_size); #else - crc=CRC32(crc, uninst_header + 512, m_exehead_size - 512); + crc=CRC32(crc, uninst_header + 512, (DWORD)m_exehead_size - 512); #endif free(uninst_header); @@ -3242,7 +3245,7 @@ int CEXEBuild::uninstall_generate() udata.clear(); //uninstall_size_full=fh.length_of_all_following_data + sizeof(int) + unicondata_size - 32 + sizeof(int); - uninstall_size_full=fh.length_of_all_following_data+m_unicon_size; + uninstall_size_full=fh.length_of_all_following_data+(int)m_unicon_size; // compressed size uninstall_size=build_datablock.getlen()-uninstdata_offset; @@ -3409,7 +3412,7 @@ void CEXEBuild::notify(MakensisAPI::notify_e code, const TCHAR *data) const #ifdef _WIN32 if (notify_hwnd) { - COPYDATASTRUCT cds = {(DWORD)code, (_tcslen(data)+1)*sizeof(TCHAR), (void *) data}; + COPYDATASTRUCT cds = {(DWORD)code, (UINT32)(_tcslen(data)+1)*sizeof(TCHAR), (void *) data}; SendMessage(notify_hwnd, WM_COPYDATA, 0, (LPARAM)&cds); } #endif @@ -3529,7 +3532,7 @@ void CEXEBuild::init_res_editor() { build_compressor_set = true; if (!res_editor) - res_editor = new CResourceEditor(m_exehead, m_exehead_size); + res_editor = new CResourceEditor(m_exehead, (DWORD)m_exehead_size); } void CEXEBuild::close_res_editor() @@ -3569,7 +3572,7 @@ int CEXEBuild::DeclaredUserVar(const TCHAR *szVarName) return PS_ERROR; } const TCHAR *pVarName = szVarName; - int iVarLen = _tcslen(szVarName); + size_t iVarLen = _tcslen(szVarName); if (iVarLen > 60) { @@ -3638,8 +3641,10 @@ void CEXEBuild::VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList) } } -void CEXEBuild::set_target_architecture_predefines() +int CEXEBuild::set_target_architecture_data() { + build_strlist.setunicode(build_unicode), ubuild_strlist.setunicode(build_unicode); + definedlist.del(_T("NSIS_UNICODE")); definedlist.del(_T("NSIS_CHAR_SIZE")); definedlist.del(_T("NSIS_PTR_SIZE")); @@ -3652,23 +3657,27 @@ void CEXEBuild::set_target_architecture_predefines() { definedlist.add(_T("NSIS_CHAR_SIZE"), _T("1")); } - definedlist.add(_T("NSIS_PTR_SIZE"), m_target_type <= TARGET_X86UNICODE ? _T("4") : _T("8")); + definedlist.add(_T("NSIS_PTR_SIZE"), is_target_64bit() ? _T("8") : _T("4")); + + return PS_OK; } -int CEXEBuild::change_target_architecture() +int CEXEBuild::change_target_architecture(TARGETTYPE tt) { - if (build_compressor_set) + const bool wide = TARGET_X86ANSI != tt; + if (build_compressor_set || (build_unicode != wide && build_lockedunicodetarget)) { ERROR_MSG(_T("Error: Can't change target architecture after data already got compressed!\n")); return PS_ERROR; } - m_target_type = build_unicode ? TARGET_X86UNICODE : TARGET_X86ANSI; // BUGBUG64 - set_target_architecture_predefines(); + m_target_type = tt; + build_unicode = wide; - int ec = load_stub(); + int ec = set_target_architecture_data(); + if (PS_OK == ec) ec = load_stub(); #ifdef NSIS_CONFIG_PLUGIN_SUPPORT - if (PS_OK==ec) ec = initialize_default_plugins(true); + if (PS_OK == ec) ec = initialize_default_plugins(true); #endif return ec; } @@ -3677,10 +3686,9 @@ int CEXEBuild::change_target_architecture() int CEXEBuild::set_target_charset(bool unicode) { if (build_lockedunicodetarget) return PS_ERROR; - build_unicode = unicode; - build_strlist.setunicode(unicode); - ubuild_strlist.setunicode(unicode); - return change_target_architecture(); + TARGETTYPE tt = unicode ? m_target_type : TARGET_X86ANSI; + if (TARGET_X86ANSI == tt && unicode) tt = TARGET_X86UNICODE; + return change_target_architecture(tt); } #endif diff --git a/Source/build.h b/Source/build.h index 677bf588..c13c3d5f 100644 --- a/Source/build.h +++ b/Source/build.h @@ -128,6 +128,7 @@ class CEXEBuild { TARGETTYPE get_target_type(const TCHAR*s) const; const TCHAR* get_target_suffix(CEXEBuild::TARGETTYPE tt) const; const TCHAR* get_target_suffix() const {return get_target_suffix(m_target_type);} + bool is_target_64bit() const { return TARGET_AMD64 == m_target_type; } void set_default_output_filename(const tstring& filename); @@ -239,8 +240,8 @@ class CEXEBuild { DefineList *searchParseString(const TCHAR *source_string, LineParser&line, int parmOffs, bool ignCase, bool noErrors, UINT*failParam = 0); // build.cpp functions used mostly by script.cpp - void set_target_architecture_predefines(); - int change_target_architecture(); + int set_target_architecture_data(); + int change_target_architecture(TARGETTYPE tt); void set_code_type_predefines(const TCHAR *value = NULL); int getcurdbsize(); int add_section(const TCHAR *secname, const TCHAR *defname, int expand=0); @@ -257,6 +258,7 @@ class CEXEBuild { int add_entry_direct(int which, int o0=0, int o1=0, int o2=0, int o3=0, int o4=0, int o5=0); int add_db_data(IMMap *map); // returns offset int add_db_data(const char *data, int length); // returns offset + int add_db_data(const char *data, size_t length) { assert(length <= 0x7FFFFFFF); return add_db_data(data, (int)length); } int add_data(const char *data, int length, IGrowBuf *dblock); // returns offset int add_string(const TCHAR *string, int process=1, UINT codepage=-2); // returns offset (in string table) int add_asciistring(const TCHAR *string, int process=1); // For hardcoded 7bit/ASCII strings diff --git a/Source/bzip2/compress.c b/Source/bzip2/compress.c index 0b2b5013..6037353c 100644 --- a/Source/bzip2/compress.c +++ b/Source/bzip2/compress.c @@ -260,7 +260,7 @@ void generateMTFValues ( EState* s ) *ryy_j = rtmp2; }; yy[0] = rtmp; - j = ryy_j - &(yy[0]); + j = BUGBUG64TRUNCATE(Int32, ryy_j - &(yy[0])); mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; } diff --git a/Source/exehead/Main.c b/Source/exehead/Main.c index b60dc7ef..66c1fa9e 100644 --- a/Source/exehead/Main.c +++ b/Source/exehead/Main.c @@ -320,9 +320,13 @@ end: BOOL (WINAPI *OPT)(HANDLE, DWORD,PHANDLE); BOOL (WINAPI *LPV)(LPCTSTR,LPCTSTR,PLUID); BOOL (WINAPI *ATP)(HANDLE,BOOL,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD); + #ifndef _WIN64 OPT=myGetProcAddress(MGA_OpenProcessToken); LPV=myGetProcAddress(MGA_LookupPrivilegeValue); ATP=myGetProcAddress(MGA_AdjustTokenPrivileges); + #else + OPT=OpenProcessToken, LPV=LookupPrivilegeValue, ATP=AdjustTokenPrivileges; + #endif if (OPT && LPV && ATP) { HANDLE hToken; @@ -368,4 +372,7 @@ void NSISCALL CleanUp() // Clean up after plug-ins myDelete(state_plugins_dir, DEL_DIR | DEL_RECURSE | DEL_REBOOT); #endif // NSIS_CONFIG_PLUGIN_SUPPORT +#ifdef _DEBUG + // GlobalFree(g_header); ? +#endif } diff --git a/Source/exehead/Ui.c b/Source/exehead/Ui.c index c5b08508..18c7191d 100644 --- a/Source/exehead/Ui.c +++ b/Source/exehead/Ui.c @@ -236,7 +236,11 @@ FORCE_INLINE int NSISCALL ui_doinstall(void) LANGID (WINAPI *GUDUIL)(); + #ifndef _WIN64 GUDUIL = myGetProcAddress(MGA_GetUserDefaultUILanguage); + #else + GUDUIL = GetUserDefaultUILanguage; + #endif if (GUDUIL) { // Windows ME/2000+ @@ -407,7 +411,7 @@ FORCE_INLINE int NSISCALL ui_doinstall(void) #endif { - int ret=DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_INST+dlg_offset),0,DialogProc); + int ret=(int) DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_INST+dlg_offset),0,DialogProc); #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) ExecuteCallbackFunction(CB_ONGUIEND); #endif @@ -483,7 +487,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara #endif }; - m_delta = wParam; + m_delta = (int) wParam; if (uMsg == WM_INITDIALOG) { @@ -538,7 +542,6 @@ nextPage: else { HWND hwndtmp; - int pflags = this_page->flags; GetNSISString(state_click_next, this_page->clicknext); @@ -730,7 +733,7 @@ DWORD CALLBACK StreamLicenseRTF(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG { size_t len = lstrlen(((LPWSTR) dwCookie)+g_cbLicRead); len = min(len, cb/sizeof(WCHAR)); - *pcb=WideCharToMultiByte(CP_ACP,0,((LPWSTR) dwCookie)+g_cbLicRead,len,(char*)pbBuff,cb,NULL,NULL); + *pcb=WideCharToMultiByte(CP_ACP,0,((LPWSTR) dwCookie)+g_cbLicRead,(int)len,(char*)pbBuff,cb,NULL,NULL); // RTF uses only ASCII characters, so we can assume "number of output bytes" = "number of source WChar consumed" g_cbLicRead+=*pcb; return 0; @@ -779,7 +782,7 @@ static INT_PTR CALLBACK LicenseProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPAR } if (uMsg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && !LicIgnoreWMCommand) { if (m_this_page->flags & PF_LICENSE_FORCE_SELECTION) { - int is = SendMessage(GetUIItem(IDC_LICENSEAGREE), BM_GETCHECK, 0, 0) & BST_CHECKED; + int is = (int) (SendMessage(GetUIItem(IDC_LICENSEAGREE), BM_GETCHECK, 0, 0) & BST_CHECKED); m_this_page->flags &= ~PF_LICENSE_SELECTED; m_this_page->flags |= is; EnableNext(is); @@ -1052,7 +1055,11 @@ static INT_PTR CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l // Test for and use the GetDiskFreeSpaceEx API { BOOL (WINAPI *GDFSE)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER) = +#ifdef _WIN64 + GetDiskFreeSpaceEx; +#else myGetProcAddress(MGA_GetDiskFreeSpaceEx); +#endif if (GDFSE) { ULARGE_INTEGER available64; @@ -1086,7 +1093,7 @@ static INT_PTR CALLBACK DirProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l } } - if (!available_set) + if (!available_set) // TODO: Can GetDiskFreeSpace succeed when ..Ex failed on x64? { DWORD spc, bps, fc, tc; TCHAR *root; @@ -1252,7 +1259,7 @@ void NSISCALL ExecuteCallbackFunctionWithr0Int(int num,int r0) static WNDPROC oldTreeWndProc; static LPARAM last_selected_tree_item; -static DWORD WINAPI newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +static LRESULT CALLBACK newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_CHAR && wParam == VK_SPACE) { NotifyCurWnd(WM_TREEVIEW_KEYHACK); @@ -1271,7 +1278,7 @@ static DWORD WINAPI newTreeWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l if (last_selected_tree_item != lParam) { last_selected_tree_item = lParam; - ExecuteCallbackFunctionWithr0Int(CB_ONMOUSEOVERSECTION,lParam); + ExecuteCallbackFunctionWithr0Int(CB_ONMOUSEOVERSECTION,(int)lParam); } } #endif//NSIS_SUPPORT_CODECALLBACKS && NSIS_CONFIG_ENHANCEDUI_SUPPORT @@ -1320,7 +1327,7 @@ static INT_PTR CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l { if (install_types[i]) { - int j; + LRESULT j; if (i != NSIS_MAX_INST_TYPES) noCombo = 0; j=SendMessage(hwndCombo1,CB_ADDSTRING,0,(LPARAM)GetNSISStringTT(install_types[i])); SendMessage(hwndCombo1,CB_SETITEMDATA,j,i); @@ -1453,10 +1460,10 @@ static INT_PTR CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l if (uMsg == WM_COMMAND && LOWORD(wParam) == IDC_COMBO1 && HIWORD(wParam) == CBN_SELCHANGE) { - int t = SendMessage(hwndCombo1,CB_GETCURSEL,0,0); + LRESULT t = SendMessage(hwndCombo1,CB_GETCURSEL,0,0); if (t != CB_ERR) { - int whichcfg = SendMessage(hwndCombo1, CB_GETITEMDATA, t, 0); + int whichcfg = (int) SendMessage(hwndCombo1, CB_GETITEMDATA, t, 0); if (whichcfg == CB_ERR || !install_types[whichcfg]) whichcfg = NSIS_MAX_INST_TYPES; @@ -1492,7 +1499,7 @@ static INT_PTR CALLBACK SelProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_COMPONENTPAGE) if (wParam != 0) { - int secid = wParam; + int secid = (int) wParam; if (wParamSelChangeNotifyInstTypeChanged != secid) --secid; ExecuteCallbackFunctionWithr0Int(CB_ONSELCHANGE,secid); } @@ -1744,7 +1751,7 @@ static INT_PTR CALLBACK InstProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM i = count; while (i--) // Add 2 for the CR/LF combination that must follow every line. - total += 2+SendMessage(linsthwnd,LVM_GETITEMTEXT,i,(LPARAM)&item); + total += 2+(int)SendMessage(linsthwnd,LVM_GETITEMTEXT,i,(LPARAM)&item); // 2nd pass - store detail view strings on the clipboard // Clipboard MSDN docs say mem must be GMEM_MOVEABLE diff --git a/Source/exehead/exec.c b/Source/exehead/exec.c index b30e208c..6662bf8d 100644 --- a/Source/exehead/exec.c +++ b/Source/exehead/exec.c @@ -172,8 +172,11 @@ static LONG NSISCALL myRegDeleteKeyEx(HKEY thiskey, LPCTSTR lpSubKey, int onlyif { typedef LONG (WINAPI * RegDeleteKeyExPtr)(HKEY, LPCTSTR, REGSAM, DWORD); RegDeleteKeyExPtr RDKE = (RegDeleteKeyExPtr) + #ifdef _WIN64 + RegDeleteKeyEx; + #else myGetProcAddress(MGA_RegDeleteKeyEx); - + #endif if (RDKE) retval=RDKE(thiskey,lpSubKey,AlterRegistrySAM(0),0); else @@ -771,7 +774,7 @@ static int NSISCALL ExecuteEntry(entry *entry_) HWND hwnd=GetHwndFromParm(1); int msg=GetIntFromParm(2); - if (parm5>>2) exec_error += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(LPDWORD)&v); + if (parm5>>2) exec_error += !SendMessageTimeout(hwnd,msg,b3,b4,SMTO_NORMAL,parm5>>2,(PDWORD_PTR)&v); // Jim Park: This sends script messages. Some messages require // settings for Unicode. This means the user's script may need // to change for Unicode NSIS. diff --git a/Source/exehead/fileform.c b/Source/exehead/fileform.c index ba655f67..ca86ce58 100644 --- a/Source/exehead/fileform.c +++ b/Source/exehead/fileform.c @@ -398,14 +398,14 @@ int NSISCALL _dodecomp(int offset, HANDLE hFileOut, unsigned char *outbuf, int o if (err<0) return -4; - u=(char*)g_inflate_stream.next_out - outbuffer; + u=BUGBUG64TRUNCATE(int, (char*)g_inflate_stream.next_out - outbuffer); - tc = GetTickCount(); + tc=GetTickCount(); if (g_exec_flags.status_update & 1 && (tc - ltc > 200 || !input_len)) { wsprintf(progress, _T("... %d%%"), MulDiv(input_len_total - input_len, 100, input_len_total)); update_status_text(0, progress); - ltc = tc; + ltc=tc; } // if there's no output, more input is needed diff --git a/Source/exehead/fileform.h b/Source/exehead/fileform.h index 97e145a9..9b15e468 100644 --- a/Source/exehead/fileform.h +++ b/Source/exehead/fileform.h @@ -473,13 +473,31 @@ typedef struct { COLORREF text; COLORREF bkc; UINT lbStyle; +#ifndef MAKENSIS HBRUSH bkb; -#ifdef _WIN64 -#error Should we swap lbStyle and bkb to get better alignment? If we are going to do it, now is our only chance before plugins in the wild start depending on the ctlcolors layout on x64 +#else + INT32 bkb; #endif int bkmode; int flags; -} ctlcolors; +} ctlcolors32; +typedef struct { + COLORREF text; + COLORREF bkc; +#ifndef MAKENSIS + HBRUSH bkb; // NOTE: Placed above lbStyle for better alignment +#else + INT64 bkb; +#endif + UINT lbStyle; + int bkmode; + int flags; +} ctlcolors64; +#if defined(_WIN64) && !defined(MAKENSIS) +# define ctlcolors ctlcolors64 +#else +# define ctlcolors ctlcolors32 +#endif #pragma pack(pop) // constants for myDelete (util.c) diff --git a/Source/exehead/util.c b/Source/exehead/util.c index a56a0f0d..84da5da4 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -404,16 +404,14 @@ char * NSISCALL mystrstriA(char *a, const char *b) } +#ifndef _NSIS_NODEFLIB_CRTMEMCPY // mini_memcpy takes the number of bytes to copy. -void NSISCALL mini_memcpy(void *out, const void *in, int len) +void NSISCALL mini_memcpy(void *out, const void *in, UINT_PTR cb) { - char *c_out=(char*)out; - char *c_in=(char *)in; - while (len-- > 0) - { - *c_out++=*c_in++; - } + char *dst = (char*) out, *src = (char*) in; + while (cb-- > 0) *dst++ = *src++; } +#endif DWORD NSISCALL remove_ro_attr(LPCTSTR file) { @@ -538,7 +536,7 @@ void RenameViaWininit(const TCHAR* prevName, const TCHAR* newName) *pEnd-- = *p--; } - dwRenameLinePos = pszNextSec - pszWinInit + 1; // +1 for the \n + dwRenameLinePos = BUGBUG64TRUNCATE(DWORD, pszNextSec - pszWinInit) + 1; // +1 for the \n } // rename section is last, stick item at end of file else dwRenameLinePos = dwFileSize; @@ -570,13 +568,17 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew) BOOL fOk = 0; typedef BOOL (WINAPI *mfea_t)(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,DWORD dwFlags); mfea_t mfea; + #ifdef _WIN64 + mfea=MoveFileEx; + #else mfea=(mfea_t) myGetProcAddress(MGA_MoveFileEx); if (mfea) + #endif { fOk=mfea(pszExisting, pszNew, MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING); } - if (!fOk) + if (!fOk && sizeof(void*) <= 4) { RenameViaWininit(pszExisting, pszNew); } @@ -691,7 +693,7 @@ TCHAR * NSISCALL GetNSISString(TCHAR *outbuf, int strtab) // indexes into the language TCHAR *in = (TCHAR*)GetNSISStringNP(GetNSISTab(strtab)); TCHAR *out = ps_tmpbuf; - + // Still working within ps_tmpbuf, so set out to the // current position that is passed in. if (outbuf >= ps_tmpbuf && @@ -1035,6 +1037,7 @@ struct MGA_FUNC #ifdef _UNICODE struct MGA_FUNC MGA_FUNCS[] = { +#ifndef _WIN64 {"KERNEL32", "GetDiskFreeSpaceExW"}, {"KERNEL32", "MoveFileExW"}, {"ADVAPI32", "RegDeleteKeyExW"}, @@ -1042,6 +1045,7 @@ struct MGA_FUNC MGA_FUNCS[] = { {"ADVAPI32", "LookupPrivilegeValueW"}, {"ADVAPI32", "AdjustTokenPrivileges"}, {"KERNEL32", "GetUserDefaultUILanguage"}, +#endif {"SHLWAPI", "SHAutoComplete"}, {"SHFOLDER", "SHGetFolderPathW"} }; diff --git a/Source/exehead/util.h b/Source/exehead/util.h index dd3b3ad6..a7773b4e 100644 --- a/Source/exehead/util.h +++ b/Source/exehead/util.h @@ -108,11 +108,16 @@ void NSISCALL validate_filename(TCHAR *fn); * @param pszNew The new name of the file. */ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew); - -void NSISCALL mini_memcpy(void *out, const void *in, int len); DWORD NSISCALL remove_ro_attr(LPCTSTR file); +#ifdef _NSIS_NODEFLIB_CRTMEMCPY +#define mini_memcpy memcpy +#else +void NSISCALL mini_memcpy(void *out, const void *in, UINT_PTR cb); +#endif + enum myGetProcAddressFunctions { +#ifndef _WIN64 MGA_GetDiskFreeSpaceEx, MGA_MoveFileEx, MGA_RegDeleteKeyEx, @@ -120,8 +125,9 @@ enum myGetProcAddressFunctions { MGA_LookupPrivilegeValue, MGA_AdjustTokenPrivileges, MGA_GetUserDefaultUILanguage, - MGA_SHAutoComplete, - MGA_SHGetFolderPath, +#endif + MGA_SHAutoComplete, // x64 can link to shlwapi directly but as long as MGA_SHGetFolderPath is used we can stick with myGetProcAddress + MGA_SHGetFolderPath, // TODO: This can probably call something else directly on x64 }; void * NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func); diff --git a/Source/fileform.cpp b/Source/fileform.cpp index 170ce51a..e994666e 100644 --- a/Source/fileform.cpp +++ b/Source/fileform.cpp @@ -146,14 +146,25 @@ void page_writer::write(const page *data) m_sink->write_int_array(data->parms, 5); } -void ctlcolors_writer::write(const ctlcolors *data) +void ctlcolors_writer::writeplatformitem(const void *data, bool wide, bool x64) { - m_sink->write_int(data->text); - m_sink->write_int(data->bkc); - m_sink->write_int(data->lbStyle); - m_sink->write_int((INT_PTR) data->bkb); - m_sink->write_int(data->bkmode); - m_sink->write_int(data->flags); + assert(sizeof(int) == 4 && sizeof(ctlcolors64) > sizeof(ctlcolors32)); + ctlcolors *p = (ctlcolors*) data; + m_sink->write_int(p->text); + m_sink->write_int(p->bkc); + if (x64) + { + assert(!p->bkb); + m_sink->write_int64(p->bkb); + m_sink->write_int(p->lbStyle); + } + else + { + m_sink->write_int(p->lbStyle); + m_sink->write_int(p->bkb); + } + m_sink->write_int(p->bkmode); + m_sink->write_int(p->flags); } void LOGFONT_writer::write(const LOGFONT *data) diff --git a/Source/fileform.h b/Source/fileform.h index bc1f412e..2ea6def6 100644 --- a/Source/fileform.h +++ b/Source/fileform.h @@ -40,13 +40,26 @@ } \ } +#define DECLARE_PLATFORMITEMWRITER(x) class x##_writer : public writer \ + { public: \ + x##_writer(writer_sink *sink) : writer(sink) {} \ + void writeplatformitem(const void *data, bool wide, bool x64); \ + static void write_block(IGrowBuf *pGB, writer_sink *pS, bool wide, bool x64) \ + { \ + x##_writer writer(pS); \ + for (size_t l = pGB->getlen() / sizeof(x), i = 0; i < l; i++) \ + writer.writeplatformitem(&(((x*)pGB->get())[i]), wide, x64); \ + } \ + } + + DECLARE_WRITER(firstheader); DECLARE_WRITER(block_header); DECLARE_WRITER(header); DECLARE_WRITER(section); DECLARE_WRITER(entry); DECLARE_WRITER(page); -DECLARE_WRITER(ctlcolors); +DECLARE_PLATFORMITEMWRITER(ctlcolors); DECLARE_WRITER(LOGFONT); class lang_table_writer : public writer diff --git a/Source/icon.cpp b/Source/icon.cpp index f36a053e..48522457 100644 --- a/Source/icon.cpp +++ b/Source/icon.cpp @@ -213,7 +213,7 @@ static IconPairs get_icon_order(IconGroup icon1, IconGroup icon2) FIX_ENDIAN_INT32(sorted_icons1[i].meta.dwRawSize), FIX_ENDIAN_INT32(sorted_icons2[i].meta.dwRawSize) ); - pair.size_index = i; + pair.size_index = BUGBUG64TRUNCATE(unsigned int,i); result.push_back(pair); } @@ -227,7 +227,7 @@ static IconPairs get_icon_order(IconGroup icon1, IconGroup icon2) pair.index1 = sorted_icons1[i].index; pair.index2 = 0xffff; pair.size = FIX_ENDIAN_INT32(sorted_icons1[i].meta.dwRawSize); - pair.size_index = i; + pair.size_index = BUGBUG64TRUNCATE(unsigned int,i); } if (i < sorted_icons2.size()) @@ -235,7 +235,7 @@ static IconPairs get_icon_order(IconGroup icon1, IconGroup icon2) pair.index2 = sorted_icons2[i].index; pair.index1 = 0xffff; pair.size = FIX_ENDIAN_INT32(sorted_icons2[i].meta.dwRawSize); - pair.size_index = i; + pair.size_index = BUGBUG64TRUNCATE(unsigned int,i); } result.push_back(pair); @@ -256,7 +256,7 @@ static LPBYTE generate_icon_group(IconGroup icon, IconPairs order, bool first) header->wReserved = 0; header->wIsIcon = FIX_ENDIAN_INT16(1); - header->wCount = FIX_ENDIAN_INT16(icon.size()); + header->wCount = FIX_ENDIAN_INT16((WORD)icon.size()); order = sort_pairs(order, first); @@ -285,7 +285,7 @@ void set_icon(CResourceEditor* re, WORD wIconId, IconGroup icon1, IconGroup icon size_t group_size = sizeof(IconGroupHeader) // header + order.size() * SIZEOF_RSRC_ICON_GROUP_ENTRY; // entries - re->UpdateResource(RT_GROUP_ICON, wIconId, NSIS_DEFAULT_LANG, group1, group_size); + re->UpdateResource(RT_GROUP_ICON, wIconId, NSIS_DEFAULT_LANG, group1, (DWORD)group_size); destroy_icon_group(group1); // delete old icons @@ -343,7 +343,7 @@ unsigned char* generate_uninstall_icon_data(IconGroup icon1, IconGroup icon2, si LPBYTE seeker = uninst_data; // fill group header - *(LPDWORD) seeker = FIX_ENDIAN_INT32(group_size); + *(LPDWORD) seeker = FIX_ENDIAN_INT32((UINT32)group_size); seeker += sizeof(DWORD); *(LPDWORD) seeker = 0; seeker += sizeof(DWORD); @@ -382,7 +382,7 @@ int generate_unicons_offsets(LPBYTE exeHeader, size_t exeHeaderSize, LPBYTE unin DWORD offset; DWORD size; - CResourceEditor re(exeHeader, exeHeaderSize, false); + CResourceEditor re(exeHeader, (DWORD)exeHeaderSize, false); LPBYTE seeker = uninstIconData; diff --git a/Source/lang.cpp b/Source/lang.cpp index c28d7fc1..6434fe3e 100644 --- a/Source/lang.cpp +++ b/Source/lang.cpp @@ -285,7 +285,7 @@ int StringsArray::set(int idx, const TCHAR *str) int old = ((int*) m_offsets.get())[idx]; // Need to store the TCHAR index so we divide the return value of add by sizeof(TCHAR). - ((int*)m_offsets.get())[idx] = m_strings.add(str, (_tcslen(str)+1)*sizeof(TCHAR))/sizeof(TCHAR); + ((int*)m_offsets.get())[idx] = m_strings.add(str, (DWORD)(_tcslen(str)+1)*sizeof(TCHAR))/sizeof(TCHAR); return old; } @@ -1014,7 +1014,7 @@ l_readerr: // set ^Language nlf->m_szStrings[NLF_LANGUAGE] = _tcsdup(nlf->m_szName); - int temp; + size_t temp; // Get font if (!GetNextNLFLine(lr, buf, NSIS_MAX_STRLEN, errlr)) goto l_readerr; diff --git a/Source/script.cpp b/Source/script.cpp index 2ffb4e76..b18f31dc 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -343,7 +343,7 @@ int CEXEBuild::doParse(const TCHAR *str) } // add new line to line buffer - const size_t cchstr = _tcslen(str); + const unsigned int cchstr = (unsigned int) _tcslen(str); m_linebuild.add(str,(cchstr+1)*sizeof(TCHAR)); // keep waiting for more lines if this line ends with a backslash @@ -651,7 +651,7 @@ void CEXEBuild::ps_addtoline(const TCHAR *str, GrowBuf &linedata, StringList &hi if (t-in > 1) // handle multibyte chars (no escape) { - linedata.add((void*)in,(t-in)*sizeof(TCHAR)); + linedata.add((void*)in,BUGBUG64TRUNCATE(int,(t-in)*sizeof(TCHAR))); in=t; continue; } @@ -1134,7 +1134,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) ERROR_MSG(_T("!macro: macro named \"%") NPRIs _T("\" already found!\n"),macroname); return PS_ERROR; } - m_macros.add(macroname,(_tcslen(macroname)+1)*sizeof(TCHAR)); + m_macros.add(macroname,(int)(_tcslen(macroname)+1)*sizeof(TCHAR)); int pc; for (pc=2; pc < line.getnumtokens(); pc ++) @@ -1154,7 +1154,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return PS_ERROR; } } - m_macros.add(line.gettoken_str(pc),(_tcslen(line.gettoken_str(pc))+1)*sizeof(TCHAR)); + m_macros.add(line.gettoken_str(pc),(int)(_tcslen(line.gettoken_str(pc))+1)*sizeof(TCHAR)); } m_macros.add(_T(""),sizeof(_T(""))); @@ -1198,7 +1198,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return PS_ERROR; } } - if (str[0]) m_macros.add(str,(_tcslen(str)+1)*sizeof(TCHAR)); + if (str[0]) m_macros.add(str,(int)(_tcslen(str)+1)*sizeof(TCHAR)); else m_macros.add(_T(" "),sizeof(_T(" "))); linecnt++; } @@ -1220,9 +1220,9 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) return PS_ERROR; } TCHAR *mbufb=(TCHAR*)m_macros.get(); - const unsigned int mcb=(mend-mbeg)*sizeof(TCHAR), mbufcb=m_macros.getlen(); + const unsigned int mcb=BUGBUG64TRUNCATE(unsigned int, (mend-mbeg)*sizeof(TCHAR)), mbufcb=m_macros.getlen(); memmove(mbeg,mend+sizeof(TCHAR),mbufcb-(mcb+(mbeg-mbufb))); - m_macros.resize(mbufcb-(mcb+sizeof(TCHAR))); + m_macros.resize((int)(mbufcb-(mcb+sizeof(TCHAR)))); SCRIPT_MSG(_T("!macroundef: %") NPRIs _T("\n"),mname); } return PS_OK; @@ -1251,7 +1251,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) l_define_saves.add(t,v); definedlist.del(t); } - l_define_names.add(t,(_tcslen(t)+1)*sizeof(TCHAR)); + l_define_names.add(t,(int)(_tcslen(t)+1)*sizeof(TCHAR)); definedlist.add(t,line.gettoken_str(npr+2)); npr++; @@ -3132,9 +3132,9 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) } else if (!_tcscmp(mathop,_T("<<")) || !_tcscmp(mathop,_T("<<<")) ) { _stprintf(value,_T("%d"),value1<>"))) { - _stprintf(value,_T("%d"),(signed)value1>>(signed)value2); - } else if (!_tcscmp(mathop,_T(">>>"))) { - _stprintf(value,_T("%d"),(unsigned)value1>>(unsigned)value2); + _stprintf(value,_T("%d"),(signed int)value1>>(signed int)value2); + } else if (!_tcscmp(mathop,_T(">>>"))) { + _stprintf(value,_T("%d"),(unsigned int)value1>>(unsigned int)value2); } else if (!_tcscmp(mathop,_T("/"))) { if (value2==0) { ERROR_MSG(_T("!define /math: division by zero! (\"%i / %i\")\n"),value1,value2); @@ -3155,7 +3155,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) value=line.gettoken_str(2); } - if (dupemode==2)definedlist.del(define); + if (dupemode==2) definedlist.del(define); if (definedlist.add(define,value)) { ERROR_MSG(_T("!define: \"%") NPRIs _T("\" already defined!\n"),define); @@ -3453,7 +3453,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) delete tlist; // parse line } - if ((unsigned)-1 != fail_parm && !noErrors) + if ((UINT)-1 != fail_parm && !noErrors) { const TCHAR *msgprefix=!fail_parm ? _T("starting ") : _T(""); TCHAR *p=line.gettoken_str(parmOffs + (fail_parm*2)); @@ -3493,8 +3493,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) TCHAR *src = line.gettoken_str(2+ignoreCase); TCHAR *search = line.gettoken_str(3+ignoreCase); TCHAR *replace = line.gettoken_str(4+ignoreCase); - int searchlen=_tcslen(search); - int replacelen=_tcslen(replace); + int searchlen=(int)_tcslen(search), replacelen=(int)_tcslen(replace); if (!searchlen) { ERROR_MSG(_T("!searchreplace: search string must not be empty for search/replace!\n")); @@ -4332,8 +4331,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) TCHAR *np=p; while (*np && *np != _T('|')) np++; if (*np) *np++=0; - for (x = 0 ; (unsigned) x < COUNTOF(list) && _tcsicmp(list[x].str, p); x++); - if ((unsigned) x < COUNTOF(list)) + for (x = 0 ; (size_t) x < COUNTOF(list) && _tcsicmp(list[x].str, p); x++); + if ((size_t) x < COUNTOF(list)) { r|=list[x].id; } @@ -6735,7 +6734,7 @@ int CEXEBuild::add_file(const tstring& dir, const tstring& file, int attrib, con ent.offsets[4]=0; ent.offsets[5]=0; - if (INVALID_FILE_ATTRIBUTES != (unsigned)ent.offsets[1]) + if (INVALID_FILE_ATTRIBUTES != (DWORD)ent.offsets[1]) { a=add_entry(&ent); if (a != PS_OK) @@ -6800,7 +6799,7 @@ DefineList *CEXEBuild::searchParseString(const TCHAR *source_string, LineParser& tok = 0, maxlen = -1; // No more tokens to search for, save the rest of the string else { - toklen = _tcslen(tok); + toklen = (int) _tcslen(tok); while (*source_string && (ignCase?_tcsnicmp(source_string,tok,toklen):_tcsncmp(source_string,tok,toklen))) source_string++; maxlen = source_string - src_start; // Length of previous string } diff --git a/Source/strlist.cpp b/Source/strlist.cpp index 1c271a4d..ec5cfd94 100644 --- a/Source/strlist.cpp +++ b/Source/strlist.cpp @@ -34,7 +34,8 @@ unsigned int ExeHeadStringList::getnum() const { char *p = (char*) m_gr.get(); if (!p) return 1; // The empty string always exists - unsigned int cbList = gettotalsize(), cb = 0, num = 1, pos; + unsigned int num = 1; + size_t cbList = gettotalsize(), cb = 0, pos; pos = 1 + !!m_wide, p += pos; // Skip empty string if (m_wide) { @@ -93,7 +94,7 @@ unsigned int ExeHeadStringList::find(const TCHAR *str, WORD codepage, bool proce } else { - return find(str,_tcslen(str),codepage,processed,ppBufMB); + return find(str,(unsigned int)_tcslen(str),codepage,processed,ppBufMB); } } unsigned int ExeHeadStringList::find(const void *ptr, unsigned int cchF, WORD codepage, bool processed, char**ppBufMB) const @@ -140,7 +141,7 @@ unsigned int ExeHeadStringList::find(const void *ptr, unsigned int cchF, WORD co for(;;) { if (pos+=cb >= cbList) break; - cb = strlen(p+=cb) + 1; + cb = (unsigned int) strlen(p+=cb) + 1; if (cb < cbF) continue; if (byte_rev_match(p,find,cbF)) { retval = pos; break; } } @@ -165,7 +166,7 @@ int ExeHeadStringList::add(const TCHAR *str, WORD codepage, bool processed) char *bufMB = 0; unsigned int pos = find(str,codepage,processed,m_wide ? 0 : &bufMB); - if ((unsigned)-1 != pos) + if ((unsigned int)-1 != pos) { delete[] bufMB; return pos; @@ -180,7 +181,7 @@ int ExeHeadStringList::add(const TCHAR *str, WORD codepage, bool processed) } else { - unsigned int cbMB = strlen(bufMB) + 1; + unsigned int cbMB = (unsigned int) strlen(bufMB) + 1; pos = m_gr.add(bufMB,cbMB); delete[] bufMB; } @@ -192,7 +193,7 @@ int StringList::add(const TCHAR *str, int case_sensitive) { int a=find(str,case_sensitive); if (a >= 0 && case_sensitive!=-1) return a; - return m_gr.add(str,(_tcslen(str)+1)*sizeof(TCHAR))/sizeof(TCHAR); + return m_gr.add(str,BUGBUG64TRUNCATE(int, (_tcslen(str)+1)*sizeof(TCHAR)))/sizeof(TCHAR); } // use 2 for case sensitive end-of-string matches too @@ -222,9 +223,9 @@ int StringList::find(const TCHAR *str, int case_sensitive, int *idx/*=NULL*/) co str_slen < offs_slen && // check for end of string !_tcscmp(s + offs + offs_slen - str_slen,str)) { - return offs + offs_slen - str_slen; + return BUGBUG64TRUNCATE(int, offs + offs_slen - str_slen); } - offs += offs_slen + 1; + offs += BUGBUG64TRUNCATE(int, offs_slen + 1); if (idx) (*idx)++; } @@ -235,12 +236,12 @@ int StringList::find(const TCHAR *str, int case_sensitive, int *idx/*=NULL*/) co void StringList::delbypos(int pos) { TCHAR *s=(TCHAR*) m_gr.get(); - int len=_tcslen(s+pos)+1; + int len=(int)_tcslen(s+pos)+1; if (pos+len < getcount()) { - // Move everything after the string position to the current position. - memcpy(s+pos,s+pos+len, (getcount()-pos+len)*sizeof(TCHAR)); + // Move everything after the string position to the current position. + memcpy(s+pos,s+pos+len, (getcount()-pos+len)*sizeof(TCHAR)); } m_gr.resize(m_gr.getlen()-len*sizeof(TCHAR)); } @@ -254,7 +255,7 @@ int StringList::idx2pos(int idx) const if (idx>=0) while (offs < getcount()) { if (cnt++ == idx) return offs; - offs+=_tcslen(s+offs)+1; + offs+=(int)_tcslen(s+offs)+1; } return -1; } @@ -267,7 +268,7 @@ int StringList::getnum() const int idx=0; while (offs < ml) { - offs+=_tcslen(s+offs)+1; + offs+=(int)_tcslen(s+offs)+1; idx++; } return idx; diff --git a/Source/strlist.h b/Source/strlist.h index 844521f5..80f07b3c 100644 --- a/Source/strlist.h +++ b/Source/strlist.h @@ -164,10 +164,10 @@ template class SortedStringList { public: - /** - * Jim Park: Note that SortedStringList actually owns T.name. - * Yes, this violates all kinds of encapsulation ideas. - */ + /** + * Jim Park: Note that SortedStringList actually owns T.name. + * Yes, this violates all kinds of encapsulation ideas. + */ virtual ~SortedStringList() { T *s=(T*) m_gr.get(); @@ -178,22 +178,22 @@ class SortedStringList } } - /** - * This function adds a new T struct with a copy of TCHAR *name into - * T.name. But adds it into a sorted position. All calls to - * add must be done with the same value for case_sensitive or you - * can get random behavior. - * - * @param name The name which is the "key" to finding the instance of T. - * @param case_sensitive 1 means case sensitive, 0 insensitive. + /** + * This function adds a new T struct with a copy of TCHAR *name into + * T.name. But adds it into a sorted position. All calls to + * add must be done with the same value for case_sensitive or you + * can get random behavior. + * + * @param name The name which is the "key" to finding the instance of T. + * @param case_sensitive 1 means case sensitive, 0 insensitive. * @return Returns -1 when name already exists and pos if added. - */ + */ int add(const TCHAR *name, int case_sensitive=0) { T newstruct={0,}; int pos=find(name,case_sensitive,1); if (pos==-1) return -1; - const UINT cbName=(_tcslen(name)+1)*sizeof(TCHAR); + const unsigned long cbName=(unsigned long) (_tcslen(name)+1)*sizeof(TCHAR); newstruct.name=(TCHAR*)malloc(cbName); if (!newstruct.name) { @@ -215,22 +215,22 @@ class SortedStringList return pos; } - /** + /** * This function does a binary search for the T in the buffer that * contains str as its T.name. It then returns the position of the found * T, not in its byte position, but its T position (valid offset to T*). - * + * * @param str The string to search for in T.name. - * + * * @param case_sensitive If 1, do a case sensitive search, otherwise, case insensitive. - * + * * @param returnbestpos If 1, then the function changes behavior. Instead * of looking for the string str in the Ts, it tries to find the best * sorted position to insert str into the buffer. - * + * * @return Returns -1 if not found, position if found. If returnbestpos=1 * returns -1 if found, best pos to insert if not found - */ + */ int find(const TCHAR *str, int case_sensitive=0, int returnbestpos=0) { T *data=(T *) m_gr.get(); @@ -254,12 +254,12 @@ class SortedStringList return returnbestpos ? nextpos : -1; } - /** - * This function looks for str in T.name and deletes the T in the - * buffer. - * - * @return Returns 0 on success, 1 on failure. - */ + /** + * This function looks for str in T.name and deletes the T in the + * buffer. + * + * @return Returns 0 on success, 1 on failure. + */ int del(const TCHAR *str, int case_sensitive=0) { int pos=find(str, case_sensitive); @@ -332,7 +332,7 @@ class SortedStringListND // no delete - can be placed in GrowBuf if (pos==-1) return alwaysreturnpos ? where : -1; // Note that .name is set with the TCHAR* offset into m_strings. - newstruct.name=m_strings.add(name,(_tcslen(name)+1)*sizeof(TCHAR))/sizeof(TCHAR); + newstruct.name=m_strings.add(name,((unsigned int)_tcslen(name)+1)*sizeof(TCHAR))/sizeof(TCHAR); m_gr.add(&newstruct,sizeof(T)); T *s=(T*) m_gr.get(); @@ -403,7 +403,7 @@ class SortedStringListND // no delete - can be placed in GrowBuf } else { - unsigned int pCurr_len = _tcslen(pCurr); + unsigned int pCurr_len = (unsigned int) _tcslen(pCurr); if (case_sensitive) res = _tcsncmp(str, pCurr, STD_MIN((unsigned int) n_chars, pCurr_len)); else @@ -444,8 +444,8 @@ class SortedStringListND // no delete - can be placed in GrowBuf * Structure stored by DefineList. */ struct define { - TCHAR *name; // key - TCHAR *value; // value stored + TCHAR *name; // key + TCHAR *value; // value stored }; /** @@ -459,11 +459,11 @@ class DefineList : public SortedStringList void operator=(const DefineList&); public: - /* Empty default constructor */ + /* Empty default constructor */ DefineList() {} // VC6 complains otherwise virtual ~DefineList(); - /** + /** * Add a name-value pair, case insensitively. * * @param name The name of the variable or key to search by. In a @@ -473,8 +473,8 @@ class DefineList : public SortedStringList * of the pair. * * @return Returns 0 if successful, 1 if already exists. Errors cause - * general program exit with error logging. - */ + * general program exit with error logging. + */ int add(const TCHAR *name, const TCHAR *value=_T("")); /** diff --git a/Source/tchar.h b/Source/tchar.h index dc6bffd2..95e97567 100644 --- a/Source/tchar.h +++ b/Source/tchar.h @@ -50,7 +50,7 @@ typedef wchar_t TCHAR, _TUCHAR; // printfs #define _ftprintf fwprintf #define _sntprintf _snwprintf -#if (defined(_MSC_VER) && (_MSC_VER<=1310)) || defined(__MINGW32__) +#if (defined(_MSC_VER) && (_MSC_VER<=1310||_MSC_FULL_VER<=140040310)) || defined(__MINGW32__) # define _stprintf swprintf #else # define _stprintf _swprintf @@ -243,5 +243,9 @@ typedef unsigned char _TUCHAR; #endif // is functions (the same in Unicode / ANSI) +#ifndef _istgraph #define _istgraph isgraph +#endif +#ifndef _istascii #define _istascii __isascii +#endif diff --git a/Source/utf.cpp b/Source/utf.cpp index 60ef621c..e89e82bc 100644 --- a/Source/utf.cpp +++ b/Source/utf.cpp @@ -22,7 +22,7 @@ UINT StrLenUTF16(const void*str) { - return sizeof(wchar_t) == 2 ? wcslen((wchar_t*)str) : InlineStrLenUTF16(str); + return sizeof(wchar_t) == 2 ? (UINT)wcslen((wchar_t*)str) : InlineStrLenUTF16(str); } bool StrSetUTF16LE(tstring&dest, const void*src) @@ -204,10 +204,10 @@ void* CharEncConv::Convert(const void*Src, size_t cbSrc, size_t*cbOut) { if (NStreamEncoding::UTF16BE == m_TE) goto l_swapUTF16; cbSrc /= sizeof(wchar_t); - UINT cbDest = WideCharToMultiByte(m_TE, 0, (wchar_t*)Src, cbSrc, 0, 0, 0, 0); + UINT cbDest = WideCharToMultiByte(m_TE, 0, (wchar_t*)Src, (int)cbSrc, 0, 0, 0, 0); char *p = (char*) realloc(m_Result, (cbDest + 1) * sizeof(char)); if (p) m_Result = p; else return 0; - if (!(cbDest = WideCharToMultiByte(m_TE, 0, (wchar_t*)Src, cbSrc, p, cbDest, 0, 0))) return 0; + if (!(cbDest = WideCharToMultiByte(m_TE, 0, (wchar_t*)Src, (int)cbSrc, p, (int)cbDest, 0, 0))) return 0; if (p[--cbDest]) p[++cbDest] = '\0'; // Always \0 terminate if (cbOut) *cbOut = cbDest; // cbOut never includes the \0 terminator } @@ -220,16 +220,16 @@ l_swapUTF16: char *p = (char*) realloc(m_Result, cbSrc + sizeof(wchar_t)); if (p) m_Result = p; else return 0; memcpy(p, Src, cbSrc); - cchDest = cbSrc / sizeof(wchar_t); + cchDest = (UINT) (cbSrc / sizeof(wchar_t)); UTF16InplaceEndianSwap(p, cchDest); if (!cchDest) *((WORD*)p) = 0, ++cchDest; // For "--cchDest" during \0 termination } else { - cchDest = MultiByteToWideChar(m_FE, 0, (char*)Src, cbSrc, 0, 0); + cchDest = MultiByteToWideChar(m_FE, 0, (char*)Src, (int)cbSrc, 0, 0); char *p = (char*) realloc(m_Result, (cchDest + 1) * sizeof(wchar_t)); if (p) m_Result = p; else return 0; - if (!(cchDest = MultiByteToWideChar(m_FE, 0, (char*)Src, cbSrc, (LPWSTR)p, cchDest))) return 0; + if (!(cchDest = MultiByteToWideChar(m_FE, 0, (char*)Src, (int)cbSrc, (LPWSTR)p, (int)cchDest))) return 0; if (NStreamEncoding::UTF16BE == m_TE) UTF16InplaceEndianSwap(p, cchDest); } if (((WORD*)m_Result)[--cchDest]) ((WORD*)m_Result)[++cchDest] = '\0'; diff --git a/Source/util.cpp b/Source/util.cpp index f3ec84a8..da025fcc 100644 --- a/Source/util.cpp +++ b/Source/util.cpp @@ -787,7 +787,7 @@ size_t ExpandoStrFmtVaList(wchar_t*Stack, size_t cchStack, wchar_t**ppMalloc, co for(;;) { cch = ExpandoStrFmtVaList_vsnwprintf(dest, cchAvail, FmtStr, Args); - if ((unsigned)-1 == cch) + if ((size_t)-1 == cch) { cch = 0; if (cansizecalc) break; // vswprintf error, abort! @@ -818,7 +818,7 @@ int RunChildProcessRedirected(LPCWSTR cmdprefix, LPCWSTR cmdmain) UINT cp = CP_UTF8, mbtwcf = MB_ERR_INVALID_CHARS; errno = ENOMEM; if (!cmdprefix) cmdprefix = _T(""); - UINT cch1 = _tcslen(cmdprefix), cch2 = _tcslen(cmdmain); + size_t cch1 = _tcslen(cmdprefix), cch2 = _tcslen(cmdmain); WCHAR *cmd = (WCHAR*) malloc( (cch1 + cch2 + 1) * sizeof(WCHAR) ); if (!cmd) return -1; _tcscpy(cmd, cmdprefix); @@ -995,7 +995,7 @@ bool WINAPI WinStdIO_OStreamInit(WINSIO_OSDATA&osd, FILE*strm, WORD cp, int bom) } bool WINAPI WinStdIO_OStreamWrite(WINSIO_OSDATA&osd, const wchar_t *Str, UINT cch) { - if ((unsigned)-1 == cch) cch = _tcslen(Str); + if ((UINT)-1 == cch) cch = (UINT)_tcslen(Str); DWORD cbio; if (WinStdIO_IsConsole(osd)) return !!WriteConsoleW(osd.hNative, Str, cch, &cbio, 0) || !cch; @@ -1024,7 +1024,9 @@ int WINAPI WinStdIO_vfwprintf(FILE*strm, const wchar_t*Fmt, va_list val) extern WINSIO_OSDATA g_osdata_stdout; ExpandoString buf; errno = ENOMEM; - UINT cch = buf.StrFmt(Fmt, val, false); + const size_t cchfmt = buf.StrFmt(Fmt, val, false); + UINT cch = (UINT) cchfmt; + assert(sizeof(size_t) <= 4 || cchfmt == cch); if (cch && !WinStdIO_OStreamWrite(g_osdata_stdout, buf, cch)) { cch = 0, errno = EIO; @@ -1139,7 +1141,7 @@ static bool GetDLLVersionUsingRE(const tstring& filepath, DWORD& high, DWORD & l { CResourceEditor *dllre = new CResourceEditor(dll, len); LPBYTE ver = dllre->GetResource(VS_FILE_INFO, VS_VERSION_INFO, 0); - int versize = dllre->GetResourceSize(VS_FILE_INFO, VS_VERSION_INFO, 0); + size_t versize = (size_t) dllre->GetResourceSize(VS_FILE_INFO, VS_VERSION_INFO, 0); if (ver) { @@ -1147,7 +1149,7 @@ static bool GetDLLVersionUsingRE(const tstring& filepath, DWORD& high, DWORD & l { // get VS_FIXEDFILEINFO from VS_VERSIONINFO WINWCHAR *szKey = (WINWCHAR *)(ver + sizeof(WORD) * 3); - int len = (WinWStrLen(szKey) + 1) * sizeof(WINWCHAR) + sizeof(WORD) * 3; + size_t len = (WinWStrLen(szKey) + 1) * sizeof(WINWCHAR) + sizeof(WORD) * 3; len = (len + 3) & ~3; // align on DWORD boundry VS_FIXEDFILEINFO *verinfo = (VS_FIXEDFILEINFO *)(ver + len); if (versize > len && verinfo->dwSignature == VS_FFI_SIGNATURE) diff --git a/Source/winchar.cpp b/Source/winchar.cpp index 94b949bd..a5d63978 100644 --- a/Source/winchar.cpp +++ b/Source/winchar.cpp @@ -45,7 +45,7 @@ int WinWStrNICmpASCII(const WINWCHAR *a, const char *b, size_t n) WINWCHAR* WinWStrDupFromChar(const char *s, unsigned int cp) { - size_t cch = MultiByteToWideChar(cp, 0, s, -1, 0, 0); + int cch = MultiByteToWideChar(cp, 0, s, -1, 0, 0); wchar_t *p = (wchar_t*) malloc(cch); if (p) { diff --git a/Source/writer.cpp b/Source/writer.cpp index 4578fbd1..ca4262df 100644 --- a/Source/writer.cpp +++ b/Source/writer.cpp @@ -41,6 +41,11 @@ void writer_sink::write_int(const int i) int fi = FIX_ENDIAN_INT32(i); write_data(&fi, sizeof(int)); } +void writer_sink::write_int64(const INT64 i) +{ + INT64 fi = FIX_ENDIAN_INT64(i); + write_data(&fi, sizeof(INT64)); +} void writer_sink::write_int_array(const int i[], const size_t len) { @@ -73,7 +78,7 @@ void writer_sink::write_string(const TCHAR *s, size_t size) { char *wb = new char[size]; memset(wb, 0, size); - WideCharToMultiByte(CP_ACP, 0, s, -1, wb, size, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, s, -1, wb, (int)size, NULL, NULL); write_data(wb, size); delete [] wb; } @@ -93,7 +98,7 @@ void writer_sink::write_growbuf(const IGrowBuf *b) void growbuf_writer_sink::write_data(const void *data, const size_t size) { - m_buf->add(data, size); + m_buf->add(data, BUGBUG64TRUNCATE(int, size)); } void file_writer_sink::write_data(const void *data, const size_t size) @@ -109,6 +114,6 @@ void file_writer_sink::write_data(const void *data, const size_t size) void crc_writer_sink::write_data(const void *data, const size_t size) { - *m_crc = CRC32(*m_crc, (const unsigned char *) data, size); + *m_crc = CRC32(*m_crc, (const unsigned char *) data, BUGBUG64TRUNCATE(unsigned int, size)); } #endif diff --git a/Source/writer.h b/Source/writer.h index 5cff7997..8f16b7e5 100644 --- a/Source/writer.h +++ b/Source/writer.h @@ -33,6 +33,7 @@ public: virtual void write_byte(const unsigned char b); virtual void write_short(const short s); virtual void write_int(const int i); + virtual void write_int64(const INT64 i); virtual void write_int_array(const int i[], const size_t len); virtual void write_string(const TCHAR *s, size_t size); virtual void write_growbuf(const IGrowBuf *b);