Allow makensis to use stubs and plugins of different bitness, based on patch #265

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6619 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2015-10-01 17:32:56 +00:00
parent 8577c8e9ae
commit 12cab3f3db
8 changed files with 91 additions and 65 deletions

View file

@ -86,7 +86,7 @@ static inline void PrintCommandSig(const tstring sig)
_ftprintf(g_output, _T(" + %") NPRIs _T("\n"), sig.c_str());
}
void Plugins::AddPluginsDir(const tstring &path, bool displayInfo)
void Plugins::AddPluginsDir(const tstring &path, bool pe64, bool displayInfo)
{
boost::scoped_ptr<dir_reader> dr( new_dir_reader() );
dr->read(path);
@ -99,7 +99,7 @@ void Plugins::AddPluginsDir(const tstring &path, bool displayInfo)
continue;
const tstring plugin = path + PLATFORM_PATH_SEPARATOR_C + *files_itr;
GetExports(plugin, displayInfo);
GetExports(plugin, pe64, displayInfo);
}
}
@ -136,38 +136,45 @@ void read_file(const tstring& filename, vector<unsigned char>& data)
}
}
void Plugins::GetExports(const tstring &pathToDll, bool displayInfo)
void Plugins::GetExports(const tstring &pathToDll, bool pe64, bool displayInfo)
{
vector<unsigned char> dlldata;
PIMAGE_NT_HEADERS NTHeaders;
PIMAGE_NT_HEADERS pNTHdrs;
try {
read_file(pathToDll, dlldata);
if (dlldata.empty()) return;
NTHeaders = CResourceEditor::GetNTHeaders(&dlldata[0]);
pNTHdrs = CResourceEditor::GetNTHeaders(&dlldata[0]);
} catch (std::runtime_error&) {
return;
}
const WORD reqohm = pe64 ? IMAGE_NT_OPTIONAL_HDR64_MAGIC : IMAGE_NT_OPTIONAL_HDR32_MAGIC;
if (*GetCommonMemberFromPEOptHdr(pNTHdrs->OptionalHeader, Magic) != reqohm)
{
// Ignore DLLs that don't match our target
return;
}
tstring dllName = remove_file_extension(get_file_name(pathToDll));
if (DllHasDataHandle(dllName))
{
m_dllname_conflicts.insert(dllName);
}
FIX_ENDIAN_INT16_INPLACE(NTHeaders->FileHeader.Characteristics);
if (NTHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL)
FIX_ENDIAN_INT16_INPLACE(pNTHdrs->FileHeader.Characteristics);
if (pNTHdrs->FileHeader.Characteristics & IMAGE_FILE_DLL)
{
FIX_ENDIAN_INT32_INPLACE(NTHeaders->OptionalHeader.NumberOfRvaAndSizes);
if (NTHeaders->OptionalHeader.NumberOfRvaAndSizes <= IMAGE_DIRECTORY_ENTRY_EXPORT) return;
DWORD numrvaandsiz = *GetMemberFromPEOptHdr(pNTHdrs->OptionalHeader, NumberOfRvaAndSizes);
FIX_ENDIAN_INT32_INPLACE(numrvaandsiz);
if (numrvaandsiz <= IMAGE_DIRECTORY_ENTRY_EXPORT) return;
DWORD ExportDirVA = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
DWORD ExportDirSize = NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(NTHeaders);
const IMAGE_DATA_DIRECTORY *pExportDir;
pExportDir = &(*GetMemberFromPEOptHdr(pNTHdrs->OptionalHeader, DataDirectory))[IMAGE_DIRECTORY_ENTRY_EXPORT];
const DWORD ExportDirVA = FIX_ENDIAN_INT32(pExportDir->VirtualAddress);
const DWORD ExportDirSize = FIX_ENDIAN_INT32(pExportDir->Size);
FIX_ENDIAN_INT32_INPLACE(ExportDirVA);
FIX_ENDIAN_INT32_INPLACE(ExportDirSize);
WORD num_sections = FIX_ENDIAN_INT16(NTHeaders->FileHeader.NumberOfSections);
PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(pNTHdrs);
const WORD num_sections = FIX_ENDIAN_INT16(pNTHdrs->FileHeader.NumberOfSections);
for (DWORD i = 0; i < num_sections; i++)
{
@ -223,12 +230,12 @@ bool Plugins::DllHasDataHandle(const tstring& dllnamelowercase) const
return -1 != h;
}
bool Plugins::Initialize(const TCHAR*arcsubdir, bool displayInfo)
bool Plugins::Initialize(const TCHAR*arcsubdir, bool pe64, bool displayInfo)
{
if (m_initialized) return true;
m_initialized = true;
AddPluginsDir(tstring(arcsubdir), displayInfo);
AddPluginsDir(tstring(arcsubdir), pe64, displayInfo);
return true;
}