Files
Work/image/SCRAPS.BAK
2024-08-07 09:16:27 -04:00

366 lines
14 KiB
Plaintext

void loadImageImportThunks(DWORD deltaOffset,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,ImageExportDescriptors &imageExportDescriptors);
void ImageImportDescriptor::loadImageImportThunk(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,ImageExportDescriptors &imageExportDescriptors)
{
ImageSectionHeader imageSectionHeader;
imageThunkImportOrdinals.remove();
imageThunkImportNames.remove();
pureView.push();
pureView.seek(virtualAddress-deltaOffset,PureViewOfFile::SeekSet);
while(TRUE)
{
ImageThunkData imageThunkData;
imageThunkData<<pureView;
if(!imageThunkData.isOkay())break;
if(imageThunkData.isOrdinalImport())
{
ImageExportDescriptor imageExportDescriptor;
ImageThunkName imageThunkName;
DWORD exportIndex;
if(imageExportDescriptors.locateImageExportOrdinal(imageThunkData.ordinal(),imageExportDescriptor,exportIndex))
{
imageThunkName.importName(imageExportDescriptor.imageExportName());
imageThunkImportNames.insert(&imageThunkName);
}
else imageThunkImportOrdinals.insert(&imageThunkData);
}
else
{
ImageThunkName imageThunkName;
pureView.push();
imageSectionHeaders.enclosingSectionHeader(imageThunkData.addressOfDataRVA(),imageSectionHeader,deltaOffset);
pureView.seek(imageThunkData.addressOfDataRVA()-deltaOffset,PureViewOfFile::SeekSet);
imageThunkName<<pureView;
imageThunkImportNames.insert(&imageThunkName);
pureView.pop();
}
}
pureView.pop();
}
void ImageImportDescriptor::loadImageImportThunks(DWORD deltaOffset,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,ImageExportDescriptors &imageExportDescriptors)
{
if(!isOkay())return;
if(!firstThunkRVA()&&!originalFirstThunkRVA())return;
if(originalFirstThunkRVA())loadImageImportThunk(originalFirstThunkRVA(),deltaOffset,
imageOriginalThunkImportOrdinals(),imageOriginalThunkImportNames(),pureView,imageSectionHeaders,imageExportDescriptors);
else if(firstThunkRVA())loadImageImportThunk(firstThunkRVA(),deltaOffset,
imageThunkImportOrdinals(),imageThunkImportNames(),pureView,imageSectionHeaders,imageExportDescriptors);
}
WORD PEHeader::loadImageImportDescriptors(Block<ImageImportDescriptor> &imageImportDescriptors,ImageSectionHeader &importSectionHeader,ImageExportDescriptors &imageExportDescriptors,PureViewOfFile &pureView)
{
DirectoryEntryKey sectionKey(DirectoryEntryKey::ImportDirectory);
ImageDataDirectory imageSectionDirectory(((ImageOptionalHeader&)*this)[sectionKey]);
ImageImportDescriptor imageImportDescriptor;
ImageSectionHeader importNamesSectionHeader;
ImageSectionHeader exportSectionHeader;
DWORD deltaOffset;
DWORD deltaNames;
imageImportDescriptors.remove();
imageExportDescriptors.size(0);
if(!enclosingSectionHeader(imageSectionDirectory.virtualAddress(),importSectionHeader,deltaOffset))return FALSE;
pureView.seek(imageSectionDirectory.virtualAddress()-deltaOffset,PureViewOfFile::SeekSet);
while(TRUE)
{
String moduleName;
imageImportDescriptor<<pureView;
if(!imageImportDescriptor.isOkay())break;
enclosingSectionHeader(imageImportDescriptor.nameRVA(),importNamesSectionHeader,deltaNames);
pureView.push();
pureView.seek(imageImportDescriptor.nameRVA()-deltaNames,PureViewOfFile::SeekSet);
pureView.getLine(moduleName);
loadImageExportDescriptors(imageExportDescriptors,exportSectionHeader,moduleName);
imageImportDescriptor.moduleName(moduleName);
pureView.pop();
imageImportDescriptor.loadImageImportThunks(deltaOffset,pureView,(ImageSectionHeaders&)*this,imageExportDescriptors);
imageImportDescriptors.insert(&imageImportDescriptor);
}
return imageImportDescriptors.size();
}
WORD loadImageImportDescriptors(Block<ImageImportDescriptor> &imageImportDescriptors,ImageSectionHeader &importSectionHeader,ImageExportDescriptors &imageExportDescriptors,PureViewOfFile &pureView);
// ::sprintf(entryPointString,"&0x%08lx",(DWORD)((PureVector<ImageExportDescriptor>&)*this)[functionIndex].imageExportEntryPoint());
void replaceImageImportOrdinals(Block<ImageImportDescriptor> &imageImportDescriptors,PureViewOfFile &pureView);
void PEHeader::replaceImageImportOrdinals(Block<ImageImportDescriptor> &imageImportDescriptors,PureViewOfFile &pureView)
{
ImageExportDescriptors imageExportDescriptors;
ImageExportDescriptor imageExportDescriptor;
ImageSectionHeader exportSectionHeader;
DWORD itemCount;
DWORD importModuleCount;
DWORD exportIndex;
if(!(importModuleCount=imageImportDescriptors.size()))return;
loadImageExportDescriptors(imageExportDescriptors,exportSectionHeader,pureView);
for(short importModuleIndex=0;importModuleIndex<importModuleCount;importModuleIndex++)
{
ImageImportDescriptor &imageImportDescriptor(imageImportDescriptors[importModuleIndex]);
itemCount=imageImportDescriptor.imageOriginalThunkImportOrdinals().size();
for(DWORD itemIndex=0;itemIndex<itemCount;itemIndex++)
{
ImageImportDescriptorExpand::ImageThunkDataBlock &imageThunkDataBlock(imageImportDescriptor.imageOriginalThunkImportOrdinals());
if(imageExportDescriptors.locateImageExportOrdinal(imageThunkDataBlock[itemIndex].ordinal(),imageExportDescriptor,exportIndex))
{
imageImportDescriptor.imageOriginalThunkImportNames().insert
}
}
itemCount=imageImportDescriptor.imageThunkImportOrdinals().size();
for(itemIndex=0;itemIndex<itemCount;itemIndex++)
{
ImageImportDescriptorExpand::ImageThunkDataBlock &imageThunkDataBlock(imageImportDescriptor.imageThunkImportOrdinals());
if(imageExportDescriptors.locateImageExportOrdinal(imageThunkDataBlock[itemIndex].ordinal(),imageExportDescriptor,exportIndex))
{
}
}
}
}
// ((PureVector<ImageExportDescriptor>&)*this)[(WORD)exportOrdinals[nameIndex]-1].imageExportName(exportNames[nameIndex]);
// ((PureVector<ImageExportDescriptor>&)*this)[(WORD)exportOrdinals[nameIndex]-1].imageExportOrdinal(exportOrdinals[nameIndex]);
WORD PEHeader::enclosingSectionHeader(DWORD virtualAddress,ImageSectionHeader &someImageSectionHeader,DWORD &deltaOffset)
{
DWORD sectionCount(((PureVector<ImageSectionHeader>&)*this).size());
for(short sectionIndex=0;sectionIndex<sectionCount;sectionIndex++)
{
ImageSectionHeader &imageSectionHeader(((PureVector<ImageSectionHeader>&)*this)[sectionIndex]);
if(virtualAddress>=imageSectionHeader.virtualAddress()&&
virtualAddress<imageSectionHeader.virtualAddress()+imageSectionHeader.virtualSize())
{
someImageSectionHeader=imageSectionHeader;
deltaOffset=imageSectionHeader.virtualAddress()-imageSectionHeader.pointerRawData();
return TRUE;
}
}
return TRUE;
}
#if 0
WORD PEHeader::loadImageImportDescriptors(Block<ImageImportDescriptor> &imageImportDescriptors,ImageSectionHeader &importSectionHeader,PureViewOfFile &pureView)
{
DirectoryEntryKey sectionKey(DirectoryEntryKey::ImportDirectory);
ImageDataDirectory imageSectionDirectory(((ImageOptionalHeader&)*this)[sectionKey]);
ImageImportDescriptor imageImportDescriptor;
DWORD deltaOffset;
DWORD deltaNames;
imageImportDescriptors.remove();
if(!enclosingSectionHeader(imageSectionDirectory.virtualAddress(),importSectionHeader))return FALSE;
deltaOffset=importSectionHeader.virtualAddress()-importSectionHeader.pointerRawData();
pureView.seek(imageSectionDirectory.virtualAddress()-deltaOffset,PureViewOfFile::SeekSet);
while(TRUE)
{
String moduleName;
imageImportDescriptor<<pureView;
if(!imageImportDescriptor.isOkay())break;
deltaOffset=importNamesSectionHeader.virtualAddress()-importNamesSectionHeader.pointerRawData();
pureView.push();
pureView.seek(imageImportDescriptor.nameRVA()-deltaOffset,PureViewOfFile::SeekSet);
pureView.getLine(moduleName);
imageImportDescriptor.moduleName(moduleName);
pureView.pop();
imageImportDescriptor.loadImageImportThunks(deltaOffset,pureView);
imageImportDescriptors.insert(&imageImportDescriptor);
}
return imageImportDescriptors.size();
}
#endif
if(originalFirstThunkRVA())loadImageImportThunk(originalFirstThunkRVA(),deltaOffset,
imageOriginalThunkImportOrdinals(),imageOriginalThunkImportNames(),pureView);
void loadImageImportThunks(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView);
void PEHeader::loadImageImportThunks(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView)
{
imageThunkImportOrdinals.remove();
imageThunkImportNames.remove();
pureView.push();
pureView.seek(virtualAddress-deltaOffset,PureViewOfFile::SeekSet);
while(TRUE)
{
ImageThunkData imageThunkData;
imageThunkData<<pureView;
if(!imageThunkData.isOkay())break;
if(imageThunkData.isOrdinalImport())imageThunkImportOrdinals.insert(&imageThunkData);
else
{
ImageThunkName imageThunkName;
pureView.push();
pureView.seek(imageThunkData.addressOfDataRVA()-deltaOffset,PureViewOfFile::SeekSet);
imageThunkName<<pureView;
imageThunkImportNames.insert(&imageThunkName);
pureView.pop();
}
}
pureView.pop();
}
// Block<ImageThunkData> imageOriginalThunkImportOrdinals;
// Block<ImageThunkName> imageOriginalThunkImportNames;
// if(imageImportDescriptor.originalFirstThunkRVA())
// loadImageImportThunks(imageImportDescriptor.originalFirstThunkRVA(),deltaOffset,
// imageOriginalThunkImportOrdinals,imageOriginalThunkImportNames,pureView);
// Block<ImageThunkData> imageThunkImportOrdinals;
// Block<ImageThunkName> imageThunkImportNames;
// if(imageImportDescriptor.firstThunkRVA())
// loadImageImportThunks(imageImportDescriptor.firstThunkRVA(),deltaOffset,
// imageThunkImportOrdinals,imageThunkImportNames,pureView);
pureView.push();
if(imageImportDescriptor.originalFirstThunkRVA())
{
pureView.seek(imageImportDescriptor.originalFirstThunkRVA()-deltaOffset,PureViewOfFile::SeekSet);
while(TRUE)
{
ImageThunkData imageThunkData;
imageThunkData<<pureView;
if(!imageThunkData.isOkay())break;
}
}
pureView.pop();
#if 0
pureView.push();
if(imageImportDescriptor.firstThunkRVA())
{
pureView.seek(imageImportDescriptor.firstThunkRVA()-deltaOffset,PureViewOfFile::SeekSet);
while(TRUE)
{
ImageThunkData imageThunkData;
imageThunkData<<pureView;
if(!imageThunkData.isOkay())break;
if(imageThunkData.isOrdinalImport())
{
}
else
{
ImageThunkName imageThunkName;
pureView.push();
pureView.seek(imageThunkData.addressOfDataRVA()-deltaOffset,PureViewOfFile::SeekSet);
imageThunkName<<pureView;
pureView.pop();
}
}
}
pureView.pop();
#endif
// ImageThunkName imageThunkName;
// imageThunkName<<pureView;
// break;
// pureView.seek(imageImportDescriptor.nameRVA()-deltaOffset,PureViewOfFile::SeekSet);
// char *lpString((char*)(imageImportDescriptor.nameRVA()-deltaOffset+pureView.base()));
// if(!lpString)return;
// pureView.seek(deltaOffset-imageImportDescriptor.nameRVA(),PureViewOfFile::SeekSet);
// char *lpString((char*)(imageImportDescriptor.nameRVA()-deltaOffset+pureView.base()));
// if(!lpString)return;
// lpString=0;
Bitmap kcBitmap("C:\\WORK\\SCENE\\MEDIA\\BMP\\KC.BMP");
HWND hDisplayWnd;
hDisplayWnd=::CreateWindow("BUTTON","",WS_VISIBLE,0,0,100,100,(HWND)0,(HMENU)0,hInstance,(LPVOID)0);
if(!hDisplayWnd)return FALSE;
::ShowWindow(hDisplayWnd,SW_SHOW);
::UpdateWindow(hDisplayWnd);
kcBitmap.displayBitmap(hDisplayWnd);
::Sleep(10000);
::DestroyWindow(hDisplayWnd);
// DisAssembler disAssembler;
// disAssembler.pageBreak(FALSE);
// disAssembler.disassemble("C:\\COMMAND.COM");
// winConsole.writeLine("Finished, press any key.");
// winConsole.read();
//#ifndef _COMMON_PUREVIEWOFFILE_HPP_
//#include <common/pview.hpp>
//#endif
//#ifndef _COMMON_BLOCK_TPP_
//#include <common/block.tpp>
//#endif
#if 0
// Block<SmartPointer<char> > mResStrings;
mResStrings.insert(&SmartPointer<char>("???_0"));
mResStrings.insert(&SmartPointer<char>("CURSOR"));
mResStrings.insert(&SmartPointer<char>("BITMAP"));
mResStrings.insert(&SmartPointer<char>("ICON"));
mResStrings.insert(&SmartPointer<char>("MENU"));
mResStrings.insert(&SmartPointer<char>("DIALOG"));
mResStrings.insert(&SmartPointer<char>("STRING"));
mResStrings.insert(&SmartPointer<char>("FONTDIR"));
mResStrings.insert(&SmartPointer<char>("FONT"));
mResStrings.insert(&SmartPointer<char>("ACCELERATORS"));
mResStrings.insert(&SmartPointer<char>("RCDATA"));
mResStrings.insert(&SmartPointer<char>("MESSAGETABLE"));
mResStrings.insert(&SmartPointer<char>("GROUP_CURSOR"));
mResStrings.insert(&SmartPointer<char>("???_13"));
mResStrings.insert(&SmartPointer<char>("GROUP_ICON"));
mResStrings.insert(&SmartPointer<char>("???_15"));
mResStrings.insert(&SmartPointer<char>("VERSION"));
for(short itemIndex=0;itemIndex<mResStrings.size();itemIndex++)
mResStrings[itemIndex].disposition(PointerDisposition::Assume);
#endif
// imgResDir.read(imageSectionHeader.pointerRawData(),pureView);
// pureView.seek(imageSectionHeader.pointerRawData(),PureViewOfFile::SeekSet);
// sectionData.size(imageSectionHeader.sizeofRawData());
// imgResDir.read(imageSectionHeader.pointerRawData(),pureView);
// descendResourceDirectory(imgResDir);
void ImageResourceDataEntry::read(DWORD resBase,DWORD deltaOffset,PureViewOfFile &pureView)
{
pureView.push();
pureView.read((char*)&((IMAGE_RESOURCE_DATA_ENTRY&)*this),sizeof(IMAGE_RESOURCE_DATA_ENTRY));
mRawData.size(size());
pureView.seek(offsetData()-deltaOffset,PureViewOfFile::SeekSet);
pureView.read((char*)((BYTE*)mRawData),mRawData.size());
// FileHandle resFile("RES.DAT",FileHandle::Write,FileHandle::ShareNone,FileHandle::Overwrite);
// resFile.write((BYTE*)mRawData,mRawData.size());
pureView.pop();
}