Pfad der Binary

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Pfad der Binary

Beitrag von vonTurnundTaxis »

Wie kann man (unter Linux) den Pfad seiner Binary ermitteln?
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Meinst du jetzt den Ordner bin oder meinst du Pfad zum Programm?
Bild
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Den Pfad zum Programm.
Der Pfad zu /bin/ wird sich wohl kaum ändern ;)
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Beitrag von Eric »

/proc/self/exe bzw. /proc/(prozessid)/exe ist ein symbolischer Link auf das Programm.

Ich hab dazu ein Programm geschrieben, hab aber gerade kein Linux mit PB um es zu testen.

Code: Alles auswählen

mem=AllocateMemory(1024)
b.s="/proc/self/exe"
c.l=@b
!mov eax,85       ;int sys_readlink(const char * path, char * buf, int bufsiz)
!mov ebx,[v_c]
!mov ecx,[v_mem]
!mov edx,1024
!int 0x80
MessageRequester("",GetPathPart(PeekS(mem)))
(Vielleicht ist PB auch nicht so glücklich, wenn ich einfach irgendwelche Register verändere)
Zuletzt geändert von Eric am 11.04.2006 16:58, insgesamt 1-mal geändert.
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

es sollte eigentlich damit klar kommen Die voher aber zu sichern
dürfte nicht schaden.
Bild
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

@Eric
Hast du dich beim Register edx -> ecx verschreiben.
Ansonsten schade das PB solche funktion nicht hat, so muss für jedes Betriebsystem was anderes frickeln.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Beitrag von Eric »

Whoops, da hab ich doch glatt ecx vergessen /:->
Ich habe es jetzt korrigiert, eax ebx ecx edx sollte stimmen.
Hat jemand es schon getestet?
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

Ja, es funktioniert schon (warum auch nicht).
Allerdings nur auf 32bit Systemen, was da für 64bit geändert werden muss weiss ich so noch nicht.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Beitrag von Eric »

Macht es als 32bit-Anwendung unter 64bit-Linux Probleme
(Oder hab ich etwa was verpasst und es gibt ein 64bit-PB? :lol: )
Und kommt eine Fehlermeldung? (general protection fault oder so?)
64bit-Prozessoren haben einen neuen Speicherschutz...
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Ich habe nochmal kurz rum gekrammt und einen etwas ältern Source
gefunden:

Code: Alles auswählen

Procedure.s GetAppDir()
    Protected lBuffer.l, lLen.l
    Protected sOut.s
    
    lBuffer = AllocateMemory(2048+1)
    CompilerSelect #PB_Compiler_OS 
        CompilerCase #PB_OS_Windows
            GetModuleFileName_(#Null, lBuffer, #MAX_PATH)
            sOut = GetPathPart(PeekS(lBuffer))
            If Right(sOut, 1) <> "\": sOut + "\": EndIf
    
        CompilerCase #PB_OS_Linux
            lLen = Readlink_("/proc/" + Str(getpid_()) + "/exe", lBuffer, 2048) 
            sOut = GetPathPart(PeekS(lBuffer, lLen))
    CompilerEndSelect
    FreeMemory(lBuffer)
    
    ProcedureReturn sOut
EndProcedure

Procedure.s GetAppName()
    Protected lBuffer.l, lLen.l
    Protected sOut.s
    
    lBuffer = AllocateMemory(2048+1)
    CompilerSelect #PB_Compiler_OS 
        CompilerCase #PB_OS_Windows
            GetModuleFileName_(#Null, lBuffer, 2048)
            sOut = GetFilePart(PeekS(lBuffer))
    
        CompilerCase #PB_OS_Linux
            lLen = Readlink_("/proc/" + Str(getpid_()) + "/exe", lBuffer, 2048) 
            sOut = GetFilePart(PeekS(lBuffer, lLen))    
    CompilerEndSelect
    FreeMemory(lBuffer)
    
    ProcedureReturn sOut
EndProcedure 
Macht das gleiche wie Erics Code aber benutzt dazu die libc und
funktioniert auf Windows und Linux.
Bild
Antworten