Seite 1 von 3

64 Bit Probleme im Programm

Verfasst: 08.03.2012 18:14
von deichi1
Hallo zusammen,

ich habe mit PB 32Bit ein Programm geschrieben, welches die Consolanwendung "Tshark.exe" steuert und die Ausgabe verarbeitet.
In einem ersten Schritt wird "Tshark -D" abgesetzt um die aktiven Netzwerkinterfaces zu ermitteln.
In einem zweiten Schritt werden dann die Caputredaten live oder von Festplatte mittels Tshark untersucht und die Ergebnisse gesammelt.
Das alles funktioniert hervorragend mit einem in 32Bit kompilierten Programm (auch unter Win7 64Bit).
Jetzt möchte ich das Programm mittes PB 64Bit kompilieren und laufen lassen.
Nach dem Kompilieren und einem Programmstart bekomme ich keine Interfaces von Tshark, jedoch die Caputredaten (live oder Festplatte) werden angezeigt und verarbeitet).
Mauell, in einem Konsolfenster, funktioniert der Befehl "Tshark -D".
Tshark ist ein Programm, welches mit Wireshark(64Bit) installiert wird und verwendet die WPcap.dll (sowohl unter 32 und 64Bit).
In einem 32Bit-Systen und einem 64Bit-System ist die DLL immer die Gleiche (kein Versionsunterschied).
Beide PB-Versionen greifen auf die absolut gleiche DLL zu.

Ich verstehe nicht, warum das 64Bit-Programm nur die Interfaceausgabe unterschlägt;-(

Gruß
deichi1

Re: PB 32Bit und 64Bit verhalten sich nicht gleich.

Verfasst: 08.03.2012 18:33
von STARGÅTE
Ohne den Code selbst kann man leider nicht viel dazu sagen.

Vermutlich wirst du aber einfach eine Long als Integer oder andersrum deklariert haben, sodass sich zwischen 32Bit und 64Bit ein Strukturlängenunterschied ergibt

Re: PB 32Bit und 64Bit verhalten sich nicht gleich.

Verfasst: 08.03.2012 18:35
von ts-soft
PB verhält sich schon gleich, aber das OS oder diese Exe nicht.
Kann das leider nicht testen, somit bei der Fehlersuche nicht helfen,
möchte Dich aber bitten, den Titel anzupassen, da das ganze kein
PB Problem ist, wie der Titel suggeriert.

Gruß
Thomas

Re: 64 Bit Probleme im Programm

Verfasst: 09.03.2012 21:15
von deichi1
@ STARGÅTE:

vielen Dank für die schnelle Antwort. Leider ist der gesamte Code so groß (mehere 1000 Zeilen), dass es hier den Rahmen sprängt ihn einzubauen.
Mit Deinem Hinweis auf die Deklaration hast Du mich auf eine Idee gebracht, der ich nachgehen werde.
Wenn ich nicht erfolgreich bin melde ich mich wieder und dann müssen wir einen Weg finden, dass Du denrelevanten Code zu Gesicht bekommst.
Fürs Erste mal vielen Dank;-)

@ ts-soft:

sorry, es war nicht meine Absicht hier einen Fehler in PB darzustellen.
Habe den Titel angepasst.
Ist er so OK?

Gruß
deichi1

Re: 64 Bit Probleme im Programm

Verfasst: 09.03.2012 21:21
von ts-soft
deichi1 hat geschrieben:Ist er so OK?
:allright:

Re: 64 Bit Probleme im Programm

Verfasst: 12.03.2012 15:20
von deichi1
Hallo zusammen,

habe jetzt umfangreiche Tests gemacht und die entsprechenden Proceduren extrahiert, so dass es für jeden nachvollziehbar ist.
Der Beispielcode ist angehängt und auch ausreichend kommentiert.
Es handelt sich um zwei Proceduren, die beide gleich aufgebaut sind.

1. GetInterfaceList()
Sie soll via Tshark.exe -D die Liste der Interfaces ermiteln und im Debugfenster darstellen.

2. LiveCap()
Sie soll via Tshark.exe -i num die Daten vom aktiven Ethernetinterface lesen und im Debugfenster darstellen.
Die Nummer muss vor dem Start ermittelt und in Option2.s eingetragen werden.

Getestet habe ich die Proceduren unter folgenden Betriebssystemen:

XP32/PB32 V4.60
Win7 32/PB32 V4.60
Win7 64/PB32 V.60
Win7 64/PB64 V4.60

Die Ergebnisse:

XP32|PB32 V4.60
GetInterfaceList: funktioniert
LiveCap: funktioniert

Win7 32|PB32 V4.60
GetInterfaceList: funktioniert
LiveCap: funktioniert

Win7 64|PB32 V4.60
GetInterfaceList: funktioniert nicht
LiveCap: funktioniert

Win7 64| PB64 V4.60
GetInterfaceList: funktinoiert nicht
LiveCap: funktioniert


Verblüffend ist, dass nur die eine Routine (GetInterfaceList) unter 64Bit OS nicht will.
Wie schon erwähnt, über CMD funktioniert der Befehl.

Hat Irgendjemand eine Idee, was ich falsch mache oder was das am OS schräg sein könnte?
Habe wirklich keinen Plan mehr;-)

Gruß deichi1

Code: Alles auswählen

;***********************************************************
;Vorbedingung:
;Es muss Whireshark in seiner neusest, stabilen Version installiert sein.
;Idealerweise unter einem 64Bit.OS und als 64Bit-Version
;Der Programmoutput beider Proceduren wird im Debugfenster ausgegeben.
;
;GetInterfaceList():
;Diese Procedure soll die Interfaceliste ermitteln und darstellen.
;
;LiveCap():
;Es werden die Daten vom Netzwerkinterface "1" eingeholt und dargestellt.
;Interface-1 ist meist das erste, aktive Ethernetinterface.
;***********************************************************

Option1.s = "-D"
;
;Die Zahl hinter dem -i bezeichnet das Interface von dem
;gelesen werden soll. Um die Zahl zu bekommen sollte entwerder
;die Procedure GetInterfaceList() ausgefürht werden oder man ermittelt 
;sie via Tshark.exe mit der Option "-D"
;
Option2.s = "-i 1"


Procedure GetInterfaceList(Option1.s)
  
  Option.s  =   Option1.s
  Prog.s = "c:\programme\wireshark\tshark.exe"
  ProgNum.q = RunProgram(Prog.s, Option.s, "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Hide)

  If ProgNum  
    While ProgramRunning(ProgNum)
      If AvailableProgramOutput(ProgNum)
      Debug ReadProgramString(ProgNum)
      EndIf
  Wend
    KillProgram(ProgNum)
    CloseProgram(ProgNum) 
  EndIf

EndProcedure

Procedure LiveCap(Option2.s)
  
  Option.s  =   Option2.s
  Prog.s = "c:\programme\wireshark\tshark.exe"
  ProgNum.q = RunProgram(Prog.s, Option.s, "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Hide)

  If ProgNum  
    While ProgramRunning(ProgNum)
      If AvailableProgramOutput(ProgNum)
      Debug ReadProgramString(ProgNum)
      EndIf
  Wend
    KillProgram(ProgNum)
    CloseProgram(ProgNum) 
  EndIf

EndProcedure


;GetInterfaceList(Option1.s)
LiveCap(Option2.s)

Re: 64 Bit Probleme im Programm

Verfasst: 12.03.2012 15:29
von ts-soft
Du nutzt ja immer dieselbe Exe? Sollte es da nicht 2 von geben. Und das mit den fixen Pfaden
ist hoffentlich nur zu Testzwecken, den Ordner ProgramFiles, sowie alle anderen Systemordner
sollte man immer per API feststellen.

Ansonsten, wenn es von der Shell aus klappt, schreib doch einfach eine Batch und starte die.

Nachtrag:
Das starten der Bildschirmtastatur unter Win 7 mit:

Code: Alles auswählen

RunProgram("osk")
funktioniert auch nur mit einer Exe, die im selben Format compiliert wurde, wie das OS!

Ich vermute mal, es werden aufgrund der Wow64FsRedirection notwendige DLLs nicht gefunden,
folgender Code könnte Dir helfen:

Code: Alles auswählen

Procedure DisableWow64FsRedirection(Flag)
  If OSVersion() >= #PB_OS_Windows_Vista
    Protected DLL = OpenLibrary(#PB_Any, "kernel32.dll")
    Protected IsWow64, Result
    If DLL
      If CallFunction(DLL, "IsWow64Process", GetCurrentProcess_(), @IsWow64)
        If IsWow64
          Result = CallFunction(DLL, "Wow64EnableWow64FsRedirection", Flag ! 1)
        EndIf
      EndIf
      CloseLibrary(DLL)
    EndIf
  EndIf
  ProcedureReturn Result
EndProcedure

Re: 64 Bit Probleme im Programm

Verfasst: 12.03.2012 15:43
von Falko
Du schreibst folgendes:
;Die Zahl hinter dem -i bezeichnet das Interface von dem
;gelesen werden soll. Um die Zahl zu bekommen sollte entwerder
;die Procedure GetInterfaceList() ausgefürht werden oder man ermittelt
;sie via Tshark.exe mit der Option "-D"
Wobei ich im ersten Blick sehe, das beide Procedure gleich sind und du sie mit veschiedenen
Parametern aufrufst.
Theoretisch müsste das gleiche bei folgender Procedure funktionieren:

Code: Alles auswählen

Option1.s = "-i 1"
;...
GetInterfaceList(Option1)
Vielleicht liegt das am Aufrufparameter -D, das es nicht funktionirt. Habe nichts
installiert um es testen zu können.

Gruß,
Falko

Re: 64 Bit Probleme im Programm

Verfasst: 12.03.2012 15:52
von deichi1
ts-soft;

das ist immer die gleiche EXE weil Wireshark als 64Bit App installiert ist.
Einen Test mit Wireshark 32Bit unter 64Bit OS habe ich nicht gemacht.
Es wird immer die gleiche wpcap.dll verwendet.
Die Jungs von Wireshark haben an der DLL und auch an den Zulieferprogrammen (Tshark.exe usw.) absolut nichts geändert.
Der fixe Pfad ist nur zum Test und zur Vereinfachung.

Aber warum funktioniert die gleiche EXE mit anderen Parameter?
Kann wohl kein Problem der DLL sein. Oder?

Wenn ich eine Batch verwende habe ich immer noch das Problem, dass ich die Ausgabe in mein Programm bekommen muss.
Den der Befehl "Tshark.exe -D > Test.txt" funktioniert schon garnicht.

Gruß
deichi1

Re: 64 Bit Probleme im Programm

Verfasst: 12.03.2012 15:54
von deichi1
Hallo Falco,

das "D" muss groß geschrieben sein, das "d" eine andere Bedeutung hat.
Ich habe extra zwei Proceduren geschrieben, damit es deutlicher wird was ich meine.

Gruß
deichi1