Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
4.093 Beiträge
 
Delphi 12 Athens
 
#2

AW: Pointer oder Protected Memory ?

  Alt 27. Aug 2024, 18:40
Sowas in der Art, ungetested:

Verwendung von VirtualAlloc/VirtualProtect (nur Windows)

VirtualAlloc: Kann verwendet werden, um einen Speicherblock im virtuellen Adressraum eines Prozesses zu reservieren. Dieser Speicher kann dann mit spezifischen Zugriffsrechten markiert werden.

VirtualProtect: Erlaubt es, die Zugriffsrechte auf einen Speicherbereich nachträglich zu ändern (z. B. von lesbar auf nicht lesbar).


Delphi-Quellcode:
var
  ProtectedMemory: Pointer;
  Size: DWORD;
begin
  Size := 32; // 32 Bytes
  ProtectedMemory := VirtualAlloc(nil, Size, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
  if ProtectedMemory <> nil then
  begin
    // Daten in den geschützten Speicher schreiben
    PBYTE(ProtectedMemory)^ := 123; // Beispiel: einen Wert speichern
    
    // Zugriffsschutz ändern
    VirtualProtect(ProtectedMemory, Size, PAGE_READONLY, nil);

    // Pointer an eine DLL-Funktion übergeben
    // Beispiel: DLLFunction(ProtectedMemory);

    // Nach Nutzung: Speicher freigeben
    VirtualFree(ProtectedMemory, 0, MEM_RELEASE);
  end;
end;
Vorteile: Direkter Zugriff auf die Speicherverwaltung des Betriebssystems.
Nachteile: Plattformabhängig (nur für Windows), fehleranfällig, wenn nicht korrekt implementiert.


Eventuell geht es auch per TMemoryStream oder TBytes, ich bin jetzt nicht der DLL-Experte.

TMemoryStream: Kann zur Verwaltung von Speicherblöcken genutzt werden. Man kann den Stream lesen und schreiben,
aber den Pointer auf die Daten extrahieren, um ihn an eine DLL zu übergeben.

TBytes: Ein dynamisches Array von Bytes, das als Zwischenspeicher fungieren kann.

Delphi-Quellcode:
var
  MemoryBuffer: TBytes;
begin
  SetLength(MemoryBuffer, 32); // 32 Bytes

  // Daten in den Speicher schreiben
  MemoryBuffer[0] := 123; // Beispiel: einen Wert speichern

  // Pointer an eine DLL-Funktion übergeben
  // Beispiel: DLLFunction(@MemoryBuffer[0]);
end;
Vorteile: Plattformunabhängig, einfach zu implementieren.
Nachteile: Kein echter Schutz des Speichers (kein Schutz vor Schreibzugriffen).
  Mit Zitat antworten Zitat