Files
Work/image/EXPORT.CPP
2024-08-07 09:16:27 -04:00

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;
}