C++ Übersetzungshilfe

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

C++ Übersetzungshilfe

Beitrag 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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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...
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Beitrag von Deluxe0321 »

Danke edel :allright: !
Wäre ich niemals darauf gekommen.

Gruß Marv
Antworten