- makensis should now compile on any POSIX compliment platform (Linux, *BSD, Mac OS X, etc.)

- improved makefiles so nothing is compiled when it's already up-to-date
- Added SW_HIDE to ExecShell's accepted show modes


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3518 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2004-03-29 20:21:00 +00:00
parent 8567625b0e
commit 4c5f8a30eb
46 changed files with 2054 additions and 679 deletions

View file

@ -2,11 +2,13 @@
// #include "StdAfx.h"
#ifndef INITGUID
#define INITGUID
#ifdef WIN32
# include <objbase.h>
# include <initguid.h>
#endif
#include <objbase.h>
#include <initguid.h>
#include "../Platform.h"
#define INITGUID
#include "7zip/ICoder.h"
#include "7zip/Compress/LZ/IMatchFinder.h"

View file

@ -3,6 +3,10 @@
#ifndef __STDAFX_H
#define __STDAFX_H
#include <windows.h>
#ifdef _WIN32
# include <windows.h>
#else
# include "../../../Platform.h"
#endif
#endif

View file

@ -15,7 +15,8 @@ namespace BT_NAMESPACE {
#ifdef __USE_3_BYTES
#pragma pack(push, PragmaBinTree, 1)
//#pragma pack(push, PragmaBinTree, 1)
#pragma pack(1)
struct CIndex
{
@ -31,7 +32,8 @@ struct CIndex
};
const UINT32 kMaxValForNormalize = CIndex(-1);
#pragma pack(pop, PragmaBinTree)
//#pragma pack(pop, PragmaBinTree)
#pragma pack()
#else
@ -54,7 +56,8 @@ const UINT32 kMaxValForNormalize = (UINT32(1) << 31) - 1;
// #endif
#pragma pack(push, PragmaBinTreePair, 1)
//#pragma pack(push, PragmaBinTreePair, 1)
#pragma pack(1)
// #pragma pack(push, 1)
struct CPair
@ -64,7 +67,8 @@ struct CPair
};
// #pragma pack(pop)
#pragma pack(pop, PragmaBinTreePair)
//#pragma pack(pop, PragmaBinTreePair)
#pragma pack()
class CInTree: public CLZInWindow
{

View file

@ -40,13 +40,13 @@ namespace BT_NAMESPACE {
CInTree::CInTree():
_hash(0),
#ifdef HASH_ARRAY_2
_hash2(0),
#ifdef HASH_ARRAY_3
_hash3(0),
#endif
#endif
_hash(0),
_son(0),
_cutValue(0xFF)
{
@ -134,7 +134,7 @@ static const UINT32 kEmptyHashValue = 0;
HRESULT CInTree::Init(ISequentialInStream *stream)
{
RINOK(CLZInWindow::Init(stream));
int i;
unsigned int i;
for(i = 0; i < kHashSize; i++)
_hash[i] = kEmptyHashValue;

View file

@ -3,6 +3,10 @@
#ifndef __STDAFX_H
#define __STDAFX_H
#include <windows.h>
#ifdef _WIN32
# include <windows.h>
#else
# include "../../../../Platform.h"
#endif
#endif

View file

@ -254,10 +254,11 @@ public:
HRESULT Create();
MY_UNKNOWN_IMP2(
/*MY_UNKNOWN_IMP2(
ICompressSetCoderProperties,
ICompressWriteCoderProperties
)
)*/
MY_UNKNOWN_IMP
STDMETHOD(Init)(
ISequentialOutStream *outStream);

View file

@ -3,6 +3,10 @@
#ifndef __STDAFX_H
#define __STDAFX_H
#include <windows.h>
#ifdef _WIN32
# include <windows.h>
#else
# include "../../../../Platform.h"
#endif
#endif

View file

@ -3,6 +3,10 @@
#ifndef __STDAFX_H
#define __STDAFX_H
#include <windows.h>
#ifdef _WIN32
# include <windows.h>
#else
# include "../../../../Platform.h"
#endif
#endif

View file

@ -5,20 +5,52 @@
#ifndef __MYUNKNOWN_H
#define __MYUNKNOWN_H
#ifdef WIN32
#ifdef _WIN32
// #include <guiddef.h>
#include <basetyps.h>
#else
#else
#include "../../Platform.h"
#include <string>
#define HRESULT LONG
#define STDMETHODCALLTYPE __stdcall
#if ((_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED))
# define STDMETHODCALLTYPE __stdcall
#else
# if defined(__GNUC__) && defined(__i386__)
# define STDMETHODCALLTYPE __attribute__((__stdcall__))
# else
# define STDMETHODCALLTYPE
# endif
#endif
#define PROPID ULONG
#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f
#define STDMETHOD(f) STDMETHOD_(HRESULT, f)
#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
#define STDMETHODIMP STDMETHODIMP_(HRESULT)
#define VT_UI4 1
#define VT_BSTR 2
typedef struct _PROPVARIANT
{
WORD vt;
ULONG ulVal;
wchar_t *bstrVal;
} PROPVARIANT;
#define S_OK 0
#define E_NOINTERFACE 0x80000001
#define E_ABORT 0x80000002
#define E_INVALIDARG 0x80070057
#define E_FAIL 0x80004005
#define E_OUTOFMEMORY 0x8007000E
#define PURE = 0;
typedef struct {
@ -35,33 +67,34 @@ typedef struct {
#endif
#ifdef INITGUID
#define MY_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#else
#define MY_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
MY_EXTERN_C const GUID name
#endif
#ifdef __cplusplus
#define REFGUID const GUID &
typedef const GUID & REFGUID;
#else
#define REFGUID const GUID * __MIDL_CONST
#endif
#define MIDL_INTERFACE(x) struct
#define MIDL_INTERFACE(x) struct
inline int operator==(REFGUID g1, REFGUID g2)
{
for (int i = 0; i < sizeof(g1); i++)
for (unsigned int i = 0; i < sizeof(g1); i++)
if (((unsigned char *)&g1)[i] != ((unsigned char *)&g2)[i])
return false;
return true;
}
inline int operator!=(REFGUID &g1, REFGUID &g2)
inline int operator!=(REFGUID g1, REFGUID g2)
{ return !(g1 == g2); }
struct IUnknown
{
STDMETHOD(QueryInterface) (const GUID *iid, void **outObject) PURE;
STDMETHOD(QueryInterface) (REFGUID iid, void **outObject) PURE;
STDMETHOD_(ULONG, AddRef)() PURE;
STDMETHOD_(ULONG, Release)() PURE;
};

View file

@ -50,10 +50,10 @@ public:
_p = NULL;
return pt;
}
HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
/*HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
{
return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
}
}*/
/*
HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
{
@ -65,16 +65,16 @@ public:
return hr;
}
*/
template <class Q>
/*template <class Q>
HRESULT QueryInterface(REFGUID iid, Q** pp) const
{
return _p->QueryInterface(iid, (void**)pp);
}
}*/
};
//////////////////////////////////////////////////////////
class CMyComBSTR
/*class CMyComBSTR
{
public:
BSTR m_str;
@ -83,7 +83,7 @@ public:
// CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }
// CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); }
CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
/*
/ *
CMyComBSTR(REFGUID src)
{
LPOLESTR szGuid;
@ -91,7 +91,7 @@ public:
m_str = ::SysAllocString(szGuid);
CoTaskMemFree(szGuid);
}
*/
* /
~CMyComBSTR() { ::SysFreeString(m_str); }
CMyComBSTR& operator=(const CMyComBSTR& src)
{
@ -132,7 +132,7 @@ public:
m_str = NULL;
}
bool operator!() const { return (m_str == NULL); }
};
};*/
//////////////////////////////////////////////////////////

View file

@ -3,6 +3,10 @@
#ifndef __STDAFX_H
#define __STDAFX_H
#include <windows.h>
#ifdef _WIN32
# include <windows.h>
#else
# include "../../Platform.h"
#endif
#endif

View file

@ -5,7 +5,11 @@
#ifndef __COMMON_TYPES_H
#define __COMMON_TYPES_H
#include <basetsd.h>
#ifdef _WIN32
# include <basetsd.h>
#else
# include "../../Platform.h"
#endif
typedef unsigned char UINT8;
typedef unsigned short UINT16;

View file

@ -21,6 +21,12 @@
*/
#include "DialogTemplate.h"
#include "util.h"
#ifndef _WIN32
# include <stdio.h>
# include <stdlib.h>
# include <iconv.h>
#endif
//////////////////////////////////////////////////////////////////////
// Utilities
@ -28,13 +34,6 @@
#define ALIGN(dwToAlign, dwAlignOn) dwToAlign = (dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn
// returns the number of WCHARs in str including null charcter
inline DWORD WCStrLen(WCHAR* szwStr) {
int i;
for (i = 0; szwStr[i]; i++);
return i+1;
}
// Reads a variany length array from seeker into readInto and advances seeker
void ReadVarLenArr(BYTE* &seeker, char* &readInto, unsigned int uCodePage) {
WORD* arr = (WORD*)seeker;
@ -49,16 +48,49 @@ void ReadVarLenArr(BYTE* &seeker, char* &readInto, unsigned int uCodePage) {
break;
default:
{
int iStrLen = WideCharToMultiByte(uCodePage, 0, (WCHAR*)arr, -1, 0, 0, 0, 0);
readInto = new char[iStrLen];
WideCharToMultiByte(uCodePage, 0, (WCHAR*)arr, -1, readInto, iStrLen, 0, 0);
seeker += WCStrLen((WCHAR*)arr)*sizeof(WCHAR);
int iStrLen = 1;
#ifdef _WIN32
iStrLen = WideCharToMultiByte(uCodePage, 0, (WCHAR*)arr, -1, 0, 0, 0, 0);
if (iStrLen)
{
readInto = new char[iStrLen];
WideCharToMultiByte(uCodePage, 0, (WCHAR*)arr, -1, readInto, iStrLen, 0, 0);
}
else
{
*arr = 0;
seeker += sizeof(WCHAR);
}
#else
char cp[128] = "";
if (uCodePage != CP_ACP)
snprintf(cp, 128, "CP%d", uCodePage);
iconv_t cd = iconv_open(cp, "UCS-2");
if (cd != (iconv_t) -1)
{
iStrLen = WCStrLen((WCHAR *) arr);
char *in = (char *) arr;
char *out = readInto = new char[iStrLen + 1];
size_t insize = (iStrLen * sizeof(WCHAR)) + 1;
size_t outsize = iStrLen + 1;
if (__iconv_adaptor(iconv, cd, &in, &insize, &out, &outsize) == (size_t) -1)
{
*arr = 0;
iStrLen = 1;
}
iconv_close(cd);
}
else
*arr = 0;
#endif
seeker += iStrLen*sizeof(WCHAR);
}
break;
}
}
// A macro that writes a given string (that can be a number too) into the buffer
#ifdef _WIN32
#define WriteStringOrId(x) \
if (x) \
if (IS_INTRESOURCE(x)) { \
@ -73,9 +105,46 @@ void ReadVarLenArr(BYTE* &seeker, char* &readInto, unsigned int uCodePage) {
} \
else \
seeker += sizeof(WORD);
#else
#define WriteStringOrId(x) \
if (x) \
if (IS_INTRESOURCE(x)) { \
*(WORD*)seeker = 0xFFFF; \
seeker += sizeof(WORD); \
*(WORD*)seeker = WORD(DWORD(x)); \
seeker += sizeof(WORD); \
} \
else { \
char cp[128] = ""; \
if (m_uCodePage != CP_ACP) \
snprintf(cp, 128, "CP%d", m_uCodePage); \
iconv_t cd = iconv_open("UCS-2", cp); \
if (cd != (iconv_t) -1) \
{ \
char *in = (char *) x; \
char *out = (char *) seeker; \
size_t insize = strlen(in) + 1; \
size_t outsize = insize * 2; \
if (__iconv_adaptor(iconv, cd, &in, &insize, &out, &outsize) == (size_t) -1) \
{ \
*seeker = 0; \
seeker += sizeof(WCHAR); \
} \
seeker = (BYTE *) out; \
iconv_close(cd); \
} \
else \
{ \
*seeker = 0; \
seeker += sizeof(WCHAR); \
} \
} \
else \
seeker += sizeof(WORD);
#endif
// 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) : (lstrlen(x)+1)*sizeof(WCHAR)) : sizeof(WORD)
#define AddStringOrIdSize(x) dwSize += x ? (IS_INTRESOURCE(x) ? sizeof(DWORD) : (strlen(x)+1)*sizeof(WCHAR)) : sizeof(WORD)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
@ -264,7 +333,7 @@ int CDialogTemplate::RemoveItem(WORD wId) {
// Sets the font of the dialog
void CDialogTemplate::SetFont(char* szFaceName, WORD wFontSize) {
if (lstrcmp(szFaceName, "MS Shell Dlg")) {
if (strcmp(szFaceName, "MS Shell Dlg")) {
// not MS Shell Dlg
m_dwStyle &= ~DS_SHELLFONT;
m_bExtended = false;
@ -276,8 +345,8 @@ void CDialogTemplate::SetFont(char* szFaceName, WORD wFontSize) {
}
m_dwStyle |= DS_SETFONT;
if (m_szFont) delete [] m_szFont;
m_szFont = new char[lstrlen(szFaceName)+1];
lstrcpy(m_szFont, szFaceName);
m_szFont = new char[strlen(szFaceName)+1];
strcpy(m_szFont, szFaceName);
m_sFontSize = wFontSize;
}
@ -287,12 +356,12 @@ void CDialogTemplate::AddItem(DialogItemTemplate item) {
CopyMemory(newItem, &item, sizeof(DialogItemTemplate));
if (item.szClass && !IS_INTRESOURCE(item.szClass)) {
newItem->szClass = new char[lstrlen(item.szClass)+1];
lstrcpy(newItem->szClass, item.szClass);
newItem->szClass = new char[strlen(item.szClass)+1];
strcpy(newItem->szClass, item.szClass);
}
if (item.szTitle && !IS_INTRESOURCE(item.szTitle)) {
newItem->szTitle = new char[lstrlen(item.szTitle)+1];
lstrcpy(newItem->szTitle, item.szTitle);
newItem->szTitle = new char[strlen(item.szTitle)+1];
strcpy(newItem->szTitle, item.szTitle);
}
if (item.wCreateDataSize) {
newItem->szCreationData = new char[item.wCreateDataSize];
@ -315,6 +384,7 @@ void CDialogTemplate::Resize(short x, short y) {
m_sHeight += y;
}
#ifdef _WIN32
// Creates a dummy dialog that is used for converting units
HWND CDialogTemplate::CreateDummyDialog() {
DWORD dwTemp;
@ -361,7 +431,7 @@ SIZE CDialogTemplate::GetStringSize(WORD id, char *str) {
SelectObject(memDC, font);
SIZE size;
GetTextExtentPoint32(memDC, str, lstrlen(str), &size);
GetTextExtentPoint32(memDC, str, strlen(str), &size);
DestroyWindow(hDlg);
DeleteObject(font);
@ -415,6 +485,7 @@ void CDialogTemplate::CTrimToString(WORD id, char *str, int margins) {
item->sWidth = short(size.cx);
item->sHeight = short(size.cy);
}
#endif
// Moves every item right and gives it the WS_EX_RIGHT extended style
void CDialogTemplate::ConvertToRTL() {
@ -452,12 +523,12 @@ void CDialogTemplate::ConvertToRTL() {
m_vItems[i]->dwStyle |= SS_CENTERIMAGE;
}
}
else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !strcmpi(m_vItems[i]->szClass, "RichEdit20A")) {
else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !stricmp(m_vItems[i]->szClass, "RichEdit20A")) {
if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) {
m_vItems[i]->dwStyle ^= ES_RIGHT;
}
}
else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !strcmpi(m_vItems[i]->szClass, "SysTreeView32")) {
else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !stricmp(m_vItems[i]->szClass, "SysTreeView32")) {
m_vItems[i]->dwStyle |= TVS_RTLREADING;
addExStyle = true;
}

View file

@ -28,9 +28,9 @@
#endif // _MSC_VER > 1000
#include "Platform.h"
#include <Vector>
#include <vector>
#include <StdExcept>
#include <stdexcept>
using namespace std;
struct DialogItemTemplate {
@ -51,7 +51,19 @@ struct DialogItemTemplate {
WORD wCreateDataSize;
};
#pragma pack(push, 1)
#pragma pack(1)
#ifndef _WIN32
typedef struct {
DWORD style;
DWORD dwExtendedStyle;
WORD cdit;
short x;
short y;
short cx;
short cy;
} DLGTEMPLATE;
#endif
typedef struct {
WORD dlgVer;
@ -66,6 +78,18 @@ typedef struct {
short cy;
} DLGTEMPLATEEX;
#ifndef _WIN32
typedef struct {
DWORD style;
DWORD dwExtendedStyle;
short x;
short y;
short cx;
short cy;
WORD id;
} DLGITEMTEMPLATE;
#endif
typedef struct {
DWORD helpID;
DWORD exStyle;
@ -78,7 +102,7 @@ typedef struct {
WORD _miscrosoft_docs_are_wrong;
} DLGITEMTEMPLATEEX;
#pragma pack(pop)
#pragma pack()
class CDialogTemplate {
public:
@ -92,15 +116,19 @@ public:
int RemoveItem(WORD wId);
void SetFont(char* szFaceName, WORD wFontSize);
void AddItem(DialogItemTemplate item);
#ifdef _WIN32
HWND CreateDummyDialog();
#endif
void MoveAll(short x, short y);
void Resize(short x, short y);
#ifdef _WIN32
void PixelsToDlgUnits(short& x, short& y);
void DlgUnitsToPixels(short& x, short& y);
SIZE GetStringSize(WORD id, char *str);
void RTrimToString(WORD id, char *str, int margins);
void LTrimToString(WORD id, char *str, int margins);
void CTrimToString(WORD id, char *str, int margins);
#endif
void ConvertToRTL();
BYTE* Save(DWORD& dwSize);
DWORD GetSize();

View file

@ -5,79 +5,52 @@
# -- Objects and source files --
SRCS = zlib/deflate.c zlib/trees.c bzip2/blocksort.c bzip2/bzlib.c bzip2/compress.c bzip2/huffman.c 7zip/7zGuids.cpp 7zip/Common/CRC.cpp 7zip/7zip/Compress/LZ/LZInWindow.cpp 7zip/7zip/Compress/LZMA/LZMAEncoder.cpp 7zip/7zip/Compress/LZMA/LZMALen.cpp 7zip/7zip/Compress/LZMA/LZMALiteral.cpp 7zip/7zip/Common/OutBuffer.cpp 7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp build.cpp crc32.c DialogTemplate.cpp exedata.cpp lang.cpp makenssi.cpp Plugins.cpp ResourceEditor.cpp ResourceVersionInfo.cpp script.cpp tokens.cpp util.cpp
OBJS = 7zGuids.o blocksort.o build.o bzlib.o compress.o CRC.o crc32.o deflate.o DialogTemplate.o exedata.o huffman.o lang.o LZInWindow.o LZMAEncoder.o LZMALen.o LZMALiteral.o makenssi.o OutBuffer.o Plugins.o RangeCoderBit.o ResourceEditor.o ResourceVersionInfo.o script.o tokens.o trees.o util.o
ifeq "$(strip $(findstring i386pe,$(shell ld -V)))" ""
LIBS = -lstdc++ -lpthread
else
LIBS = -lgdi32 -lversion -lstdc++
# -- Required .h files --
BASEINC = Platform.h exehead/config.h
endif
# -- Programs --
MAKE = make
CC = gcc
RC = windres
RM = rm
# -- Compilers and linker flags --
DEFINES = -DWIN32 -D_WINDOWS_
CFLAGS = -Wall -O2 $(DEFINES)
CPPFLAGS = -Wall -O2 $(DEFINES)
LFLAGS = -s
RCFLAGS = --input-format rc --output-format coff
DEFINES = -DCOMPRESS_MF_BT
CFLAGS = -Wall -O3
CXXFLAGS = -Wall -O3
CPPFLAGS = $(DEFINES)
LDFLAGS = -s -Wl,-Map,$(subst .exe,.map,$@)
all : exehead_zlib exehead_bzip2 exehead_lzma exehead_resources makensis
all : makensis
exehead_zlib exehead_bzip2 exehead_lzma exehead_resources :
$(MAKE) -C exehead $@
cs = zlib bzip2 lzma
rs = bitmap1.h icon.h unicon.h
deps = $(foreach c,$(cs),exehead/Release-$(c)/exehead_$(c).h) $(foreach r,$(rs),exehead/Release-zlib/$(r))
exehead : $(deps)
$(deps) :
$(MAKE) -C exehead $(foreach d,$^,$(subst exehead/,,$(d)))
makensis : $(OBJS)
$(CC) $(CFLAGS) $(CPPFLAGS) $(LFLAGS) -o ../makensis.exe $(OBJS) $(LIBS)
makensis : ../makensis.exe
# -- Dependencies --
build.o : build.cpp ./zlib/zlib.h $(BASEINC) ./exehead/fileform.h ./exehead/resource.h exedata.h build.h util.h strlist.h lineparse.h ResourceEditor.h Makefile
exedata.o : exedata.cpp exedata.h ./exehead/Release-zlib/bitmap1.h ./exehead/Release-zlib/icon.h ./exehead/Release-zlib/unicon.h ./exehead/Release-zlib/exehead_zlib.h Makefile
makenssi.o : makenssi.cpp build.h util.h exedata.h strlist.h lineparse.h ./exehead/fileform.h $(BASEINC) Makefile
script.o : script.cpp tokens.h build.h util.h exedata.h strlist.h lineparse.h ResourceEditor.h DialogTemplate.h ./exehead/resource.h ./exehead/fileform.h $(BASEINC) Makefile
tokens.o : tokens.cpp build.h tokens.h Makefile
util.o : util.cpp ./exehead/fileform.h util.h strlist.h ResourceEditor.h Makefile
crc32.o : crc32.c $(BASEINC) Makefile
ResourceEditor.o : ResourceEditor.cpp
DialogTemplate.o : DialogTemplate.cpp
../makensis.exe : $(SRCS) $(OBJS) $(deps)
$(CC) -Wall $(LDFLAGS) -o ../makensis.exe $(OBJS) $(LIBS)
# -- Special command lines for zlib --
deflate.o : zlib/deflate.c
$(CC) $(CFLAGS) -c $< -o $@
trees.o : zlib/trees.c
$(CC) $(CFLAGS) -c $< -o $@
VPATH=zlib:bzip2:7zip:7zip/Common:7zip/7zip:7zip/7zip/Compress/LZ:7zip/7zip/Compress/LZMA:7zip/7zip/Common:7zip/7zip/Compress/RangeCoder
# -- Special command lines for bzip2 --
blocksort.o : bzip2/blocksort.c
$(CC) $(CFLAGS) -c $< -o $@
bzlib.o : bzip2/bzlib.c
$(CC) $(CFLAGS) -c $< -o $@
compress.o : bzip2/compress.c
$(CC) $(CFLAGS) -c $< -o $@
huffman.o : bzip2/huffman.c
$(CC) $(CFLAGS) -c $< -o $@
# -- Special command lines for lzma --
7zGuids.o : 7zip/7zGuids.cpp
$(CC) $(CFLAGS) -c $< -o $@
CRC.o : 7zip/Common/CRC.cpp
$(CC) $(CFLAGS) -c $< -o $@
LZInWindow.o : 7zip/7zip/Compress/LZ/LZInWindow.cpp
$(CC) $(CFLAGS) -c $< -o $@
LZMAEncoder.o : 7zip/7zip/Compress/LZMA/LZMAEncoder.cpp
$(CC) $(CFLAGS) -c $< -o $@
LZMALen.o : 7zip/7zip/Compress/LZMA/LZMALen.cpp
$(CC) $(CFLAGS) -c $< -o $@
LZMALiteral.o : 7zip/7zip/Compress/LZMA/LZMALiteral.cpp
$(CC) $(CFLAGS) -c $< -o $@
OutBuffer.o : 7zip/7zip/Common/OutBuffer.cpp
$(CC) $(CFLAGS) -c $< -o $@
RangeCoderBit.o : 7zip/7zip/Compress/RangeCoder/RangeCoderBit.cpp
$(CC) $(CFLAGS) -c $< -o $@
# -- Some dependencies --
$(OBJS) : Platform.h exehead/config.h
build.o : czlib.h cbzip2.h clzma.h exehead/fileform.h
script.o : exehead/fileform.h tokens.h
# -- Clean script --
clean ::
clean : clean_makensis
$(MAKE) -C exehead clean
$(RM) *.o
$(RM) ../makensis.exe
clean_makensis :
$(RM) -f *.o
$(RM) -f ../makensis.exe
# -- Phony targets --
.PHONY : exehead makensis clean clean_makensis

View file

@ -1,6 +1,8 @@
#ifndef ___PLATFORM__H___
#define ___PLATFORM__H___
// some definitions for non Win32 platforms were taken from MinGW's free Win32 library
// includes
#ifdef _WIN32
@ -10,8 +12,51 @@
# include <Windows.h>
# include <commctrl.h>
#else
# define WORD unsigned short
# define DWORD unsigned long
# ifndef EXEHEAD
# include <string.h>
# include <stdlib.h>
# endif
// basic types
typedef unsigned char BYTE, *PBYTE, *LPBYTE;
typedef unsigned short WORD, *LPWORD;
typedef unsigned long DWORD, *LPDWORD;
typedef unsigned int UINT;
typedef unsigned int UINT32;
typedef int INT;
typedef int INT32;
typedef long LONG;
typedef unsigned long ULONG;
typedef long long INT64;
typedef unsigned long long UINT64;
typedef int BOOL;
typedef void VOID;
typedef void *LPVOID;
typedef char CHAR, *PCHAR, *LPCH, *PCH, *NPSTR, *LPSTR, *PSTR;
typedef const char *LPCCH, *PCSTR, *LPCSTR;
typedef unsigned short WCHAR, *PWCHAR, *LPWCH, *PWCH, *NWPSTR, *LPWSTR, *PWSTR;
typedef const unsigned short *LPCWCH, *PCWCH, *LPCWSTR, *PCWSTR;
typedef unsigned int UINT_PTR;
// basic stuff
typedef unsigned long HANDLE;
typedef unsigned long HKEY;
// some gdi
typedef unsigned long COLORREF;
typedef unsigned long HBRUSH;
// bool
# define FALSE 0
# define TRUE 1
// more
typedef WORD LANGID;
#endif
// system specific
#ifdef _WIN32
# define PATH_SEPARATOR_STR "\\"
# define PATH_SEPARATOR_C '\\'
#else
# define PATH_SEPARATOR_STR "/"
# define PATH_SEPARATOR_C '/'
#endif
// attributes
@ -42,7 +87,7 @@
# define NSISCALL __stdcall // Ordinary functions
# define NSISCALLV __cdecl // Variable-argument-list functions
#else
# ifdef __GNUC__
# if defined(__GNUC__) && defined(__i386__)
# define NSISCALL __attribute__((__stdcall__)) // Ordinary functions
# define NSISCALLV __attribute__((__cdecl__)) // Variable-argument-list functions
# else
@ -51,141 +96,559 @@
# endif
#endif
// macros
#ifndef _WIN32
# ifndef min
# define min(x,y) ((x<y)?x:y)
# endif
# ifndef max
# define max(x,y) ((x>y)?x:y)
# endif
# ifndef FIELD_OFFSET
# define FIELD_OFFSET(t,f) ((LONG)&(((t*)0)->f))
# endif
# ifndef MAKEINTRESOURCE
# define MAKEINTRESOURCE(i) (LPSTR)((DWORD)((WORD)(i)))
# endif
# ifndef IMAGE_FIRST_SECTION
# define IMAGE_FIRST_SECTION(h) ((PIMAGE_SECTION_HEADER) ((DWORD)h+FIELD_OFFSET(IMAGE_NT_HEADERS,OptionalHeader)+((PIMAGE_NT_HEADERS)(h))->FileHeader.SizeOfOptionalHeader))
# endif
# ifndef RGB
# define RGB(r,g,b) ((DWORD)(((BYTE)(r)|((WORD)(g)<<8))|(((DWORD)(BYTE)(b))<<16)))
# endif
# ifndef MAKELONG
# define MAKELONG(a,b) ((LONG)(((WORD)(a))|(((DWORD)((WORD)(b)))<<16)))
# endif
#endif
#ifndef IS_INTRESOURCE
# define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0)
#endif
// functions
#ifndef _WIN32
# define stricmp strcasecmp
# define strcmpi strcasecmp
# define strnicmp strncasecmp
# define CopyMemory memcpy
# define ZeroMemory(x, y) memset(x, 0, y)
#endif
// defines
#ifndef FOF_NOERRORUI
#define FOF_NOERRORUI 0x0400
#endif
#ifndef DS_SHELLFONT
#define DS_SHELLFONT (DS_SETFONT | DS_FIXEDSYS)
# define FOF_NOERRORUI 0x0400
#endif
#ifndef ULONG_PTR
#define ULONG_PTR DWORD
#endif
#ifndef IS_INTRESOURCE
#define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0)
# define ULONG_PTR DWORD
#endif
#ifndef IDC_HAND
#define IDC_HAND MAKEINTRESOURCE(32649)
# define IDC_HAND MAKEINTRESOURCE(32649)
#endif
#ifndef BIF_NEWDIALOGSTYLE
#define BIF_NEWDIALOGSTYLE 0x0040
# define BIF_NEWDIALOGSTYLE 0x0040
#endif
#ifndef TVITEM
#define TVITEM TV_ITEM
# define TVITEM TV_ITEM
#endif
#ifndef TVM_SETITEMHEIGHT
#define TVM_SETITEMHEIGHT (TV_FIRST + 27)
# define TVM_SETITEMHEIGHT (TV_FIRST + 27)
#endif
#ifndef TVM_GETITEMHEIGHT
#define TVM_GETITEMHEIGHT (TV_FIRST + 28)
# define TVM_GETITEMHEIGHT (TV_FIRST + 28)
#endif
#ifndef LVS_EX_LABELTIP
#define LVS_EX_LABELTIP 0x00004000
# define LVS_EX_LABELTIP 0x00004000
#endif
#ifdef __GNUC__ // ((DWORD)-1) may cause parsing errors with MinGW
# ifdef INVALID_FILE_ATTRIBUTES // updated win32api may also set as (DWORD)-1
# undef INVALID_FILE_ATTRIBUTES
#ifndef EXEHEAD
# ifndef SF_TEXT
# define SF_TEXT 1
# endif
# define INVALID_FILE_ATTRIBUTES ((unsigned long)-1)
#else
# ifndef INVALID_FILE_ATTRIBUTES
# define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
# ifndef SF_RTF
# define SF_RTF 2
# endif
#endif
#ifdef __GNUC__
# undef INVALID_FILE_ATTRIBUTES
#endif
#ifndef INVALID_FILE_ATTRIBUTES
# define INVALID_FILE_ATTRIBUTES ((unsigned long) -1)
#endif
// shell folders
#ifdef _WIN32
# include <Shlobj.h>
#endif
#ifndef CSIDL_FLAG_CREATE
#define CSIDL_FLAG_CREATE 0x8000
# define CSIDL_FLAG_CREATE 0x8000
#endif
#ifndef CSIDL_WINDOWS
#define CSIDL_WINDOWS 0x0024
#ifndef CSIDL_PROGRAMS
# define CSIDL_PROGRAMS 0x2
#endif
#ifndef CSIDL_SYSTEM
#define CSIDL_SYSTEM 0x0025
#ifndef CSIDL_COMMON_PROGRAMS
# define CSIDL_COMMON_PROGRAMS 0x17
#endif
#ifndef CSIDL_PROGRAM_FILES
#define CSIDL_PROGRAM_FILES 0x0026
#ifndef CSIDL_PRINTERS
# define CSIDL_PRINTERS 0x4
#endif
#ifndef CSIDL_PROGRAM_FILES_COMMON
#define CSIDL_PROGRAM_FILES_COMMON 0x002b
#ifndef CSIDL_PERSONAL
# define CSIDL_PERSONAL 0x5
#endif
#ifndef CSIDL_COMMON_DOCUMENTS
#define CSIDL_COMMON_DOCUMENTS 0x002e
# define CSIDL_COMMON_DOCUMENTS 0x2E
#endif
#ifndef CSIDL_RESOURCES
#define CSIDL_RESOURCES 0x0038
#ifndef CSIDL_FAVORITES
# define CSIDL_FAVORITES 0x6
#endif
#ifndef CSIDL_RESOURCES_LOCALIZED
#define CSIDL_RESOURCES_LOCALIZED 0x0039
#ifndef CSIDL_COMMON_FAVORITES
# define CSIDL_COMMON_FAVORITES 0x1F
#endif
#ifndef CSIDL_COMMON_ADMINTOOLS
#define CSIDL_COMMON_ADMINTOOLS 0x002f
#ifndef CSIDL_STARTUP
# define CSIDL_STARTUP 0x7
#endif
#ifndef CSIDL_ADMINTOOLS
#define CSIDL_ADMINTOOLS 0x0030
#ifndef CSIDL_COMMON_STARTUP
# define CSIDL_COMMON_STARTUP 0x18
#endif
#ifndef CSIDL_MYPICTURES
#define CSIDL_MYPICTURES 0x0027
#ifndef CSIDL_RECENT
# define CSIDL_RECENT 0x8
#endif
#ifndef CSIDL_COMMON_PICTURES
#define CSIDL_COMMON_PICTURES 0x0036
#ifndef CSIDL_SENDTO
# define CSIDL_SENDTO 0x9
#endif
#ifndef CSIDL_MYMUSIC
#define CSIDL_MYMUSIC 0x000d
#ifndef CSIDL_STARTMENU
# define CSIDL_STARTMENU 0xB
#endif
#ifndef CSIDL_COMMON_MUSIC
#define CSIDL_COMMON_MUSIC 0x0035
#ifndef CSIDL_COMMON_STARTMENU
# define CSIDL_COMMON_STARTMENU 0x16
#endif
#ifndef CSIDL_MYVIDEO
#define CSIDL_MYVIDEO 0x000e
#ifndef CSIDL_DESKTOPDIRECTORY
# define CSIDL_DESKTOPDIRECTORY 0x10
#endif
#ifndef CSIDL_COMMON_VIDEO
#define CSIDL_COMMON_VIDEO 0x0037
#ifndef CSIDL_COMMON_DESKTOPDIRECTORY
# define CSIDL_COMMON_DESKTOPDIRECTORY 0x19
#endif
#ifndef CSIDL_CDBURN_AREA
#define CSIDL_CDBURN_AREA 0x003b
#ifndef CSIDL_NETHOOD
# define CSIDL_NETHOOD 0x13
#endif
#ifndef CSIDL_FONTS
# define CSIDL_FONTS 0x14
#endif
#ifndef CSIDL_TEMPLATES
#define CSIDL_TEMPLATES 0x0015
# define CSIDL_TEMPLATES 0x15
#endif
#ifndef CSIDL_COMMON_TEMPLATES
#define CSIDL_COMMON_TEMPLATES 0x002d
# define CSIDL_COMMON_TEMPLATES 0x2D
#endif
#ifndef CSIDL_PROFILE
#define CSIDL_PROFILE 0x0028
#ifndef CSIDL_APPDATA
# define CSIDL_APPDATA 0x1A
#endif
#ifndef CSIDL_COMMON_APPDATA
#define CSIDL_COMMON_APPDATA 0x0023
# define CSIDL_COMMON_APPDATA 0x23
#endif
#ifndef CSIDL_PRINTHOOD
# define CSIDL_PRINTHOOD 0x1B
#endif
#ifndef CSIDL_ALTSTARTUP
# define CSIDL_ALTSTARTUP 0x1D
#endif
#ifndef CSIDL_COMMON_ALTSTARTUP
# define CSIDL_COMMON_ALTSTARTUP 0x1E
#endif
#ifndef CSIDL_INTERNET_CACHE
# define CSIDL_INTERNET_CACHE 0x20
#endif
#ifndef CSIDL_COOKIES
# define CSIDL_COOKIES 0x21
#endif
#ifndef CSIDL_HISTORY
# define CSIDL_HISTORY 0x22
#endif
#ifndef CSIDL_WINDOWS
# define CSIDL_WINDOWS 0x24
#endif
#ifndef CSIDL_SYSTEM
# define CSIDL_SYSTEM 0x25
#endif
#ifndef CSIDL_PROGRAM_FILES
# define CSIDL_PROGRAM_FILES 0x26
#endif
#ifndef CSIDL_PROGRAM_FILES_COMMON
# define CSIDL_PROGRAM_FILES_COMMON 0x2B
#endif
#ifndef CSIDL_MYPICTURES
# define CSIDL_MYPICTURES 0x27
#endif
#ifndef CSIDL_COMMON_PICTURES
# define CSIDL_COMMON_PICTURES 0x36
#endif
#ifndef CSIDL_PROFILE
# define CSIDL_PROFILE 0x28
#endif
#ifndef CSIDL_ADMINTOOLS
# define CSIDL_ADMINTOOLS 0x30
#endif
#ifndef CSIDL_COMMON_ADMINTOOLS
# define CSIDL_COMMON_ADMINTOOLS 0x2F
#endif
#ifndef CSIDL_MYMUSIC
# define CSIDL_MYMUSIC 0xD
#endif
#ifndef CSIDL_COMMON_MUSIC
# define CSIDL_COMMON_MUSIC 0x35
#endif
#ifndef CSIDL_MYVIDEO
# define CSIDL_MYVIDEO 0xE
#endif
#ifndef CSIDL_COMMON_VIDEO
# define CSIDL_COMMON_VIDEO 0x37
#endif
#ifndef CSIDL_RESOURCES
# define CSIDL_RESOURCES 0x38
#endif
#ifndef CSIDL_RESOURCES_LOCALIZED
# define CSIDL_RESOURCES_LOCALIZED 0x39
#endif
#ifndef CSIDL_CDBURN_AREA
# define CSIDL_CDBURN_AREA 0x3B
#endif
#ifndef CP_ACP
# define CP_ACP 0
#endif
#ifndef COLOR_BTNFACE
# define COLOR_BTNFACE 15
#endif
#ifndef COLOR_WINDOW
# define COLOR_WINDOW 5
#endif
#ifndef RT_BITMAP
# define RT_BITMAP MAKEINTRESOURCE(2)
#endif
#ifndef RT_ICON
# define RT_ICON MAKEINTRESOURCE(3)
#endif
#ifndef RT_DIALOG
# define RT_DIALOG MAKEINTRESOURCE(5)
#endif
#ifndef RT_GROUP_ICON
# define RT_GROUP_ICON MAKEINTRESOURCE(14)
#endif
#ifndef RT_VERSION
# define RT_VERSION MAKEINTRESOURCE(16)
#endif
// message box
#ifndef MB_OK
# define MB_OK 0
# define MB_OKCANCEL 1
# define MB_ABORTRETRYIGNORE 2
# define MB_YESNOCANCEL 3
# define MB_YESNO 4
# define MB_RETRYCANCEL 5
# define MB_DEFBUTTON1 0
# define MB_DEFBUTTON2 256
# define MB_DEFBUTTON3 512
# define MB_DEFBUTTON4 768
# define MB_ICONSTOP 16
# define MB_ICONQUESTION 32
# define MB_ICONEXCLAMATION 48
# define MB_ICONINFORMATION 64
# define MB_SETFOREGROUND 0x10000
# define MB_TOPMOST 0x40000
# define MB_RIGHT 0x80000
#endif
#ifndef IDOK
# define IDOK 1
# define IDCANCEL 2
# define IDABORT 3
# define IDRETRY 4
# define IDIGNORE 5
# define IDYES 6
# define IDNO 7
#endif
// window styles
#ifndef _WIN32
# define WS_CHILD 0x40000000
# define WS_VISIBLE 0x10000000
# define BS_CHECKBOX 2
# define BS_LEFT 256
# define BS_LEFTTEXT 32
# define BS_RADIOBUTTON 4
# define BS_RIGHT 512
# define BS_USERBUTTON 8
# define ES_LEFT 0
# define ES_CENTER 1
# define ES_RIGHT 2
# define SS_BITMAP 14
# define SS_CENTER 1
# define SS_CENTERIMAGE 512
# define SS_ICON 3
# define SS_LEFT 0
# define SS_LEFTNOWORDWRAP 0xc
# define SS_RIGHT 2
# define SS_RIGHTJUST 0x400
# define SS_USERITEM 10
# define SS_TYPEMASK 0x0000001FL
# define DS_FIXEDSYS 8
# define DS_SETFONT 64
# define DS_SHELLFONT (DS_SETFONT | DS_FIXEDSYS)
# define WS_EX_RIGHT 0x1000
# define WS_EX_RIGHTSCROLLBAR 0
# define WS_EX_RTLREADING 0x2000
# define TVS_RTLREADING 64
# define PBS_SMOOTH 1
#endif
// brush styles
#ifndef BS_SOLID
# define BS_SOLID 0
#endif
#ifndef BS_NULL
# define BS_NULL 1
#endif
// reg
#ifndef HKEY_CLASSES_ROOT
# define HKEY_CLASSES_ROOT ((HKEY)0x80000000)
# define HKEY_CURRENT_USER ((HKEY)0x80000001)
# define HKEY_LOCAL_MACHINE ((HKEY)0x80000002)
# define HKEY_USERS ((HKEY)0x80000003)
# define HKEY_PERFORMANCE_DATA ((HKEY)0x80000004)
# define HKEY_CURRENT_CONFIG ((HKEY)0x80000005)
# define HKEY_DYN_DATA ((HKEY)0x80000006)
#endif
// show modes
#ifndef SW_SHOWNORMAL
# define SW_HIDE 0
# define SW_SHOWNORMAL 1
# define SW_SHOWMINIMIZED 2
# define SW_SHOWMAXIMIZED 3
# define SW_SHOWNOACTIVATE 4
# define SW_SHOWMINNOACTIVE 7
# define SW_SHOWNA 8
#endif
// hotkeys
#ifndef HOTKEYF_SHIFT
# define HOTKEYF_SHIFT 1
# define HOTKEYF_CONTROL 2
# define HOTKEYF_ALT 4
# define HOTKEYF_EXT 8
#endif
// vk
#ifndef VK_F1
# define VK_F1 0x70
#endif
// gdi
#ifndef OPAQUE
# define OPAQUE 2
#endif
#ifndef TRANSPARENT
# define TRANSPARENT 1
#endif
// file ops
#ifndef FOF_SILENT
# define FOF_SILENT 4
# define FOF_NOCONFIRMATION 16
# define FOF_FILESONLY 128
# define FOF_SIMPLEPROGRESS 256
# define FOF_NOCONFIRMMKDIR 512
#endif
// file attribs
#ifndef FILE_ATTRIBUTE_READONLY
# define FILE_ATTRIBUTE_READONLY 0x00000001
# define FILE_ATTRIBUTE_HIDDEN 0x00000002
# define FILE_ATTRIBUTE_SYSTEM 0x00000004
# define FILE_ATTRIBUTE_ARCHIVE 0x00000020
# define FILE_ATTRIBUTE_NORMAL 0x00000080
# define FILE_ATTRIBUTE_TEMPORARY 0x00000100
# define FILE_ATTRIBUTE_OFFLINE 0x00001000
#endif
// registry
#ifndef REG_SZ
# define REG_SZ 1
# define REG_EXPAND_SZ 2
# define REG_BINARY 3
# define REG_DWORD 4
#endif
// fopen
#ifndef GENERIC_READ
# define GENERIC_READ 0x80000000
# define GENERIC_WRITE 0x40000000
#endif
#ifndef CREATE_NEW
# define CREATE_NEW 1
# define CREATE_ALWAYS 2
# define OPEN_EXISTING 3
# define OPEN_ALWAYS 4
#endif
// fseek
#ifndef FILE_BEGIN
# define FILE_BEGIN 0
# define FILE_CURRENT 1
# define FILE_END 2
#endif
// PE
#ifndef _WIN32
# define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
# define IMAGE_DOS_SIGNATURE 0x5A4D
# define IMAGE_NT_SIGNATURE 0x00004550
# define IMAGE_FILE_DLL 8192
# define IMAGE_DIRECTORY_ENTRY_EXPORT 0
# define IMAGE_SIZEOF_SHORT_NAME 8
#endif
// structures
#ifndef _WIN32
# pragma pack(2)
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic;
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew;
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
# pragma pack(4)
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Reserved1;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER,*PIMAGE_OPTIONAL_HEADER;
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS;
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions;
DWORD AddressOfNames;
DWORD AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
# pragma pack()
#endif
#endif

View file

@ -3,12 +3,18 @@
#include "Plugins.h"
#include "Platform.h"
#include <WinNT.h>
#include "util.h"
#ifdef _WIN32
# include <WinNT.h>
#else
# include <sys/stat.h>
# include <glob.h>
#endif
extern FILE *g_output;
void Plugins::FindCommands(char* path,bool displayInfo)
void Plugins::FindCommands(char* path, bool displayInfo)
{
if (path)
{
@ -16,11 +22,8 @@ void Plugins::FindCommands(char* path,bool displayInfo)
if (length > 0)
{
WIN32_FIND_DATA data;
HANDLE handle;
if (path[length-1] == '\\' ||
path[length-1] == '/')
char *lc = CharPrev(path, path + strlen(path));
if (*lc == '\\' || *lc == '/')
{
length--;
}
@ -31,21 +34,49 @@ void Plugins::FindCommands(char* path,bool displayInfo)
char* pathAndWildcard = new char [length+7];
strcpy(pathAndWildcard,basePath);
strcat(pathAndWildcard,"\\*.dll");
strcat(pathAndWildcard,PATH_SEPARATOR_STR "*.dll");
#ifdef _WIN32
WIN32_FIND_DATA data;
HANDLE handle;
handle = FindFirstFile(pathAndWildcard,&data);
if (handle != INVALID_HANDLE_VALUE)
{
do
#else
glob_t globbuf;
globbuf.gl_offs = 0;
globbuf.gl_pathc = 0;
if (!glob(pathAndWildcard, 0, NULL, &globbuf))
{
struct stat s;
for (unsigned int i = 0; i < globbuf.gl_pathc; i++)
{
if (stat(globbuf.gl_pathv[i], &s) || !S_ISREG(s.st_mode))
continue;
#endif
#ifdef _WIN32
{
char* dllPath = new char [length+strlen(data.cFileName)+2];
wsprintf(dllPath,"%s\\%s",basePath,data.cFileName);
wsprintf(dllPath,"%s" PATH_SEPARATOR_STR "%s",basePath,data.cFileName);
#else
char *dllPath = new char [strlen(globbuf.gl_pathv[i])+1];
strcpy(dllPath,globbuf.gl_pathv[i]);
#endif
GetExports(dllPath,displayInfo);
delete[] dllPath;
} while (FindNextFile(handle,&data));
}
#ifdef _WIN32
while (FindNextFile(handle,&data));
#else
globfree(&globbuf);
#endif
}
#ifdef _WIN32
delete[] pathAndWildcard;
#endif
delete[] basePath;
}
}
@ -58,24 +89,19 @@ void Plugins::GetExports(char* pathToDll, bool displayInfo)
unsigned char* dlldata = 0;
long dlldatalen = 0;
bool loaded = false;
char dllName[100];
char signature[256];
char dllName[1024];
char signature[1024];
dllName[0] = 0;
char* ptr = strrchr(pathToDll,'\\');
char* ptr = strrchr(pathToDll,PATH_SEPARATOR_C);
if (ptr && *ptr && *(ptr+1)) strcpy(dllName,ptr+1);
// find .dll
char *dllName2 = strdup(dllName);
for (ptr = dllName2; *ptr; ptr = CharNext(ptr))
int len = strlen(dllName);
if (len > 4 && !stricmp(dllName + len - 4, ".dll"))
{
if (!strcmpi(ptr, ".dll"))
{
*(dllName + (ptr - dllName2)) = 0;
break;
}
dllName[len - 4] = 0;
}
free(dllName2);
FILE* dll = fopen(pathToDll,"rb");
if (dll)

View file

@ -20,8 +20,14 @@
3. This notice may not be removed or altered from any source distribution.
*/
#define RESOURCE_EDITOR_NOT_API
#include "ResourceEditor.h"
#include "util.h"
#include <time.h>
#include <queue>
#ifndef _WIN32
# include <iconv.h>
#endif
//////////////////////////////////////////////////////////////////////
// Utilities
@ -195,7 +201,9 @@ BYTE* CResourceEditor::GetResource(char* szType, char* szName, LANGID wLanguage)
i = nameDir->Find(szName);
if (i > -1) {
langDir = nameDir->GetEntry(i)->GetSubDirectory();
i = langDir->Find(wLanguage);
i = 0;
if (wLanguage)
i = langDir->Find(wLanguage);
if (i > -1) {
data = langDir->GetEntry(i)->GetDataEntry();
}
@ -208,7 +216,7 @@ BYTE* CResourceEditor::GetResource(char* szType, char* szName, LANGID wLanguage)
return toReturn;
}
else
return 0;
return NULL;
}
void CResourceEditor::FreeResource(BYTE* pbResource)
@ -381,29 +389,47 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P
// Go through all entries of this resource directory
for (int i = 0; i < rdToScan->Header.NumberOfNamedEntries + rdToScan->Header.NumberOfIdEntries; i++) {
// If this entry points to data entry get a pointer to it
if (!rdToScan->Entries[i].DataIsDirectory)
if (!rdToScan->Entries[i].DirectoryOffset.DataIsDirectory)
rde = PIMAGE_RESOURCE_DATA_ENTRY(rdToScan->Entries[i].OffsetToData + (BYTE*)rdRoot);
// If this entry has a name, translate it from Unicode
if (rdToScan->Entries[i].NameIsString) {
PIMAGE_RESOURCE_DIR_STRING_U rds = PIMAGE_RESOURCE_DIR_STRING_U(rdToScan->Entries[i].NameOffset + (char*)rdRoot);
if (rdToScan->Entries[i].NameString.NameIsString) {
PIMAGE_RESOURCE_DIR_STRING_U rds = PIMAGE_RESOURCE_DIR_STRING_U(rdToScan->Entries[i].NameString.NameOffset + (char*)rdRoot);
#ifdef _WIN32
int mbsSize = WideCharToMultiByte(CP_ACP, 0, rds->NameString, rds->Length, 0, 0, 0, 0);
szName = new char[mbsSize+1];
WideCharToMultiByte(CP_ACP, 0, rds->NameString, rds->Length, szName, mbsSize, 0, 0);
szName[mbsSize] = 0;
#else
{
iconv_t cd = iconv_open("", "UCS-2");
if (cd != (iconv_t) -1)
{
char *in = (char *) rds->NameString;
char *out = szName = new char[rds->Length * 2 + 1];
size_t insize = rds->Length;
size_t outsize = rds->Length * 2 + 1;
if (__iconv_adaptor(iconv, cd, &in, &insize, &out, &outsize) == (size_t) -1)
throw runtime_error("Unicode conversion failed");
iconv_close(cd);
}
else
throw runtime_error("Unicode conversion failed");
}
#endif
}
// Else, set the name to this entry's id
else
szName = MAKEINTRESOURCE(rdToScan->Entries[i].Id);
if (rdToScan->Entries[i].DataIsDirectory)
if (rdToScan->Entries[i].DirectoryOffset.DataIsDirectory)
rdc->AddEntry(
new CResourceDirectoryEntry(
szName,
ScanDirectory(
rdRoot,
PRESOURCE_DIRECTORY(rdToScan->Entries[i].OffsetToDirectory + (BYTE*)rdRoot)
PRESOURCE_DIRECTORY(rdToScan->Entries[i].DirectoryOffset.OffsetToDirectory + (BYTE*)rdRoot)
)
)
);
@ -457,14 +483,15 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) {
qDataEntries2.push(crd->GetEntry(i)->GetDataEntry());
}
IMAGE_RESOURCE_DIRECTORY_ENTRY rDirE = {{0}};
rDirE.DataIsDirectory = crd->GetEntry(i)->IsDataDirectory();
MY_IMAGE_RESOURCE_DIRECTORY_ENTRY rDirE;
ZeroMemory(&rDirE, sizeof(rDirE));
rDirE.DirectoryOffset.DataIsDirectory = crd->GetEntry(i)->IsDataDirectory();
rDirE.Id = (crd->GetEntry(i)->HasName()) ? 0 : crd->GetEntry(i)->GetId();
rDirE.NameIsString = (crd->GetEntry(i)->HasName()) ? 1 : 0;
rDirE.NameString.NameIsString = (crd->GetEntry(i)->HasName()) ? 1 : 0;
CopyMemory(seeker, &rDirE, sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
CopyMemory(seeker, &rDirE, sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY));
crd->GetEntry(i)->m_dwWrittenAt = DWORD(seeker);
seeker += sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
seeker += sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY);
}
qDirs.pop();
}
@ -491,13 +518,36 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) {
while (!qStrings.empty()) {
CResourceDirectoryEntry* cRDirE = qStrings.front();
PIMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_dwWrittenAt)->NameOffset = DWORD(seeker) - DWORD(pbRsrcSec);
PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_dwWrittenAt)->NameString.NameOffset = DWORD(seeker) - DWORD(pbRsrcSec);
char* szName = cRDirE->GetName();
WORD iLen = lstrlen(szName);
WCHAR* szwName = new WCHAR[iLen+1];
WORD iLen = strlen(szName);
WCHAR *szwName = new WCHAR[iLen + 1];
#ifdef _WIN32
// MultiByteToWideChar return value includes the null char, so -1
iLen = MultiByteToWideChar(CP_ACP, 0, szName, iLen, szwName, iLen) - 1;
#else
{
iconv_t cd = iconv_open("UCS-2", "");
if (cd != (iconv_t) -1)
{
char *in = szName;
char *out = (char *) szwName;
size_t insize = iLen + 1;
size_t outsize = (iLen + 1) * sizeof(unsigned short);
if (__iconv_adaptor(iconv, cd, &in, &insize, &out, &outsize) == (size_t) -1)
iLen = (WORD) -1;
else
iLen = (WORD) ((int) out - (int) szwName - 1);
iconv_close(cd);
}
else
iLen = (WORD) -1;
}
#endif
if (iLen == (WORD) -1)
throw runtime_error("Unicode conversion failed");
*(WORD*)seeker = iLen;
seeker += sizeof(WORD);
CopyMemory(seeker, szwName, iLen*sizeof(WCHAR));
@ -536,12 +586,12 @@ void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) {
void CResourceEditor::SetOffsets(CResourceDirectory* resDir, DWORD newResDirAt) {
for (int i = 0; i < resDir->CountEntries(); i++) {
if (resDir->GetEntry(i)->IsDataDirectory()) {
PIMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt)->DataIsDirectory = 1;
PIMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt)->OffsetToDirectory = resDir->GetEntry(i)->GetSubDirectory()->m_dwWrittenAt - newResDirAt;
PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt)->DirectoryOffset.DataIsDirectory = 1;
PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt)->DirectoryOffset.OffsetToDirectory = resDir->GetEntry(i)->GetSubDirectory()->m_dwWrittenAt - newResDirAt;
SetOffsets(resDir->GetEntry(i)->GetSubDirectory(), newResDirAt);
}
else {
PIMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt)->OffsetToData = resDir->GetEntry(i)->GetDataEntry()->m_dwWrittenAt - newResDirAt;
PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt)->OffsetToData = resDir->GetEntry(i)->GetDataEntry()->m_dwWrittenAt - newResDirAt;
}
}
}
@ -587,7 +637,7 @@ void CResourceDirectory::AddEntry(CResourceDirectoryEntry* entry) {
char* szEntName = entry->GetName();
for (i = 0; i < m_rdDir.NumberOfIdEntries; i++) {
char* szName = m_vEntries[i]->GetName();
int cmp = lstrcmp(szName, szEntName);
int cmp = strcmp(szName, szEntName);
delete [] szName;
if (cmp == 0) {
delete [] szEntName;
@ -639,7 +689,7 @@ int CResourceDirectory::Find(char* szName) {
continue;
char* szEntName = m_vEntries[i]->GetName();
int cmp = lstrcmp(szName, szEntName);
int cmp = strcmp(szName, szEntName);
delete [] szEntName;
if (!cmp)
@ -667,7 +717,7 @@ int CResourceDirectory::Find(WORD wId) {
DWORD CResourceDirectory::GetSize() {
DWORD dwSize = sizeof(IMAGE_RESOURCE_DIRECTORY);
for (unsigned int i = 0; i < m_vEntries.size(); i++) {
dwSize += sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
dwSize += sizeof(MY_IMAGE_RESOURCE_DIRECTORY_ENTRY);
if (m_vEntries[i]->HasName())
dwSize += sizeof(IMAGE_RESOURCE_DIR_STRING_U) + (m_vEntries[i]->GetNameLength()+1)*sizeof(WCHAR);
if (m_vEntries[i]->IsDataDirectory())
@ -711,8 +761,8 @@ CResourceDirectoryEntry::CResourceDirectoryEntry(char* szName, CResourceDirector
}
else {
m_bHasName = true;
m_szName = new char[lstrlen(szName)+1];
lstrcpy(m_szName, szName);
m_szName = new char[strlen(szName)+1];
strcpy(m_szName, szName);
}
m_bIsDataDirectory = true;
m_rdSubDir = rdSubDir;
@ -726,8 +776,8 @@ CResourceDirectoryEntry::CResourceDirectoryEntry(char* szName, CResourceDataEntr
}
else {
m_bHasName = true;
m_szName = new char[lstrlen(szName)+1];
lstrcpy(m_szName, szName);
m_szName = new char[strlen(szName)+1];
strcpy(m_szName, szName);
}
m_bIsDataDirectory = false;
m_rdeData = rdeData;
@ -751,13 +801,13 @@ char* CResourceDirectoryEntry::GetName() {
if (!m_bHasName)
return 0;
char* szName = 0;
szName = new char[lstrlen(m_szName)+1];
lstrcpy(szName, m_szName);
szName = new char[strlen(m_szName)+1];
strcpy(szName, m_szName);
return szName;
}
int CResourceDirectoryEntry::GetNameLength() {
return lstrlen(m_szName);
return strlen(m_szName);
}
WORD CResourceDirectoryEntry::GetId() {

View file

@ -27,17 +27,61 @@
#pragma once
#endif // _MSC_VER > 1000
#ifdef RESOURCE_EDITOR_NOT_API
#include "Platform.h"
#include <WinNT.h>
#include <Time.h>
#include <Vector>
#include <Queue>
#include <vector>
#ifdef _WIN32
# include <WinNT.h>
#else
// all definitions for non Win32 platforms were taken from MinGW's free Win32 library
# define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
# define IMAGE_SCN_MEM_DISCARDABLE 0x2000000
# pragma pack(4)
typedef struct _IMAGE_RESOURCE_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
WORD NumberOfNamedEntries;
WORD NumberOfIdEntries;
} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;
typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
DWORD OffsetToData;
DWORD Size;
DWORD CodePage;
DWORD Reserved;
} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
WORD Length;
CHAR NameString[1];
} IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING;
typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
WORD Length;
WCHAR NameString[1];
} IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U;
#endif
#endif // #ifdef RESOURCE_EDITOR_NOT_API
#pragma pack(4)
typedef struct _MY_IMAGE_RESOURCE_DIRECTORY_ENTRY {
union {
struct {
DWORD NameOffset:31;
DWORD NameIsString:1;
} NameString;
DWORD Name;
WORD Id;
};
union {
DWORD OffsetToData;
struct {
DWORD OffsetToDirectory:31;
DWORD DataIsDirectory:1;
} DirectoryOffset;
};
} MY_IMAGE_RESOURCE_DIRECTORY_ENTRY,*PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY;
#include <StdExcept>
#pragma pack()
#include <stdexcept>
using namespace std;
class CResourceDirectory;
@ -47,7 +91,7 @@ class CResourceDataEntry;
// Resource directory with entries
typedef struct RESOURCE_DIRECTORY {
IMAGE_RESOURCE_DIRECTORY Header;
IMAGE_RESOURCE_DIRECTORY_ENTRY Entries[1];
MY_IMAGE_RESOURCE_DIRECTORY_ENTRY Entries[1];
} *PRESOURCE_DIRECTORY;
class CResourceEditor {
@ -83,8 +127,6 @@ private:
void SetOffsets(CResourceDirectory* resDir, DWORD newResDirAt);
};
#ifdef RESOURCE_EDITOR_NOT_API
class CResourceDirectory {
public:
CResourceDirectory(PIMAGE_RESOURCE_DIRECTORY prd);
@ -164,6 +206,4 @@ private:
DWORD m_dwCodePage;
};
#endif // #ifdef RESOURCE_EDITOR_NOT_API
#endif // !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_)

View file

@ -2,11 +2,24 @@
//
//////////////////////////////////////////////////////////////////////
#include "Platform.h"
#include "build.h"
#include "ResourceVersionInfo.h"
#include "Platform.h"
#include "util.h"
#ifdef NSIS_SUPPORT_VERSION_INFO
#ifndef VOS__WINDOWS32
# define VOS__WINDOWS32 4
#endif
#ifndef VFT_APP
# define VFT_APP 1
#endif
#ifndef _WIN32
# include <iconv.h>
#endif
/*
int ValidCodePages[] = {
437, 708, 709, 710, 720, 737, 775, 850, 852, 855, 85, 86, 86, 86, 86, 864,
@ -74,10 +87,33 @@ void CResourceVersionInfo::SetProductVersion(int HighPart, int LowPart)
// Util function - must be freeded
WCHAR* StrToWstrAlloc(const char* istr, int codepage)
{
#ifdef _WIN32
int strSize = MultiByteToWideChar(codepage, 0, istr, -1, 0, 0);
WCHAR* wstr = new WCHAR[strSize];
MultiByteToWideChar(codepage, 0, istr, -1, wstr, strSize);
return wstr;
#else
WCHAR *wstr = NULL;
char cp[128] = "";
if (codepage != CP_ACP)
snprintf(cp, 128, "CP%d", codepage);
iconv_t cd = iconv_open("UCS-2", cp);
if (cd != (iconv_t) -1)
{
int len = strlen(istr);
char *in = (char *) istr;
char *out = (char *) wstr = new WCHAR[len + 1];
size_t insize = len + 1;
size_t outsize = (len + 1) * sizeof(WCHAR);
if (__iconv_adaptor(iconv, cd, &in, &insize, &out, &outsize) == (size_t) -1)
{
delete [] wstr;
wstr = NULL;
}
iconv_close(cd);
}
return wstr;
#endif
}
int GetVersionHeader (LPSTR &p, WORD &wLength, WORD &wValueLength, WORD &wType)
@ -93,7 +129,7 @@ int GetVersionHeader (LPSTR &p, WORD &wLength, WORD &wValueLength, WORD &wType)
wType = *(WORD*)p;
p += sizeof(WORD);
szKey = (WCHAR*)p;
p += (wcslen(szKey) + 1) * sizeof (WCHAR);
p += (WCStrLen(szKey)) * sizeof (WCHAR);
while ( ((long)p % 4) != 0 )
p++;
return p - baseP;
@ -116,7 +152,7 @@ void SaveVersionHeader (GrowBuf &strm, WORD wLength, WORD wValueLength, WORD wTy
strm.add (&wValueLength, sizeof (wValueLength));
strm.add (&wType, sizeof (wType));
keyLen = (wcslen(key) + 1) * sizeof (WCHAR);
keyLen = (WCStrLen(key)) * sizeof (WCHAR);
strm.add ((void*)key, keyLen);
PadStream(strm);
@ -138,7 +174,9 @@ void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index)
WCHAR *KeyName, *KeyValue;
strm.resize(0);
SaveVersionHeader (strm, 0, sizeof (VS_FIXEDFILEINFO), 0, L"VS_VERSION_INFO", &m_FixedInfo);
KeyName = StrToWstrAlloc("VS_VERSION_INFO", CP_ACP);
SaveVersionHeader (strm, 0, sizeof (VS_FIXEDFILEINFO), 0, KeyName, &m_FixedInfo);
delete [] KeyName;
DefineList *pChildStrings = m_ChildStringLists.get_strings(Index);
if ( pChildStrings->getnum() > 0 )
@ -159,7 +197,7 @@ void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index)
p = stringInfoStream.getlen();
KeyName = StrToWstrAlloc(pChildStrings->getname(i), codepage);
KeyValue = StrToWstrAlloc(pChildStrings->getvalue(i), codepage);
SaveVersionHeader (stringInfoStream, 0, wcslen(KeyValue) + 1, 1, KeyName, (void*)KeyValue);
SaveVersionHeader (stringInfoStream, 0, WCStrLen(KeyValue), 1, KeyName, (void*)KeyValue);
delete [] KeyName;
delete [] KeyValue;
wSize = stringInfoStream.getlen() - p;
@ -172,7 +210,9 @@ void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index)
PadStream (strm);
p = strm.getlen();
SaveVersionHeader (strm, 0, 0, 0, L"StringFileInfo", &ZEROS);
KeyName = StrToWstrAlloc("StringFileInfo", CP_ACP);
SaveVersionHeader (strm, 0, 0, 0, KeyName, &ZEROS);
delete [] KeyName;
strm.add (stringInfoStream.get(), stringInfoStream.getlen());
wSize = strm.getlen() - p;
@ -184,11 +224,15 @@ void CResourceVersionInfo::ExportToStream(GrowBuf &strm, int Index)
{
PadStream (strm);
p = strm.getlen();
SaveVersionHeader (strm, 0, 0, 0, L"VarFileInfo", &ZEROS);
KeyName = StrToWstrAlloc("VarFileInfo", CP_ACP);
SaveVersionHeader (strm, 0, 0, 0, KeyName, &ZEROS);
delete [] KeyName;
PadStream (strm);
p1 = strm.getlen();
SaveVersionHeader (strm, 0, 0, 0, L"Translation", &ZEROS);
KeyName = StrToWstrAlloc("Translation", CP_ACP);
SaveVersionHeader (strm, 0, 0, 0, KeyName, &ZEROS);
delete [] KeyName;
// First add selected code language translation
v = MAKELONG(m_ChildStringLists.get_lang(Index), m_ChildStringLists.get_codepage(Index));

View file

@ -9,10 +9,29 @@
#pragma once
#endif // _MSC_VER > 1000
#include "exehead/config.h"
#ifdef NSIS_SUPPORT_VERSION_INFO
#include <algorithm>
using namespace std;
#include "Platform.h"
#include "strlist.h"
#ifndef _WIN32
// all definitions for non Win32 platforms were taken from MinGW's free Win32 library
typedef struct tagVS_FIXEDFILEINFO {
DWORD dwSignature;
DWORD dwStrucVersion;
DWORD dwFileVersionMS;
DWORD dwFileVersionLS;
DWORD dwProductVersionMS;
DWORD dwProductVersionLS;
DWORD dwFileFlagsMask;
DWORD dwFileFlags;
DWORD dwFileOS;
DWORD dwFileType;
DWORD dwFileSubtype;
DWORD dwFileDateMS;
DWORD dwFileDateLS;
} VS_FIXEDFILEINFO;
#endif
struct version_string_list {
int codepage;

View file

@ -3,7 +3,7 @@
#ifndef ___CONSTANTS___H_____
#define ___CONSTANTS___H_____
#include "Lang.h"
#include "lang.h"
struct constantstring {
int name;

View file

@ -12,18 +12,29 @@
#include "ResourceEditor.h"
#include "DialogTemplate.h"
#include "ResourceVersionInfo.h"
#include <Shlobj.h>
#ifndef _WIN32
# include <locale.h>
# include <unistd.h>
# include <limits.h>
# include <stdlib.h>
#endif
int MMapFile::m_iAllocationGranularity = 0;
#ifdef NSIS_CONFIG_COMPRESSION_SUPPORT
#ifdef _WIN32
DWORD WINAPI lzmaCompressThread(LPVOID lpParameter)
#else
void *lzmaCompressThread(void *lpParameter)
#endif
{
CLZMA *Compressor = (CLZMA *) lpParameter;
if (!Compressor)
return 0;
return Compressor->CompressReal();
Compressor->CompressReal();
return 0;
}
#endif
@ -226,19 +237,6 @@ CEXEBuild::CEXEBuild()
#ifdef NSIS_ZLIB_COMPRESS_WHOLE
definedlist.add("NSIS_ZLIB_COMPRESS_WHOLE");
#endif
// Added by Amir Szekely 11th July 2002
// Coded by Robert Rainwater
{
char szNSISDir[NSIS_MAX_STRLEN],*fn2;
GetModuleFileName(NULL,szNSISDir,sizeof(szNSISDir)-sizeof("\\Include"));
fn2=strrchr(szNSISDir,'\\');
if(fn2!=NULL) *fn2=0;
definedlist.add("NSISDIR",(char*)szNSISDir);
lstrcat(szNSISDir, "\\Include");
include_dirs.add(szNSISDir,0);
}
#ifdef NSIS_SUPPORT_STANDARD_PREDEFINES
// Added by Sunil Kamath 11 June 2003
definedlist.add("NSIS_SUPPORT_STANDARD_PREDEFINES");
@ -380,7 +378,7 @@ definedlist.add("NSIS_SUPPORT_LANG_IN_STRINGS");
plugins_processed=0;
#endif
last_used_lang=MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
last_used_lang=NSIS_DEFAULT_LANG;
res_editor=0;
@ -391,7 +389,9 @@ definedlist.add("NSIS_SUPPORT_LANG_IN_STRINGS");
disable_window_icon=0;
#ifdef _WIN32
notify_hwnd=0;
#endif
defcodepage_set=false;
uDefCodePage=CP_ACP;
@ -456,6 +456,60 @@ definedlist.add("NSIS_SUPPORT_LANG_IN_STRINGS");
m_ShellConstants.add("CDBURN_AREA", CSIDL_CDBURN_AREA, CSIDL_CDBURN_AREA);
}
void CEXEBuild::setdirs(char *argv0)
{
char szNSISDir[NSIS_MAX_STRLEN],*fn2;
#ifdef _WIN32
GetModuleFileName(NULL,szNSISDir,sizeof(szNSISDir)-sizeof(PATH_SEPARATOR_STR "Include"));
#else
if (argv0[0] == '.' || argv0[0] == PATH_SEPARATOR_C)
{
getcwd(szNSISDir,sizeof(szNSISDir)-strlen(argv0)-2);
if (szNSISDir[strlen(szNSISDir)-1]!=PATH_SEPARATOR_C)
strcat(szNSISDir,PATH_SEPARATOR_STR);
strcat(szNSISDir,argv0);
}
else
{
char *path = getenv("PATH");
if (path)
{
char *p = path;
char *l = path;
char *e = path + strlen(path);
while (p <= e)
{
if (*p == ':' || !*p)
{
*p = 0;
strncpy(szNSISDir,l,sizeof(szNSISDir)-strlen(argv0)-2);
if (szNSISDir[strlen(szNSISDir)-1]!=PATH_SEPARATOR_C)
strcat(szNSISDir,PATH_SEPARATOR_STR);
strcat(szNSISDir,argv0);
struct stat st;
if (!stat(szNSISDir,&st))
break;
szNSISDir[0]=0;
l = ++p;
}
p = CharNext(p);
}
}
}
#if defined(MAX_PATH) && (NSIS_MAX_STRLEN >= MAX_PATH)
const char buf[NSIS_MAX_STRLEN];
strcpy(buf, szNSISDir);
realpath(buf, szNSISDir);
#endif
#endif
fn2=strrchr(szNSISDir,PATH_SEPARATOR_C);
if(fn2!=NULL) *fn2=0;
definedlist.add("NSISDIR",(char*)szNSISDir);
strcat(szNSISDir, PATH_SEPARATOR_STR "Include");
include_dirs.add(szNSISDir,0);
}
int CEXEBuild::getcurdbsize() { return cur_datablock->getlen(); }
// returns offset in stringblock
@ -484,8 +538,12 @@ int CEXEBuild::add_string(const char *string, int process/*=1*/, WORD codepage/*
int CEXEBuild::add_intstring(const int i) // returns offset in stringblock
{
char i_str[64];
char i_str[128];
#ifdef _WIN32
wsprintf(i_str, "%d", i);
#else
snprintf(i_str, 128, "%d", i);
#endif
return add_string(i_str);
}
@ -495,11 +553,25 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A
const char *p=in;
while (*p)
{
const char *np=CharNextExA(codepage, p, 0);
if (np-p > 1) // multibyte char
const char *np;
#ifdef _WIN32
np = CharNextExA(codepage, p, 0);
#else
{
int l=np-p;
char buf[1024];
snprintf(buf, 1024, "CP%d", codepage);
setlocale(LC_CTYPE, buf);
int len = mblen(p, strlen(p));
if (len > 0)
np = p + len;
else
np = p + 1;
setlocale(LC_CTYPE, "");
}
#endif
if (np - p > 1) // multibyte char
{
int l = np - p;
while (l--)
{
int i = (unsigned char)*p++;
@ -510,9 +582,9 @@ int CEXEBuild::preprocess_string(char *out, const char *in, WORD codepage/*=CP_A
}
continue;
}
int i = (unsigned char)*p;
p=np;
// Test for characters extending into the variable codes
@ -674,12 +746,13 @@ int CEXEBuild::datablock_optimize(int start_offset)
while (left > 0)
{
int l = min(left, build_filebuflen);
int la = l;
void *newstuff = db->get(start_offset + this_len - left, l);
void *oldstuff = db->getmore(pos + this_len - left, l);
void *oldstuff = db->getmore(pos + this_len - left, &la);
int res = memcmp(newstuff, oldstuff, l);
db->release(oldstuff);
db->release(oldstuff, la);
db->release();
if (res)
@ -1168,8 +1241,12 @@ int CEXEBuild::add_section(const char *secname, const char *defname, int expand/
if (defname[0])
{
char buf[32];
char buf[128];
#ifdef _WIN32
wsprintf(buf, "%d", cur_header->blocks[NB_SECTIONS].num);
#else
snprintf(buf, 128, "%d", cur_header->blocks[NB_SECTIONS].num);
#endif
if (definedlist.add(defname, buf))
{
ERROR_MSG("Error: \"%s\" already defined, can't assign section index!\n", defname);
@ -1353,7 +1430,6 @@ int CEXEBuild::resolve_instruction(const char *fn, const char *str, entry *w, in
#ifdef NSIS_SUPPORT_STROPTS
else if (w->which == EW_GETFUNCTIONADDR)
{
char buf[32];
if (w->offsets[1] < 0)
{
ERROR_MSG("Error: GetFunctionAddress requires a real function to get address of.\n");
@ -1363,16 +1439,13 @@ int CEXEBuild::resolve_instruction(const char *fn, const char *str, entry *w, in
if (resolve_call_int(fn,str,w->offsets[1],&w->offsets[1])) return 1;
w->which=EW_ASSIGNVAR;
wsprintf(buf,"%d",w->offsets[1]+1); // +1 here to make 1-based.
w->offsets[1]=add_string(buf);
w->offsets[1]=add_intstring(w->offsets[1]+1); // +1 here to make 1-based.
}
else if (w->which == EW_GETLABELADDR)
{
char buf[32];
if (resolve_jump_int(fn,&w->offsets[1],offs,start,end)) return 1;
w->which=EW_ASSIGNVAR;
wsprintf(buf,"%d",w->offsets[1]);
w->offsets[1]=add_string(buf);
w->offsets[1]=add_intstring(w->offsets[1]);
}
#endif
return 0;
@ -1978,7 +2051,7 @@ again:
SCRIPT_MSG("Done!\n");
#define REMOVE_ICON(id) if (disable_window_icon) { \
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(id), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); \
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(id), NSIS_DEFAULT_LANG); \
if (dlg) { \
CDialogTemplate dt(dlg,uDefCodePage); \
free(dlg); \
@ -1996,7 +2069,7 @@ again:
\
DWORD dwSize; \
dlg = dt.Save(dwSize); \
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(id), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), dlg, dwSize); \
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(id), NSIS_DEFAULT_LANG, dlg, dwSize); \
} \
res_editor->FreeResource(dlg); \
} \
@ -2007,43 +2080,43 @@ again:
init_res_editor();
#ifdef NSIS_CONFIG_LICENSEPAGE
if (!license_normal) {
res_editor->UpdateResource(RT_DIALOG, IDD_LICENSE, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_DIALOG, IDD_LICENSE, NSIS_DEFAULT_LANG, 0, 0);
}
else REMOVE_ICON(IDD_LICENSE);
if (!license_fsrb) {
res_editor->UpdateResource(RT_DIALOG, IDD_LICENSE_FSRB, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_DIALOG, IDD_LICENSE_FSRB, NSIS_DEFAULT_LANG, 0, 0);
}
else REMOVE_ICON(IDD_LICENSE_FSRB);
if (!license_fscb) {
res_editor->UpdateResource(RT_DIALOG, IDD_LICENSE_FSCB, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_DIALOG, IDD_LICENSE_FSCB, NSIS_DEFAULT_LANG, 0, 0);
}
else REMOVE_ICON(IDD_LICENSE_FSCB);
#endif // NSIS_CONFIG_LICENSEPAGE
#ifdef NSIS_CONFIG_COMPONENTPAGE
if (!selcom) {
res_editor->UpdateResource(RT_DIALOG, IDD_SELCOM, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_BITMAP, IDB_BITMAP1, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_DIALOG, IDD_SELCOM, NSIS_DEFAULT_LANG, 0, 0);
res_editor->UpdateResource(RT_BITMAP, IDB_BITMAP1, NSIS_DEFAULT_LANG, 0, 0);
}
else REMOVE_ICON(IDD_SELCOM);
#endif // NSIS_CONFIG_COMPONENTPAGE
if (!dir) {
res_editor->UpdateResource(RT_DIALOG, IDD_DIR, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_DIALOG, IDD_DIR, NSIS_DEFAULT_LANG, 0, 0);
}
else REMOVE_ICON(IDD_DIR);
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
if (!uninstconfirm) {
res_editor->UpdateResource(RT_DIALOG, IDD_UNINST, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_DIALOG, IDD_UNINST, NSIS_DEFAULT_LANG, 0, 0);
}
else REMOVE_ICON(IDD_UNINST);
#endif // NSIS_CONFIG_UNINSTALL_SUPPORT
if (!instlog) {
res_editor->UpdateResource(RT_DIALOG, IDD_INSTFILES, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_DIALOG, IDD_INSTFILES, NSIS_DEFAULT_LANG, 0, 0);
}
else REMOVE_ICON(IDD_INSTFILES);
if (!main) {
res_editor->UpdateResource(RT_DIALOG, IDD_INST, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, 0, 0);
if (!build_compress_whole && !build_crcchk)
res_editor->UpdateResource(RT_DIALOG, IDD_VERIFY, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0);
res_editor->UpdateResource(RT_DIALOG, IDD_VERIFY, NSIS_DEFAULT_LANG, 0, 0);
}
SCRIPT_MSG("Done!\n");
@ -2310,10 +2383,29 @@ int CEXEBuild::write_output(void)
int crc=0;
{
char buffer[1024],*p;
#ifdef _WIN32
char buffer[1024];
char *p;
GetFullPathName(build_output_filename,1024,buffer,&p);
#else
# ifdef PATH_MAX
char buffer[PATH_MAX];
# else
int path_max = pathconf(build_output_filename, _PC_PATH_MAX);
if (path_max <= 0)
path_max = 4096;
char *buffer = (char *) malloc(path_max);
if (!buffer)
buffer = build_output_filename;
# endif
realpath(build_output_filename, buffer);
#endif
notify(MAKENSIS_NOTIFY_OUTPUT, buffer);
INFO_MSG("\nOutput: \"%s\"\n",buffer);
INFO_MSG("\nOutput: \"%s\"\n", buffer);
#if !defined(_WIN32) && defined(PATH_MAX)
if (buffer != build_output_filename)
free(buffer);
#endif
}
FILE *fp = fopen(build_output_filename,"w+b");
if (!fp)
@ -2503,7 +2595,11 @@ int CEXEBuild::write_output(void)
{
int total_out_size_estimate=
exeheader_size_new+sizeof(fh)+build_datablock.getlen()+(build_crcchk?sizeof(int):0);
#ifdef _WIN32
int pc=MulDiv(db_opt_save,1000,db_opt_save+total_out_size_estimate);
#else
int pc=(int)(((long long)db_opt_save*1000)/(db_opt_save+total_out_size_estimate));
#endif
INFO_MSG("Datablock optimizer saved %d bytes (~%d.%d%%).\n",db_opt_save,
pc/10,pc%10);
}
@ -2648,7 +2744,11 @@ int CEXEBuild::write_output(void)
}
INFO_MSG("\n");
{
#ifdef _WIN32
int pc=MulDiv(ftell(fp),1000,total_usize);
#else
int pc=(int)(((long long)ftell(fp)*1000)/(total_usize));
#endif
INFO_MSG("Total size: %10d / %d bytes (%d.%d%%)\n",
ftell(fp),total_usize,pc/10,pc%10);
}
@ -2996,7 +3096,11 @@ void CEXEBuild::warning_fl(const char *s, ...)
void CEXEBuild::ERROR_MSG(const char *s, ...)
{
#ifdef _WIN32
if (display_errors || notify_hwnd)
#else
if (display_errors)
#endif
{
char buf[NSIS_MAX_STRLEN*4];
va_list val;
@ -3055,7 +3159,8 @@ void CEXEBuild::print_warnings()
fflush(g_output);
}
void CEXEBuild::notify(int code, char *data)
#ifdef _WIN32
void CEXEBuild::notify(notify_e code, char *data)
{
if (notify_hwnd)
{
@ -3063,6 +3168,7 @@ void CEXEBuild::notify(int code, char *data)
SendMessage(notify_hwnd, WM_COPYDATA, 0, (LPARAM)&cds);
}
}
#endif
// Added by Ximon Eighteen 5th August 2002
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
@ -3080,8 +3186,8 @@ void CEXEBuild::build_plugin_table(void)
char* searchPath = new char [strlen(nsisdir)+9];
if (searchPath)
{
wsprintf(searchPath,"%s\\plugins",nsisdir);
INFO_MSG("Processing plugin dlls: \"%s\\*.dll\"\n",searchPath);
sprintf(searchPath,"%s" PATH_SEPARATOR_STR "Plugins",nsisdir);
INFO_MSG("Processing plugin dlls: \"%s" PATH_SEPARATOR_STR "*.dll\"\n",searchPath);
m_plugins.FindCommands(searchPath,display_info?true:false);
INFO_MSG("\n");
delete[] searchPath;

View file

@ -1,7 +1,7 @@
#ifndef _BUILD_H_
#define _BUILD_H_
#include <StdExcept>
#include <stdexcept>
using namespace std;
@ -18,9 +18,8 @@ using namespace std;
#ifdef NSIS_SUPPORT_STANDARD_PREDEFINES
// Added by Sunil Kamath 11 June 2003
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
# include <time.h>
# include <sys/stat.h>
#endif
#ifdef NSIS_CONFIG_COMPRESSION_SUPPORT
@ -33,7 +32,7 @@ using namespace std;
#endif//NSIS_CONFIG_COMPRESSION_SUPPORT
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
#include "Plugins.h"
# include "Plugins.h"
#endif //NSIS_CONFIG_PLUGIN_SUPPORT
#ifdef NSIS_CONFIG_CRC_SUPPORT
@ -48,7 +47,7 @@ extern "C"
#define PS_ERROR 50
#define PS_WARNING 100
enum {
enum notify_e {
MAKENSIS_NOTIFY_SCRIPT,
MAKENSIS_NOTIFY_WARNING,
MAKENSIS_NOTIFY_ERROR,
@ -66,6 +65,7 @@ enum {
class CEXEBuild {
public:
CEXEBuild();
void CEXEBuild::setdirs(char *argv0);
~CEXEBuild();
// to add a warning to the compiler's warning list.
@ -104,8 +104,12 @@ class CEXEBuild {
char *curfilename;
FILE *fp;
#ifdef _WIN32
HWND notify_hwnd;
void notify(int code, char *data);
void notify(notify_e code, char *data);
#else
void notify(notify_e code, char *data) { }
#endif
private:
// tokens.cpp

View file

@ -71,7 +71,7 @@ extern "C" {
#endif
#include "../exehead/config.h"
#include <windows.h>
#include "../Platform.h"
#define BZ_RUN 0
#define BZ_FLUSH 1
@ -129,8 +129,8 @@ typedef unsigned short UInt16;
#ifndef EXEHEAD
#define BZALLOC(items) GlobalAlloc(GPTR,items)
#define BZFREE(addr) { if (addr) GlobalFree(addr); }
#define BZALLOC(items) malloc(items)
#define BZFREE(addr) { if (addr) free(addr); }
#define mini_memcpy memcpy
typedef struct {

View file

@ -6,8 +6,16 @@
#include "7zip/7zip/Compress/LZMA/LZMAEncoder.h"
#include "7zip/Common/MyCom.h"
#ifndef _WIN32
# include <sched.h>
#endif
// implemented in build.cpp - simply calls CompressReal
#ifdef _WIN32
DWORD WINAPI lzmaCompressThread(LPVOID lpParameter);
#else
void *lzmaCompressThread(void *arg);
#endif
class CLZMA:
public ICompressor,
@ -18,7 +26,11 @@ class CLZMA:
private:
NCompress::NLZMA::CEncoder *_encoder;
#ifdef _WIN32
HANDLE hCompressionThread;
#else
pthread_t hCompressionThread;
#endif
BYTE *next_in; /* next input byte */
UINT avail_in; /* number of bytes available at next_in */
@ -30,11 +42,38 @@ private:
BOOL finish;
CRITICAL_SECTION cs;
BOOL nt_locked; /* nsis thread locked */
BOOL ct_locked; /* compression thread locked */
long sync_state;
BOOL compressor_finished;
#ifndef _WIN32
# define Sleep(x) sched_yield()
pthread_mutex_t mutex;
// these two lock every targer passed to them, but that's ok becuase
// we use only one target anyway...
long InterlockedExchange(long volatile* target, long value)
{
long oldvalue;
pthread_mutex_lock(&mutex);
oldvalue = *target;
*target = value;
pthread_mutex_unlock(&mutex);
return oldvalue;
}
long InterlockedCompareExchange(long volatile* destination, long exchange, long comperand)
{
long oldvalue;
pthread_mutex_lock(&mutex);
oldvalue = *destination;
if (oldvalue == comperand)
*destination = exchange;
pthread_mutex_unlock(&mutex);
return oldvalue;
}
#endif
public:
MY_UNKNOWN_IMP
@ -42,18 +81,27 @@ public:
{
_encoder = new NCompress::NLZMA::CEncoder();
_encoder->SetWriteEndMarkerMode(true);
#ifdef _WIN32
hCompressionThread = NULL;
#else
hCompressionThread = 0;
#endif
compressor_finished = FALSE;
finish = FALSE;
ct_locked = TRUE;
#ifndef _WIN32
pthread_mutex_init(&mutex, 0);
#endif
compressor_finished = 1;
sync_state = 0;
End();
InitializeCriticalSection(&cs);
}
virtual ~CLZMA()
{
#ifndef _WIN32
pthread_mutex_destroy(&mutex);
#endif
End();
DeleteCriticalSection(&cs);
if (_encoder)
{
delete _encoder;
@ -65,8 +113,7 @@ public:
{
End();
nt_locked = TRUE;
ct_locked = FALSE;
sync_state = 1;
compressor_finished = FALSE;
finish = FALSE;
@ -103,27 +150,26 @@ public:
int End()
{
if (!compressor_finished && !ct_locked)
// is compressor not finished and waiting for input/output?
if (hCompressionThread && !compressor_finished && sync_state == 0)
{
// kill compression thread
avail_in = 0;
avail_out = 0;
finish = TRUE;
LeaveCriticalSection(&cs);
while (!ct_locked)
Sleep(0);
nt_locked = FALSE;
EnterCriticalSection(&cs);
while (ct_locked)
Sleep(0);
nt_locked = TRUE;
LeaveCriticalSection(&cs);
InterlockedExchange(&sync_state, 1);
while (InterlockedCompareExchange(&sync_state, 2, 0) != 0)
Sleep(1);
}
#ifdef _WIN32
if (hCompressionThread)
{
CloseHandle(hCompressionThread);
hCompressionThread = NULL;
}
#else
hCompressionThread = 0;
#endif
SetNextOut(NULL, 0);
SetNextIn(NULL, 0);
return C_OK;
@ -131,12 +177,6 @@ public:
int CompressReal()
{
EnterCriticalSection(&cs);
ct_locked = TRUE;
while (nt_locked)
Sleep(0);
try
{
if (_encoder->WriteCoderProperties(this) == S_OK)
@ -168,8 +208,7 @@ public:
}
compressor_finished = TRUE;
LeaveCriticalSection(&cs);
ct_locked = FALSE;
InterlockedExchange(&sync_state, 0);
return C_OK;
}
@ -188,31 +227,26 @@ public:
if (!hCompressionThread)
{
#ifdef _WIN32
DWORD dwThreadId;
hCompressionThread = CreateThread(0, 0, lzmaCompressThread, (LPVOID) this, 0, &dwThreadId);
if (!hCompressionThread)
#else
if (pthread_create(&hCompressionThread, NULL, lzmaCompressThread, (LPVOID) this))
#endif
return -2;
}
else
{
LeaveCriticalSection(&cs);
InterlockedExchange(&sync_state, 1);
}
while (!ct_locked)
Sleep(0);
nt_locked = FALSE;
EnterCriticalSection(&cs);
nt_locked = TRUE;
while (ct_locked)
Sleep(0);
while (InterlockedCompareExchange(&sync_state, 2, 0) != 0)
Sleep(1);
if (compressor_finished)
{
LeaveCriticalSection(&cs);
return res;
}
@ -221,17 +255,9 @@ public:
void GetMoreIO()
{
LeaveCriticalSection(&cs);
while (!nt_locked)
Sleep(0);
ct_locked = FALSE;
EnterCriticalSection(&cs);
ct_locked = TRUE;
while (nt_locked)
Sleep(0);
InterlockedExchange(&sync_state, 0);
while (InterlockedCompareExchange(&sync_state, 2, 1) != 1)
Sleep(1);
}
STDMETHOD(Read)(void *data, UINT32 size, UINT32 *processedSize)

View file

@ -69,7 +69,7 @@ char *ValidateTempDir()
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow)
{
int ret = 2;
static int ret;
const char *m_Err = _LANG_ERRORWRITINGTEMP;
int cl_flags = 0;

View file

@ -10,6 +10,8 @@ BZIP2_OBJS = Release-bzip2/bgbg.o Release-bzip2/exec.o Release-bzip2/fileform.o
LZMA_SRCS = bgbg.c exec.c fileform.c main.c ui.c util.c ../crc32.c resource.rc ../7zip/LZMADecode.c
LZMA_OBJS = Release-lzma/bgbg.o Release-lzma/exec.o Release-lzma/fileform.o Release-lzma/main.o Release-lzma/ui.o Release-lzma/util.o Release-lzma/crc32.o Release-lzma/resource.res Release-lzma/LZMADecode.o
SRCS = $(ZLIB_SRCS) $(BZIP2_SRCS) $(LZMA_SRCS)
LIBS = -lole32 -lgdi32 -lversion -luuid -lcomctl32 -lkernel32 -luser32 -lshell32 -ladvapi32
# -- Programs --
@ -17,13 +19,18 @@ CC = gcc
RC = windres
RM = rm
MKDIR = mkdir
BIN2H = ./bin2h
# -- Compilers and linker flags --
DEFINES = -DWIN32 -D_WINDOWS_ -DEXEHEAD -DWIN32_LEAN_AND_MEAN -DZEXPORT=__stdcall -DLZMACALL=__stdcall
CFLAGS = -Wall -Os -fno-common -fomit-frame-pointer -fno-inline $(DEFINES)
LFLAGS = -s -mwindows -nostdlib -nostartfiles --enable-stdcall-fixup -Wl,-Bdynamic -Wl,--file-alignment,512 -Wl,--exclude-libs,msvcrt.a -Wl,-e,_WinMain@16 -Wl,sections_script.ld
CPPFLAGS = -DEXEHEAD -DWIN32_LEAN_AND_MEAN -DZEXPORT=__stdcall -DLZMACALL=__fastcall
CFLAGS = -Wall -Os
LDFLAGS = -s -mwindows -nostdlib -nostartfiles --enable-stdcall-fixup -Wl,-Bdynamic -Wl,--file-alignment,512 -Wl,--exclude-libs,msvcrt.a -Wl,-e,_WinMain@16 -Wl,sections_script -Wl,-Map,$(subst .exe,.map,$@)
RCFLAGS = --input-format rc --output-format coff
vpath %.c .:..:../zlib:../bzip2:../7zip
%c : config.h fileform.h
all : exehead_zlib exehead_bzip2 exehead_lzma exehead_resources
missing_dirs = $(filter-out $(wildcard Release-*),Release-zlib Release-bzip2 Release-lzma)
@ -34,75 +41,99 @@ else
mkdirline =
endif
dirs:
dirs :
$(mkdirline)
exehead_zlib : dirs $(ZLIB_SRCS) $(ZLIB_OBJS) sections_script
$(CC) $(CFLAGS) $(LFLAGS) -o Release-zlib/exehead_zlib.exe $(ZLIB_OBJS) $(LIBS)
bin2h Release-zlib/exehead_zlib.exe Release-zlib/exehead_zlib.h zlib_header_data
%.o : dirs
exehead_bzip2 : dirs $(BZIP2_SRCS) $(BZIP2_OBJS) sections_script
$(CC) $(CFLAGS) $(LFLAGS) -o Release-bzip2/exehead_bzip2.exe $(BZIP2_OBJS) $(LIBS)
bin2h Release-bzip2/exehead_bzip2.exe Release-bzip2/exehead_bzip2.h bzip2_header_data
exehead_zlib : Release-zlib/exehead_zlib.exe Release-zlib/exehead_zlib.h
exehead_lzma : dirs $(LZMA_SRCS) $(LZMA_OBJS) sections_script
$(CC) $(CFLAGS) $(LFLAGS) -o Release-lzma/exehead_lzma.exe $(LZMA_OBJS) $(LIBS)
bin2h Release-lzma/exehead_lzma.exe Release-lzma/exehead_lzma.h lzma_header_data
Release-zlib/exehead_zlib.exe : $(ZLIB_OBJS) sections_script
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(ZLIB_OBJS) $(LIBS)
exehead_resources : exehead_zlib
bin2h bitmap1.bmp Release-zlib/bitmap1.h bitmap1_data
bin2h nsis.ico Release-zlib/icon.h icon_data
bin2h uninst.ico Release-zlib/unicon.h unicon_data
Release-zlib/exehead_zlib.h : Release-zlib/exehead_zlib.exe
$(BIN2H) $< $@ zlib_header_data
sections_script:
echo SECTIONS > sections_script.ld
echo { >> sections_script.ld
echo .text : { *(.text) } >> sections_script.ld
echo .data : { *(.data) } >> sections_script.ld
echo .rdata : { *(.rdata) } >> sections_script.ld
echo .bss : { *(.bss) } >> sections_script.ld
echo .idata : { *(.idata) } >> sections_script.ld
echo .ndata BLOCK(__section_alignment__) : { [ .ndata ] } >> sections_script.ld
echo .rsrc : { *(.rsrc) } >> sections_script.ld
echo } >> sections_script.ld
Release-zlib/%.o : %.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
Release-zlib/resource.res : resource.rc resource.h config.h
$(RC) $(RCFLAGS) -o $@ -i $<
exehead_bzip2 : Release-bzip2/exehead_bzip2.exe Release-bzip2/exehead_bzip2.h
Release-bzip2/exehead_bzip2.exe : $(BZIP2_OBJS) sections_script
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(BZIP2_OBJS) $(LIBS)
Release-bzip2/exehead_bzip2.h : Release-bzip2/exehead_bzip2.exe
$(BIN2H) $< $@ bzip2_header_data
Release-bzip2/%.o : %.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
Release-bzip2/resource.res : resource.rc resource.h config.h
$(RC) $(RCFLAGS) -o $@ -i $<
exehead_lzma : Release-lzma/exehead_lzma.exe Release-lzma/exehead_lzma.h
Release-lzma/exehead_lzma.exe : $(LZMA_OBJS) sections_script
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(LZMA_OBJS) $(LIBS)
Release-lzma/exehead_lzma.h : Release-lzma/exehead_lzma.exe
$(BIN2H) $< $@ lzma_header_data
Release-lzma/%.o : %.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
Release-lzma/resource.res : resource.rc resource.h config.h
$(RC) $(RCFLAGS) -o $@ -i $<
exehead_resources : Release-zlib/bitmap1.h Release-zlib/icon.h Release-zlib/unicon.h
Release-zlib/bitmap1.h : bitmap1.bmp
$(BIN2H) bitmap1.bmp Release-zlib/bitmap1.h bitmap1_data
Release-zlib/icon.h : nsis.ico
$(BIN2H) nsis.ico Release-zlib/icon.h icon_data
Release-zlib/unicon.h : uninst.ico
$(BIN2H) uninst.ico Release-zlib/unicon.h unicon_data
sections_script:
echo "SECTIONS" > sections_script
echo "{" >> sections_script
echo " .text : { *(.text) }" >> sections_script
echo " .data : { *(.data) }" >> sections_script
echo " .rdata : { *(.rdata) }" >> sections_script
echo " .bss : { *(.bss) }" >> sections_script
echo " .idata : { *(.idata) }" >> sections_script
echo " .ndata BLOCK(__section_alignment__) : { [ .ndata ] }" >> sections_script
echo " .rsrc : { *(.rsrc) }" >> sections_script
echo "}" >> sections_script
Release-zlib/ = -DNSIS_COMPRESS_USE_ZLIB
Release-bzip2/ = -DNSIS_COMPRESS_USE_BZIP2
Release-lzma/ = -DNSIS_COMPRESS_USE_LZMA
getdefine = $($(dir $@))
Release-zlib/%.o Release-bzip2/%.o Release-lzma/%.o : %.c $(DEPENDS)
$(CC) $(CFLAGS) $(getdefine) -c $< -o $@
Release-zlib/%.o Release-bzip2/%.o Release-lzma/%.o : ../%.c $(DEPENDS)
$(CC) $(CFLAGS) $(getdefine) -c $< -o $@
Release-zlib/%.o Release-bzip2/%.o Release-lzma/%.o : ../zlib/%.c $(DEPENDS)
$(CC) $(CFLAGS) $(getdefine) -c $< -o $@
Release-zlib/%.o Release-bzip2/%.o Release-lzma/%.o : ../bzip2/%.c $(DEPENDS)
$(CC) $(CFLAGS) $(getdefine) -c $< -o $@
Release-zlib/%.o Release-bzip2/%.o Release-lzma/%.o : ../7zip/%.c $(DEPENDS)
$(CC) $(CFLAGS) $(getdefine) -c $< -o $@
%/resource.res : resource.rc resource.h config.h Makefile
$(RC) $(RCFLAGS) -o $*/resource.res -i resource.rc
CFLAGS =: $(CFLAGS) $(getdefine)
clean ::
$(RM) sections_script.ld
$(RM) Release-zlib/*.o
$(RM) Release-zlib/resource.res
$(RM) Release-zlib/exehead_zlib.exe
$(RM) Release-zlib/exehead_zlib.h
$(RM) Release-zlib/bitmap1.h
$(RM) Release-zlib/icon.h
$(RM) Release-zlib/unicon.h
$(RM) Release-bzip2/*.o
$(RM) Release-bzip2/resource.res
$(RM) Release-bzip2/exehead_bzip2.exe
$(RM) Release-bzip2/exehead_bzip2.h
$(RM) Release-lzma/*.o
$(RM) Release-lzma/resource.res
$(RM) Release-lzma/exehead_lzma.exe
$(RM) Release-lzma/exehead_lzma.h
$(RM) -f sections_script
$(RM) -f Release-zlib/*.o
$(RM) -f Release-zlib/resource.res
$(RM) -f Release-zlib/exehead_zlib.exe
$(RM) -f Release-zlib/exehead_zlib.h
$(RM) -f Release-zlib/bitmap1.h
$(RM) -f Release-zlib/icon.h
$(RM) -f Release-zlib/unicon.h
$(RM) -f Release-bzip2/*.o
$(RM) -f Release-bzip2/resource.res
$(RM) -f Release-bzip2/exehead_bzip2.exe
$(RM) -f Release-bzip2/exehead_bzip2.h
$(RM) -f Release-lzma/*.o
$(RM) -f Release-lzma/resource.res
$(RM) -f Release-lzma/exehead_lzma.exe
$(RM) -f Release-lzma/exehead_lzma.h
.PHONY : exehead_zlib exehead_bzip2 exehead_lzma exehead_resources dirs clean

View file

@ -794,7 +794,7 @@ static int NSISCALL _sumsecsfield(int idx)
#ifdef NSIS_CONFIG_COMPONENTPAGE
if (sections[x].flags & SF_SELECTED)
#endif
total += sections[x].fields[idx];
total += ((int *)&sections[x])[idx];
}
return total;
}

View file

@ -24,7 +24,7 @@ typedef struct _stack_t {
static stack_t *g_st;
#endif
union exec_flags g_exec_flags;
exec_flags g_exec_flags;
#if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT)
HRESULT g_hres;
@ -212,16 +212,16 @@ static int NSISCALL ExecuteEntry(entry *entry_)
break;
#endif//NSIS_CONFIG_VISIBLE_SUPPORT
case EW_SETFLAG:
g_exec_flags.flags[parm0]=GetIntFromParm(1);
FIELDN(g_exec_flags,parm0)=GetIntFromParm(1);
break;
case EW_IFFLAG:
{
int f=lent.offsets[!g_exec_flags.flags[parm2]];
g_exec_flags.flags[parm2]&=parm3;
int f=lent.offsets[!FIELDN(g_exec_flags,parm2)];
FIELDN(g_exec_flags,parm2)&=parm3;
return f;
}
case EW_GETFLAG:
myitoa(var0,g_exec_flags.flags[parm1]);
myitoa(var0,FIELDN(g_exec_flags,parm1));
break;
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
case EW_CHDETAILSVIEW:

View file

@ -1,7 +1,7 @@
#ifndef _EXEC_H_
#define _EXEC_H_
extern union exec_flags g_exec_flags;
extern exec_flags g_exec_flags;
int NSISCALL ExecuteCodeSegment(int pos, HWND hwndProgress); // returns 0 on success

View file

@ -315,18 +315,14 @@ typedef struct
#define SF_EXPAND 32
#define SF_PSELECTED 64
typedef union
typedef struct
{
struct
{
int name_ptr; // '' for non-optional components
int install_types; // bits set for each of the different install_types, if any.
int flags; // SF_* - defined above
int code;
int code_size;
int size_kb;
};
int fields[1];
int name_ptr; // '' for non-optional components
int install_types; // bits set for each of the different install_types, if any.
int flags; // SF_* - defined above
int code;
int code_size;
int size_kb;
} section;
#define SECTION_OFFSET(field) (FIELD_OFFSET(section, field)/sizeof(int))
@ -395,6 +391,7 @@ typedef struct
int parms[5];
} page;
// text/bg color
#define CC_TEXT 1
#define CC_TEXT_SYS 2
#define CC_BK 4
@ -410,6 +407,42 @@ typedef struct {
int flags;
} ctlcolors;
// $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value.
// Added by ramon 3 jun 2003
#define NS_SKIP_CODE 252
#define NS_VAR_CODE 253
#define NS_SHELL_CODE 254
#define NS_LANG_CODE 255
#define NS_CODES_START NS_SKIP_CODE
#define CODE_SHORT(x) (WORD)((((WORD)x & 0x7F) | (((WORD)x & 0x3F80) << 1) | 0x8080))
#define MAX_CODED 16383
#define NSIS_INSTDIR_INVALID 1
#define NSIS_INSTDIR_NOT_ENOUGH_SPACE 2
typedef struct
{
int autoclose;
int all_user_var;
int exec_error;
int abort;
#ifdef NSIS_SUPPORT_REBOOT
int exec_reboot;
#endif
int cur_insttype;
int insttype_changed;
#ifdef NSIS_CONFIG_SILENT_SUPPORT
int silent;
#endif
int instdir_error;
int rtl;
} exec_flags;
#define FIELDN(x, y) (((int *)&x)[y])
#ifdef EXEHEAD
// the following are only used/implemented in exehead, not makensis.
int NSISCALL isheader(firstheader *h); // returns 0 on not header, length_of_datablock on success
@ -431,41 +464,6 @@ extern int g_quit_flag;
BOOL NSISCALL ReadSelfFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead);
DWORD NSISCALL SetSelfFilePointer(LONG lDistanceToMove);
// $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value.
// Added by ramon 3 jun 2003
#define NS_SKIP_CODE 252
#define NS_VAR_CODE 253
#define NS_SHELL_CODE 254
#define NS_LANG_CODE 255
#define NS_CODES_START NS_SKIP_CODE
#define CODE_SHORT(x) (WORD)((((WORD)x & 0x7F) | (((WORD)x & 0x3F80) << 1) | 0x8080))
#define MAX_CODED 16383
#define NSIS_INSTDIR_INVALID 1
#define NSIS_INSTDIR_NOT_ENOUGH_SPACE 2
union exec_flags {
struct {
int autoclose;
int all_user_var;
int exec_error;
int abort;
#ifdef NSIS_SUPPORT_REBOOT
int exec_reboot;
#endif
int cur_insttype;
int insttype_changed;
#ifdef NSIS_CONFIG_SILENT_SUPPORT
int silent;
#endif
int instdir_error;
int rtl;
};
int flags[1];
};
#ifdef EXEHEAD
extern struct block_header g_blocks[BLOCKS_NUM];
extern header *g_header;
extern int g_flags;

View file

@ -4,9 +4,8 @@
#include "state.h"
#include "config.h"
#include "lang.h"
#include "exec.h"
#include "fileform.h"
#include "exec.h"
#include "ui.h"
#ifdef NSIS_CONFIG_LOG

View file

@ -3,7 +3,7 @@
#include <stdlib.h>
#include "build.h"
#include "DialogTemplate.h"
#include "exehead\resource.h"
#include "exehead/resource.h"
extern const char *NSIS_VERSION;
@ -313,14 +313,14 @@ int CEXEBuild::GenerateLangTables() {
init_res_editor();
#define ADD_FONT(id) { \
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(id), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); \
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(id), NSIS_DEFAULT_LANG); \
if (dlg) { \
CDialogTemplate td(dlg); \
free(dlg); \
td.SetFont(build_font, build_font_size); \
DWORD dwSize; \
dlg = td.Save(dwSize); \
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(id), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), dlg, dwSize); \
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(id), NSIS_DEFAULT_LANG, dlg, dwSize); \
res_editor->FreeResource(dlg); \
} \
}
@ -368,7 +368,7 @@ int CEXEBuild::GenerateLangTables() {
init_res_editor();
#define ADD_FONT(id) { \
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(id), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); \
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(id), NSIS_DEFAULT_LANG); \
if (dlg) { \
CDialogTemplate td(dlg,lt[i].nlf.m_uCodePage); \
free(dlg); \
@ -376,7 +376,7 @@ int CEXEBuild::GenerateLangTables() {
if (lt[i].nlf.m_bRTL) td.ConvertToRTL(); \
DWORD dwSize; \
dlg = td.Save(dwSize); \
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(id+cur_offset), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), dlg, dwSize); \
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(id+cur_offset), NSIS_DEFAULT_LANG, dlg, dwSize); \
res_editor->FreeResource(dlg); \
} \
}
@ -720,6 +720,14 @@ char SkipComments(FILE *f) {
return c;
}
#ifndef _WIN32
BOOL IsValidCodePage(UINT CodePage)
{
// FIXME make a real check
return TRUE;
}
#endif
// NSIS Language File parser
LanguageTable * CEXEBuild::LoadLangFile(char *filename) {
FILE *f = fopen(filename, "r");

View file

@ -36,6 +36,9 @@ const char *NSIS_VERSION="v2.0";
#include "Platform.h"
#include <stdio.h>
#include <signal.h>
#ifdef _WIN32
# include <direct.h>
#endif
#include "build.h"
#include "util.h"
@ -86,6 +89,8 @@ int main(int argc, char **argv)
int tmpargpos=1;
int no_logo=0;
build.setdirs(argv[0]);
if (argc > 1 && !stricmp(argv[1], "/VERSION"))
{
fprintf(g_output,NSIS_VERSION);
@ -217,9 +222,14 @@ int main(int argc, char **argv)
}
else if (!stricmp(argv[argpos],"/NOTIFYHWND"))
{
#ifdef _WIN32
build.notify_hwnd=(HWND)atol(argv[++argpos]);
if (!IsWindow(build.notify_hwnd))
build.notify_hwnd=0;
#else
argpos++;
build.warning("/NOTIFYHWND is disabled for non Win32 platforms.");
#endif
}
else if (!stricmp(argv[argpos],"/HDRINFO"))
{
@ -257,12 +267,11 @@ int main(int argc, char **argv)
{
g_noconfig=1;
char exepath[1024];
GetModuleFileName(NULL,exepath,sizeof(exepath)-1);
//strncpy(exepath,argv[0],1023);
strncpy(exepath,argv[0],sizeof(exepath)-1);
exepath[1023]=0;
char *p=exepath;
while (*p) p++;
while (p > exepath && *p != '\\') p=CharPrev(exepath,p);
while (p > exepath && *p != PATH_SEPARATOR_C) p=CharPrev(exepath,p);
if (p>exepath) p++;
strcpy(p,"nsisconf.nsh");
FILE *cfg=fopen(exepath,"rt");
@ -320,11 +329,19 @@ int main(int argc, char **argv)
}
if (do_cd)
{
char dirbuf[1024],*p;
char dirbuf[1024]="";
char *p;
#ifdef _WIN32
GetFullPathName(sfile,sizeof(dirbuf),dirbuf,&p);
p=dirbuf;
while (*p) p++;
while (p > dirbuf && *p != '\\') p=CharPrev(dirbuf,p);
p=CharPrev(dirbuf,p);
#else
getcwd(dirbuf,sizeof(dirbuf)-strlen(sfile)-2);
if (dirbuf[strlen(dirbuf)-1]!=PATH_SEPARATOR_C)
strcat(dirbuf,PATH_SEPARATOR_STR);
strcat(dirbuf,sfile);
p=strrchr(dirbuf,PATH_SEPARATOR_C);
#endif
if (!p) p=dirbuf;
*p=0;
if (dirbuf[0])
{
@ -333,7 +350,7 @@ int main(int argc, char **argv)
fprintf(g_output,"Changing directory to: \"%s\"\n",dirbuf);
fflush(g_output);
}
if (!SetCurrentDirectory(dirbuf))
if (chdir(dirbuf))
{
if (build.display_errors)
{

View file

@ -1,9 +1,6 @@
#include "Platform.h"
#include <stdio.h>
#include <shlobj.h>
#define _RICHEDIT_VER 0x0200
#include <RichEdit.h>
#undef _RICHEDIT_VER
#include <ctype.h>
#include "tokens.h"
#include "build.h"
#include "util.h"
@ -13,6 +10,12 @@
#include "lang.h"
#include "exehead/resource.h"
#ifndef _WIN32
# include <sys/stat.h>
# include <time.h>
# include <glob.h>
#endif
#define MAX_INCLUDEDEPTH 10
#define MAX_LINELENGTH 4096
@ -56,6 +59,7 @@ char *CEXEBuild::set_timestamp_predefine(char *filename)
}
char timestampbuf[256] = "";
#ifdef _WIN32
char datebuf[128] = "";
char timebuf[128] = "";
WIN32_FIND_DATA fd;
@ -76,6 +80,17 @@ char *CEXEBuild::set_timestamp_predefine(char *filename)
definedlist.add("__TIMESTAMP__",timestampbuf);
}
#else
struct stat st;
if (!stat(filename, &st))
{
ctime_r(&st.st_mtime, timestampbuf);
char *p = timestampbuf + strlen(timestampbuf);
while (!*p || *p == '\n')
*p-- = 0;
definedlist.add("__TIMESTAMP__",timestampbuf);
}
#endif
return oldtimestamp;
}
@ -92,8 +107,8 @@ void CEXEBuild::restore_timestamp_predefine(char *oldtimestamp)
char *CEXEBuild::set_line_predefine(int linecnt, BOOL is_macro)
{
char* linebuf = NULL;
char temp[8] = "";
wsprintf(temp,"%d",linecnt);
char temp[128] = "";
sprintf(temp,"%d",linecnt);
char *oldline = definedlist.find("__LINE__");
if(oldline) {
@ -102,7 +117,7 @@ char *CEXEBuild::set_line_predefine(int linecnt, BOOL is_macro)
}
if(is_macro && oldline) {
linebuf = (char *)malloc(strlen(oldline)+strlen(temp)+2);
wsprintf(linebuf,"%s.%s",oldline,temp);
sprintf(linebuf,"%s.%s",oldline,temp);
}
else {
linebuf = strdup(temp);
@ -126,23 +141,30 @@ void CEXEBuild::set_date_time_predefines()
{
time_t etime;
struct tm * ltime;
SYSTEMTIME stime;
char datebuf[32];
char timebuf[32];
char datebuf[128];
char timebuf[128];
time(&etime);
ltime = localtime(&etime);
#ifdef _WIN32
SYSTEMTIME stime;
stime.wYear = ltime->tm_year+1900;
stime.wMonth = ltime->tm_mon + 1;
stime.wDay = ltime->tm_mday;
stime.wHour= ltime->tm_hour;
stime.wMinute= ltime->tm_min;
stime.wSecond= ltime->tm_sec;
stime.wMilliseconds= 0;
GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &stime, NULL, datebuf, sizeof(datebuf));
stime.wHour= ltime->tm_hour;
stime.wMinute= ltime->tm_min;
stime.wSecond= ltime->tm_sec;
stime.wMilliseconds= 0;
GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &stime, NULL, datebuf, sizeof(datebuf));
definedlist.add("__DATE__",(char *)datebuf);
GetTimeFormat(LOCALE_USER_DEFAULT, 0, &stime, NULL, timebuf, sizeof(timebuf));
GetTimeFormat(LOCALE_USER_DEFAULT, 0, &stime, NULL, timebuf, sizeof(timebuf));
definedlist.add("__TIME__",(char *)timebuf);
#else
strftime(datebuf, sizeof(datebuf), "%x", ltime);
definedlist.add("__DATE__",(char *)datebuf);
strftime(timebuf, sizeof(timebuf), "%X", ltime);
definedlist.add("__TIME__",(char *)timebuf);
#endif
}
void CEXEBuild::del_date_time_predefines()
@ -841,7 +863,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
char *p=str;
str[0]=0;
fgets(str,MAX_LINELENGTH,fp);
//SCRIPT_MSG("%s%s", str, str[lstrlen(str)-1]=='\n'?"":"\n");
//SCRIPT_MSG("%s%s", str, str[strlen(str)-1]=='\n'?"":"\n");
if (feof(fp) && !str[0])
{
ERROR_MSG("!macro \"%s\": unterminated (no !macroend found in file)!\n",line.gettoken_str(1));
@ -1892,7 +1914,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
try {
init_res_editor();
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INSTFILES), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INSTFILES), NSIS_DEFAULT_LANG);
if (!dlg) throw runtime_error("IDD_INSTFILES doesn't exist!");
CDialogTemplate dt(dlg,uDefCodePage);
free(dlg);
@ -1908,7 +1930,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
DWORD dwSize;
dlg = dt.Save(dwSize);
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INSTFILES), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), dlg, dwSize);
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INSTFILES), NSIS_DEFAULT_LANG, dlg, dwSize);
res_editor->FreeResource(dlg);
}
catch (exception& err) {
@ -2076,7 +2098,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
SCRIPT_MSG("XPStyle: %s\n", line.gettoken_str(1));
init_res_editor();
const char *szXPManifest = k ? 0 : "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\"><assemblyIdentity version=\"1.0.0.0\" processorArchitecture=\"X86\" name=\"Nullsoft.NSIS.exehead\" type=\"win32\"/><description>Nullsoft Install System v2.0</description><dependency><dependentAssembly><assemblyIdentity type=\"win32\" name=\"Microsoft.Windows.Common-Controls\" version=\"6.0.0.0\" processorArchitecture=\"X86\" publicKeyToken=\"6595b64144ccf1df\" language=\"*\" /></dependentAssembly></dependency></assembly>";
res_editor->UpdateResource(MAKEINTRESOURCE(24), MAKEINTRESOURCE(1), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (unsigned char*)szXPManifest, k ? 0 : lstrlen(szXPManifest));
res_editor->UpdateResource(MAKEINTRESOURCE(24), MAKEINTRESOURCE(1), NSIS_DEFAULT_LANG, (unsigned char*)szXPManifest, k ? 0 : strlen(szXPManifest));
}
catch (exception& err) {
ERROR_MSG("Error while adding XP style: %s\n", err.what());
@ -2089,32 +2111,47 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
int k=line.gettoken_enum(1, "all\0IDD_LICENSE\0IDD_DIR\0IDD_SELCOM\0IDD_INST\0IDD_INSTFILES\0IDD_UNINST\0IDD_VERIFY\0IDD_LICENSE_FSRB\0IDD_LICENSE_FSCB\0");
if (k<0) PRINTHELP();
HINSTANCE hUIFile = LoadLibraryEx(line.gettoken_str(2), 0, LOAD_LIBRARY_AS_DATAFILE);
if (!hUIFile) {
ERROR_MSG("Error: Can't find \"%s\" in \"%s\"!\n", line.gettoken_str(1), line.gettoken_str(2));
FILE *fui = fopen(line.gettoken_str(2), "rb");
if (!fui) {
ERROR_MSG("Error: Can't open \"%s\"!\n", line.gettoken_str(2));
return PS_ERROR;
}
fseek(fui, 0, SEEK_END);
unsigned int len = ftell(fui);
fseek(fui, 0, SEEK_SET);
LPBYTE ui = (LPBYTE) malloc(len);
if (!ui) {
ERROR_MSG("Internal compiler error #12345: malloc(%d) failed\n", len);
extern void quit(); quit();
}
if (fread(ui, 1, len, fui) != len) {
fclose(fui);
free(ui);
ERROR_MSG("Error: Can't read \"%s\"!\n", line.gettoken_str(2));
return PS_ERROR;
}
fclose(fui);
CResourceEditor *uire = new CResourceEditor(ui, len);
init_res_editor();
// Search for required items
#define SEARCH(x) if (!UIDlg.GetItem(x)) {ERROR_MSG("Error: Can't find %s (%u) in the custom UI!\n", #x, x);return PS_ERROR;}
#define SAVE(x) dwSize = UIDlg.GetSize(); res_editor->UpdateResource(RT_DIALOG, x, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), dlg, dwSize);
#define GET(x) dlg = uire->GetResource(RT_DIALOG, MAKEINTRESOURCE(x), 0); if (!dlg) return PS_ERROR; CDialogTemplate UIDlg(dlg, uDefCodePage);
#define SEARCH(x) if (!UIDlg.GetItem(x)) {ERROR_MSG("Error: Can't find %s (%u) in the custom UI!\n", #x, x);delete [] dlg;free(ui);delete uire;return PS_ERROR;}
#define SAVE(x) dwSize = UIDlg.GetSize(); res_editor->UpdateResource(RT_DIALOG, x, NSIS_DEFAULT_LANG, dlg, dwSize); delete [] dlg;
BYTE* dlg = 0;
LPBYTE dlg = NULL;
if (k == 0 || k == 1) {
dlg = get_dlg(hUIFile, IDD_LICENSE, line.gettoken_str(2));
if (!dlg) return PS_ERROR;
CDialogTemplate UIDlg(dlg,uDefCodePage);
GET(IDD_LICENSE);
SEARCH(IDC_EDIT1);
SAVE(IDD_LICENSE);
}
if (k == 0 || k == 2) {
dlg = get_dlg(hUIFile, IDD_DIR, line.gettoken_str(2));
if (!dlg) return PS_ERROR;
CDialogTemplate UIDlg(dlg,uDefCodePage);
GET(IDD_DIR);
SEARCH(IDC_DIR);
SEARCH(IDC_BROWSE);
#ifdef NSIS_CONFIG_LOG
@ -2124,18 +2161,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
}
if (k == 0 || k == 3) {
dlg = get_dlg(hUIFile, IDD_SELCOM, line.gettoken_str(2));
if (!dlg) return PS_ERROR;
CDialogTemplate UIDlg(dlg,uDefCodePage);
GET(IDD_SELCOM);
SEARCH(IDC_TREE1);
SEARCH(IDC_COMBO1);
SAVE(IDD_SELCOM);
}
if (k == 0 || k == 4) {
dlg = get_dlg(hUIFile, IDD_INST, line.gettoken_str(2));
if (!dlg) return PS_ERROR;
CDialogTemplate UIDlg(dlg,uDefCodePage);
GET(IDD_INST);
SEARCH(IDC_BACK);
SEARCH(IDC_CHILDRECT);
SEARCH(IDC_VERSTR);
@ -2161,9 +2194,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
}
if (k == 0 || k == 5) {
dlg = get_dlg(hUIFile, IDD_INSTFILES, line.gettoken_str(2));
if (!dlg) return PS_ERROR;
CDialogTemplate UIDlg(dlg,uDefCodePage);
GET(IDD_INSTFILES);
SEARCH(IDC_LIST1);
SEARCH(IDC_PROGRESS);
SEARCH(IDC_SHOWDETAILS);
@ -2171,27 +2202,19 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
}
if (k == 0 || k == 6) {
dlg = get_dlg(hUIFile, IDD_UNINST, line.gettoken_str(2));
if (!dlg) return PS_ERROR;
CDialogTemplate UIDlg(dlg,uDefCodePage);
GET(IDD_UNINST);
SEARCH(IDC_EDIT1);
SAVE(IDD_UNINST);
}
if (k == 0 || k == 7) {
dlg = get_dlg(hUIFile, IDD_VERIFY, line.gettoken_str(2));
if (!dlg) return PS_ERROR;
CDialogTemplate UIDlg(dlg,uDefCodePage);
GET(IDD_VERIFY);
SEARCH(IDC_STR);
// No RTL here, pure English goes here.
//SAVE(IDD_VERIFY);
res_editor->UpdateResource(RT_DIALOG, IDD_VERIFY, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), dlg, UIDlg.GetSize());
SAVE(IDD_VERIFY);
}
if (k == 0 || k == 8) {
dlg = get_dlg(hUIFile, IDD_LICENSE_FSRB, line.gettoken_str(2));
if (!dlg) return PS_ERROR;
CDialogTemplate UIDlg(dlg,uDefCodePage);
GET(IDD_LICENSE_FSRB);
SEARCH(IDC_EDIT1);
SEARCH(IDC_LICENSEAGREE);
SEARCH(IDC_LICENSEDISAGREE);
@ -2199,17 +2222,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
}
if (k == 0 || k == 9) {
dlg = get_dlg(hUIFile, IDD_LICENSE_FSCB, line.gettoken_str(2));
if (!dlg) return PS_ERROR;
CDialogTemplate UIDlg(dlg,uDefCodePage);
GET(IDD_LICENSE_FSCB);
SEARCH(IDC_EDIT1);
SEARCH(IDC_LICENSEAGREE);
SAVE(IDD_LICENSE_FSCB);
}
if (!FreeLibrary(hUIFile)) {
ERROR_MSG("can't free library!\n");
}
delete uire;
free(ui);
SCRIPT_MSG("ChangeUI: %s %s%s\n", line.gettoken_str(1), line.gettoken_str(2), branding_image_found?" (branding image holder found)":"");
}
@ -2219,6 +2239,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
}
return PS_OK;
case TOK_ADDBRANDINGIMAGE:
#ifdef _WIN32
try {
int k=line.gettoken_enum(1,"top\0left\0bottom\0right\0");
int wh=line.gettoken_int(2);
@ -2228,7 +2249,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
padding = line.gettoken_int(3);
init_res_editor();
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INST), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INST), NSIS_DEFAULT_LANG);
CDialogTemplate dt(dlg,uDefCodePage);
delete [] dlg;
@ -2275,7 +2296,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
DWORD dwDlgSize;
dlg = dt.Save(dwDlgSize);
res_editor->UpdateResource(RT_DIALOG, IDD_INST, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), dlg, dwDlgSize);
res_editor->UpdateResource(RT_DIALOG, IDD_INST, NSIS_DEFAULT_LANG, dlg, dwDlgSize);
res_editor->FreeResource(dlg);
@ -2290,6 +2311,10 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
return PS_ERROR;
}
return PS_OK;
#else
ERROR_MSG("Error: AddBrandingImage is disabled for non Win32 platforms.\n");
return PS_ERROR;
#endif
case TOK_SETFONT:
{
if (!strnicmp(line.gettoken_str(1), "/LANG=", 6))
@ -2498,15 +2523,16 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
return PS_OK;
case TOK_P_INCLUDE:
{
WIN32_FIND_DATA fd;
char *f = line.gettoken_str(1);
int included = 0;
#ifdef _WIN32
WIN32_FIND_DATA fd;
unsigned int malloced = sizeof(fd.cFileName) + strlen(f) + 1;
char *incfile = (char *) malloc(malloced);
int included = 0;
strcpy(incfile, f);
char *slash = strrchr(incfile, '\\');
char *slash = strrchr(incfile, PATH_SEPARATOR_C);
HANDLE search = FindFirstFile(f, &fd);
if (search != INVALID_HANDLE_VALUE)
@ -2519,11 +2545,25 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
incfile[0] = 0;
strcat(incfile, fd.cFileName);
if (includeScript(incfile) != PS_OK)
#else
unsigned int malloced = strlen(f) + 100;
char *incfile = (char *) malloc(malloced);
glob_t globbuf;
if (!glob(incfile, GLOB_NOSORT, NULL, &globbuf))
{
for (unsigned int i = 0; i < globbuf.gl_pathc; i++)
{
if (includeScript(globbuf.gl_pathv[i]) != PS_OK)
#endif
return PS_ERROR;
included++;
}
#ifdef _WIN32
while (FindNextFile(search, &fd));
FindClose(search);
#else
globfree(&globbuf);
#endif
}
else
{
@ -2538,11 +2578,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
incfile = (char *) malloc(malloced);
}
strcpy(incfile, dir);
if (*f != '\\')
strcat(incfile, "\\");
if (*f != PATH_SEPARATOR_C)
strcat(incfile, PATH_SEPARATOR_STR);
strcat(incfile, f);
slash = strrchr(incfile, '\\');
#ifdef _WIN32
slash = strrchr(incfile, PATH_SEPARATOR_C);
search = FindFirstFile(incfile, &fd);
if (search != INVALID_HANDLE_VALUE)
{
@ -2553,12 +2594,24 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
else
incfile[0] = 0;
strcat(incfile, fd.cFileName);
if (includeScript(incfile) != PS_OK)
#else
if (!glob(incfile, GLOB_NOSORT, NULL, &globbuf))
{
for (unsigned int i = 0; i < globbuf.gl_pathc; i++)
{
if (includeScript(globbuf.gl_pathv[i]) != PS_OK)
#endif
return PS_ERROR;
included++;
}
#ifdef _WIN32
while (FindNextFile(search, &fd));
FindClose(search);
#else
globfree(&globbuf);
#endif
break;
}
else
@ -2578,7 +2631,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
}
return PS_OK;
case TOK_P_CD:
#ifdef _WIN32
if (!line.gettoken_str(1)[0] || !SetCurrentDirectory(line.gettoken_str(1)))
#else
if (!line.gettoken_str(1)[0] || chdir(line.gettoken_str(1)))
#endif
{
ERROR_MSG("!cd: error changing to: \"%s\"\n",line.gettoken_str(1));
return PS_ERROR;
@ -2996,10 +3053,11 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
if (line.getnumtokens()!=a+1 && !trim) PRINTHELP();
if (line.getnumtokens()==a+1)
SetInnerString(NLF_BRANDING,line.gettoken_str(a));
#ifdef _WIN32
if (trim) try {
init_res_editor();
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INST), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
BYTE* dlg = res_editor->GetResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INST), NSIS_DEFAULT_LANG);
CDialogTemplate td(dlg,uDefCodePage);
free(dlg);
@ -3007,7 +3065,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
char str[512];
extern const char *NSIS_VERSION;
if (line.getnumtokens()==a+1 && line.gettoken_str(a)[0])
lstrcpy(str, line.gettoken_str(a));
strcpy(str, line.gettoken_str(a));
else
wsprintf(str, "Nullsoft Install System %s", NSIS_VERSION);
@ -3020,13 +3078,20 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
DWORD dwSize;
dlg = td.Save(dwSize);
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INST), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), dlg, dwSize);
res_editor->UpdateResource(RT_DIALOG, MAKEINTRESOURCE(IDD_INST), NSIS_DEFAULT_LANG, dlg, dwSize);
res_editor->FreeResource(dlg);
}
catch (exception& err) {
ERROR_MSG("Error while triming branding text control: %s\n", err.what());
return PS_ERROR;
}
#else
if (trim)
{
ERROR_MSG("Error: BrandingText /TRIM* disabled for non Win32 platforms.\n");
return PS_ERROR;
}
#endif
SCRIPT_MSG("BrandingText: \"%s\"\n",line.gettoken_str(a));
}
return PS_OK;
@ -3041,7 +3106,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
return PS_OK;
case TOK_SPACETEXTS:
{
if (!lstrcmpi(line.gettoken_str(1), "none")) {
if (!strcmpi(line.gettoken_str(1), "none")) {
no_space_texts=true;
SCRIPT_MSG("SpaceTexts: none\n");
}
@ -3221,8 +3286,8 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
ent.offsets[3]=SW_SHOWNORMAL;
if (line.getnumtokens() > 4)
{
int tab[3]={SW_SHOWNORMAL,SW_SHOWMAXIMIZED,SW_SHOWMINIMIZED};
int a=line.gettoken_enum(4,"SW_SHOWNORMAL\0SW_SHOWMAXIMIZED\0SW_SHOWMINIMIZED\0");
int tab[4]={SW_SHOWNORMAL,SW_SHOWMAXIMIZED,SW_SHOWMINIMIZED,SW_HIDE};
int a=line.gettoken_enum(4,"SW_SHOWNORMAL\0SW_SHOWMAXIMIZED\0SW_SHOWMINIMIZED\0SW_HIDE\0");
if (a < 0) PRINTHELP()
ent.offsets[3]=tab[a];
}
@ -3651,15 +3716,15 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
for (int i = 3; i < line.getnumtokens(); i++) {
char *tok=line.gettoken_str(i);
if (tok[0]=='/') {
if (!lstrcmpi(tok,"/ITALIC")) {
if (!strcmpi(tok,"/ITALIC")) {
SCRIPT_MSG(" /ITALIC");
flags|=1;
}
else if (!lstrcmpi(tok,"/UNDERLINE")) {
else if (!strcmpi(tok,"/UNDERLINE")) {
SCRIPT_MSG(" /UNDERLINE");
flags|=2;
}
else if (!lstrcmpi(tok,"/STRIKE")) {
else if (!strcmpi(tok,"/STRIKE")) {
SCRIPT_MSG(" /STRIKE");
flags|=4;
}
@ -4120,6 +4185,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
return add_entry(&ent);
case TOK_GETDLLVERSIONLOCAL:
{
#ifdef _WIN32
char buf[128];
DWORD low=0, high=0;
DWORD s,d;
@ -4127,7 +4193,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
int alloced=0;
char *path=line.gettoken_str(1);
if (!((*path == '\\' && path[1] == '\\') || (*path && path[1] == ':'))) {
size_t pathlen=lstrlen(path)+GetCurrentDirectory(0, buf)+2;
size_t pathlen=strlen(path)+GetCurrentDirectory(0, buf)+2;
char *nrpath=(char *)malloc(pathlen);
alloced=1;
GetCurrentDirectory(pathlen, nrpath);
@ -4193,12 +4259,17 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
if (ent.offsets[0]<0) PRINTHELP()
SCRIPT_MSG("GetDLLVersionLocal: %s (%u,%u)->(%s,%s)\n",
line.gettoken_str(1),high,low,line.gettoken_str(2),line.gettoken_str(3));
#else
ERROR_MSG("Error: GetDLLVersionLocal is disabled for non Win32 platforms.\n");
return PS_ERROR;
#endif
}
return add_entry(&ent);
case TOK_GETFILETIMELOCAL:
{
char buf[129];
DWORD high=0,low=0;
#ifdef _WIN32
int flag=0;
HANDLE hFile=CreateFile(line.gettoken_str(1),0,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile != INVALID_HANDLE_VALUE)
@ -4217,6 +4288,29 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
ERROR_MSG("GetFileTimeLocal: error reading date from \"%s\"\n",line.gettoken_str(1));
return PS_ERROR;
}
#else
struct stat st;
if (!stat(line.gettoken_str(1), &st))
{
union
{
struct
{
long l;
long h;
} words;
long long ll;
};
ll = (st.st_mtime * 10000000) + 116444736000000000LL;
high = words.h;
low = words.l;
}
else
{
ERROR_MSG("GetFileTimeLocal: error reading date from \"%s\"\n",line.gettoken_str(1));
return PS_ERROR;
}
#endif
ent.which=EW_ASSIGNVAR;
ent.offsets[0]=GetUserVarIndex(line, 2);
@ -5153,7 +5247,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
int i = 1;
int nounload = 0;
if (!lstrcmpi(line.gettoken_str(i), "/NOUNLOAD")) {
if (!strcmpi(line.gettoken_str(i), "/NOUNLOAD")) {
i++;
nounload++;
}
@ -5166,7 +5260,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
int w=parmst + (line.getnumtokens()-i - 1);
ent.which=EW_PUSHPOP;
ent.offsets[0]=add_string(line.gettoken_str(w));
if (!lstrcmpi(line.gettoken_str(w), "/NOUNLOAD")) nounloadmisused=1;
if (!strcmpi(line.gettoken_str(w), "/NOUNLOAD")) nounloadmisused=1;
ent.offsets[1]=0;
ret=add_entry(&ent);
if (ret != PS_OK) {
@ -5257,15 +5351,25 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
{
char dir[1024];
char newfn[1024];
#ifdef _WIN32
HANDLE h;
WIN32_FIND_DATA d;
#else
glob_t globbuf;
#endif
strcpy(dir,lgss);
{
char *s=dir+strlen(dir);
while (s > dir && *s != '\\') s=CharPrev(dir,s);
while (s > dir && *s != PATH_SEPARATOR_C) s=CharPrev(dir,s);
*s=0;
if (!*dir)
{
dir[0] = '.';
dir[1] = 0;
}
}
#ifdef _WIN32
h = FindFirstFile(lgss,&d);
if (h != INVALID_HANDLE_VALUE)
{
@ -5273,12 +5377,29 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
{
if ((d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
{
#else
glob(lgss, GLOB_NOSORT, NULL, &globbuf);
{
for (unsigned int i = 0; i < globbuf.gl_pathc; i++)
{
struct stat s;
if (!stat(globbuf.gl_pathv[i], &s) && S_ISREG(s.st_mode))
{
char *filename = strrchr(globbuf.gl_pathv[i], PATH_SEPARATOR_C);
if (filename)
filename++;
else
filename = globbuf.gl_pathv[i];
#endif
MMapFile mmap;
HANDLE hFile;
DWORD len;
(*total_files)++;
sprintf(newfn,"%s%s%s",dir,dir[0]?"\\":"",d.cFileName);
hFile=CreateFile(
#ifdef _WIN32
HANDLE hFile;
sprintf(newfn,"%s%s%s",dir,dir[0]?PATH_SEPARATOR_STR:"",d.cFileName);
hFile = CreateFile(
newfn,
GENERIC_READ,
FILE_SHARE_READ,
@ -5289,21 +5410,49 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
);
if (hFile == INVALID_HANDLE_VALUE)
{
FindClose(h);
ERROR_MSG("%sFile: failed opening file \"%s\"\n",generatecode?"":"Reserve",newfn);
return PS_ERROR;
}
len = GetFileSize(hFile, NULL);
if (len && !mmap.setfile(hFile, len))
{
FindClose(h);
CloseHandle(hFile);
ERROR_MSG("%sFile: failed creating mmap of \"%s\"\n",generatecode?"":"Reserve",newfn);
return PS_ERROR;
}
#else
int fd;
sprintf(newfn,"%s%s%s",dir,dir[0]?PATH_SEPARATOR_STR:"",filename);
len = (DWORD) s.st_size;
fd = open(newfn, O_RDONLY);
if (fd == -1)
{
globfree(&globbuf);
ERROR_MSG("%sFile: failed opening file \"%s\"\n",generatecode?"":"Reserve",newfn);
return PS_ERROR;
}
if (len && !mmap.setfile(fd, len))
{
globfree(&globbuf);
close(fd);
ERROR_MSG("%sFile: failed creating mmap of \"%s\"\n",generatecode?"":"Reserve",newfn);
return PS_ERROR;
}
#endif
if (generatecode&1)
section_add_size_kb((len+1023)/1024);
#ifdef _WIN32
if (name_override) SCRIPT_MSG("%sFile: \"%s\"->\"%s\"",generatecode?"":"Reserve",d.cFileName,name_override);
else SCRIPT_MSG("%sFile: \"%s\"",generatecode?"":"Reserve",d.cFileName);
#else
if (name_override) SCRIPT_MSG("%sFile: \"%s\"->\"%s\"",generatecode?"":"Reserve",filename,name_override);
else SCRIPT_MSG("%sFile: \"%s\"",generatecode?"":"Reserve",filename);
#endif
if (!build_compress_whole)
if (build_compress) SCRIPT_MSG(" [compress]");
fflush(stdout);
@ -5327,7 +5476,11 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
}
else
{
#ifdef _WIN32
char *i=d.cFileName,*o=buf;
#else
char *i=filename,*o=buf;
#endif
while (*i)
{
char c=*i++;
@ -5344,7 +5497,13 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
if (ent.offsets[2] < 0)
{
#ifdef _WIN32
CloseHandle(hFile);
FindClose(h);
#else
close(fd);
globfree(&globbuf);
#endif
return PS_ERROR;
}
@ -5364,6 +5523,7 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
{
if (build_datesave || build_overwrite>=0x3 /*ifnewer or ifdiff*/)
{
#ifdef _WIN32
FILETIME ft;
if (GetFileTime(hFile,NULL,NULL,&ft))
{
@ -5373,6 +5533,29 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
else
{
CloseHandle(hFile);
FindClose(h);
#else
struct stat st;
if (!fstat(fd, &st))
{
union
{
struct
{
long l;
long h;
} words;
long long ll;
};
ll = (st.st_mtime * 10000000) + 116444736000000000LL;
ent.offsets[3] = words.l;
ent.offsets[4] = words.h;
}
else
{
close(fd);
globfree(&globbuf);
#endif
ERROR_MSG("%sFile: failed getting file date from \"%s\"\n",generatecode?"":"Reserve",newfn);
return PS_ERROR;
}
@ -5402,18 +5585,27 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
ent.offsets[5] = DefineInnerLangString(build_allowskipfiles ? NLF_FILE_ERROR : NLF_FILE_ERROR_NOIGNORE);
}
#ifdef _WIN32
CloseHandle(hFile);
#else
close(fd);
#endif
if (generatecode)
{
int a=add_entry(&ent);
if (a != PS_OK)
{
#ifdef _WIN32
FindClose(h);
#else
globfree(&globbuf);
#endif
return a;
}
if (attrib)
{
#ifdef _WIN32
ent.which=EW_SETFILEATTRIBUTES;
// $OUTDIR is the working directory
ent.offsets[0]=add_string(name_override?name_override:buf);
@ -5429,32 +5621,65 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
FindClose(h);
return a;
}
#else
warning_fl("File /a is disabled for non Win32 platforms.");
#endif
}
}
}
} while (FindNextFile(h,&d));
}
#ifdef _WIN32
while (FindNextFile(h,&d));
FindClose(h);
#else
globfree(&globbuf);
#endif
}
if (recurse)
{
#ifdef NSIS_SUPPORT_STACK
#ifdef _WIN32
WIN32_FIND_DATA temp;
#endif
DWORD a=GetFileAttributes(lgss);
#ifdef _WIN32
const char *fspec=lgss+strlen(dir)+!!dir[0];
#else
const char *fspec;
if (!strcmp(dir,".") && strncmp(lgss,".",1))
fspec=lgss;
else
fspec=lgss+strlen(dir)+!!dir[0];
#endif
strcpy(newfn,lgss);
#ifdef _WIN32
DWORD a=GetFileAttributes(lgss);
if (a==INVALID_FILE_ATTRIBUTES)
{
a=GetFileAttributes(dir);
sprintf(newfn,"%s%s*.*",dir,dir[0]?"\\":"");
sprintf(newfn,"%s%s*.*",dir,dir[0]?PATH_SEPARATOR_STR:"");
}
#else
int a;
struct stat st;
if (stat(lgss, &st))
{
stat(dir, &st);
sprintf(newfn,"%s%s*",dir,dir[0]?PATH_SEPARATOR_STR:"");
}
#endif
else
{
// we don't want to include a whole directory if it's not the first call
if (rec_depth) return PS_OK;
#ifdef _WIN32
fspec="*.*";
#else
fspec="*";
#endif
}
#ifdef _WIN32
if (a&FILE_ATTRIBUTE_DIRECTORY)
{
h=FindFirstFile(newfn,&d);
@ -5466,10 +5691,33 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
{
if (strcmp(d.cFileName,"..") && strcmp(d.cFileName,"."))
{
#else
if (S_ISDIR(st.st_mode))
{
if (!glob(newfn, GLOB_NOSORT, NULL, &globbuf))
{
for (unsigned int i = 0; i < globbuf.gl_pathc; i++)
{
struct stat s;
if (!stat(globbuf.gl_pathv[i], &s) && S_ISDIR(s.st_mode))
{
char *dirname = strrchr(globbuf.gl_pathv[i], PATH_SEPARATOR_C);
if (dirname)
dirname++;
else
dirname = globbuf.gl_pathv[i];
if (strcmp(dirname, "..") && strcmp(dirname, "."))
{
#endif
char out_path[1024] = "$OUTDIR\\";
{
char *i = d.cFileName, *o=out_path+strlen(out_path);
#ifdef _WIN32
char *i = d.cFileName;
#else
char *i = dirname;
#endif
char *o=out_path+strlen(out_path);
while (*i)
{
@ -5493,35 +5741,58 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
}
char spec[1024];
sprintf(spec,"%s%s%s",dir,dir[0]?"\\":"",d.cFileName);
#ifdef _WIN32
wsprintf(spec,"%s%s%s",dir,dir[0]?PATH_SEPARATOR_STR:"",d.cFileName);
#else
wsprintf(spec,"%s%s%s",dir,dir[0]?PATH_SEPARATOR_STR:"",dirname);
#endif
SCRIPT_MSG("%sFile: Descending to: \"%s\"\n",generatecode?"":"Reserve",spec);
strcat(spec,"\\");
strcat(spec,PATH_SEPARATOR_STR);
strcat(spec,fspec);
if (generatecode)
{
a=add_entry_direct(EW_PUSHPOP, add_string("$OUTDIR"));
if (a != PS_OK)
{
#ifdef _WIN32
FindClose(h);
#else
globfree(&globbuf);
#endif
return a;
}
a=add_entry_direct(EW_ASSIGNVAR, m_UserVarNames.get("OUTDIR"), add_string(out_path));
if (a != PS_OK)
{
#ifdef _WIN32
FindClose(h);
#else
globfree(&globbuf);
#endif
return a;
}
#ifdef _WIN32
HANDLE htemp = FindFirstFile(spec,&temp);
if (htemp != INVALID_HANDLE_VALUE)
{
FindClose(htemp);
#else
glob_t globbuf2;
glob(spec, GLOB_NOSORT, NULL, &globbuf2);
if (globbuf2.gl_pathc)
{
#endif
a=add_entry_direct(EW_CREATEDIR, add_string("$OUTDIR"), 1);
if (a != PS_OK)
{
#ifdef _WIN32
FindClose(h);
#else
globfree(&globbuf2);
#endif
return a;
}
}
@ -5529,7 +5800,11 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
a=do_add_file(spec,attrib,recurse,linecnt,total_files,NULL,generatecode,data_handle,rec_depth+1);
if (a != PS_OK)
{
#ifdef _WIN32
FindClose(h);
#else
globfree(&globbuf);
#endif
return a;
}
@ -5538,25 +5813,38 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
a=add_entry_direct(EW_PUSHPOP, m_UserVarNames.get("OUTDIR"), 1);
if (a != PS_OK)
{
#ifdef _WIN32
FindClose(h);
#else
globfree(&globbuf);
#endif
return a;
}
if (attrib)
{
#ifdef _WIN32
a=add_entry_direct(EW_SETFILEATTRIBUTES, add_string(out_path), d.dwFileAttributes);
if (a != PS_OK)
{
FindClose(h);
return a;
}
#else
warning_fl("File /a is disabled for non Win32 platforms.");
#endif
}
}
SCRIPT_MSG("%sFile: Returning to: \"%s\"\n",generatecode?"":"Reserve",dir);
}
}
} while (FindNextFile(h,&d));
}
#ifdef _WIN32
while (FindNextFile(h,&d));
FindClose(h);
#else
globfree(&globbuf);
#endif
if (!rec_depth)
{
@ -5564,7 +5852,6 @@ int CEXEBuild::do_add_file(const char *lgss, int attrib, int recurse, int linecn
a=add_entry_direct(EW_CREATEDIR, add_string("$OUTDIR"), 1);
if (a != PS_OK)
{
FindClose(h);
return a;
}
}

View file

@ -4,6 +4,12 @@
#include "Platform.h"
#include <stdio.h>
#include <stdlib.h> // for gcc
#ifndef _WIN32
# include <sys/mman.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <unistd.h>
#endif
class IGrowBuf
{
@ -20,9 +26,10 @@ class IMMap
virtual void resize(int newlen)=0;
virtual int getsize()=0;
virtual void *get(int offset, int size)=0;
virtual void *getmore(int offset, int size)=0;
virtual void *get(int offset, int *size)=0;
virtual void *getmore(int offset, int *size)=0;
virtual void release()=0;
virtual void release(void *view)=0;
virtual void release(void *view, int size)=0;
virtual void clear()=0;
virtual void setro(BOOL bRO)=0;
virtual void flush(int num)=0;
@ -485,8 +492,13 @@ class MMapFile : public IMMap
public:
MMapFile()
{
#ifdef _WIN32
m_hFile = INVALID_HANDLE_VALUE;
m_hFileMap = NULL;
#else
m_hFile = -1;
#endif
m_pView = NULL;
m_iSize = 0;
m_bReadOnly = FALSE;
@ -494,9 +506,13 @@ class MMapFile : public IMMap
if (!m_iAllocationGranularity)
{
#ifdef _WIN32
SYSTEM_INFO si;
GetSystemInfo(&si);
m_iAllocationGranularity = (int) si.dwAllocationGranularity;
#else
m_iAllocationGranularity = getpagesize();
#endif
}
}
@ -509,12 +525,17 @@ class MMapFile : public IMMap
{
release();
#ifdef _WIN32
if (m_hFileMap)
CloseHandle(m_hFileMap);
if (m_bTempHandle && m_hFile)
CloseHandle(m_hFile);
m_hFileMap = 0;
#else
if (m_bTempHandle && m_hFile)
close(m_hFile);
#endif
}
void setro(BOOL bRO)
@ -522,21 +543,22 @@ class MMapFile : public IMMap
m_bReadOnly = bRO;
}
#ifdef _WIN32
int setfile(HANDLE hFile, DWORD dwSize)
#else
int setfile(int hFile, DWORD dwSize)
#endif
{
release();
if (m_hFileMap)
CloseHandle(m_hFileMap);
if (m_bTempHandle && m_hFile)
CloseHandle(m_hFile);
m_hFileMap = 0;
clear();
m_hFile = hFile;
m_bTempHandle = FALSE;
#ifdef _WIN32
if (m_hFile == INVALID_HANDLE_VALUE)
#else
if (m_hFile == -1)
#endif
return 0;
m_iSize = (int) dwSize;
@ -544,10 +566,12 @@ class MMapFile : public IMMap
if (m_iSize <= 0)
return 0;
#ifdef _WIN32
m_hFileMap = CreateFileMapping(m_hFile, NULL, PAGE_READONLY, 0, m_iSize, NULL);
if (!m_hFileMap)
return 0;
#endif
m_bReadOnly = TRUE;
@ -560,13 +584,16 @@ class MMapFile : public IMMap
if (newsize > m_iSize)
{
#ifdef _WIN32
if (m_hFileMap)
CloseHandle(m_hFileMap);
m_hFileMap = 0;
#endif
m_iSize = newsize;
#ifdef _WIN32
if (m_hFile == INVALID_HANDLE_VALUE)
{
char buf[MAX_PATH], buf2[MAX_PATH];
@ -610,6 +637,14 @@ class MMapFile : public IMMap
}
quit();
}
#else
if (m_hFile == -1)
{
char tmp[] = "/tmp/makensisXXXXXX";
m_hFile = mkstemp(tmp);
m_bTempHandle = TRUE;
}
#endif
}
}
@ -620,9 +655,19 @@ class MMapFile : public IMMap
void *get(int offset, int size)
{
return get(offset, &size);
}
void *get(int offset, int *sizep)
{
if (!sizep)
return NULL;
if (m_pView)
release();
int size = *sizep;
if (!m_iSize || offset + size > m_iSize)
{
extern FILE *g_output;
@ -639,9 +684,18 @@ class MMapFile : public IMMap
int alignedoffset = offset - (offset % m_iAllocationGranularity);
size += offset - alignedoffset;
#ifdef _WIN32
m_pView = MapViewOfFile(m_hFileMap, m_bReadOnly ? FILE_MAP_READ : FILE_MAP_WRITE, 0, alignedoffset, size);
#else
m_pView = mmap(0, size, m_bReadOnly ? PROT_READ : PROT_READ | PROT_WRITE, MAP_SHARED, m_hFile, alignedoffset);
m_iMappedSize = *sizep = size;
#endif
#ifdef _WIN32
if (!m_pView)
#else
if (m_pView == MAP_FAILED)
#endif
{
extern FILE *g_output;
extern void quit(); extern int g_display_errors;
@ -656,13 +710,19 @@ class MMapFile : public IMMap
return (void *)((char *)m_pView + offset - alignedoffset);
}
void *getmore(int offset, int size)
void *getmore(int offset, int *size)
{
void *pView;
void *pViewBackup = m_pView;
#ifndef _WIN32
int iMappedSizeBackup = m_iMappedSize;
#endif
m_pView = 0;
pView = get(offset, size);
m_pView = pViewBackup;
#ifndef _WIN32
m_iMappedSize = iMappedSizeBackup;
#endif
return pView;
}
@ -671,26 +731,43 @@ class MMapFile : public IMMap
if (!m_pView)
return;
#ifdef _WIN32
UnmapViewOfFile(m_pView);
#else
munmap(m_pView, m_iMappedSize);
#endif
m_pView = NULL;
}
void release(void *pView)
void release(void *pView, int size)
{
if (!pView)
return;
#ifdef _WIN32
UnmapViewOfFile(pView);
#else
munmap(pView, size);
#endif
}
void flush(int num)
{
if (m_pView)
#ifdef _WIN32
FlushViewOfFile(m_pView, num);
#else
msync(m_pView, num, MS_SYNC);
#endif
}
private:
#ifdef _WIN32
HANDLE m_hFile, m_hFileMap;
#else
int m_hFile;
int m_iMappedSize;
#endif
void *m_pView;
int m_iSize;
BOOL m_bReadOnly;
@ -721,19 +798,24 @@ class MMapFake : public IMMap
void *get(int offset, int size)
{
if (offset + size > m_iSize)
return get(offset, &size);
}
void *get(int offset, int *size)
{
if (!size || (offset + *size > m_iSize))
return NULL;
return (void *)(m_pMem + offset);
}
void *getmore(int offset, int size)
void *getmore(int offset, int *size)
{
return get(offset, size);
}
void resize(int n) {}
void release() {}
void release(void *p) {}
void release(void *p, int size) {}
void clear() {}
void setro(BOOL b) {}
void flush(BOOL b) {}
@ -817,6 +899,14 @@ class MMapBuf : public IGrowBuf, public IMMap
return get(0, m_alloc);
}
void *get(int offset, int *sizep)
{
if (!sizep)
return NULL;
int size = *sizep;
return get(offset, size);
}
void *get(int offset, int size)
{
if (m_gb_u)
@ -824,7 +914,7 @@ class MMapBuf : public IGrowBuf, public IMMap
return (void *) ((char *) m_gb.get() + offset);
}
void *getmore(int offset, int size)
void *getmore(int offset, int *size)
{
if (m_gb_u)
return m_fm.getmore(offset, size);
@ -837,10 +927,10 @@ class MMapBuf : public IGrowBuf, public IMMap
m_fm.release();
}
void release(void *pView)
void release(void *pView, int size)
{
if (m_gb_u)
m_fm.release(pView);
m_fm.release(pView, size);
}
void clear()

View file

@ -3,7 +3,7 @@
#ifndef ___USERVARS___H_____
#define ___USERVARS___H_____
#include "Lang.h"
#include "lang.h"
struct uservarstring {
int name;

View file

@ -1,7 +1,6 @@
#include "Platform.h"
#include <stdio.h>
#include <stdarg.h>
#include <conio.h>
#include "exedata.h"
#include "exehead/fileform.h"
#include "util.h"
@ -18,7 +17,7 @@ void dopause(void)
if (g_display_errors) fprintf(g_output,"MakeNSIS done - hit enter to close...");
fflush(stdout);
int a;
while ((a=_getch()) != '\r' && a != 27/*esc*/);
while ((a=getchar()) != '\r' && a != '\n' && a != 27/*esc*/);
}
}
@ -82,7 +81,7 @@ int update_bitmap(CResourceEditor* re, WORD id, char* filename, int width/*=0*/,
}
fclose(f);
re->UpdateResource(RT_BITMAP, MAKEINTRESOURCE(id), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), bitmap, dwSize);
re->UpdateResource(RT_BITMAP, MAKEINTRESOURCE(id), NSIS_DEFAULT_LANG, bitmap, dwSize);
free(bitmap);
@ -146,7 +145,7 @@ int replace_icon(CResourceEditor* re, WORD wIconId, char* filename)
int i = 1;
// Delete old icons
while (re->UpdateResource(RT_ICON, MAKEINTRESOURCE(i++), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 0, 0));
while (re->UpdateResource(RT_ICON, MAKEINTRESOURCE(i++), NSIS_DEFAULT_LANG, 0, 0));
int iNewIconSize = 0;
@ -170,7 +169,7 @@ int replace_icon(CResourceEditor* re, WORD wIconId, char* filename)
throw bad_alloc();
}
fread(iconData, sizeof(BYTE), ige->dwRawSize, f);
re->UpdateResource(RT_ICON, MAKEINTRESOURCE(i+1), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), iconData, ige->dwRawSize);
re->UpdateResource(RT_ICON, MAKEINTRESOURCE(i+1), NSIS_DEFAULT_LANG, iconData, ige->dwRawSize);
free(iconData);
fsetpos(f, &pos);
@ -185,7 +184,7 @@ int replace_icon(CResourceEditor* re, WORD wIconId, char* filename)
fclose(f);
re->UpdateResource(RT_GROUP_ICON, MAKEINTRESOURCE(wIconId), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), rsrcIconGroup, sizeof(IconGroupHeader) + igh.wCount*SIZEOF_RSRC_ICON_GROUP_ENTRY);
re->UpdateResource(RT_GROUP_ICON, MAKEINTRESOURCE(wIconId), NSIS_DEFAULT_LANG, rsrcIconGroup, sizeof(IconGroupHeader) + igh.wCount*SIZEOF_RSRC_ICON_GROUP_ENTRY);
free(rsrcIconGroup);
@ -300,20 +299,20 @@ int generate_unicons_offsets(unsigned char* exeHeader, unsigned char* uninstIcon
int idx = find_in_dir(rdRoot, (WORD) (int) RT_ICON);
MY_ASSERT(idx == -1, "no icons?!");
MY_ASSERT(!rdRoot->Entries[idx].DataIsDirectory, "bad resource directory");
MY_ASSERT(!rdRoot->Entries[idx].DirectoryOffset.DataIsDirectory, "bad resource directory");
PRESOURCE_DIRECTORY rdIcons = PRESOURCE_DIRECTORY(rdRoot->Entries[idx].OffsetToDirectory + DWORD(rdRoot));
PRESOURCE_DIRECTORY rdIcons = PRESOURCE_DIRECTORY(rdRoot->Entries[idx].DirectoryOffset.OffsetToDirectory + DWORD(rdRoot));
MY_ASSERT((int)rdIcons - (int)exeHeader > iNextSection, "corrupted EXE - invalid pointer");
MY_ASSERT(rdIcons->Header.NumberOfIdEntries == 0, "no icons found");
for (i = 0; i < rdIcons->Header.NumberOfIdEntries; i++) { // Icons dir can't have named entries
MY_ASSERT(!rdIcons->Entries[i].DataIsDirectory, "bad resource directory");
PRESOURCE_DIRECTORY rd = PRESOURCE_DIRECTORY(rdIcons->Entries[i].OffsetToDirectory + DWORD(rdRoot));
MY_ASSERT(!rdIcons->Entries[i].DirectoryOffset.DataIsDirectory, "bad resource directory");
PRESOURCE_DIRECTORY rd = PRESOURCE_DIRECTORY(rdIcons->Entries[i].DirectoryOffset.OffsetToDirectory + DWORD(rdRoot));
MY_ASSERT((int)rd - (int)exeHeader > iNextSection, "corrupted EXE - invalid pointer");
MY_ASSERT(rd->Entries[0].DataIsDirectory, "bad resource directory");
MY_ASSERT(rd->Entries[0].DirectoryOffset.DataIsDirectory, "bad resource directory");
PIMAGE_RESOURCE_DATA_ENTRY rde = PIMAGE_RESOURCE_DATA_ENTRY(rd->Entries[0].OffsetToData + DWORD(rdRoot));
@ -352,30 +351,45 @@ int generate_unicons_offsets(unsigned char* exeHeader, unsigned char* uninstIcon
seeker += dwSize;
}
return PIMAGE_RESOURCE_DATA_ENTRY(PRESOURCE_DIRECTORY(rdIcons->Entries[0].OffsetToDirectory + DWORD(rdRoot))->Entries[0].OffsetToData + DWORD(rdRoot))->OffsetToData + DWORD(rdRoot) - dwResourceSectionVA - DWORD(exeHeader);
return PIMAGE_RESOURCE_DATA_ENTRY(PRESOURCE_DIRECTORY(rdIcons->Entries[0].DirectoryOffset.OffsetToDirectory + DWORD(rdRoot))->Entries[0].OffsetToData + DWORD(rdRoot))->OffsetToData + DWORD(rdRoot) - dwResourceSectionVA - DWORD(exeHeader);
}
#endif // NSIS_CONFIG_UNINSTALL_SUPPORT
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
BYTE* get_dlg(HINSTANCE hUIFile, WORD dlgId, char* filename) {
HRSRC hUIRes = FindResource(hUIFile, MAKEINTRESOURCE(dlgId), RT_DIALOG);
if (!hUIRes) {
if (g_display_errors) fprintf(g_output, "Error: \"%s\" doesn't contain a dialog with the ID %u!\n", filename, dlgId);
return 0;
}
HGLOBAL hUIMem = LoadResource(hUIFile, hUIRes);
if (!hUIMem) {
if (g_display_errors) fprintf(g_output, "Error: Can't load a dialog from \"%s\"!\n", filename);
return 0;
}
BYTE* pbUIData = (BYTE*)LockResource(hUIMem);
if (!pbUIData) {
if (g_display_errors) fprintf(g_output, "Error: Can't lock resource from \"%s\"!\n", filename);
return 0;
}
return pbUIData;
// returns the number of WCHARs in str including null charcter
int WCStrLen(const WCHAR* szwStr) {
int i;
for (i = 0; szwStr[i]; i++);
return i+1;
}
#endif //NSIS_CONFIG_VISIBLE_SUPPORT
#ifndef _WIN32
char *CharPrev(const char *s, const char *p) {
if (!s || !p || p < s)
return NULL;
while (*s) {
char *n = CharNext(s);
if (n >= p)
break;
s = n;
}
return (char *) s;
}
char *CharNext(const char *s) {
int l = 0;
if (s && *s)
l = min(1, mblen(s, strlen(s)));
return (char *) s + l;
}
int wsprintf(char *s, const char *format, ...) {
va_list val;
va_start(val, format);
int res = vsnprintf(s, 1024, format, val);
va_end(val);
return res;
}
#endif
void *operator new(size_t size) {
void *p = malloc(size);

View file

@ -1,6 +1,9 @@
#ifndef _UTIL_H_
#define _UTIL_H_
#ifndef _WIN32
# include <iconv.h>
#endif
#include "ResourceEditor.h"
// these are the standard pause-before-quit shit.
@ -21,9 +24,22 @@ unsigned char* generate_uninstall_icon_data(char* filename);
int generate_unicons_offsets(unsigned char* exeHeader, unsigned char* uninstIconData);
#endif//NSIS_CONFIG_UNINSTALL_SUPPORT
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
// Returns dialog's raw data from a given loaded module
BYTE* get_dlg(HINSTANCE hUIFile, WORD dlgId, char* filename);
// returns the number of WCHARs in str including null charcter
int WCStrLen(const WCHAR* szwStr);
#ifndef _WIN32
char *CharPrev(const char *s, const char *p);
char *CharNext(const char *s);
int wsprintf(char *s, const char *format, ...);
// iconv const inconsistency workaround by Alexandre Oliva
template <typename T>
inline size_t __iconv_adaptor
(size_t (*iconv_func)(iconv_t, T, size_t *, char**,size_t*),
iconv_t cd, char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft)
{
return iconv_func (cd, (T)inbuf, inbytesleft, outbuf, outbytesleft);
}
#endif
#endif //_UTIL_H_

View file

@ -7,7 +7,7 @@
#ifndef _DEFLATE_H
#define _DEFLATE_H
#include "zutil.h"
#include "ZUTIL.H"
/* ===========================================================================
* Internal compression state.

View file

@ -76,7 +76,7 @@ local inflate_huft *fixed_tl;
local inflate_huft *fixed_td;
/* copy as much as possible from the sliding window to the output area */
local void inflate_flush(z)
local void ZEXPORT inflate_flush(z)
z_streamp z;
{
inflate_blocks_statef *s = &z->blocks;
@ -118,7 +118,7 @@ again:
#define BMAX 15 /* maximum bit length of any code */
local int huft_build(
local int ZEXPORT huft_build(
uIntf *b, /* code lengths in bits (all assumed <= BMAX) */
uInt n, /* number of codes (assumed <= 288) */
uInt s, /* number of simple-valued codes (0..s-1) */
@ -306,7 +306,7 @@ uInt *hn) /* working area: values in order of bit length */
return (y != 0 && g != 1) ? Z_BUF_ERROR : Z_OK;
}
int inflate(z_streamp z)
int ZEXPORT inflate(z_streamp z)
{
inflate_blocks_statef *s = &z->blocks;
inflate_codes_statef *c = &s->sub.decode.t_codes; /* codes state */

View file

@ -42,8 +42,8 @@
#ifndef _ZLIB_H
#define _ZLIB_H
#include "zconf.h"
#include "zutil.h"
#include "ZCONF.H"
#include "ZUTIL.H"
#ifdef __cplusplus
extern "C" {

View file

@ -8,13 +8,13 @@
subject to change. Applications should only use zlib.h.
*/
/* @(#) $Id: ZUTIL.H,v 1.1.1.1 2002/08/02 10:01:35 kichik Exp $ */
/* @(#) $Id: ZUTIL.H,v 1.2 2002/09/22 20:02:03 eccles Exp $ */
#ifndef _Z_UTIL_H
#define _Z_UTIL_H
#include <windows.h>
#include "zlib.h"
#include "../Platform.h"
#include "ZLIB.H"
#ifndef local
# define local static
@ -63,10 +63,11 @@ typedef unsigned long ulg;
#ifdef EXEHEAD
#include "../exehead/util.h"
#define ZALLOC(strm, items, size) my_GlobalAlloc((items)*(size))
#else // def EXEHEAD
#define ZALLOC(strm, items, size) GlobalAlloc(GPTR,(items)*(size))
#endif // def EXEHEAD
#define ZFREE(strm, addr) { if (addr) GlobalFree(addr); }
#else // def EXEHEAD
#define ZALLOC(strm, items, size) malloc((items)*(size))
#define ZFREE(strm, addr) { if (addr) free(addr); }
#endif // def EXEHEAD
#define TRY_FREE(s, p) { ZFREE(s, p); }
#define ERR_RETURN(strm,err) return (err)

View file

@ -4,7 +4,7 @@
*/
#include "deflate.h"
#include "DEFLATE.H"
const char deflate_copyright[] =
" deflate 1.1.3 Copyright 1995-1998 Jean-loup Gailly ";
@ -728,7 +728,7 @@ local void fill_window(s)
s->ins_h = s->window[s->strstart];
UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
#if MIN_MATCH != 3
Call UPDATE_HASH() MIN_MATCH-3 more times
# error Call UPDATE_HASH() MIN_MATCH-3 more times
#endif
}

View file

@ -4,7 +4,7 @@
*/
#include "deflate.h"
#include "DEFLATE.H"
#ifdef DEBUG
# include <ctype.h>