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

View file

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