Mumble Link Struktur auslesen

  • Hallo, ich würde gerne auf die Mumble Link Struktur aus einer Software zugreifen. Allerdings weis ich nicht wie man in AutoIT auf das virtual memory mapped file zugreifen kann.

    Ich habe einen funktionierenden C#-Code, den ich gerne in AutoIT-Code umwandeln möchte. Den Ausschnitt für das Abrufen der Mumble Link Daten, ist hier:

    Wie setze ich den Abruf uns das speichern der Mumble Link Struktur-Daten in meine eigene Struktur um?


    Danke schon mal.


    EDIT BugFix:
    Es gehört zum guten Ton, dass man Crosspostings bekannt gibt. :rolleyes:

  • Ich denke das wird in diese Richtung gehen. Ich hab mit den Befehlen noch nie gearbeitet und weiß grad nicht, wie die Struktur von diesem MumbleLink aussieht, aber so etwa sollte es sein:



    Ich hoffe, das hilft dir weiter.

    EDIT: Hab grad nochmal geschaut und die Struktur in den Code übernommen. So sollte es funktionieren, hoffe ich :D
    (Achte darauf, dass mumble in 32bit compiliert wurde und mit einem compiler der wchar_t wie wchar behandelt, also mit 2Byte)


    MfG Kanashius

  • Hey Kanashius,

    erstmal vielen vielen Dank das Du dir die Mühe gemacht hast den ganzen Code zu schreiben.

    _WinAPI_CloseHandle benötigt übrigens noch einen #include <WinAPI.au3>, sonst gibt es die Funktion nicht.

    $playerInfo.x usw. habe ich in $playerInfo_x geändert, da es hier Fehler gab (bei den anderen Achsen natürlich auch). Deinen Code habe ich mal ausprobiert und leider bekomme ich keine Koordinaten geliefert (nur 0). Hier dein Code, den ich leicht verändert habe:

    Ich habe leider noch nicht rausfinden können wo hier der Fehler liegt. ?(

    Bevor ich deine Antwort gesehen habe, habe ich selbst mal an einer Lösung gearbeitet habe aber zunächst Probleme gehabt, ein Array in eine Struktur zu packen - anscheinend so einfach nicht möglich bei AutoIT. Also habe ich z.b das fAvatarPosition[3] Array in fAvatarPosition_x usw. geändert. Ich bekomme die korrekten Koordinaten ausgeliefert. Probleme gibt es aber bei dem fAvatarFront[3] welches ich wie bei dem anderen Array zerlegt habe. Hier bekomme ich den Y-Winkel nicht ausgeliefert. Bleibt einfach 0. Hier mal mein Code:


    AutoIt
    #include <WinAPI.au3>
    #include <WinAPIFiles.au3>
    #include <WinAPIDiag.au3>
    $LinkedMem = 'UINT uiVersion;DWORD uiTick;float fAvatarPosition_x;float fAvatarPosition_y;float fAvatarPosition_z;float fAvatarFront_x;float fAvatarFront_y;float fAvatarFront_z;float fAvatarTop_x;float fAvatarTop_y;float fAvatarTop_z;WCHAR name[256];float fCameraPosition_x;float fCameraPosition_y;float fCameraPosition_z;float fCameraFront_x;float fCameraFront_y;float fCameraFront_z;float fCameraTop_x;float fCameraTop_y;float fCameraTop_z;WCHAR identity[256];UINT context_len;CHAR context[256];WCHAR description[2048];'
    Local $mumb = _WinAPI_OpenFileMapping("MumbleLink")
    Local $pAddress = _WinAPI_MapViewOfFile($mumb)
    Local $tStruct = DllStructCreate($LinkedMem, $pAddress)
    ConsoleWrite('X is: ' & DllStructGetData($tStruct, "fAvatarPosition_x") *  39.37010 & @CRLF)
    ConsoleWrite('Y is: ' & DllStructGetData($tStruct, "fAvatarPosition_y") *  39.37010 & @CRLF)
    ConsoleWrite('Z is: ' & DllStructGetData($tStruct, "fAvatarPosition_z") *  39.37010 & @CRLF)

    Ich verstehe generell noch nicht so ganz was _WinAPI_OpenFileMapping und _WinAPI_MapViewOfFile überhaupt machen. Die Erklärungen sind sehr kurz. _WinAPI_MapViewOfFile liefert denke ich einen Pointer zu dem Memory mapped file, mit welchem ich eine Struktur baue nach dem definierten Aufbau (bei dir $sStructure32). Verstehe ich das richtig?

    Edit: Wenn ich deine UINT32 in UINT ändere bekomme ich zumindest für die X-Koordinate den richtigen Wert. Allerdings liefert dein $playerInfo_x = DllStructGetData($tData,"fAvatarPosition",0) den Wert 0 und deine $playerInfo_y=DllStructGetData($tData,"fAvatarPosition",1) und $playerInfo_y=DllStructGetData($tData,"fAvatarPosition",2) den richtigen Wet für die x-Koordinate. Allerdings liefern beide Konsolen-Befehle die x-Koordinate aus obwohl hier nach y und z gefragt wurde. Hier stimmt wohl was mit der Struktur nicht.

    Einmal editiert, zuletzt von SturmGhost (10. November 2016 um 20:39)

  • Probier DllStructGetData($tStruct, "fAvatarPosition_x") mal in meinem Script aus. Wenn es dort auch falsch ist guck mal, ob mumble als 32 oder 64 bit kompiliert wurde, und welcher compiler.
    Bei win32 wird dort eine andere Struktur genutzt und wchar_t ist compilerabhängig, wie viele bytes das braucht. Ich vermute, dass dort das Problem liegt.

    Gegebenenfalls mal alles in ein Array aus Bytes lesen, dann mit autoit ausgeben lassen und gucken, wo was steht.

  • Habe jetzt in der Struktur-Definition dein FLOAT fAvatarPosition[3] durch FLOAT fAvatarPosition_x; usw. ausgetauscht. Also insgesamt:


    AutoIt
    global $sStructure32="UINT uiVersion;DWORD uiTick;FLOAT fAvatarPosition_x;"& _
    			 "FLOAT fAvatarPosition_y;FLOAT fAvatarPosition_z;"& _
    		     "FLOAT fAvatarFront[3];FLOAT fAvatarTop[3];WCHAR name[256];"& _
    		     "FLOAT fCameraPosition[3];FLOAT fCameraFront[3];FLOAT fCameraTop[3];"& _
    		     "WCHAR identity[256];UINT context_len;BYTE context[256];"& _
    		     "WCHAR description[2048];"


    Hat zur Folge das nun die X-Koordinate und die Y-Koordinate korrekt sind. Als Z-Koordinaten wird jedoch ebenfalls die Y-Koordinate ausgegeben. X/

    Zum Compiler habe ich nur das hier gefunden:

    https://github.com/mumble-voip/mu…2-static/README

    und

    https://wiki.mumble.info/wiki/BuildingWindows

    Scheint demnach 32 Bit und mit Visual Studio 2013 in C++ compiliert worden zu sein.

    Zitat

    Gegebenenfalls mal alles in ein Array aus Bytes lesen, dann mit autoit ausgeben lassen und gucken, wo was steht.

    Wie mache ich das - den Pointer nehmen und dann...? ?(

  • Es gehört auch zum guten Ton nicht Texte als Zitat von mir auszugeben, die ist nie geschrieben habe - bitte ändern. ;)

    Der Thread wurde geclosed weil die Leute dort auf alles was "game" enthält sofort allergisch reagieren - Blödsinn aber gut.
    Hast Du kein Interesse an einem Austauscht? Ich habe hier keine Anfrage gestellt nach dem Motto: "Mein Name ist ich weiß von nix - bitte codet mir alles komplett" - das sowas ungerne gesehen wird ist klar.

    @Kanashius

    Mittlerweile habe ich das Problem lösen können, indem ich in der Struktur alle Arrays für die Koordinaten aufgespalten habe in x,y und z und dann mit einer For-Schleife durch die Struktur gegangen bin und die enthaltenen Informationen verglichen habe. Dadurch habe ich nun die richtigen offsets bzw. Positionsangaben für die Struktur und kann es korrekt auslesen.

  • Es gehört auch zum guten Ton nicht Texte als Zitat von mir auszugeben, die ist nie geschrieben habe - bitte ändern.

    Wie gewünscht erledigt. wbb hatte es fälscherlichrweise dir zugeschrieben.

    Der Thread wurde geclosed weil die Leute dort auf alles was "game" enthält sofort allergisch reagieren - Blödsinn aber gut.

    Und dieses Gute sollte man hier auch beachten, Daher alle Beiträge auf Eis gelegt, bis ein Mod oder Ad
    min sie entsorgt bzw. wieder auftaut.

  • @autoBert warum? Das ist doch garkein Game. Noch dazu geht das es die Koordinaten auf die du abzielst nur gibt wenn das Game, welches Mumble auch erstmal unterstützen muss, diese auch an den Mumble senden. Und selbst dann sind das Pseudokoordinaten und keine realen Ingame. Das sperren der Beiträge halte ich für absolut unnötig und hoffe, dass ein Mod das auch so sieht. Die Koordinaten stellen lediglich eine grobe Richtung/Entfernung zu anderen Spielern da für Stereosound. Daraus einen Bot ect. zu machen ist praktisch unmöglich.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    • Offizieller Beitrag

    Warum wurde jetzt die Moderation zugespammt?
    Geht die Botparanoia wieder mal los?

  • Weil autobert die Beiträge deaktiviert hat und du jetzt wohl entscheiden sollst.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    • Offizieller Beitrag

    @autoBert, wenn du meinst das ein Thread nicht Regelkonform ist, dann deaktiviere den Thread und nicht die einzelbeiträge.
    Wenn die anden Poweruser meinen das der Beitrag OK ist, dann aktiviert ihn doch einfach wieder ;)

    • Offizieller Beitrag

    Also für mich, handelt es sich bei Mumble um einen Voicechat. Warum man auch immer den mit dem Spiel linken will, ist mir noch nicht ganz klar, aber muss es ja auch nicht. Da der Hersteller aber selbst Routinen und Anleitungen zur Verfügung stellt, die die Anbindung an andere Anwendungen unterstützen, sehe ich hier keinen Regelverstoß.

  • Schön das Ihr euch einigen konntet. :love:

    Während ich mit meinem C#-Code die Werte verglichen habe, ist mir gar nicht aufgefallen das die Funktion _WinAPI_OpenFileMapping("MumbleLink") natürlich nur funktioniert, wenn die Datei "MumbleLink" bereits vorhanden ist. Das ist natürlich zum Start des Programms nicht der Fall. Im C#-Code kann das elegant mit der Funktion MemoryMappedFile.CreateOrOpen gelöst werden, welche es so in AutoIT leider nicht gibt. Stattdessen habe ich die Funktion _WinAPI_CreateFileMapping gefunden. Ich wollte das ganze also nun so lösen:


    AutoIt
    Func _openMumbleLink()
    	if $hMappedFile = 0 Then
    		$hMappedFile = _WinAPI_CreateFileMapping(Null, 5716, "MumbleLink")
    	Else
    		$hMappedFile = _WinAPI_OpenFileMapping("MumbleLink")
    	EndIf
    	$pViewAdress = _WinAPI_MapViewOfFile($hMappedFile)
    	if $pViewAdress = 0 then SetError(2)
    EndFunc

    Leider werden dann keine Werte ausgelesen. :thumbdown: Das ganze funktioniert erst, wenn ich einmalig den C#-Code ausgeführt habe, dann kann ich über die Funktion _WinAPI_OpenFileMapping("MumbleLink") oder auch _WinAPI_CreateFileMapping aus die Daten zugreifen. Bei der Angabe der Größe habe ich verschiedene Sachen probiert. Einmal die Größe meiner Struktur (5460) $sStructure32 und einmal die Größe der C#-Struktur (5716) - vielleicht übersehe ich hier was anderes? ?(

    Edit: Funktioniert nun. Ich musste nur einen "SecurityIdentifier" setzen. Die Lösung fand ich hier:

    http://stackoverflow.com/questions/2291…ss-in-to-winapi

    Einfach Local $sid = _Security__StringSidToSid("S-1-0") erstellen und der _WinAPI_CreateFileMapping übergeben. Die richtige Struktur-Größe war auch wichtig. Ich musste die originale C#-Struktur Größe verwenden (5714) damit es schlussendlich funktionierte. ;)

    2 Mal editiert, zuletzt von SturmGhost (11. November 2016 um 18:22)