Initial
This commit is contained in:
148
image/EXPORT.CPP
Normal file
148
image/EXPORT.CPP
Normal file
@@ -0,0 +1,148 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user