diff options
Diffstat (limited to 'Source/ResourceEditor.cpp')
-rwxr-xr-x | Source/ResourceEditor.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/Source/ResourceEditor.cpp b/Source/ResourceEditor.cpp index 8aefefc..8509414 100755 --- a/Source/ResourceEditor.cpp +++ b/Source/ResourceEditor.cpp @@ -3,7 +3,7 @@ * * This file is a part of NSIS. * - * Copyright (C) 2002-2008 Amir Szekely <kichik@users.sourceforge.net> + * Copyright (C) 2002-2009 Amir Szekely <kichik@users.sourceforge.net> * * Licensed under the zlib/libpng license (the "License"); * you may not use this file except in compliance with the License. @@ -125,10 +125,11 @@ PRESOURCE_DIRECTORY CResourceEditor::GetResourceDirectory( // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize) { +CResourceEditor::CResourceEditor(BYTE* pbPE, int iSize, bool bKeepData /*=true*/) { // Copy the data pointer m_pbPE = pbPE; m_iSize = iSize; + m_bKeepData = bKeepData; // Get NT headers m_ntHeaders = GetNTHeaders(m_pbPE); @@ -270,6 +271,9 @@ bool CResourceEditor::UpdateResource(WORD szType, WORD szName, LANGID wLanguage, // Returns a copy of the requested resource // Returns 0 if the requested resource can't be found BYTE* CResourceEditor::GetResourceW(WCHAR* szType, WCHAR* szName, LANGID wLanguage) { + if (!m_bKeepData) + throw runtime_error("Can't GetResource() when bKeepData is false"); + CResourceDirectory* nameDir = 0; CResourceDirectory* langDir = 0; CResourceDataEntry* data = 0; @@ -398,6 +402,9 @@ void CResourceEditor::FreeResource(BYTE* pbResource) // Saves the edited PE into a buffer and returns it. DWORD CResourceEditor::Save(BYTE* pbBuf, DWORD &dwSize) { + if (!m_bKeepData) + throw runtime_error("Can't Save() when bKeepData is false"); + unsigned int i; DWORD dwReqSize; @@ -478,7 +485,7 @@ DWORD CResourceEditor::Save(BYTE* pbBuf, DWORD &dwSize) { // Set the new BaseOfData if needed if (ntHeaders->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) { DWORD* pdwBaseOfData = &((PIMAGE_OPTIONAL_HEADER32)&ntHeaders->OptionalHeader)->BaseOfData; - if (*pdwBaseOfData > m_dwResourceSectionVA) + if (ConvertEndianness(*pdwBaseOfData) > m_dwResourceSectionVA) *pdwBaseOfData = AdjustVA(*pdwBaseOfData, dwVAAdjustment); } @@ -624,6 +631,18 @@ CResourceDirectory* CResourceEditor::ScanDirectory(PRESOURCE_DIRECTORY rdRoot, P LPBYTE pbData = (LPBYTE)rdRoot + ConvertEndianness(rde->OffsetToData) - m_dwResourceSectionVA; DWORD dwOffset = DWORD(pbData - m_pbPE); + if (m_bKeepData) + { + if (dwOffset > DWORD(m_iSize)) + { + throw runtime_error("Invalid resource entry data pointer, possibly compressed resources"); + } + } + else + { + pbData = m_pbPE; // dummy pointer to "nothing" + } + rdc->AddEntry( new CResourceDirectoryEntry( szName, |