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 Createmutex / Windows 7 / 64bit Problem (https://www.delphipraxis.net/143121-createmutex-windows-7-64bit-problem.html)

Mavarik 10. Nov 2009 08:14


Createmutex / Windows 7 / 64bit Problem
 
Hallo Zusammen...

Ich habe einen Servicedienst mit Adminrechten geladen...

Dieser Dienst holt sich ein Mutex mit:

Delphi-Quellcode:
  ServiceGeladen := CreateEvent(nil,true,true,ServiceDa);
  SetEvent(ServiceGeladen);
Ein anderes Programm soll abfragen ob der Service geladen ist mit:

Delphi-Quellcode:
  Geladen := CreateMutex(nil, true,ServiceDa);

  if Geladen = 0
    then begin
Bisher (unter Vista 32Bit) funktionierte das prima so...
Hat jemand ne Idee woran es liegt, dass es jetzt nicht mehr läuft?
- 64 Bit?
- Windows 7
- sonstiges...

Grüsse Mavarik :coder:

PS.: Lasterror = 0 Gelanden = 256

Dezipaitor 10. Nov 2009 09:56

Re: Createmutex / Windows 7 / 64bit Problem
 
Das Erste ist ein eigentlich ein Event, d.h. das sind zwei völlig verschiedene Objekte.

Also, du kannst Events verwenden, statt Mutexes, musst aber dieselbe Funktion (CreateMutex <-> CreateEvent) nutzen. Schau dir die Doku in der MSDN dazu genau an.

Mavarik 10. Nov 2009 10:07

Re: Createmutex / Windows 7 / 64bit Problem
 
Oh Cool ist mir nicht aufgefallen...

Komisch, dass es unter Vista so funktioniert..

Aber auch wenn ich bei beiden den CreateEvent verwende erhalte ich nicht das gewünschte Ergebiss

Sollte nicht GetLastError = ERROR_ALREADY_EXISTS sein?

Grüsse :dp:

wicht 10. Nov 2009 10:28

Re: Createmutex / Windows 7 / 64bit Problem
 
Muss da vielleicht auch das berühmte "GLOBAL\" vor?

Mavarik 10. Nov 2009 10:45

Re: Createmutex / Windows 7 / 64bit Problem
 
Zitat:

Zitat von wicht
Muss da vielleicht auch das berühmte "GLOBAL\" vor?

Was - wo - vor?

Warum zeigt sich erst unter Windows 7 das Problem oder liegt es an 64 Bit...?

Wie gesagt unter Vista 32 läuft es...

Mavarik

wicht 10. Nov 2009 10:48

Re: Createmutex / Windows 7 / 64bit Problem
 
War mehr ins blaue geraden :) .. Naja der Mutex bekommt ja einen Namen, und der Name sollte dann nicht "asdf" sein, sondern "GLOBAL\asdf". Kannst ja mal versuchen, keine Ahnung ob es hilft.

Mavarik 10. Nov 2009 11:08

Re: Createmutex / Windows 7 / 64bit Problem
 
Zitat:

Zitat von wicht
War mehr ins blaue geraden :) .. Naja der Mutex bekommt ja einen Namen, und der Name sollte dann nicht "asdf" sein, sondern "GLOBAL\asdf". Kannst ja mal versuchen, keine Ahnung ob es hilft.

Wenn ich GLOBAL\ davor setze läßt sich der Mutex nicht erzeugen...

Aber auch alle anderen Events klappen unter W7_64 nicht mehr...

Wo ist der Trick..?

Mavarik

Mavarik 10. Nov 2009 11:45

Re: Createmutex / Windows 7 / 64bit Problem
 
Ich habe folgendes gefunde zu "Global"

Link <- hier steht "Global\\"

Funktioniert aber auch nicht...

Dezipaitor 10. Nov 2009 13:07

Re: Createmutex / Windows 7 / 64bit Problem
 
für Global\xxx benötigt man das CreateGlobalPrivilege, was z.B. Admin haben.

Mavarik 10. Nov 2009 13:16

Re: Createmutex / Windows 7 / 64bit Problem
 
Zitat:

Zitat von Dezipaitor
für Global\xxx benötigt man das CreateGlobalPrivilege, was z.B. Admin haben.

CreateGlobalPrivilege aus "Deiner" API?

Ich habe es mit "InitializeSecurityDescriptor" versucht... wollte leider auch nicht...


Frank

Fridolin Walther 10. Nov 2009 13:51

Re: Createmutex / Windows 7 / 64bit Problem
 
Ich frage mich ein wenig, wozu man da ein Mutex bemüht. Viel sauberer wäre es imho den Service Manager einfach zu fragen ob der Service läuft. Das ist nicht nur einfacher, sondern auch sicherer (es gibt nämlich einen Zeitraum in der der Mutex noch nicht existiert, Dein Service aber im Begriff ist zu starten):

Delphi-Quellcode:
uses winsvc;

function IsServiceRunning(serviceName : string) : Boolean;
var
  scmHandle : THandle;
  serviceHandle : THandle;
  serviceStatus : TServiceStatus;
begin
  Result := FALSE;
  scmHandle := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, GENERIC_READ);
  if scmHandle <> 0 then
    begin
      serviceHandle := OpenService(scmHandle, PChar(serviceName), SERVICE_QUERY_STATUS);
      if serviceHandle <> 0 then
        begin
          if QueryServiceStatus(serviceHandle, serviceStatus) then
            result := serviceStatus.dwCurrentState <> SERVICE_STOPPED;
          CloseServiceHandle(serviceHandle);
        end;
      CloseServiceHandle(scmHandle);
    end;
end;
Wenn Du wirklich ein Mutex nutzen magst, dann sollte es meiner Ansicht nach notwendig sein, den Mutex im globalen Namespace zu erstellen. Dazu musst Du Dir dann vorher entsprechende Rechte besorgen.

Mavarik 10. Nov 2009 14:05

Re: Createmutex / Windows 7 / 64bit Problem
 
Zitat:

Zitat von Fridolin Walther
Wenn Du wirklich ein Mutex nutzen magst, dann sollte es meiner Ansicht nach notwendig sein, den Mutex im globalen Namespace zu erstellen. Dazu musst Du Dir dann vorher entsprechende Rechte besorgen.

Danke für den Codesnipe ISServiceRunning... (Funktioniert)

Leider verschieb das "nur" das Problem, weil unter Win7 das gleiche Problem mit den Events habe...

Auch die Events haben unter Vista mit eingeschalteter UAC ohne den globalen Namespace funktioniert...

Mavarik :coder:

Dezipaitor 10. Nov 2009 14:19

Re: Createmutex / Windows 7 / 64bit Problem
 
Naja, man wartet ja eigentlich nicht auf den Dienst selbst, sondern auf irgendein Feature, welches er bereitstellt, z.B. Pipe.

Mavarik 10. Nov 2009 14:31

Re: Createmutex / Windows 7 / 64bit Problem
 
Zitat:

Zitat von Dezipaitor
Naja, man wartet ja eigentlich nicht auf den Dienst selbst, sondern auf irgendein Feature, welches er bereitstellt, z.B. Pipe.

Ja klar... Der Dienst stellt über ein CreateFileMapping... Ein Memory Block zur Verfügung...
Das ganze mit verschiedenen Threads die alle über Events-Handels synconisiert werden...
Aber das funktioniert nicht mehr und Win 7...

Wenn ich die gleichen Exe unter Vista laufen lassen - alles einwandfrei...

Habe mir auch gerade die Updates der API usw. geladen... Gleiches Problem...

Mavarik :gruebel:

Mavarik 11. Nov 2009 15:20

Re: Createmutex / Windows 7 / 64bit Problem
 
Hallo Christian!

Hast Du mal ein Stück source für "CreateGlobalPrivilege"...

Leider kann ich dazu nix finden..

Grüsse :gruebel:

Mavarik 11. Nov 2009 16:35

Re: Createmutex / Windows 7 / 64bit Problem
 
OK So funktioniert es...

Delphi-Quellcode:
var
   SecurityDesc: TSecurityDescriptor;
   SecurityAttr: TSecurityAttributes;
begin
  InitializeSecurityDescriptor(@SecurityDesc, SECURITY_DESCRIPTOR_REVISION);

  SetSecurityDescriptorDacl(@SecurityDesc, True, nil, False);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.lpSecurityDescriptor := @SecurityDesc;
  SecurityAttr.bInheritHandle := False;


  Geladen := CreateMutex(@SecurityAttr, false,pchar('Global\'+ServiceDa));
  error := GetLastError;

  if error = ERROR_ALREADY_EXISTS
Ich gehe davon aus, dass ich alle Mutex und Events mit dem Parameter aufrufen muss...
Werde ich mal testen...

Grüsse Mavarik :coder:

Dezipaitor 11. Nov 2009 18:22

Re: Createmutex / Windows 7 / 64bit Problem
 
Das Privileg heißt SE_CREATE_GLOBAL_NAME und wird mit AdjustTokenPrivilege oder JwEnablePrivilege von JWSCL aktiviert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 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