big-endian compatibility

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4608 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2006-03-24 18:36:24 +00:00
parent c6ff33d9c5
commit 5d0149966e
2 changed files with 88 additions and 72 deletions

View file

@ -36,18 +36,30 @@ using namespace std;
// Utilities
//////////////////////////////////////////////////////////////////////
static inline DWORD ConvertEndianness(DWORD d) {
return FIX_ENDIAN_INT32(d);
}
static inline WORD ConvertEndianness(WORD w) {
return FIX_ENDIAN_INT16(w);
}
static inline short ConvertEndianness(short s) {
return ConvertEndianness(WORD(s));
}
#define ALIGN(dwToAlign, dwAlignOn) dwToAlign = (dwToAlign%dwAlignOn == 0) ? dwToAlign : dwToAlign - (dwToAlign%dwAlignOn) + dwAlignOn
// Reads a variany length array from seeker into readInto and advances seeker
void ReadVarLenArr(LPBYTE &seeker, char* &readInto, unsigned int uCodePage) {
WORD* arr = (WORD*)seeker;
switch (arr[0]) {
switch (ConvertEndianness(arr[0])) {
case 0x0000:
readInto = 0;
seeker += sizeof(WORD);
break;
case 0xFFFF:
readInto = MAKEINTRESOURCE(arr[1]);
readInto = MAKEINTRESOURCE(ConvertEndianness(arr[1]));
seeker += 2*sizeof(WORD);
break;
default:
@ -81,7 +93,7 @@ void ReadVarLenArr(LPBYTE &seeker, char* &readInto, unsigned int uCodePage) {
if (IS_INTRESOURCE(x)) { \
*(WORD*)seeker = 0xFFFF; \
seeker += sizeof(WORD); \
*(WORD*)seeker = WORD(DWORD(x)); \
*(WORD*)seeker = ConvertEndianness(WORD(DWORD(x))); \
seeker += sizeof(WORD); \
} \
else { \
@ -121,29 +133,29 @@ CDialogTemplate::CDialogTemplate(BYTE* pbData, unsigned int uCodePage) {
DLGTEMPLATEEX* dTemplateEx = (DLGTEMPLATEEX*)pbData;
m_dwHelpId = dTemplateEx->helpID;
m_dwStyle = dTemplateEx->style;
m_dwExtStyle = dTemplateEx->exStyle;
m_sX = dTemplateEx->x;
m_sY = dTemplateEx->y;
m_sWidth = dTemplateEx->cx;
m_sHeight = dTemplateEx->cy;
m_dwHelpId = ConvertEndianness(dTemplateEx->helpID);
m_dwStyle = ConvertEndianness(dTemplateEx->style);
m_dwExtStyle = ConvertEndianness(dTemplateEx->exStyle);
m_sX = ConvertEndianness(dTemplateEx->x);
m_sY = ConvertEndianness(dTemplateEx->y);
m_sWidth = ConvertEndianness(dTemplateEx->cx);
m_sHeight = ConvertEndianness(dTemplateEx->cy);
wItems = dTemplateEx->cDlgItems;
wItems = ConvertEndianness(dTemplateEx->cDlgItems);
}
else {
m_bExtended = false;
DLGTEMPLATE* dTemplate = (DLGTEMPLATE*)pbData;
m_dwStyle = dTemplate->style;
m_dwExtStyle = dTemplate->dwExtendedStyle;
m_sX = dTemplate->x;
m_sY = dTemplate->y;
m_sWidth = dTemplate->cx;
m_sHeight = dTemplate->cy;
m_dwStyle = ConvertEndianness(dTemplate->style);
m_dwExtStyle = ConvertEndianness(dTemplate->dwExtendedStyle);
m_sX = ConvertEndianness(dTemplate->x);
m_sY = ConvertEndianness(dTemplate->y);
m_sWidth = ConvertEndianness(dTemplate->cx);
m_sHeight = ConvertEndianness(dTemplate->cy);
wItems = dTemplate->cdit;
wItems = ConvertEndianness(dTemplate->cdit);
}
BYTE* seeker = pbData + (m_bExtended ? sizeof(DLGTEMPLATEEX) : sizeof(DLGTEMPLATE));
@ -156,10 +168,10 @@ CDialogTemplate::CDialogTemplate(BYTE* pbData, unsigned int uCodePage) {
ReadVarLenArr(seeker, m_szTitle, m_uCodePage);
// Read font size and variant length array (only if style DS_SETFONT is used!)
if (m_dwStyle & DS_SETFONT) {
m_sFontSize = *(short*)seeker;
m_sFontSize = ConvertEndianness(*(short*)seeker);
seeker += sizeof(short);
if (m_bExtended) {
m_sFontWeight = *(short*)seeker;
m_sFontWeight = ConvertEndianness(*(short*)seeker);
seeker += sizeof(short);
m_bItalic = *(BYTE*)seeker;
seeker += sizeof(BYTE);
@ -181,14 +193,14 @@ CDialogTemplate::CDialogTemplate(BYTE* pbData, unsigned int uCodePage) {
if (m_bExtended) {
DLGITEMTEMPLATEEX* rawItem = (DLGITEMTEMPLATEEX*)seeker;
item->dwHelpId = rawItem->helpID;
item->dwStyle = rawItem->style;
item->dwExtStyle = rawItem->exStyle;
item->sX = rawItem->x;
item->sY = rawItem->y;
item->sWidth = rawItem->cx;
item->sHeight = rawItem->cy;
item->wId = rawItem->id;
item->dwHelpId = ConvertEndianness(rawItem->helpID);
item->dwStyle = ConvertEndianness(rawItem->style);
item->dwExtStyle = ConvertEndianness(rawItem->exStyle);
item->sX = ConvertEndianness(rawItem->x);
item->sY = ConvertEndianness(rawItem->y);
item->sWidth = ConvertEndianness(rawItem->cx);
item->sHeight = ConvertEndianness(rawItem->cy);
item->wId = ConvertEndianness(rawItem->id);
seeker += sizeof(DLGITEMTEMPLATEEX);
}
@ -196,13 +208,13 @@ CDialogTemplate::CDialogTemplate(BYTE* pbData, unsigned int uCodePage) {
DLGITEMTEMPLATE* rawItem = (DLGITEMTEMPLATE*)seeker;
item->dwHelpId = 0;
item->dwStyle = rawItem->style;
item->dwExtStyle = rawItem->dwExtendedStyle;
item->sX = rawItem->x;
item->sY = rawItem->y;
item->sWidth = rawItem->cx;
item->sHeight = rawItem->cy;
item->wId = rawItem->id;
item->dwStyle = ConvertEndianness(rawItem->style);
item->dwExtStyle = ConvertEndianness(rawItem->dwExtendedStyle);
item->sX = ConvertEndianness(rawItem->x);
item->sY = ConvertEndianness(rawItem->y);
item->sWidth = ConvertEndianness(rawItem->cx);
item->sHeight = ConvertEndianness(rawItem->cy);
item->wId = ConvertEndianness(rawItem->id);
seeker += sizeof(DLGITEMTEMPLATE);
}
@ -214,7 +226,7 @@ CDialogTemplate::CDialogTemplate(BYTE* pbData, unsigned int uCodePage) {
// Read creation data variant length array
// First read the size of the array (no null termination)
item->wCreateDataSize = *(WORD*)seeker;
item->wCreateDataSize = ConvertEndianness(*(WORD*)seeker);
seeker += sizeof(WORD);
// Then read the array it self (if size is not 0)
if (item->wCreateDataSize) {
@ -511,16 +523,16 @@ BYTE* CDialogTemplate::Save(DWORD& dwSize) {
if (m_bExtended) {
DLGTEMPLATEEX dh = {
0x0001,
0xFFFF,
m_dwHelpId,
m_dwExtStyle,
m_dwStyle,
m_vItems.size(),
m_sX,
m_sY,
m_sWidth,
m_sHeight
ConvertEndianness(WORD(0x0001)),
ConvertEndianness(WORD(0xFFFF)),
ConvertEndianness(m_dwHelpId),
ConvertEndianness(m_dwExtStyle),
ConvertEndianness(m_dwStyle),
ConvertEndianness(WORD(m_vItems.size())),
ConvertEndianness(m_sX),
ConvertEndianness(m_sY),
ConvertEndianness(m_sWidth),
ConvertEndianness(m_sHeight)
};
CopyMemory(seeker, &dh, sizeof(DLGTEMPLATEEX));
@ -528,13 +540,13 @@ BYTE* CDialogTemplate::Save(DWORD& dwSize) {
}
else {
DLGTEMPLATE dh = {
m_dwStyle,
m_dwExtStyle,
m_vItems.size(),
m_sX,
m_sY,
m_sWidth,
m_sHeight
ConvertEndianness(m_dwStyle),
ConvertEndianness(m_dwExtStyle),
ConvertEndianness(WORD(m_vItems.size())),
ConvertEndianness(m_sX),
ConvertEndianness(m_sY),
ConvertEndianness(m_sWidth),
ConvertEndianness(m_sHeight)
};
CopyMemory(seeker, &dh, sizeof(DLGTEMPLATE));
@ -550,10 +562,10 @@ BYTE* CDialogTemplate::Save(DWORD& dwSize) {
// Write font variant length array, size, and extended info (if needed)
if (m_dwStyle & DS_SETFONT) {
*(short*)seeker = m_sFontSize;
*(short*)seeker = ConvertEndianness(m_sFontSize);
seeker += sizeof(short);
if (m_bExtended) {
*(short*)seeker = m_sFontWeight;
*(short*)seeker = ConvertEndianness(m_sFontWeight);
seeker += sizeof(short);
*(BYTE*)seeker = m_bItalic;
seeker += sizeof(BYTE);
@ -571,14 +583,14 @@ BYTE* CDialogTemplate::Save(DWORD& dwSize) {
if (m_bExtended) {
DLGITEMTEMPLATEEX dih = {
m_vItems[i]->dwHelpId,
m_vItems[i]->dwExtStyle,
m_vItems[i]->dwStyle,
m_vItems[i]->sX,
m_vItems[i]->sY,
m_vItems[i]->sWidth,
m_vItems[i]->sHeight,
m_vItems[i]->wId
ConvertEndianness(m_vItems[i]->dwHelpId),
ConvertEndianness(m_vItems[i]->dwExtStyle),
ConvertEndianness(m_vItems[i]->dwStyle),
ConvertEndianness(m_vItems[i]->sX),
ConvertEndianness(m_vItems[i]->sY),
ConvertEndianness(m_vItems[i]->sWidth),
ConvertEndianness(m_vItems[i]->sHeight),
ConvertEndianness(m_vItems[i]->wId)
};
CopyMemory(seeker, &dih, sizeof(DLGITEMTEMPLATEEX));
@ -586,13 +598,13 @@ BYTE* CDialogTemplate::Save(DWORD& dwSize) {
}
else {
DLGITEMTEMPLATE dih = {
m_vItems[i]->dwStyle,
m_vItems[i]->dwExtStyle,
m_vItems[i]->sX,
m_vItems[i]->sY,
m_vItems[i]->sWidth,
m_vItems[i]->sHeight,
m_vItems[i]->wId
ConvertEndianness(m_vItems[i]->dwStyle),
ConvertEndianness(m_vItems[i]->dwExtStyle),
ConvertEndianness(m_vItems[i]->sX),
ConvertEndianness(m_vItems[i]->sY),
ConvertEndianness(m_vItems[i]->sWidth),
ConvertEndianness(m_vItems[i]->sHeight),
ConvertEndianness(m_vItems[i]->wId)
};
CopyMemory(seeker, &dih, sizeof(DLGITEMTEMPLATE));
@ -608,7 +620,7 @@ BYTE* CDialogTemplate::Save(DWORD& dwSize) {
// First write its size
WORD wCreateDataSize = m_vItems[i]->wCreateDataSize;
if (m_vItems[i]->wCreateDataSize) wCreateDataSize += sizeof(WORD);
*(WORD*)seeker = wCreateDataSize;
*(WORD*)seeker = ConvertEndianness(wCreateDataSize);
seeker += sizeof(WORD);
// If size is nonzero write the data too
if (m_vItems[i]->wCreateDataSize) {

View file

@ -32,7 +32,11 @@
#include <vector>
#include <stdexcept>
#define EXTENDED_DIALOG ((DWORD) 0xFFFF0001)
#ifndef __BIG_ENDIAN__
# define EXTENDED_DIALOG ((DWORD) 0xFFFF0001)
#else
# define EXTENDED_DIALOG ((DWORD) 0x0100FFFF)
#endif
struct DialogItemTemplate {
DWORD dwHelpId; // Extended only