149 lines
5.3 KiB
C++
149 lines
5.3 KiB
C++
#include <image/export.hpp>
|
|
#include <common/qsort.hpp>
|
|
#include <common/qsort.tpp>
|
|
#include <common/stdio.hpp>
|
|
|
|
WORD ImageExportDescriptors::loadImageExports(PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,WORD sortFlag)
|
|
{
|
|
ImageSectionHeader exportFunctionsSectionHeader;
|
|
QuickSort<ImageExportDescriptor> quickSort;
|
|
Array<PureDWORD> exportFunctions;
|
|
Array<PureWORD> exportOrdinals;
|
|
PureDWORD exportFunctionEntryPoint;
|
|
Array<String> exportNames;
|
|
DWORD deltaFunctions;
|
|
|
|
size(0);
|
|
(ImageExportDirectory&)*this<<pureView;
|
|
loadExportNames(exportNames,imageSectionHeaders,pureView);
|
|
loadExportOrdinals(exportOrdinals,imageSectionHeaders,pureView);
|
|
loadExportFunctions(exportFunctions,imageSectionHeaders,pureView);
|
|
combineExportDescriptors(exportNames,exportOrdinals,exportFunctions);
|
|
if(sortFlag)quickSort.sortItems((Array<ImageExportDescriptor>&)*this);
|
|
return TRUE;
|
|
}
|
|
|
|
WORD ImageExportDescriptors::loadExportNames(Array<String> &exportNames,ImageSectionHeaders &imageSectionHeaders,PureViewOfFile &pureView)
|
|
{
|
|
ImageSectionHeader exportNamesSectionHeader;
|
|
String exportName;
|
|
DWORD deltaNames;
|
|
DWORD nameRVA;
|
|
|
|
if(!numberOfNames())return false;
|
|
exportNames.size(numberOfNames());
|
|
imageSectionHeaders.enclosingSectionHeader(addressOfNames(),exportNamesSectionHeader,deltaNames);
|
|
pureView.seek(addressOfNames()-deltaNames,PureViewOfFile::SeekSet);
|
|
for(DWORD nameIndex=0;nameIndex<numberOfNames();nameIndex++)
|
|
{
|
|
pureView.read(nameRVA);
|
|
pureView.push();
|
|
pureView.seek(nameRVA-deltaNames,PureViewOfFile::SeekSet);
|
|
pureView.getLine(exportName);
|
|
exportNames[nameIndex]=exportName;
|
|
pureView.pop();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
WORD ImageExportDescriptors::loadExportOrdinals(Array<PureWORD> &exportOrdinals,ImageSectionHeaders &imageSectionHeaders,PureViewOfFile &pureView)
|
|
{
|
|
ImageSectionHeader exportOrdinalsSectionHeader;
|
|
WORD exportOrdinal;
|
|
DWORD deltaOrdinals;
|
|
|
|
if(!numberOfNames())return false;
|
|
exportOrdinals.size(numberOfNames());
|
|
imageSectionHeaders.enclosingSectionHeader(addressOfNameOrdinals(),exportOrdinalsSectionHeader,deltaOrdinals);
|
|
pureView.seek(addressOfNameOrdinals()-deltaOrdinals,PureViewOfFile::SeekSet);
|
|
for(DWORD ordinalIndex=0;ordinalIndex<numberOfNames();ordinalIndex++)
|
|
{
|
|
pureView.read(exportOrdinal);
|
|
exportOrdinals[ordinalIndex]=exportOrdinal;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
WORD ImageExportDescriptors::loadExportFunctions(Array<PureDWORD> &exportFunctions,ImageSectionHeaders &imageSectionHeaders,PureViewOfFile &pureView)
|
|
{
|
|
ImageSectionHeader exportFunctionsSectionHeader;
|
|
DWORD exportFunction;
|
|
DWORD deltaFunctions;
|
|
|
|
if(!numberOfFunctions())return false;
|
|
exportFunctions.size(numberOfFunctions());
|
|
imageSectionHeaders.enclosingSectionHeader(addressOfFunctions(),exportFunctionsSectionHeader,deltaFunctions);
|
|
pureView.seek(addressOfFunctions()-deltaFunctions,PureViewOfFile::SeekSet);
|
|
for(DWORD functionIndex=0;functionIndex<numberOfFunctions();functionIndex++)
|
|
{
|
|
pureView.read(exportFunction);
|
|
exportFunctions[functionIndex]=exportFunction;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
WORD ImageExportDescriptors::combineExportDescriptors(Array<String> &exportNames,Array<PureWORD> &exportOrdinals,Array<PureDWORD> &exportFunctions)
|
|
{
|
|
DWORD sizeExportNames(exportNames.size());
|
|
DWORD sizeExportFunctions(exportFunctions.size());
|
|
String entryPointString;
|
|
|
|
size(sizeExportFunctions);
|
|
for(DWORD functionIndex=0;functionIndex<sizeExportFunctions;functionIndex++)
|
|
{
|
|
((Array<ImageExportDescriptor>&)*this)[functionIndex].imageExportEntryPoint(exportFunctions[functionIndex]);
|
|
((Array<ImageExportDescriptor>&)*this)[functionIndex].imageExportOrdinal(functionIndex+base());
|
|
}
|
|
for(LONG nameIndex=0;nameIndex<sizeExportNames;nameIndex++)
|
|
{
|
|
((Array<ImageExportDescriptor>&)*this)[exportOrdinals[nameIndex].getValue()].imageExportName(exportNames[nameIndex]);
|
|
((Array<ImageExportDescriptor>&)*this)[exportOrdinals[nameIndex].getValue()].imageExportOrdinal(exportOrdinals[nameIndex].getValue()+(WORD)base());
|
|
}
|
|
for(functionIndex=0;functionIndex<sizeExportFunctions;functionIndex++)
|
|
{
|
|
if(((Array<ImageExportDescriptor>&)*this)[functionIndex].imageExportName().isNull())
|
|
{
|
|
::sprintf(entryPointString,"@%d",((Array<ImageExportDescriptor>&)*this)[functionIndex].imageExportOrdinal().getValue());
|
|
((Array<ImageExportDescriptor>&)*this)[functionIndex].imageExportName(entryPointString);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
WORD ImageExportDescriptors::locateImageExportName(String imageExportName,ImageExportDescriptor &imageExportDescriptor,DWORD &exportIndex)
|
|
{
|
|
DWORD sizeExportFunctions(size());
|
|
WORD exportOrdinal;
|
|
|
|
if(imageExportName.isNull())return FALSE;
|
|
for(DWORD itemIndex=0;itemIndex<sizeExportFunctions;itemIndex++)
|
|
{
|
|
if(imageExportName==operator[](itemIndex).imageExportName())
|
|
{
|
|
imageExportDescriptor=operator[](itemIndex);
|
|
exportIndex=itemIndex;
|
|
return TRUE;
|
|
}
|
|
}
|
|
if(makeOrdinalValue(imageExportName,exportOrdinal))
|
|
return locateImageExportOrdinal(exportOrdinal,imageExportDescriptor,exportIndex);
|
|
return FALSE;
|
|
}
|
|
|
|
WORD ImageExportDescriptors::locateImageExportOrdinal(DWORD exportOrdinal,ImageExportDescriptor &imageExportDescriptor,DWORD &exportIndex)
|
|
{
|
|
DWORD sizeExportFunctions(size());
|
|
|
|
for(DWORD itemIndex=0;itemIndex<sizeExportFunctions;itemIndex++)
|
|
{
|
|
if(exportOrdinal==operator[](itemIndex).imageExportOrdinal().getValue())
|
|
{
|
|
imageExportDescriptor=operator[](itemIndex);
|
|
exportIndex=itemIndex;
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|