AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Variante Records?

Ein Thema von Zacherl · begonnen am 20. Mär 2009 · letzter Beitrag vom 21. Mär 2009
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.626 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Variante Records?

  Alt 20. Mär 2009, 15:58
Hey,

ich schreibe grade an einer Unit, mit der man PE Dateien bearbeiten kann. Nun muss ich zwischen 32 und 64 Bit Header differenzieren. Es ändert sich nur die Größe von 4 Feldern. Bei 32 Bit sind diese vom Typ DWord und bei 64 Bit vom Typ Int64.

Möchte jetzt innerhalb meiner Methoden nicht immer zwischen 32 und 64 Bit unterscheiden müssen. Gibt es eine Methode, mit der ich den Typ des Records zur Laufzeit festlegen kann?

Gruß Zacherl
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Variante Records?

  Alt 20. Mär 2009, 16:00
Nein. Das einfachste ist wohl, eine Klasse mit Eigenschaften zu erstellen, deren Getter abstrakt sind. Diese leitest du dann zweimal ab.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#3

Re: Variante Records?

  Alt 21. Mär 2009, 14:46
Zitat von Zacherl:
Hey,

ich schreibe grade an einer Unit, mit der man PE Dateien bearbeiten kann. Nun muss ich zwischen 32 und 64 Bit Header differenzieren. Es ändert sich nur die Größe von 4 Feldern. Bei 32 Bit sind diese vom Typ DWord und bei 64 Bit vom Typ Int64.

Möchte jetzt innerhalb meiner Methoden nicht immer zwischen 32 und 64 Bit unterscheiden müssen. Gibt es eine Methode, mit der ich den Typ des Records zur Laufzeit festlegen kann?

Gruß Zacherl
Hallo,

der Compiler verwendet die Offsets innerhalb des Records wie Konstanten, sie werden fest in das Compilat eingebaut. Das gilt auch für variante Teile des Records, die stehen am gleichen Offset, und es wird der Platz der grössten Variante reserviert, d.h. der Record und alle Offsets sind immer gleich - genau das ist ja bei deinen Records nicht der Fall.

Eine Möglichkeit: du arbeitest intern ausschliesslich mit der 64bit-Variante und wandelst 32bit-Records schon beim Lesen um.

Gruss Reinhard
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Variante Records?

  Alt 21. Mär 2009, 14:51
Sehe ich das richtig, dass die PE-Header erst gemeinsame Felder haben (32/64bit shared), dann ein Flag für die Wortgröße und danach erst den Rest? Dann könntest du das nämlich aufteilen: je einen Record für die wortgrößenspezifischen Sachen, der in den varianten Teil eines Records kommt, der den Rest selbst hält. Nicht schön, aber es wären variante Records
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.626 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: Variante Records?

  Alt 21. Mär 2009, 16:03
Alles ziemlich unschön. Das mit dem Varianten Record kann ich mir glaube ich abschminken, da doch nicht ganz alle Felder gleich sind:

Code:
typedef struct _IMAGE_OPTIONAL_HEADER {
  WORD                Magic;
  BYTE                MajorLinkerVersion;
  BYTE                MinorLinkerVersion;
  DWORD               SizeOfCode;
  DWORD               SizeOfInitializedData;
  DWORD               SizeOfUninitializedData;
  DWORD               AddressOfEntryPoint;
  DWORD               BaseOfCode;
  DWORD               BaseOfData;
  DWORD               ImageBase;
  DWORD               SectionAlignment;
  DWORD               FileAlignment;
  WORD                MajorOperatingSystemVersion;
  WORD                MinorOperatingSystemVersion;
  WORD                MajorImageVersion;
  WORD                MinorImageVersion;
  WORD                MajorSubsystemVersion;
  WORD                MinorSubsystemVersion;
  DWORD               Win32VersionValue;
  DWORD               SizeOfImage;
  DWORD               SizeOfHeaders;
  DWORD               CheckSum;
  WORD                Subsystem;
  WORD                DllCharacteristics;
  DWORD               SizeOfStackReserve;
  DWORD               SizeOfStackCommit;
  DWORD               SizeOfHeapReserve;
  DWORD               SizeOfHeapCommit;
  DWORD               LoaderFlags;
  DWORD               NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

typedef struct _IMAGE_OPTIONAL_HEADER64 {
 WORD       Magic;
 BYTE       MajorLinkerVersion;
 BYTE       MinorLinkerVersion;
 DWORD      SizeOfCode;
 DWORD      SizeOfInitializedData;
 DWORD      SizeOfUninitializedData;
 DWORD      AddressOfEntryPoint;
 DWORD      BaseOfCode;
 ULONGLONG  ImageBase;
 DWORD      SectionAlignment;
 DWORD      FileAlignment;
 WORD       MajorOperatingSystemVersion;
 WORD       MinorOperatingSystemVersion;
 WORD       MajorImageVersion;
 WORD       MinorImageVersion;
 WORD       MajorSubsystemVersion;
 WORD       MinorSubsystemVersion;
 DWORD      Win32VersionValue;
 DWORD      SizeOfImage;
 DWORD      SizeOfHeaders;
 DWORD      CheckSum;
 WORD       Subsystem;
 WORD       DllCharacteristics;
 ULONGLONG  SizeOfStackReserve;
 ULONGLONG  SizeOfStackCommit;
 ULONGLONG  SizeOfHeapReserve;
 ULONGLONG  SizeOfHeapCommit;
 DWORD      LoaderFlags;
 DWORD      NumberOfRvaAndSizes;
 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
BaseOfData wurde im 64 Bit Header entfernt und dafür die ImageBase Kapazität vergrößert.

Mit OOP zu arbeiten bringt mir auch keine Vorteile, soweit ich das sehe, da ich alle Codes 2x schreiben muss. Ich lade die komplette PE Datei in einen Buffer und lese / schreibe Daten, indem ich mit PImageNtHeaders, etc arbeite. Und grade den Case auf PImageNtHeaders kann ich ja nicht irgendwie variabel gestalten. Ansonsten wäre das alles ja kein Problem. Dann würde ich mir einen Getter schreiben, der entweder einen Pointer auf den 32 oder den 64 Bit Header zurückgibt.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Variante Records?

  Alt 21. Mär 2009, 16:12
Ich meinte eigentlich, dass du eine Klasse schreibst, die das selbe Interface wie IMAGE_OPTIONAL_HEADER hat, nur mit Eigenschaften statt Feldern. Damit kannst du vermeiden, den gesamten Code doppelt zu schreiben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.626 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: Variante Records?

  Alt 21. Mär 2009, 16:28
Ah okay dann hatte ich dich erst falsch verstanden. Bin grade selbst auf die Idee gekommen so eine Klasse zu schreiben. Muss halt jetzt den ImageOptionalHeader von den anderen Feldern des ImageNtHeaders trennen, aber geht wohl nicht anders.

Gruß Zacherl
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf