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;
|
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)
|
void CResourceEditor::FreeResource(BYTE* pbResource)
|
||||||
{
|
{
|
||||||
if (pbResource)
|
if (pbResource)
|
||||||
|
@ -568,26 +608,34 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P
|
||||||
szName = MAKEINTRESOURCEW(ConvertEndianness(rdToScan->Entries[i].UName.Id));
|
szName = MAKEINTRESOURCEW(ConvertEndianness(rdToScan->Entries[i].UName.Id));
|
||||||
|
|
||||||
if (rd.UOffset.DirectoryOffset.DataIsDirectory)
|
if (rd.UOffset.DirectoryOffset.DataIsDirectory)
|
||||||
|
{
|
||||||
rdc->AddEntry(
|
rdc->AddEntry(
|
||||||
new CResourceDirectoryEntry(
|
new CResourceDirectoryEntry(
|
||||||
szName,
|
szName,
|
||||||
ScanDirectory(
|
ScanDirectory(
|
||||||
rdRoot,
|
rdRoot,
|
||||||
PRESOURCE_DIRECTORY(rd.UOffset.DirectoryOffset.OffsetToDirectory + (BYTE*)rdRoot)
|
PRESOURCE_DIRECTORY(rd.UOffset.DirectoryOffset.OffsetToDirectory + (LPBYTE)rdRoot)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
LPBYTE pbData = (LPBYTE)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA;
|
||||||
|
DWORD dwOffset = DWORD(pbData - m_pbPE);
|
||||||
|
|
||||||
rdc->AddEntry(
|
rdc->AddEntry(
|
||||||
new CResourceDirectoryEntry(
|
new CResourceDirectoryEntry(
|
||||||
szName,
|
szName,
|
||||||
new CResourceDataEntry(
|
new CResourceDataEntry(
|
||||||
(BYTE*)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA,
|
pbData,
|
||||||
ConvertEndianness(rde->Size),
|
ConvertEndianness(rde->Size),
|
||||||
ConvertEndianness(rde->CodePage)
|
ConvertEndianness(rde->CodePage),
|
||||||
|
dwOffset
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Delete the dynamicly allocated name if it is a name and not an id
|
// Delete the dynamicly allocated name if it is a name and not an id
|
||||||
if (!IS_INTRESOURCE(szName))
|
if (!IS_INTRESOURCE(szName))
|
||||||
|
@ -978,9 +1026,10 @@ CResourceDataEntry* CResourceDirectoryEntry::GetDataEntry() {
|
||||||
// Construction/Destruction
|
// Construction/Destruction
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
CResourceDataEntry::CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage) {
|
CResourceDataEntry::CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage, DWORD dwOffset) {
|
||||||
m_pbData = 0;
|
m_pbData = 0;
|
||||||
SetData(pbData, dwSize, dwCodePage);
|
SetData(pbData, dwSize, dwCodePage);
|
||||||
|
m_dwOffset = dwOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
CResourceDataEntry::~CResourceDataEntry() {
|
CResourceDataEntry::~CResourceDataEntry() {
|
||||||
|
@ -1008,6 +1057,7 @@ void CResourceDataEntry::SetData(BYTE* pbData, DWORD dwSize, DWORD dwCodePage) {
|
||||||
CopyMemory(m_pbData, pbData, dwSize);
|
CopyMemory(m_pbData, pbData, dwSize);
|
||||||
m_dwSize = dwSize;
|
m_dwSize = dwSize;
|
||||||
m_dwCodePage = dwCodePage;
|
m_dwCodePage = dwCodePage;
|
||||||
|
m_dwOffset = DWORD(-1); // unset
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD CResourceDataEntry::GetSize() {
|
DWORD CResourceDataEntry::GetSize() {
|
||||||
|
@ -1017,3 +1067,7 @@ DWORD CResourceDataEntry::GetSize() {
|
||||||
DWORD CResourceDataEntry::GetCodePage() {
|
DWORD CResourceDataEntry::GetCodePage() {
|
||||||
return m_dwCodePage;
|
return m_dwCodePage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DWORD CResourceDataEntry::GetOffset() {
|
||||||
|
return m_dwOffset;
|
||||||
|
}
|
||||||
|
|
|
@ -123,6 +123,8 @@ public:
|
||||||
BYTE* GetResourceA(char* szType, char* szName, LANGID wLanguage);
|
BYTE* GetResourceA(char* szType, char* szName, LANGID wLanguage);
|
||||||
int GetResourceSizeW(WCHAR* szType, WCHAR* szName, LANGID wLanguage);
|
int GetResourceSizeW(WCHAR* szType, WCHAR* szName, LANGID wLanguage);
|
||||||
int GetResourceSizeA(char* szType, char* 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);
|
void FreeResource(BYTE* pbResource);
|
||||||
|
|
||||||
bool AddExtraVirtualSize2PESection(const char* pszSectionName, int addsize);
|
bool AddExtraVirtualSize2PESection(const char* pszSectionName, int addsize);
|
||||||
|
@ -217,7 +219,7 @@ private:
|
||||||
|
|
||||||
class CResourceDataEntry {
|
class CResourceDataEntry {
|
||||||
public:
|
public:
|
||||||
CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage = 0);
|
CResourceDataEntry(BYTE* pbData, DWORD dwSize, DWORD dwCodePage = 0, DWORD dwOffset = DWORD(-1));
|
||||||
~CResourceDataEntry();
|
~CResourceDataEntry();
|
||||||
|
|
||||||
BYTE* GetData();
|
BYTE* GetData();
|
||||||
|
@ -227,6 +229,7 @@ public:
|
||||||
|
|
||||||
DWORD GetSize();
|
DWORD GetSize();
|
||||||
DWORD GetCodePage();
|
DWORD GetCodePage();
|
||||||
|
DWORD GetOffset();
|
||||||
|
|
||||||
DWORD m_dwWrittenAt;
|
DWORD m_dwWrittenAt;
|
||||||
|
|
||||||
|
@ -234,6 +237,7 @@ private:
|
||||||
BYTE* m_pbData;
|
BYTE* m_pbData;
|
||||||
DWORD m_dwSize;
|
DWORD m_dwSize;
|
||||||
DWORD m_dwCodePage;
|
DWORD m_dwCodePage;
|
||||||
|
DWORD m_dwOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_)
|
#endif // !defined(AFX_RESOURCEEDITOR_H__683BF710_E805_4093_975B_D5729186A89A__INCLUDED_)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue