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:
parent
c6ff33d9c5
commit
5d0149966e
2 changed files with 88 additions and 72 deletions
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue