diff --git a/Source/ResourceEditor.cpp b/Source/ResourceEditor.cpp index 6988f454..d96e9da8 100644 --- a/Source/ResourceEditor.cpp +++ b/Source/ResourceEditor.cpp @@ -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; +} diff --git a/Source/ResourceEditor.h b/Source/ResourceEditor.h index ea83bd04..d821fe25 100644 --- a/Source/ResourceEditor.h +++ b/Source/ResourceEditor.h @@ -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_)