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/)
-   -   Delphi MemoryMapped Files unter Vista - keine Daten (https://www.delphipraxis.net/92973-memorymapped-files-unter-vista-keine-daten.html)

Zacherl 29. Mai 2007 18:22


MemoryMapped Files unter Vista - keine Daten
 
Hey,

hab an einem Beispiel gehockt, welches mit MMFs funktioniert. Unter XP klapt das auch wunderbar. Unter Vista habe ich eine seltsame Feststellung gemacht. Und zwar werden keine Daten in mein MMF geschrieben.

Zum Testen habe ich die Schreib und Lese-Funktion im selben Prozess kurz hintereinander aufgerufen. Der Pointer bleibt leer .. kann sich das jemand erklären?

Gruß Florian

Assertor 29. Mai 2007 18:32

Re: MemoryMapped Files unter Vista - keine Daten
 
Hi Florian,

ich habe irgendetwas in Erinnerung, daß das was Du machen möchtest unter Vista nicht mehr so einfach geht. Hier liegen wahrscheinlich Probleme mit den Zugriffsrechten vor (ist unter Vista in vielen Fällen nicht mehr erlaubt).

Es wird das SeCreateGlobalPrivilege benötigt, doch die UAC verhindert daß irgendwas außer einem Service dies erhält.

Bekommst Du denn etwas aus der Richtung GetLastError bzw. als Rückgabewert? Das dürfte in Richtung "Access Denied" gehen...

Gruß winkel79

Robert Marquardt 29. Mai 2007 18:35

Re: MemoryMapped Files unter Vista - keine Daten
 
Vesuch mal auf Named Pipes auszuweichen.

Zacherl 29. Mai 2007 20:53

Re: MemoryMapped Files unter Vista - keine Daten
 
Hast du vielleicht ein kleines Beispiel dazu?

Robert Marquardt 30. Mai 2007 04:23

Re: MemoryMapped Files unter Vista - keine Daten
 
Nein, ich kaempfe selber noch damit.

Zacherl 30. Mai 2007 19:46

Re: MemoryMapped Files unter Vista - keine Daten
 
Okey ich werd auch mal bisschen rumsuchen. Grade auch wie es ist, wenn ein Prozess unter Adminrechten und der andere mit normalem Token läuft. Denke mal dann wird es aber überhauptnicht funktionieren ..

Wenn du eine Lösung gefunde hast würde ich mich sehr freuen, wenn du mir die kurz zeigen könntest :)

SirThornberry 30. Mai 2007 20:10

Re: MemoryMapped Files unter Vista - keine Daten
 
wie sieht dein Quellcode aus? Prüfst du auch die Rückgabewerte? Ich kann mir nicht vorstellen das du einfach nicht in ein MMF schreiben kannst aber keine Fehlercodes zurück geliefert werden.

Zacherl 30. Mai 2007 20:19

Re: MemoryMapped Files unter Vista - keine Daten
 
Ich habe Luckies Beispiel genommen. Die Fehlercodes geben nur SUCCESS zurück. Meine Funktion ist so geändert, dass ich direkt einen Pointer schreibe.

Delphi-Quellcode:
function WriteToMMF(Data: Pointer; Len: Integer; Filename: string): DWORD;
var
  dwResult: DWORD;
  hFileMapping: THandle;
  Mem: Pointer;
begin
  dwResult := 0;
  hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil,
    PAGE_READWRITE, 0, Len, PChar(Filename));
  if hFileMapping <> 0 then
  begin
    Mem := MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
    if Assigned(Mem) then
    begin
      CopyMemory(Mem, Data, Len);
      //CloseHandle(hFileMapping);
    end;
  end
    else
  begin
    dwResult := GetLastError;
  end;
  Result := dwResult;
end;
Erster "Fehler" rufe ich CloseHandle auf, kann ich im anderen Programm schon gar nicht auf die Daten zugreifen. Zweite Sache ist .. ich habs genauer getestet.

Ich schicke erst einen PChar, welcher auch korrekt ankommt. Danach sende ich Pointer(Len) mit SizeOf(Integer). Dies ist die Passage, welche nicht ankommt.
Das Längenbyte ist 0. Was ich versuche ist unabhängig vom String eine ganze Resource zur anderen Anwendung zu schicken. Da die Anwendung ja nicht weiß wie groß die Resource sein wird, musste ich das mit dem Längenbyte vorweg machen.

Insgesamt habe ich zur besseren Übersicht einfach 3 Verschiedene "Dateinamen" verwendet.

SirThornberry 30. Mai 2007 20:28

Re: MemoryMapped Files unter Vista - keine Daten
 
Zitat:

Erster "Fehler" rufe ich CloseHandle auf, kann ich im anderen Programm schon gar nicht auf die Daten zugreifen. Zweite Sache ist .. ich habs genauer getestet.
Das ist kein Fehler. Wenn du die Datei schließt und die Memory-Datei somit von keinem Prozess mehr geöffnet ist wird sie wieder frei gegeben.

Zacherl 30. Mai 2007 21:03

Re: MemoryMapped Files unter Vista - keine Daten
 
Achso okey .. und das zweite Verhalten? Kann ich mir irgendwie nicht erklären =/

SirThornberry 30. Mai 2007 21:08

Re: MemoryMapped Files unter Vista - keine Daten
 
um dazu etwas sagen zu können müsste man wissen wie du das, was sich hinter data verbirgt zusammemsetzt. So sieht man ja nur das du etwas kopierst aber mehr nicht

Zacherl 30. Mai 2007 21:48

Re: MemoryMapped Files unter Vista - keine Daten
 
Ich habe einmal die Variable Len vom Typ Integer. Schreiben tue ich die so:

WriteToMMF(Pointer(Len), SizeOf(Integer), 'MyMapName1')

SirThornberry 30. Mai 2007 21:56

Re: MemoryMapped Files unter Vista - keine Daten
 
genau da liegt der Fehler!
Deine Funktion erwartet einen Pointer auf die Daten.
Du castest aber deine Länge einfach zu einem Pointer und übergibst dies dann als Adresse. Es wird also nicht deine Länge geschrieben sondern wenn deine Länge "5" ist dann wird das geschrieben was an Adresse 5 ist.
Du musst also die Adresse von deiner Längenvariable übergeben und nicht einfach deine Variable zu einem Pointer casten (Grundlagen).

Zacherl 30. Mai 2007 22:10

Re: MemoryMapped Files unter Vista - keine Daten
 
Ah sorry hatte das falsch im Kopf. So meinte ich auch:

Delphi-Quellcode:
WriteToMMF(@Len, SizeOf(Len), 'InjectionMappingTest2');
Unter XP funktioniert das wunderbar. Unter Vista leider nicht. Der String kommt unter Vista allerdings an .. ich darf nicht mit Strings arbeiten, sondern ausschließlich mit PChar. Es könnte mein Problem lösen, wenn ich eine Assembler Funktion hätte, die mit IntToPChar macht ..

Zacherl 31. Mai 2007 22:43

Re: MemoryMapped Files unter Vista - keine Daten
 
*push* :duck:

Zacherl 1. Jun 2007 21:30

Re: MemoryMapped Files unter Vista - keine Daten
 
Konnte das Problem weiter eindämmen: Es passiert nicht auf allen Rechnern, sondern nur auf einigen. Egal ob XP oder Vista. Auch funktiniert es nicht mit Microsoft Virtual PC 2007.

Dort ist der ankommende Integer immer = 0.

Zacherl 1. Jun 2007 23:15

Re: MemoryMapped Files unter Vista - keine Daten
 
Ich weiß ich nerve :oops: Sehr seltsame Sache muss man sagen:

Delphi-Quellcode:
procedure WriteToMMF(Filename: PChar; Data: Pointer; Len: Integer);
var
  hFile: Cardinal;
  Mem: Pointer;
begin
  hFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Len +1, Filename);
  if hFile <> 0 then
  begin
    Mem := MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, 0);
    CopyMemory(Mem, Data, Len);
  end;
  //CloseHandle(hFile);
end;

function ReadFromMMF(Filename: PChar; Size: Integer): Pointer;
var
  hFile: Cardinal;
begin
  hFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Size, Filename);
  if hFile <> 0 then
  begin
    Result := MapViewOfFile(hFile, FILE_MAP_READ, 0, 0, 0);
  end
    else
  begin
    Result := nil;
  end;
  CloseHandle(hFile);
end;
Es kommt eine AV bei CopyMemory im WriteToMMF Teil, wenn ich das Programm auf einer VM starte. Sehr komisch ist noch, dass es auf meinem normalen System funktioniert. Und das sogar, wenn ich CopyMemory auskommentiere :mrgreen: :D Kann ich mir nicht erklären, denke aber mal, dass da mein Fehler liegt.

ARGH :wall: Ich habs .. heureka :D Mein Programm hat sich teilweise geschlossen, befor mein RemoteThread auf die Daten zugegriffen hat. Ein simples WaitForSingleObject hats getan.

himitsu 18. Jan 2008 06:12

Re: MemoryMapped Files unter Vista - keine Daten
 
Zitat:

Zitat von SirThornberry
Das ist kein Fehler. Wenn du die Datei schließt und die Memory-Datei somit von keinem Prozess mehr geöffnet ist wird sie wieder frei gegeben.

eben nicht, wenn eine Datei per MMF geöffnet ist und nur das FileHandle (das von CreateFile) geschlossen wird, dann bleibt der gemappte Teil erhalten.

hab mir so ein geiles MemoryLeak geschaffen, wo z.B. "angeblich" geschlossene Dateien, solange das Programm noch aktiv war, nicht von anderen Programmen (Explorer) gelöscht werden konnten.


ach ja ....

och menno, war schon fast soweit mich auf die MMFs zusammen SendMessage zu stürzen, um Programmübergreifend kommunizieren zu können, da es für mich wohl am Einfachsten wär.

QuickAndDirty 18. Jan 2008 07:35

Re: MemoryMapped Files unter Vista - keine Daten
 
Zitat:

Zitat von Zacherl
Konnte das Problem weiter eindämmen: Es passiert nicht auf allen Rechnern, sondern nur auf einigen. Egal ob XP oder Vista. Auch funktiniert es nicht mit Microsoft Virtual PC 2007.

Dort ist der ankommende Integer immer = 0.

Läuft da ein virenscanner?
Es gibt Virenscanner die öffnen Dateien obwohl das Flag tragen das sie sich beim Schließen automatisch löschen sollen.

Tyrael Y. 18. Jan 2008 08:57

Re: MemoryMapped Files unter Vista - keine Daten
 
Möchte es kurz in den Raum schmeissen....

...vergesst nicht, daß es auch noch das gute alte TCP/IP gibt, damit kann man ja nicht nur
zwischen verschiedenen Rechnern kommunizieren, sondern auch innerhalb des selben Rechners, ich sehe
dies als eine alternative zu MMF, Named Pipes, usw.

negaH 18. Jan 2008 11:48

Re: MemoryMapped Files unter Vista - keine Daten
 
davon abgesehen das
Delphi-Quellcode:

WriteToMMF(@Len, SizeOf(Len), 'InjectionMappingTest2');

procedure WriteToMMF(Filename: PChar; Data: Pointer; Len: Integer);
aus deinen obigen Postings nicht zusammenpasst (Parameter) versuche mal folgende Änderung:

Delphi-Quellcode:
procedure WriteToMMF(Filename: PChar; Data: Pointer; Len: Integer);
var
  hFile: Cardinal;
  Mem: Pointer;
begin
  hFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Len +1, Filename);
  if hFile <> 0 then
  begin
    Mem := MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, 0);
    if Mem <> nil then CopyMemory(Mem, Data, Len)
      else RaiseLastWin32Error;
  end else RaiseLastWin32Error;
  //CloseHandle(hFile);
end;
Ach und nochwas: Wo wird hFile wieder geschlossen ? Wo wird Mem wieder mit UnmapViewOfFile() freigegeben ? Wo sind die try finally Schutzblöcke ?

Gruß Hagen

JonnyGuitar 18. Jan 2008 14:08

Re: MemoryMapped Files unter Vista - keine Daten
 
nur ein kurzer einwurf zum thema vista.
ich meine mich zu errinnern, dass das unter vista nur funktioniert wenn
man sich mit SetSecurityDescriptorDacl die vollen rechte holt.

cheers Jonny


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr.

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