Seite 1 von 1

C++ Übersetzungshilfe

Verfasst: 13.10.2008 17:57
von Deluxe0321
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!

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
Schonmal danke!
Gruß Marv

Verfasst: 13.10.2008 22:13
von edel
Das nennt man "casten" und braucht man nicht in PB.

aus

Code: Alles auswählen

 fixBlk = (FixupBlock *)offsetPtr; 
wird

Code: Alles auswählen

 fixBlk = *offsetPtr

Code: Alles auswählen

FixupBlock *fixBlk = (FixupBlock *)((char *)ptrLoc + inpeXH->relocationTableAddress); 

Code: Alles auswählen

*fixBlk.FixupBlock = ptrLoc + *inpeXH\relocationTableAddress 
usw...

Verfasst: 13.10.2008 22:52
von Deluxe0321
Danke edel :allright: !
Wäre ich niemals darauf gekommen.

Gruß Marv