C++ Übersetzungshilfe
Verfasst: 13.10.2008 17:57
Hey, ich glaube ich habe in C++ eine Verständnislücke. Ich bekomme es nicht hin aus diesem Stücken des Codeabschnitts unten einen Sinn zu ziehen. Den Teil der mir nicht ins Hirn geht habe ich mit einem Kommentar versehen. Habe schon einen Teil übersetzt; zu sehen darunter..
Wäre nett wenn mir jemand helfen könnte!
Schonmal danke!
Gruß Marv
Wäre nett wenn mir jemand helfen könnte!
Code: Alles auswählen
//**********************************************************************************************************
//
// This function loads a PE file into memory With proper alignment.
// Enough memory must be allocated at ptrLoc.
//
//**********************************************************************************************************
struct FixupBlock
{
unsigned long pageRVA;
unsigned long blockSize;
};
void doRelocation(MZHeader *inMZ, PE_Header *inPE, PE_ExtHeader *inpeXH,
SectionHeader *inSecHdr, LPVOID ptrLoc, DWORD newBase)
{
If(inpeXH->relocationTableAddress && inpeXH->relocationTableSize)
{
// Was passiert hier?
FixupBlock *fixBlk = (FixupBlock *)((char *)ptrLoc + inpeXH->relocationTableAddress);
long delta = newBase - inpeXH->imageBase;
While(fixBlk->blockSize)
{
//printf("Addr = %X\n", fixBlk->pageRVA);
//printf("Size = %X\n", fixBlk->blockSize);
int numEntries = (fixBlk->blockSize - SizeOf(FixupBlock)) >> 1;
//printf("Num Entries = %d\n", numEntries);
unsigned short *offsetPtr = (unsigned short *)(fixBlk + 1);
For(int i = 0; i < numEntries; i++)
{
// Was passiert hier?
DWORD *codeLoc = (DWORD *)((char *)ptrLoc + fixBlk->pageRVA + (*offsetPtr & 0x0FFF));
int relocType = (*offsetPtr & 0xF000) >> 12;
//printf("Val = %X\n", *offsetPtr);
//printf("Type = %X\n", relocType);
If(relocType == 3)
*codeLoc = ((DWORD)*codeLoc) + delta;
Else
{
printf("Unknown relocation type = %d\n", relocType);
}
offsetPtr++;
}
// Was passiert hier?
fixBlk = (FixupBlock *)offsetPtr;
}
}
}
Code: Alles auswählen
;structuren --> nicht dabei.. ist nur ein Ausschnitt!
MZHeader.MZHeader
PE_Header.PE_Header
PE_ExtHeader.PE_ExtHeader
NewList SectionHeader.SectionHeader()
Procedure doRelocation(*inMZ.MZHeader , *inPE.PE_Header , *inpeXH.PE_ExtHeader ,SectionHeader.SectionHeader(), ptrLoc, newBase.d)
If *inpeXH\relocationTableAddress And *inpeXH\relocationTableSize
;?*fixBlk = AllocateMemory((FixupBlock *)((char *)ptrLoc + *inpeXH\relocationTableAddress);
delta = newBase - inpeXH\imageBase;
While fixBlk\blockSize
Debug "Addr = "+Str(fixBlk->pageRVA);
Debug "Size = "+Str(fixBlk->blockSize);
numEntries = (fixBlk\blockSize - SizeOf(FixupBlock)) >> 1;
Debug "Num Entries = "+Str(numEntries);
*offsetPtr = fixBlk + 1
For i = 0 To numEntries; i++)
codeLoc = ptrLoc + fixBlk\pageRVA + (offsetPtr & $0FFF);
;?relocType = (*offsetPtr & $F000) >> 12;
Debug "Val = "+Str(*offsetPtr);
Debug "Type = "+St(relocType);
If relocType = 3
*codeLoc = *codeLoc + delta;
Else
Debug "Unknown relocation type " +Str(relocType);
EndIf
offsetPtr + 1;
Next
;?fixBlk = (FixupBlock *)offsetPtr;
Wend
EndIf
EndProcedure
Gruß Marv