GetServiceName() über eine DLL aufrufen

Anfängerfragen zum Programmieren mit PureBasic.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

GetServiceName() über eine DLL aufrufen

Beitrag von funk.munich »

Hi zusammen,

ich möchte gerne über eine DLL herausfinden, ob der angegebene Dienst
existiert.

Code: Alles auswählen

; CallDll.exe
OpenLibrary(0, "Service.dll")
myCall = CallFunction(0, "ExistService", "ClipSrv") 
CloseLibrary(0)

Code: Alles auswählen

; Service.dll
ProcedureDLL.s ExistService(Service.s)

  Protected ServiceName.s
  
  ExamimeServices()
  
  While NextServices() 
    ServiceName.s = GetServiceName()
    
    If ServiceName = Service
      MessageRequester("", ServiceName)
    EndIf
  Wend
    
  ProcedureReturn result

EndProcedure
Wenn ich nur GetServiceName() über die DLL aufrufe funktioniert es.
Jedoch immer wenn ich "ServiceName" nutze erhalte ich eine Invalid
Memory Address.

Hat jemand eine Idee was ich da falsch mache?

Danke + Gruß,
Daniel
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Ich hatte mir das mal in der Art zum PBOSL-Service dazugebastelt:

Code: Alles auswählen

ProcedureDLL.l IsService(ServiceName.s)
	Protected Result.l, schSCManager.l

	schSCManager = OpenSCManager_(0, 0, #SRSC_MANAGER_ALL_ACCESS)
	If schSCManager
		Result = OpenService_(schSCManager, @ServiceName, #SRSERVICE_ALL_ACCESS)
		If Result
			CloseServiceHandle_(Result)
		EndIf
		CloseServiceHandle_(schSCManager)
	EndIf

	ProcedureReturn Result
EndProcedure
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

"ServiceName" ist ein lokaler string innerhalb der prozedur innerhalb der DLL.
sobald du die Proc beendest, existiert der String nicht mehr,
und ein Zugriff darauf landet natürlich in einem ungültigen speicherbereich.

du könntest z.b. deine DLL Proc so einrichten, dass sie einen pointer zu einem String erhält,
in den sie das ergebnis von GetServiceName dann reinschreibt.

aber:
was sind ExamimeServices, NextServices (da ist das s am ende zuviel) und GetServiceName überhaupt für Funktionen?

wenn du code postest, des sich auf eine nicht native Lib bezieht, erwähne das doch bitte auch.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi zusammen,

danke für die Info.

Generell nutze ich hierfür PB4.2 + PBOSL-Service.

@HeXOR,
wenn ich Deinen Code nutze erhalte ich die Fehlermeldung, dass #SRSC_MANAGER_ALL_ACCESS nicht existiert (-> Constant not found ...).

@Kaeru,
das Paket von PBOSL nutzt "ExamimeServices()" sowie auch "NextServices()".

Meinst Du soetwas?

Code: Alles auswählen

; CallDll.exe 
*Buffer = AllocateMemory(256)
*Pointer = *Buffer
CopyMemoryString("ClipSrv", @*Pointer)
OpenLibrary(0, "Service.dll") 
myCall = CallFunction(0, "ExistService", *Buffer) 
CloseLibrary(0) 

Code: Alles auswählen

; Service.dll 
ProcedureDLL.s ExistService(*Service) 
  Protected tmpResult.s = "0"
  
  ExamimeServices()
  
  While NextServices() 
        
    If GetServiceName() = PeekS(*Service) 
      MessageRequester("", "wahr")
    EndIf
  Wend
  
  ;FreeMemory(*Service)
  
  ProcedureReturn result
EndProcedure
Jedoch auch dort habe ich das Problem, dass ich ein Invalid Memory erhalte.

War der Aufruf eines Pointers falsch oder habe ich noch etwas falsch gemacht?

Danke + Gruß,
Daniel
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Mein Gott Leute, ist Eigeninitiative dermassen aus der Mode gekommen ?

Code: Alles auswählen

#SRSC_MANAGER_ALL_ACCESS      = $F003F
#SRSERVICE_ALL_ACCESS         = $F01FF
Wenn du schon die OpenSource-Libs benutzt, hättest du ja wenigstens auch auf die Idee kommen können dort mal in die Sources zu schauen...
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi HeXOR,

danke für die nette Antwort.

Generell hast Du Recht und beim nächsten Mal schaue ich mir vorher
die sourcen an. Diese hatte ich leider in dem Moment nicht heruntergeladen gehabt.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

funk.munich hat geschrieben: danke für die nette Antwort.
Ein Schlag mit dem Zaunpfahl hilft meist mehr, als ein freundliches anstupsen ;)
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi zusammen,

bei folgenden Code taucht auch ein "Invalid Memory Access. (read error at address 0)" auf. Also immer wenn ich innerhalb einer Procedure
NTService prozeduren aufrufe taucht das Problem auf.

Code: Alles auswählen

; Invalid Memory Access.
Procedure ExistService()

ExamimeServices()

While NextServices()
  Debug GetServiceName()
Wend

EndProcedure

ExistService()
Nur wenn ich folgendes nutze funxt es einwandfrei.

Code: Alles auswählen

ExamimeServices()

While NextServices()
  Debug GetServiceName()
Wend
Woran kann das liegen?

Danke + Gruß,
Daniel
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Hast du Threadsafe aktiviert ?
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi HeXOR,

ich habe beides schon ausprobiert gehabt. Also mit oder ohne ThreadSafe
erhalte ich das Problem :-(

Wenn Du den Code Schnipsel bei Dir laufen lässt, erhältst Du keinen Fehler?

Danke,
Daniel
Antworten