Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Übergabe eines Wertes an eine DLL-Variable eines anderen Prozesses (https://www.delphipraxis.net/161108-uebergabe-eines-wertes-eine-dll-variable-eines-anderen-prozesses.html)

KarYn-To 16. Jun 2011 23:56

Übergabe eines Wertes an eine DLL-Variable eines anderen Prozesses
 
Sehr geehrte DPLer,

zunächst, ja, ich habe die Suche gewissenhaft genutzt und habe nichts gefunden oder bin einfach zu inkompetent! In meinem Projekt hooke ich per DLL-Injektion über CreateRemoteThread und LoadLibrary die wichtigen API-Calls der WS2_32.dll und fixiere sie auf einen Netzwerkadapter. Bisher leider mit einer, in der DLL deklarierten, statischen IP. (Projektvorlagen zum Selbststudium = ForceBindIP)
Es besteht die Möglichkeit über eine Combobox den gewünschten Adapter auszuwählen. Jetzt kommt der Haken.

Leider fällt mir nach längerer Überlegung kein vernünftiger Weg ein, der injizierten DLL die zu wählende, den zu verwendenden Netzwerkadapter mitzuteilen. :wall:

Meine Überlegungen waren mir zu unflexibel:
  • IP in die Registry schreiben und von der DLL auslesen lassen
  • IP in einer Datei speichern...
  • IP direkt nach Injektion in die DLL schreiben... (Leider keine Ahnung von statischer Reservierung des Speicherbereiches)

Freue mich schon auf Eure Ideen und Vorschläge.

Beste Grüße
Karyn

P.S.: Anwendungszweck ist das LAN-Gaming über's Internet!

himitsu 17. Jun 2011 06:16

AW: Übergabe eines Wertes an eine DLL-Variable eines anderen Prozesses
 
Stichwort: IPC (inter-process communication / Interprozesskommunikation)

Da gibt es viele Wege, wie z.B.

MMF (memory-mapped file)
Pipe
Message (SendMessage, PostMessage)
nomale Dateien
...

blackfin 17. Jun 2011 08:19

AW: Übergabe eines Wertes an eine DLL-Variable eines anderen Prozesses
 
Wie Himitsu bereits gesagt hat, gibt es dazu mehrere Möglichkeiten.
Die "schlankeste" ist meiner Meinung nach über eine MMF, und dazu gab es auch schon ein "How To" hier :)

aber...
Zitat:

P.S.: Anwendungszweck ist das LAN-Gaming über's Internet!
Was hat das jetzt mit der Frage genau zu tun?
Wenn du im Endeffekt mehrere / viele unterschiedliche Messages von einem Server an einen Client (und vice versa) senden wollen würdest, dann wäre eine "echte" Client-/Server-Anwendung wohl eher angebracht.

CCRDude 17. Jun 2011 13:53

AW: Übergabe eines Wertes an eine DLL-Variable eines anderen Prozesses
 
Zitat:

Zitat von blackfin (Beitrag 1106895)
Wenn du im Endeffekt mehrere / viele unterschiedliche Messages von einem Server an einen Client (und vice versa) senden wollen würdest, dann wäre eine "echte" Client-/Server-Anwendung wohl eher angebracht.

Da er code injection betreibt, glaube ich eher, daß er ein bestendes Netzwerkspiel auf einen internen inoffiziellen Server umbiegen will ;)

KarYn-To 21. Jun 2011 00:22

AW: Übergabe eines Wertes an eine DLL-Variable eines anderen Prozesses
 
Zitat:

Zitat von CCRDude (Beitrag 1107006)
Da er code injection betreibt, glaube ich eher, daß er ein bestendes Netzwerkspiel auf einen internen inoffiziellen Server umbiegen will ;)

Zunächst vielen Dank für die Beiträge und besonders für den Hinweis mit MMF und allgemein IPC. Habe die Übergabe der IP über MMF gelöst. Hier ein Codesnippet:
Code:
T_OWN_INADDR = record
  S_un_b: SunB;
  S_un_w: SunW;
  S_addr: Integer;
end;

// Prozedur in der Bedienanwendung
procedure MakeMMF(own_inaddr: T_OWN_INADDR);
var
  hMap: Cardinal;
  MapView: Pointer;
  tmp_inaddr: T_OWN_INADDR;
  inaddr: in_addr;
begin
  hMap := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(T_OWN_INADDR), 'ipu7');
  MapView := MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
  if Assigned(MapView) then
  begin
    OutputDebugString('MMF erfolgreich erstellt!');
    CopyMemory(MapView, @own_inaddr, SizeOf(T_OWN_INADDR));
  end;
  CloseHandle(hMap);
end;

// Prozedur in der DLL die eingenistet wird.
procedure ReadMMF;
var
  hMap: Cardinal;
  MapView: Pointer;
  tmp_inaddr: T_OWN_INADDR;
  inaddr: in_addr;
begin
  hMap := OpenFileMapping(FILE_MAP_READ, False, 'ipu7');
  MapView := MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
  if Assigned(MapView) then
  begin
    OutputDebugString('MMF erfolgreich geöffnet!');
    CopyMemory(@tmp_inaddr, MapView, SizeOf(T_OWN_INADDR));
    AdapterAddress.S_un_b := tmp_inaddr.S_un_b;
    AdapterAddress.S_un_w := tmp_inaddr.S_un_w;
    AdapterAddress.S_addr := tmp_inaddr.S_addr;
    UnMapViewOfFile(MapView);
    CloseHandle(hMap);
  end;
end;
Nochmals vielen Dank :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz