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).