2002-08-02 10:01:35 +00:00
|
|
|
/*
|
2005-01-04 14:54:48 +00:00
|
|
|
Copyright (C) 2002-2005 Amir Szekely <kichik@netvision.net.il>
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
This software is provided 'as-is', without any express or implied
|
|
|
|
warranty. In no event will the authors be held liable for any damages
|
|
|
|
arising from the use of this software.
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
including commercial applications, and to alter it and redistribute it
|
|
|
|
freely, subject to the following restrictions:
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
|
|
claim that you wrote the original software. If you use this software
|
|
|
|
in a product, an acknowledgment in the product documentation would be
|
|
|
|
appreciated but is not required.
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
|
|
misrepresented as being the original software.
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
3. This notice may not be removed or altered from any source distribution.
|
2002-08-02 10:01:35 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#if !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_)
|
|
|
|
#define AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_
|
|
|
|
|
|
|
|
#if _MSC_VER > 1000
|
|
|
|
#pragma once
|
|
|
|
#endif // _MSC_VER > 1000
|
|
|
|
|
2004-01-30 22:04:10 +00:00
|
|
|
#include "Platform.h"
|
2004-03-29 20:21:00 +00:00
|
|
|
#include <vector>
|
|
|
|
#ifdef _WIN32
|
|
|
|
# include <WinNT.h>
|
|
|
|
#else
|
|
|
|
// all definitions for non Win32 platforms were taken from MinGW's free Win32 library
|
2004-08-13 20:01:12 +00:00
|
|
|
# define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
|
2004-03-29 20:21:00 +00:00
|
|
|
# define IMAGE_SCN_MEM_DISCARDABLE 0x2000000
|
|
|
|
# pragma pack(4)
|
|
|
|
typedef struct _IMAGE_RESOURCE_DIRECTORY {
|
2004-08-13 20:01:12 +00:00
|
|
|
DWORD Characteristics;
|
|
|
|
DWORD TimeDateStamp;
|
|
|
|
WORD MajorVersion;
|
|
|
|
WORD MinorVersion;
|
|
|
|
WORD NumberOfNamedEntries;
|
|
|
|
WORD NumberOfIdEntries;
|
2004-03-29 20:21:00 +00:00
|
|
|
} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;
|
|
|
|
typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
|
2004-08-13 20:01:12 +00:00
|
|
|
DWORD OffsetToData;
|
|
|
|
DWORD Size;
|
|
|
|
DWORD CodePage;
|
|
|
|
DWORD Reserved;
|
2004-03-29 20:21:00 +00:00
|
|
|
} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
|
|
|
|
typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
|
2004-08-13 20:01:12 +00:00
|
|
|
WORD Length;
|
|
|
|
CHAR NameString[1];
|
2004-03-29 20:21:00 +00:00
|
|
|
} IMAGE_RESOURCE_DIRECTORY_STRING,*PIMAGE_RESOURCE_DIRECTORY_STRING;
|
|
|
|
typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
|
2004-08-13 20:01:12 +00:00
|
|
|
WORD Length;
|
|
|
|
WCHAR NameString[1];
|
2004-03-29 20:21:00 +00:00
|
|
|
} IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#pragma pack(4)
|
|
|
|
typedef struct _MY_IMAGE_RESOURCE_DIRECTORY_ENTRY {
|
2004-08-13 20:01:12 +00:00
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
DWORD NameOffset:31;
|
|
|
|
DWORD NameIsString:1;
|
|
|
|
} NameString;
|
|
|
|
DWORD Name;
|
|
|
|
WORD Id;
|
|
|
|
};
|
|
|
|
union {
|
|
|
|
DWORD OffsetToData;
|
|
|
|
struct {
|
|
|
|
DWORD OffsetToDirectory:31;
|
|
|
|
DWORD DataIsDirectory:1;
|
|
|
|
} DirectoryOffset;
|
|
|
|
};
|
2004-03-29 20:21:00 +00:00
|
|
|
} MY_IMAGE_RESOURCE_DIRECTORY_ENTRY,*PMY_IMAGE_RESOURCE_DIRECTORY_ENTRY;
|
|
|
|
|
|
|
|
#pragma pack()
|
|
|
|
|
|
|
|
#include <stdexcept>
|
2002-08-02 10:01:35 +00:00
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
class CResourceDirectory;
|
|
|
|
class CResourceDirectoryEntry;
|
|
|
|
class CResourceDataEntry;
|
|
|
|
|
|
|
|
// Resource directory with entries
|
|
|
|
typedef struct RESOURCE_DIRECTORY {
|
2003-06-24 19:17:51 +00:00
|
|
|
IMAGE_RESOURCE_DIRECTORY Header;
|
2004-03-29 20:21:00 +00:00
|
|
|
MY_IMAGE_RESOURCE_DIRECTORY_ENTRY Entries[1];
|
2002-08-02 10:01:35 +00:00
|
|
|
} *PRESOURCE_DIRECTORY;
|
|
|
|
|
|
|
|
class CResourceEditor {
|
|
|
|
public:
|
2003-06-24 19:17:51 +00:00
|
|
|
CResourceEditor(BYTE* pbPE, int iSize);
|
|
|
|
virtual ~CResourceEditor();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
bool UpdateResource(char* szType, char* szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize);
|
|
|
|
bool UpdateResource(WORD szType, char* szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize);
|
|
|
|
bool UpdateResource(char* szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize);
|
|
|
|
bool UpdateResource(WORD szType, WORD szName, LANGID wLanguage, BYTE* lpData, DWORD dwSize);
|
|
|
|
BYTE* GetResource(char* szType, char* szName, LANGID wLanguage);
|
2004-09-11 11:25:19 +00:00
|
|
|
int GetResourceSize(char* szType, char* szName, LANGID wLanguage);
|
2004-02-05 12:19:02 +00:00
|
|
|
void FreeResource(BYTE* pbResource);
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
bool AddExtraVirtualSize2PESection(const char* pszSectionName, int addsize);
|
2004-02-05 12:19:02 +00:00
|
|
|
DWORD Save(BYTE* pbBuf, DWORD &dwSize);
|
2002-08-02 10:01:35 +00:00
|
|
|
|
|
|
|
private:
|
2003-06-24 19:17:51 +00:00
|
|
|
BYTE* m_pbPE;
|
|
|
|
int m_iSize;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
PIMAGE_DOS_HEADER m_dosHeader;
|
|
|
|
PIMAGE_NT_HEADERS m_ntHeaders;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
DWORD m_dwResourceSectionIndex;
|
|
|
|
DWORD m_dwResourceSectionVA;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
CResourceDirectory* m_cResDir;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
CResourceDirectory* ScanDirectory(PRESOURCE_DIRECTORY rdRoot, PRESOURCE_DIRECTORY rdToScan);
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
void WriteRsrcSec(BYTE* pbRsrcSec);
|
|
|
|
void SetOffsets(CResourceDirectory* resDir, DWORD newResDirAt);
|
2002-08-02 10:01:35 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class CResourceDirectory {
|
|
|
|
public:
|
2003-06-24 19:17:51 +00:00
|
|
|
CResourceDirectory(PIMAGE_RESOURCE_DIRECTORY prd);
|
|
|
|
virtual ~CResourceDirectory();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
IMAGE_RESOURCE_DIRECTORY GetInfo();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
CResourceDirectoryEntry* GetEntry(unsigned int i);
|
|
|
|
void AddEntry(CResourceDirectoryEntry* entry);
|
|
|
|
void RemoveEntry(int i);
|
|
|
|
int CountEntries();
|
|
|
|
int Find(char* szName);
|
|
|
|
int Find(WORD wId);
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
DWORD GetSize();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
void Destroy();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
DWORD m_dwWrittenAt;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
|
|
|
private:
|
2003-06-24 19:17:51 +00:00
|
|
|
IMAGE_RESOURCE_DIRECTORY m_rdDir;
|
|
|
|
vector<CResourceDirectoryEntry*> m_vEntries;
|
2002-08-02 10:01:35 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class CResourceDirectoryEntry {
|
|
|
|
public:
|
2003-06-24 19:17:51 +00:00
|
|
|
CResourceDirectoryEntry(char* szName, CResourceDirectory* rdSubDir);
|
|
|
|
CResourceDirectoryEntry(char* szName, CResourceDataEntry* rdeData);
|
|
|
|
virtual ~CResourceDirectoryEntry();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
bool HasName();
|
|
|
|
char* GetName();
|
|
|
|
int GetNameLength();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
WORD GetId();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
bool IsDataDirectory();
|
|
|
|
CResourceDirectory* GetSubDirectory();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
CResourceDataEntry* GetDataEntry();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
DWORD m_dwWrittenAt;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
|
|
|
private:
|
2003-06-24 19:17:51 +00:00
|
|
|
bool m_bHasName;
|
|
|
|
union {
|
|
|
|
char* m_szName;
|
|
|
|
WORD m_wId;
|
|
|
|
};
|
|
|
|
|
|
|
|
bool m_bIsDataDirectory;
|
|
|
|
union {
|
|
|
|
CResourceDirectory* m_rdSubDir;
|
|
|
|
CResourceDataEntry* m_rdeData;
|
|
|
|
};
|
2002-08-02 10:01:35 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class CResourceDataEntry {
|
|
|
|
public:
|
2003-06-24 19:17:51 +00:00
|
|
|
CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage = 0);
|
|
|
|
~CResourceDataEntry();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
BYTE* GetData();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
void SetData(BYTE* pbData, DWORD dwSize);
|
|
|
|
void SetData(BYTE* pbData, DWORD dwSize, DWORD dwCodePage);
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
DWORD GetSize();
|
|
|
|
DWORD GetCodePage();
|
2002-08-02 10:01:35 +00:00
|
|
|
|
2003-06-24 19:17:51 +00:00
|
|
|
DWORD m_dwWrittenAt;
|
2002-08-02 10:01:35 +00:00
|
|
|
|
|
|
|
private:
|
2003-06-24 19:17:51 +00:00
|
|
|
BYTE* m_pbData;
|
|
|
|
DWORD m_dwSize;
|
|
|
|
DWORD m_dwCodePage;
|
2002-08-02 10:01:35 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_)
|