Projektpfad aus EXE ermitteln

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 268
Registriert: So, 28. Mär 2010 19:21

Projektpfad aus EXE ermitteln

Beitrag von azzo » Fr, 23. Feb 2018 13:41

Hallo,
ich suche nach einer Möglichkeit, eine EXE Datei zu lesen und nach einem Wort zu suchen.
Memoread oder f_open funktioniert bei mir leider nicht.

Man kann eine EXE mit F3 vom TotalCommander aus aufmachen und dann nach:
INITSTATICS
suchen.
Man sieht dann, den Projektpfad.
LG
Otto

Benutzeravatar
HaPe
Foren-Moderator
Foren-Moderator
Beiträge: 546
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: Projektpfad aus EXE ermitteln

Beitrag von HaPe » Fr, 23. Feb 2018 13:59

Hallo Otto !
Memoread oder f_open funktioniert bei mir leider nicht.
Welcher Rückgabe-Code bzw. Fehler-Code kommt denn?
Was sagt FError()?
Zuletzt geändert von HaPe am Fr, 23. Feb 2018 14:01, insgesamt 1-mal geändert.
--
Hans-Peter

Organisator der XUG Stuttgart
Beisitzer des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14594
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh » Fr, 23. Feb 2018 14:00

FOpen() kann JE Datei öffnen, solange genug Rechte auf dem Verzeichnis vorhanden sind.
Du schreibst deine Funktion anders, also könnte es eine spezielle Version sein, die eventuell die Parameter anders setzt.
FOpen( <cFilename>, [<nMode>]) --> nHandle

<nMode> ist ein ganzzahliger, numerischer Wert, der den Modus für den Dateizugriff spezifiziert. Der Standardwert ist 0, d.h. wenn <nMode> nicht angegeben ist, wird eine Datei im "Read-only" und "shared" Modus geöffnet. Für das Argument <nMode> sind in der Header-Datei "Fileio.ch" verschiedene symbolische Konstanten definiert, mit denen der Zugriffsmodus für eine Einzelplatz- oder eine Netzwerkanwendung spezifiziert werden kann.
bei der Standardversion wird Read-Only und shared geöffnet, somit sollte das auch auf einem Laufwerk funktionieren, bei dem die EXE läuft und das Schreibschutz hat.
Gruß
Hubert

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7333
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von Tom » Fr, 23. Feb 2018 14:19

Ich kann F_Open(), MemoRead() und FileStr() mit jeder beliebigen Datei veranstalten, wenn ich an sie rankomme. Das funktioniert auch bei EXEn, die über 100 MB groß sind.

Aber, mal ganz blöd gefragt: Was soll der "Projektpfad" sein, der irgendwo in der Nähe von "INITSTATICS" in der EXE steckt? Ich kann eine EXE ja in jedes beliebige Verzeichnis kopieren und dort starten, aber ihr Inhalt ändert sich dadurch nicht. Das wäre ja auch noch schöner. Ich finde allerdings bei DEBUG=yes Pfad und Name von PRG und OBJ (sonst nicht!), und bei direkt gelinktem Manifest alle darin enthaltenen Informationen. Anders gefragt: Wonach suchst Du?
Herzlich,
Tom

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14594
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh » Fr, 23. Feb 2018 14:25

Ich habe dieses Programm mal in der Workbench laufen lassen ...

Code: Alles auswählen

#include "Common.ch"
PROCEDURE Main
   LOCAL cExe, cBinBuffer, nError, cSuch
   /* we use the ansi charset by default */
   SET CHARSET TO ANSI

   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   cSuch := "INIT" + "STATICS"  // sonst wird es wegen diesem String gefunden
   cExe  := AppName(.T.)
   ?
   ? "Testprogramm: ",cExe
   ?
   ? "Versuche EXE zu öffenen ..."

   cBinBuffer := file2Str(cExe,,,@nError)

   ? "Ergebnis nError=",nError,"  Eingelesene Bytes: ",len(cBinBuffer)

   ? "Ist '"+cSuch+"' EXE vorhanden ? "

   IF cSuch $ upper(cBinBuffer)
      ? "JA, ab Byte", at(cSuch,cBinBuffer)
   ELSE
      ? "NEIN"
   END IF

   SET ALTERNATE OFF

   inkey(20)


   /* $TODO: place your application code here */
RETURN


*---------------------------------------------------------------------------------------------
FUNCTION File2Str(cFile,nStartPos,nLen,nError)      // memoread() könnte Umwandeln !!!
   LOCAL nHandle, cBuffer, nReadBytes,nSeekPos      // nError muss per Referenz übergeben werden
   cBuffer    := ""
   nReadBytes := 0
   DEFAULT nStartPos TO 1    // normalerweise will man ab dem 1. Zeichen.
   DEFAULT nLen      TO 0    // 0 steht für keine Begrenzung
   IF nStartPos < 1
      nStartPos := 1
   ENDIF
   nError  := 0              // 0 steht für keinen Fehler
   nHandle := FOpen(cFile)
   IF nHandle = -1
      nError := FError()
   ELSE
      IF nLen=0
         nLen := FSize( nHandle )
      ENDIF
      IF nStartPos > 1
         nSeekPos := FSeek( nHandle, nStartPos-1 )
         IF nSeekPos <> nStartPos-1
            nError := -2
         ENDIF
      ENDIF
      cBuffer    := space(nLen)
      nReadBytes := FRead( nHandle, @cBuffer, nLen)
      IF nReadBytes < nLen    // eventuell kein Fehler, sondern nur weniger Daten verf³gbar.
         nError := FError()
      ENDIF
   ENDIF
   FClose(nHandle)
RETURN left(cBuffer,nReadBytes)
das ist das Ergebnis:
Testprogramm: C:\Users\BRANDELH\Documents\Xbase++\Projects\test\Test.exe

Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 16384
Ist 'INITSTATICS' EXE vorhanden ?
JA, ab Byte 10997
also, es geht ganz einfach mit fOpen() oder meiner damit erstellten Funktion, die EXE Längen sollten auch kein Problem darstellen
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14594
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh » Fr, 23. Feb 2018 14:31

OK, prüfen wir noch DEBUG=OFF ... EXE wird neu erstellt, direkt gestartet und ...
Testprogramm: C:\Users\BRANDELH\Documents\Xbase++\Projects\test\Test.exe

Versuche EXE zu ”ffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 14848
Ist 'INITSTATICS' EXE vorhanden ?
JA, ab Byte 10997
Es sind weniger Bytes, also wird was weg gelassen, aber die Sprungadresse auf INITSTATICS bleibt gleich.
Was man dort finden soll weiß ich aber auch nicht ...
Gruß
Hubert

Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 268
Registriert: So, 28. Mär 2010 19:21

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo » Fr, 23. Feb 2018 17:49

Hallo Hubert,
danke für deine Hilfe.
Ich habe deinen Code mit xHarbour kompiliert.
Ich musste nur SET CHARSET TO ANSI kommentieren und habe den Pfad zur gewünschten EXE fix eingegeben.
Hier erhalte ich keinen Treffer.
Könntest du mir bitte zum Testen eine EXE mit xBase geben. Vielleicht kannst du meinen Pfad eingeben.

Mit bestem Dank im Voraus,
Otto

Code: Alles auswählen

  LOCAL cExe, cBinBuffer, nError, cSuch
   /* we use the ansi charset by default */
//  SET CHARSET TO ANSI

   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   cSuch := "INIT" + "STATICS"  // sonst wird es wegen diesem String gefunden
   cExe  := "c:\xwinhotel\xZahlung.exe" //AppName(.T.)


Testprogramm: c:\xwinhotel\xZahlung.exe
Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 2075
Ist 'INITSTATICS' EXE vorhanden ?
NEIN

Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 268
Registriert: So, 28. Mär 2010 19:21

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo » Fr, 23. Feb 2018 17:55

Hallo Tom,
danke für deine Infos. Ich suche die prg-Datei , die die main Funktion der EXE enthält.

LG
Otto

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11515
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Projektpfad aus EXE ermitteln

Beitrag von AUGE_OHR » Fr, 23. Feb 2018 23:15

Frage : über welche Xbase++ Version redet ihr :?:

ich habe das \SOURCE\samples\ Verzeichnis mit TC nach *.EXE und Text = "INITSTATICS" und "DEBUG" durchsucht und nichts gefunden :shock:
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14594
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh » So, 25. Feb 2018 0:12

Jimmy,

ich habe das mal mit 2 normalen EXE Dateien auspropiert und kann dir nur Zustimmen, warum mein anderes Beispiel etwas gefunden hat ... vermutlich den Suchbegriff selbst
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14594
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh » So, 25. Feb 2018 1:12

So ich habe mein Programm angepasst, damit der String nicht aus dem Quellcode direkt in der EXE landet und siehe da ... den gibt es gar nicht ;-)

Code: Alles auswählen

#include "Common.ch"
PROCEDURE Main
   LOCAL cExe, cBinBuffer, nError, cSuch1, cSuch2, cSuch
   /* we use the ansi charset by default */
   //   SET CHARSET TO ANSI

   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   cSuch1 := "IniT"     // sonst wird es wegen diesem String gefunden
   cSuch2 := "STaTICS"  // sonst wird es wegen diesem String gefunden
   cSuch  := upper(rtrim(ltrim(cSuch1)-ltrim(cSuch2)))
   // cExe  := AppName(.T.)
   cExe  := "c:\xwinhotel\xZahlung.exe" //AppName(.T.)
   ?
   ? "Testprogramm: ",cExe
   ?
   ? "Versuche EXE zu öffenen ..."

   cBinBuffer := file2Str(cExe,,,@nError)

   ? "Ergebnis nError=",nError,"  Eingelesene Bytes: ",len(cBinBuffer)

   ? "Ist '"+cSuch+"' in EXE vorhanden ? "

   IF cSuch1 $ upper(cBinBuffer)
      ? "JA, ab Byte", at(cSuch,cBinBuffer)
   ELSE
      ? "NEIN"
   END IF

   SET ALTERNATE OFF

   inkey(20)


   /* $TODO: place your application code here */
RETURN


*---------------------------------------------------------------------------------------------
FUNCTION File2Str(cFile,nStartPos,nLen,nError)      // memoread() könnte Umwandeln !!!
   LOCAL nHandle, cBuffer, nReadBytes,nSeekPos      // nError muss per Referenz übergeben werden
   cBuffer    := ""
   nReadBytes := 0
   DEFAULT nStartPos TO 1    // normalerweise will man ab dem 1. Zeichen.
   DEFAULT nLen      TO 0    // 0 steht für keine Begrenzung
   IF nStartPos < 1
      nStartPos := 1
   ENDIF
   nError  := 0              // 0 steht für keinen Fehler
   nHandle := FOpen(cFile)
   IF nHandle = -1
      nError := FError()
   ELSE
      IF nLen=0
         nLen := FSize( nHandle )
      ENDIF
      IF nStartPos > 1
         nSeekPos := FSeek( nHandle, nStartPos-1 )
         IF nSeekPos <> nStartPos-1
            nError := -2
         ENDIF
      ENDIF
      cBuffer    := space(nLen)
      nReadBytes := FRead( nHandle, @cBuffer, nLen)
      IF nReadBytes < nLen    // eventuell kein Fehler, sondern nur weniger Daten verf³gbar.
         nError := FError()
      ENDIF
   ENDIF
   FClose(nHandle)
RETURN left(cBuffer,nReadBytes)
Ergebnis in test.txt:

Testprogramm: c:\xwinhotel\xZahlung.exe
Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 10752
Ist 'INITSTATICS' in EXE vorhanden ?
NEIN
Diese Variable wird nicht von Xbase++ selbst gesetzt ... versuchen wir es noch mit DEBUG=YES ...


Testprogramm: c:\xwinhotel\xZahlung.exe
Versuche EXE zu öffenen ...
Ergebnis nError= 0 Eingelesene Bytes: 11776
Ist 'INITSTATICS' in EXE vorhanden ?
NEIN
Wichtig an der Geschichte ist aber, dass fOpen() die EXE fehlerfrei öffnet (nError=0 bedeutet KEIN Fehler) und meine Funktion die Datei in einen String lädt.
Gruß
Hubert

Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 268
Registriert: So, 28. Mär 2010 19:21

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo » So, 25. Feb 2018 1:31

Hallo Hubert,
auch hier wird mit fOpen() die Datei geöffnet. Aber leider wird nach einigen Bytes dann der Lesevorgang abgebrochen.
LG
Otto

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2243
Registriert: Fr, 08. Feb 2008 21:29

Re: Projektpfad aus EXE ermitteln

Beitrag von georg » So, 25. Feb 2018 7:30

Hallo, Otto -


wie liest Du, verwendest Du fRead() oder fReadStr()?

fReadStr() hört auf, wenn ein Chr(0) gelesen wird, und das hört sich nach Deinem Problem an.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 268
Registriert: So, 28. Mär 2010 19:21

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo » So, 25. Feb 2018 19:51

Hallo Georg,
danke für deine Hilfe und den Hinweis Chr(0).

Genau das war mein Problem.

Ich habe mir immer nur
cBuf := MEMOREAD( cExe )
angeschaut und anzeigen lassen.
Hier wird dann nach dem ersten CHR(0) einfach abgeschnitten.
Anbei die Funktion die bei mir nun funktioniert.
Die Funktion liefert den Pfad des prg Files - file in dem die main -Funktion enthalten ist - der EXE zurück.
Die Funktion dürfte 1:1 auch mit xBase funktionieren.
LG
Otto


Code: Alles auswählen

function PrjPath( cExe )

   local cBuf, nAt

   if Empty( cExe )
      return nil
   endif

   cBuf  := MEMOREAD( cExe )
   cBuf  := AfterAtNum( "(_INITSTATICS", cBuf, 1 )
   cBuf  := AfterAtNum( Chr( 0 ), cBuf, 1 )
   cBuf  := BeforAtNum( Chr( 0 ), cBuf, 1 )

return cBuf


Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14594
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh » Mo, 26. Feb 2018 9:20

Und wieder einmal zeigt es sich, dass es NICHT egal ist mit welchem Clipper Nachfolger man arbeitet !

1. EXE von Xbase++ oder auch PowerBasic enthalten kein Schlüsselwort INITSTATICS, das habe ich jetzt bei 5 EXE Dateien mit HEX-Editor überprüft.

2. MemoRead() aus Xbase++ liest eine BIN Datei (also auch jede EXE) komplett ein, egal ob chr(0) oder sonstwas drin enthalten ist; wobei ich nicht auf chr(26) getestet habe.

Hier die Ausgabe eines Abwandelten Xbase++ Test Programmes (einmal mit memoedit(), das zweite mal mit meiner file2str() Funktion):
Versuche EXE zu öffenen, MemoEdit() ...
Ergebnis Eingelesene Bytes: 15360
Versuche EXE zu öffenen, File2Str() ...
Ergebnis nError= 0 Eingelesene Bytes: 15360
Ist 'IniTStaTICS' EXE vorhanden ?
NEIN
(x)Harbour übersetzt ja RRG Code nach C-Code und ein C-Compiler übersetzt das dann.
Für C-Compiler Funktionen ist es normal bei chr(0) nicht mehr weiter zu lesen.

Alaska hat bei Xbase++ beide Verhaltensweisen ...

Memoread() liest alles, aber fReadStr() hört auch bei chr(0) auf.
Dennoch, Memoread() sollte laut Alaska nicht verwendet werden, da es eigentlich eine Text-Funktion ist, EXE Dateien etc. sind aber Binär-Daten.
Gruß
Hubert

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1088
Registriert: Mi, 28. Jul 2010 17:16

Re: Projektpfad aus EXE ermitteln

Beitrag von ramses » Mo, 26. Feb 2018 11:09

Hallo Hubert

bist du dir mit Harbour sicher?
Meine Version die ich unter FreeBSD verwende übersetzt PRG's in Pseudo-Code und das Runtime-Modul arbeitet diese dann ab.

Gruss Carlo

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14594
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Projektpfad aus EXE ermitteln

Beitrag von brandelh » Mo, 26. Feb 2018 11:27

Ich ging davon aus, dass das von AZZO beschriebene Verhalten von Memoedit() unter xHarbour beobachtet wurde.

Da könnte ich mich aber auch täuschen. Wie die Runtime das dann umsetzt weiß ich auch nicht, aber dass C-Funktionen normalerweise chr(0) als Ende des Strings interpretieren stimmt.
Wenn man das anders machen möchte, muss man die "Strings" als Array of Byte behandeln und dann geht das auch mit den chr(0) im Datenstrom, sonst wäre eine Verarbeitung von Binär-Daten ja nicht möglich.
Aber um es deutlich zu sagen, meine C-Kenntnisse beschränken sich auf das Lesen von Parameter Aufrufen für meine DLL Libs ;-)

Was ich eigentlich nur sagen wollte ist:

Wenn man wie in diesem Thread (zudem unter Allgemein !) ein (Fehl-)Verhalten schildert und eben NICHT Xbase++ nutzt, bitte dazu schreiben soll, dass es um XYZ Compiler geht.
Gruß
Hubert

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1088
Registriert: Mi, 28. Jul 2010 17:16

Re: Projektpfad aus EXE ermitteln

Beitrag von ramses » Mo, 26. Feb 2018 14:51

Hallo Otto

du könntest doch mit dem Texteditor eine "File Suche" in den prg's in deinen Verzeichnisen und Unterverzeichnisen suchen. z.B. nach " main" Multiedit liefert dir dann alle Dateien im gewählten Verzeichnisbaum die " main" enthalten.

Gruss Carlo

Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 268
Registriert: So, 28. Mär 2010 19:21

Re: Projektpfad aus EXE ermitteln

Beitrag von azzo » Mo, 26. Feb 2018 15:36

Hallo Carlo,
ich habe schon weiter oben gepostet, dass ich dank eurer Hilfe das Problem lösen konnte.
Danke nochmals an alle.
LG
Otto

Hallo Georg,
danke für deine Hilfe und den Hinweis Chr(0).

Genau das war mein Problem.

Ich habe mir immer nur
cBuf := MEMOREAD( cExe )
angeschaut und anzeigen lassen.
Hier wird dann nach dem ersten CHR(0) einfach abgeschnitten.
Anbei die Funktion die bei mir nun funktioniert.
Die Funktion liefert den Pfad des prg Files - file in dem die main -Funktion enthalten ist - der EXE zurück.
Die Funktion dürfte 1:1 auch mit xBase funktionieren.
LG
Otto

Code: Alles auswählen

function PrjPath( cExe )

   local cBuf, nAt

   if Empty( cExe )
      return nil
   endif

   cBuf  := MEMOREAD( cExe )
   cBuf  := AfterAtNum( "(_INITSTATICS", cBuf, 1 )
   cBuf  := AfterAtNum( Chr( 0 ), cBuf, 1 )
   cBuf  := BeforAtNum( Chr( 0 ), cBuf, 1 )

return cBuf


Antworten