|
|
//=====================================================================
//
// Definition for the standard Mac formats
//
//=====================================================================
#define LPNULL 0L
#define MAXLEVELS 3 // Max number of level in the PE header tree
#define IMAGE_FILE_MACHINE_M68K 0x0268 // Identify the M68K machine signature
#define appleMark 20
#define CODEPAGE (DWORD)-1L // Will assume ansi char set [might be wrong]
#define MENU_TYPE 4 // Map MENU to menu (4)
#define DLOG_TYPE 5 // Map DLOG to dialog (5)
#define DITL_TYPE 17 // Map DITL to 17 since 17 is unused we avoid ID conflicts with DLOG
#define STR_TYPE 6 // Map STR to string table (6)
#define MSG_TYPE 11 // Map STR# and TEXT to message table (11)
#define WIND_TYPE 18 // Map WIND to 18, unknown type, treated like a STR
#define COORDINATE_FACTOR 0.50 // factor of reduction from mac to windows
#define _APPLE_MARK_ "_APPLE_MARK_"
//=====================================================================
// Conversion utility
//=====================================================================
#define MACLONG(x) BYTE x[4]
#define MACWORD(x) BYTE x[2]
BYTE * WordToMacWord(WORD w); BYTE * LongToMacLong(LONG l); BYTE * LongToMacOffset(LONG l); BYTE * WinValToMacVal(WORD w);
LONG __inline MacLongToLong(BYTE * p) { LONG l = 0; BYTE *pl = (BYTE *) &l; p += 3; *pl++ = *p--; *pl++ = *p--; *pl++ = *p--; *pl = *p; return l; }
LONG __inline MacOffsetToLong(BYTE * p) { LONG l = 0; BYTE *pl = (BYTE *) &l; p += 2; *pl++ = *p--; *pl++ = *p--; *pl = *p; return l; }
WORD __inline MacWordToWord(BYTE * p) { WORD w = 0; BYTE *pw = (BYTE *) &w; p += 1; *pw++ = *p--; *pw = *p; return w; }
WORD __inline MacValToWinVal(BYTE * p) { return (WORD)(MacWordToWord(p)*COORDINATE_FACTOR); }
DWORD __inline MemCopy( LPVOID lpTgt, LPVOID lpSrc, DWORD dwSize, DWORD dwMaxTgt) { if(!dwSize) // If the user is asking us to copy 0 then
return 1; // do nothing but return 1 so the return test will be succesfull
if(dwMaxTgt>=dwSize) { memcpy(lpTgt, lpSrc, dwSize); lpTgt = (BYTE*)lpTgt+dwSize; return dwSize; } return 0; }
typedef BYTE * * LPLPBYTE;
typedef struct tagMacResHeader { MACLONG(mulOffsetToResData); MACLONG(mulOffsetToResMap); MACLONG(mulSizeOfResData); MACLONG(mulSizeOfResMap); } MACRESHEADER, *PMACRESHEADER;
typedef struct tagMacResMap { BYTE reserved[16+4+2]; MACWORD(mwResFileAttribute); MACWORD(mwOffsetToTypeList); MACWORD(mwOffsetToNameList); } MACRESMAP, *PMACRESMAP;
typedef struct tagMacResTypeList { BYTE szResName[4]; MACWORD(mwNumOfThisType); MACWORD(mwOffsetToRefList); } MACRESTYPELIST, *PMACRESTYPELIST;
typedef struct tagMacResRefList { MACWORD(mwResID); MACWORD(mwOffsetToResName); BYTE bResAttribute; BYTE bOffsetToResData[3]; MACLONG(reserved); } MACRESREFLIST, *PMACRESREFLIST;
typedef struct tagMacToWindowsMap { WORD wType; char szTypeName[5]; WORD wResID; char szResName[256]; DWORD dwOffsetToData; DWORD dwSizeOfData; } MACTOWINDOWSMAP, *PMACTOWINDOWSMAP;
typedef struct tagUpdResList { WORD * pTypeId; BYTE * pTypeName; WORD * pResId; BYTE * pResName; DWORD * pLang; DWORD * pSize; struct tagUpdResList* pNext; } UPDATEDRESLIST, *PUPDATEDRESLIST;
//=============================================================================
//=============================================================================
//
// Dialog structures
//
//=============================================================================
//=============================================================================
typedef struct tagMacWDLG { MACLONG(dwStyle); MACLONG(dwExtStyle); MACWORD(wNumOfElem); MACWORD(wX); MACWORD(wY); MACWORD(wcX); MACWORD(wcY); // more
} MACWDLG, *PMACWDLG;
typedef struct tagMacWDLGI { MACLONG(dwStyle); MACLONG(dwExtStyle); MACWORD(wX); MACWORD(wY); MACWORD(wcX); MACWORD(wcY); MACWORD(wID); // more
} MACWDLGI, *PMACWDLGI;
typedef struct tagMacDLOG { MACWORD(wTop); MACWORD(wLeft); MACWORD(wBottom); MACWORD(wRight); MACWORD(wProcID); BYTE bVisibile; BYTE ignored1; BYTE bGoAway; BYTE ignored2; MACLONG(lRefCon); MACWORD(wRefIdOfDITL); BYTE bLenOfTitle; //BYTE Title[];
} MACDLOG, *PMACDLOG;
typedef struct tagMacALRT { MACWORD(wTop); MACWORD(wLeft); MACWORD(wBottom); MACWORD(wRight); MACWORD(wRefIdOfDITL); MACLONG(lStage); } MACALRT, *PMACALRT;
typedef struct tagMacDIT { MACLONG(lPointer); MACWORD(wTop); MACWORD(wLeft); MACWORD(wBottom); MACWORD(wRight); BYTE bType; BYTE bSizeOfDataType; } MACDIT, *PMACDIT;
typedef struct tagMacWIND { MACWORD(wTop); MACWORD(wLeft); MACWORD(wBottom); MACWORD(wRight); MACWORD(wProcId); BYTE bVisibile; BYTE ignored1; BYTE bGoAway; BYTE ignored2; MACLONG(lRefCon); BYTE bLenOfTitle; //BYTE Title[];
} MACWIND, *PMACWIND;
//=============================================================================
//=============================================================================
//
// Menu structures
//
//=============================================================================
//=============================================================================
typedef struct tagMacMenu { MACWORD(wId); MACWORD(wWidth); MACWORD(wHeigth); MACWORD(wDefProcId); MACWORD(wReserved); // must be 0
MACLONG(lEnableFlags); BYTE bSizeOfTitle; } MACMENU, *PMACMENU;
typedef struct tagMacMenuItem { //BYTE bSizeOfText;
// text
BYTE bIconId; BYTE bKeyCodeId; BYTE bKeyCodeMark; BYTE bCharStyle; } MACMENUITEM, *PMACMENUITEM;
//=============================================================================
//=============================================================================
//
// PE Header parsing functions
//
//=============================================================================
//=============================================================================
UINT FindMacResourceSection( CFile*, BYTE **, PIMAGE_SECTION_HEADER*, int *); UINT ParseResourceFile( BYTE * pResFile, PIMAGE_SECTION_HEADER, BYTE **, LONG *, int ); BOOL IsMacResFile ( CFile * pFile );
//=============================================================================
//=============================================================================
//
// Parsing functions
//
//=============================================================================
//=============================================================================
UINT ParseSTR( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize ); UINT ParseTEXT( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize ); UINT ParseSTRNUM( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize );
UINT ParseDLOG( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize ); UINT ParseALRT( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize ); UINT ParseWDLG( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize ); UINT ParseWIND( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize );
UINT ParseWMNU( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize ); UINT ParseMENU( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize ); UINT ParseMBAR( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize );
//=============================================================================
// Used by ParseDLOG and ParseALRT to find the DITL
DWORD FindMacResource( LPSTR pfilename, LPSTR lpType, LPSTR pName ); DWORD FindResourceInResFile( BYTE * pResFile, PIMAGE_SECTION_HEADER pResSection, LPSTR pResType, LPSTR pResName);
UINT ParseDITL( LPVOID lpImageBuf, DWORD dwImageSize, LPVOID lpBuffer, DWORD dwSize );
//=============================================================================
//=============================================================================
//
// Updating functions
//
//=============================================================================
//=============================================================================
UINT UpdateMENU( LPVOID, DWORD, LPVOID, DWORD, LPVOID, DWORD *);
UINT UpdateSTR( LPVOID, DWORD, LPVOID, DWORD, LPVOID, DWORD *); UINT UpdateSTRNUM( LPVOID, DWORD, LPVOID, DWORD, LPVOID, DWORD *);
UINT UpdateDLOG( LPVOID, DWORD, LPVOID, DWORD, LPVOID, DWORD *); UINT UpdateALRT( LPVOID, DWORD, LPVOID, DWORD, LPVOID, DWORD *); UINT UpdateDITL( LPVOID, DWORD, LPVOID, DWORD, LPVOID, DWORD *); UINT UpdateWDLG( LPVOID, DWORD, LPVOID, DWORD, LPVOID, DWORD *); UINT UpdateWIND( LPVOID, DWORD, LPVOID, DWORD, LPVOID, DWORD *);
//=============================================================================
//=============================================================================
//
// General helper functions
//
//=============================================================================
//=============================================================================
WORD GetMacWString( WORD **, char *, int ); WORD PutMacWString( WORD *, char *, int ); PUPDATEDRESLIST IsResUpdated( BYTE*, MACRESREFLIST, PUPDATEDRESLIST); PUPDATEDRESLIST UpdatedResList( LPVOID, UINT );
//=============================================================================
//=============================================================================
//
// Mac to ANSI and back conversion
//
//=============================================================================
//=============================================================================
LPCSTR MacCpToAnsiCp(LPCSTR str); LPCSTR AnsiCpToMacCp(LPCSTR str);
|