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:
kichik 2007-10-03 17:01:19 +00:00
parent cc72c11f4f
commit 36683c9f87
2 changed files with 63 additions and 5 deletions

View file

@ -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;
}

View file

@ -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_)