summaryrefslogtreecommitdiff
path: root/Source/ResourceEditor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/ResourceEditor.cpp')
-rwxr-xr-xSource/ResourceEditor.cpp25
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,