added GetResourceOffsetA/W()
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5305 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
cc72c11f4f
commit
36683c9f87
2 changed files with 63 additions and 5 deletions
|
@ -350,6 +350,46 @@ int CResourceEditor::GetResourceSizeA(char* szType, char* szName, LANGID wLangua
|
|||
return result;
|
||||
}
|
||||
|
||||
// Returns the offset of the requested resource in the original PE
|
||||
// Returns -1 if the requested resource can't be found
|
||||
DWORD CResourceEditor::GetResourceOffsetW(WCHAR* szType, WCHAR* szName, LANGID wLanguage) {
|
||||
CResourceDirectory* nameDir = 0;
|
||||
CResourceDirectory* langDir = 0;
|
||||
CResourceDataEntry* data = 0;
|
||||
|
||||
int i = m_cResDir->Find(szType);
|
||||
if (i > -1) {
|
||||
nameDir = m_cResDir->GetEntry(i)->GetSubDirectory();
|
||||
i = nameDir->Find(szName);
|
||||
if (i > -1) {
|
||||
langDir = nameDir->GetEntry(i)->GetSubDirectory();
|
||||
i = 0;
|
||||
if (wLanguage)
|
||||
i = langDir->Find(wLanguage);
|
||||
if (i > -1) {
|
||||
data = langDir->GetEntry(i)->GetDataEntry();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (data)
|
||||
return data->GetOffset();
|
||||
else
|
||||
return DWORD(-1);
|
||||
}
|
||||
|
||||
int CResourceEditor::GetResourceOffsetA(char* szType, char* szName, LANGID wLanguage) {
|
||||
WCHAR* szwType = ResStringToUnicode(szType);
|
||||
WCHAR* szwName = ResStringToUnicode(szName);
|
||||
|
||||
DWORD result = GetResourceOffsetW(szwType, szwName, wLanguage);
|
||||
|
||||
FreeUnicodeResString(szwType);
|
||||
FreeUnicodeResString(szwName);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void CResourceEditor::FreeResource(BYTE* pbResource)
|
||||
{
|
||||
if (pbResource)
|
||||
|
@ -568,26 +608,34 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P
|
|||
szName = MAKEINTRESOURCEW(ConvertEndianness(rdToScan->Entries[i].UName.Id));
|
||||
|
||||
if (rd.UOffset.DirectoryOffset.DataIsDirectory)
|
||||
{
|
||||
rdc->AddEntry(
|
||||
new CResourceDirectoryEntry(
|
||||
szName,
|
||||
ScanDirectory(
|
||||
rdRoot,
|
||||
PRESOURCE_DIRECTORY(rd.UOffset.DirectoryOffset.OffsetToDirectory + (BYTE*)rdRoot)
|
||||
PRESOURCE_DIRECTORY(rd.UOffset.DirectoryOffset.OffsetToDirectory + (LPBYTE)rdRoot)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
LPBYTE pbData = (LPBYTE)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA;
|
||||
DWORD dwOffset = DWORD(pbData - m_pbPE);
|
||||
|
||||
rdc->AddEntry(
|
||||
new CResourceDirectoryEntry(
|
||||
szName,
|
||||
new CResourceDataEntry(
|
||||
(BYTE*)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA,
|
||||
pbData,
|
||||
ConvertEndianness(rde->Size),
|
||||
ConvertEndianness(rde->CodePage)
|
||||
ConvertEndianness(rde->CodePage),
|
||||
dwOffset
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Delete the dynamicly allocated name if it is a name and not an id
|
||||
if (!IS_INTRESOURCE(szName))
|
||||
|
@ -978,9 +1026,10 @@ CResourceDataEntry* CResourceDirectoryEntry::GetDataEntry() {
|
|||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
CResourceDataEntry::CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage) {
|
||||
CResourceDataEntry::CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage, DWORD dwOffset) {
|
||||
m_pbData = 0;
|
||||
SetData(pbData, dwSize, dwCodePage);
|
||||
m_dwOffset = dwOffset;
|
||||
}
|
||||
|
||||
CResourceDataEntry::~CResourceDataEntry() {
|
||||
|
@ -1008,6 +1057,7 @@ void CResourceDataEntry::SetData(BYTE* pbData, DWORD dwSize, DWORD dwCodePage) {
|
|||
CopyMemory(m_pbData, pbData, dwSize);
|
||||
m_dwSize = dwSize;
|
||||
m_dwCodePage = dwCodePage;
|
||||
m_dwOffset = DWORD(-1); // unset
|
||||
}
|
||||
|
||||
DWORD CResourceDataEntry::GetSize() {
|
||||
|
@ -1017,3 +1067,7 @@ DWORD CResourceDataEntry::GetSize() {
|
|||
DWORD CResourceDataEntry::GetCodePage() {
|
||||
return m_dwCodePage;
|
||||
}
|
||||
|
||||
DWORD CResourceDataEntry::GetOffset() {
|
||||
return m_dwOffset;
|
||||
}
|
||||
|
|
|
@ -123,6 +123,8 @@ public:
|
|||
BYTE* GetResourceA(char* szType, char* szName, LANGID wLanguage);
|
||||
int GetResourceSizeW(WCHAR* szType, WCHAR* szName, LANGID wLanguage);
|
||||
int GetResourceSizeA(char* szType, char* szName, LANGID wLanguage);
|
||||
DWORD GetResourceOffsetW(WCHAR* szType, WCHAR* szName, LANGID wLanguage);
|
||||
DWORD GetResourceOffsetA(char* szType, char* szName, LANGID wLanguage);
|
||||
void FreeResource(BYTE* pbResource);
|
||||
|
||||
bool AddExtraVirtualSize2PESection(const char* pszSectionName, int addsize);
|
||||
|
@ -217,7 +219,7 @@ private:
|
|||
|
||||
class CResourceDataEntry {
|
||||
public:
|
||||
CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage = 0);
|
||||
CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage = 0, DWORD dwOffset = DWORD(-1));
|
||||
~CResourceDataEntry();
|
||||
|
||||
BYTE* GetData();
|
||||
|
@ -227,6 +229,7 @@ public:
|
|||
|
||||
DWORD GetSize();
|
||||
DWORD GetCodePage();
|
||||
DWORD GetOffset();
|
||||
|
||||
DWORD m_dwWrittenAt;
|
||||
|
||||
|
@ -234,6 +237,7 @@ private:
|
|||
BYTE* m_pbData;
|
||||
DWORD m_dwSize;
|
||||
DWORD m_dwCodePage;
|
||||
DWORD m_dwOffset;
|
||||
};
|
||||
|
||||
#endif // !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue