Thema: Delphi Variante Records?

Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 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