Suche Helfer und Lehrer zur Bewältigung von Hobbyprojekt
-
Hallo zusammen,
ich bin Jason, 19 Jahre und komme aus Duisburg. Habe schon immer viel Spaß an Mikrocontrollern gehabt, diese zu programmieren in Assembler oder in C.
Nun da mein Hobby Veranstaltungstechnik ist, im besonderen die Lichttechnik, habe ich vor ein eigenes Lichtsteuerpult zu bauen. Die Hardware ist größenteils schon fertig und funktionstüchtig, jedoch habe ich da nun ein riesen Problem.
Es gibt einen Treiber von der Firma MegaTech, die die Lichtsteuerungssoftware GrandMA onPC von der Firma MA Lighting per Midi ansteuern lässt und auch wieder Werte für Motor-Fader zurück gibt. Nun habe ich von einem Freund gehört, dass es die Möglichkeit gibt direkt auf den Speicher zugreifen zu können und dort Werte ein und auslesen kann, also somit auch die Fader und Knöpfe in der Software über eine externe Software (mit Midi Input in C sollte man diese Werte ja übernehmen können) steuern lassen kann.
Es handelt sich insgesamt um ca. 100 Buttons und 10 Motorisierte Fader, die alle per Midi übertragen werden, eventuell habe ich noch vor, die ganzen Hardkeys, die im Moment per Shortcuts gesteuert werden auch auf diesem weg zu übertragen. (Midi und Readprocessmemory)Da ich noch nie was von dem ganzen Prozess gehört habe mit den Werte auslesen aus Software, wollte ich hier mal um Hilfe bitten und nicht nach dem Motto, macht mal bitte für mich, sondern von Anfang bis Ende erklären, dass ich das auch verstehen und eventuell selber machen kann.
Gruß Jason
-
Ich würde dir von diesem Vorhaben abraten.
Die ganzen ReadProcessMemory/WriteProcessMemory Geschichten sind im Grunde genommen Hacks, und reichlich fehleranfällig. Und nicht gerade einfach zu entwickeln.
-
was spricht dagegen den treiber zu benutzen den es schon gibt?
-
Der Treiber läuft ebenfalls über Readprocessmemory und läuft stabil.
Der vorhandene Treiber unterstützt nur die reinen Fader und nicht die Buttons, bzw. mit den Buttons auf dem Controller werden dann Shortcuts erzeugt. Allerdings habe ich schon alle Shortcuts weg und überlagern ist auch nicht so schön. Außerdem funktioniert nur der "Key Down" über den Treiber. Der "Key Up" nach loslassen der Taste wird gar nicht ausgeführt, was das Flashen von einzelnen Lichtstimmungen nicht ermöglicht. Zudem ist das drücken von 2 Tasten gleichzeitig dann auch schon wieder Problematisch.
Das ganze soll halt mit einem Readprozessmemory umgangen werden und eventuell auch somit die spätere Bedienung zu vereinfachen. Im Moment gibt es keine andere Lösung mehr für mich und ich hab da leider schon einen Haufen Geld investiert.
Gruß Jason
-
rhino-du schrieb:
Im Moment gibt es keine andere Lösung mehr für mich und ich hab da leider schon einen Haufen Geld investiert.
Wenn das wirklich so ist, dann sehe ich da ziemlich schwarz. Denn sowas is für Programmier-Neulinge alles andere als einfach.
Vor allem, wie schon gesagt: sowas ist und bleibt ne Bastelei. Dinge wie die von dir erwähnten Probleme (Flashen von einzelnen Lichtstimmungen nicht möglich) sind da noch das kleinste Problem.Kannst du die Hardware nicht einfach direkt ansteuern?
Oder anders gefragt: wozu brauchst du die "GrandMA onPC" Software überhaupt? Nur damit irgendwer mit dem Teil kommuniziert, oder brauchst du schon viele bzw. ausreichend komplizierte Features dieser Software, und willst nur an ein paar Stellen ein paar Dinge anstossen/automatisch steuern etc.?
Falls du die Software nämlich nur dazu brauchst damit die mit deiner Hardware reden kann, dann wäre es mMn. das vernünftigste den MegaTech "Treiber" und die "GrandMA onPC" Software ganz zu kübeln, und die Hardware direkt anzusprechen. Dann kannst du jede Funktion ganz genau und ohne Tricks/Hacks/Pfush direkt steuern.
EDIT: Oder hab ich das grad ganz verkehrt herum verstanden, und deine Hardware dient nur als Eingabegerät für die "GrandMA onPC" Software (und die "GrandMA onPC" Software steuert dann erst die ganze Licht-Maschinerie an)?
In dem Fall müsstest du ein "GrandMA onPC" Plugin entwickeln. Dazu musst du dir das SDK vom Hersteller besorgen.Und falls es kein solches SDK gibt, weil der Hersteller halt seine eigenen Steuerpulte verkaufen will, und nicht will dass da jmd. anderer am Kuchen mitnascht... dann hast du dummerweise auf ein totes Pferd gesetzt.
Das ist zumindest meine Meinung als jemand der seit etwa 15 Jahren professionell Software entwickelt. Damit musst du dich nicht zufrieden geben, d.h. du kannst natürlich gerne weiter suchen ob du jmd. findest der dir das hinbastelt. Nur sei nicht all zu überrascht wenn es nix wird.
-
Nochwas...
Ich will dich hiermit nicht als unverschämt hinstellen, nur ein kleines Misverständnis aus der Welt schaffen:rhino-du schrieb:
und nicht nach dem Motto, macht mal bitte für mich, sondern von Anfang bis Ende erklären, dass ich das auch verstehen und eventuell selber machen kann.
Das was du willst, also ne Erklärung von Anfang bis Ende, damit du es selbst machen kannst, ist vermutlich mehr Aufwand als dir das ganze zu entwickeln.
Ich schreib das nur weil ich glaube dass dir das nicht klar ist.
Weil dir halt mit 19, zumindest wenn du in deinem Leben bisher noch was anderes gemacht hast als genau solche Hacks zu programmieren, noch etliche Jahre Erfahrung für sowas fehlen. Und die kann man nicht einfach so auf die Schnelle "wegerklären".Wenn das jmd. von den Leuten die wissen dass sie sowas selbst hinbekommen könnten anders sieht, dann mag er mich gerne korrigieren/ergänzen.
-
kann es sein dass die limitierung vom treiber eigentlich eine limitierung vom midi port ist und dort nicht alle daten/buttons auf einmal uebertragen werden koennen?
wenn du schon soviel geld investiert hast, kannst du die firma in die du investiert hast nicht ueber den support nett fragen, ob sie dir nicht dabei helfen koennten?
vielleicht bist du nicht der erste und einzige mit dem problem und sie haben schon eine loesung.
vielleicht freuen sie sich ueber das feedback, weil sie das als feature in ihre software verbauen koennten.
vielleicht ist die loesung viel einfach aus sicht der entwickler, als aus der reverse engineering/hacking sicht.btw. wenn du nur 'klicks' usw. an eine UI schicken willst, geht das viel einfacher und stabiler mit http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx
einfach nur process memory zu mappen und daten zu aendern heisst naemlich noch lange nicht dass die software etwas damit anfaengt, die weiss ja nicht dass sich daten veraendert haben und schickt diese vermutlich nicht auf blauen dunst ueber die schnittstelle an die hardware. aber die software verarbeitet messages, denn so funktioniert windows, all deine klicks usw. kommen als eben solche an. du kannst mit sendmessage eben diese simulieren und die software verarbeitet solche messages so schnell wie sie das eben kann.
-
Genau du hast das wohl falsch verstanden. Die Hardware soll die Software steuern, da die Software auch eins von den besten Herstellen in Sachen Lichtbedienung sind.
Vor mir haben das auch schon andere geschafft.
Ich habe mich dem dem ganzen ein wenig auseinander gesetzt, jedoch die Werte Im Prozess der Software zu finden schaffe ich nicht. Vereinzelnd habe ich es geschafft bereits Fader zu bewegen, jedoch bewegten sich immer mehrere gleichzeitig. Vielleicht habe auch nicht ganz die Logik dafür das zu verstehen.Ich habe in der Berufsschule viel C gelernt, jedoch fast nur auf Mikrocontroller-Basis.
-
Hat denn diese Software irgend ein Interface für externe Steuerpulte?
Du hast ja was von MIDI geschrieben, also müsste es nicht reichen ein MIDI Device zu emulieren?Irgendwie kann ich mir nicht vorstellen dass die anderen Programme die das machen alle über WriteProcessMemory zugreifen. Es sei denn das Programm würde extra eine über WriteProcessMemory bedienbare Schnittstelle anbieten. Sowas wäre komisch, aber es wäre zumindest denkbar damit eine stabil funktionierende Kommunikation zu bewerkstelligen.
Vielleicht solltest du mal den Code posten mit dem du momentan arbeitest, und es bereits geschafft hast irgendwas in dem Programm zu bewegen. Dann könnten wir vermutlich besser einschätzen was da abgeht. Vielleicht ist das Unterfangen ja gar nicht so aussichtslos.
-
Die Lichtsoftware kann max. 72 Midi Werte verwalten und nur auf einen Channel. Zudem müsste ich sobald ich eine Änderung mache die jewalige Taste neu zuordnen.
Code schnibsel kann ich nicht anbieten, da ich zu den Leuten die schon mal das gleiche Projekt gebaut haben (Von denen es nur sehr wenige gibt) keinen Kontakt aufbauen kann.
Jedoch habe ich es heute morgen geschafft in der Berufsschule die ersten 4 Fader bewegen zu können durch einen 4-Byte Hex-Wert:
int main() { HWND hWnd = FindWindow(0, "grandMA onPC"); if(hWnd == 0){ MessageBox(0, "Error cannot find window.", "Error", MB_OK|MB_ICONERROR); } else { DWORD proccess_ID; GetWindowThreadProcessId(hWnd, &proccess_ID); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID); if(!hProcess){ MessageBox(0, "Could not open the process!", "Error!", MB_OK|MB_ICONERROR); } else { int newdata = 0x00000000; DWORD newdatasize = sizeof(newdata); for(newdata=0x00000000;newdata<0x000000FF;newdata += 0x00000001){ DWORD newdatasize = sizeof(newdata); if(WriteProcessMemory(hProcess, (LPVOID)0x66B3B67C, &newdata, newdatasize, NULL)){ //MessageBox(NULL, CHAR(newdata), "Success", MB_OK + MB_ICONINFORMATION); } else { MessageBox(NULL, "Error cannot WriteProcessMemory!", "Error", MB_OK + MB_ICONERROR); newdata = 0x000000FF; } Sleep(10); } CloseHandle(hProcess); } } return 0; }
Hier steht das erste Byte des newdata für den Wert des ersten Fader, das zweite Byte für den zweiten Fader und das geht in 4er Gruppen so weiter.
Zudem zählt das kleine Programm den Fader einmal komplett hoch.
-
Wo hast du die Adresse 0x66B3B67C her?
Und wo hast du überhaupt die Info her dass das Ding auf diese Art gesteuert werden kann? Da wo diese Info her ist, sollte es noch mehr geben. Lass dir nicht alles aus der Nase ziehen.Und davon abgesehen: hast du jetzt schonmal beim Hersteller angefragt ob die ein Plugin Interface haben? Oder externe Geräte über irgendwelche standardisierten Schnittstellen unterstützen?
-
Der Hersteller selber bietet keine Plugins an, wieso auch, da das Original Lichtpult fast 15.000€ kostet und die wollen ja auch verdienen
Jemand anderes hat wohl aus dem MidiBox Projekt sich dieses Lichtpult nachgebaut. Dort in den Kommentaren steht, dass er die komplette Steuerung wohl mit Write-/Readprocessmemory realisiert hat.
Die Adresse selber habe ich mit dem Programm Cheat Engine rausgesucht und habe auch lange dafür gebraucht oder ich war einfach nur zwischenzeitlich blind. Habe nun alle 20 Fader zusammen, jedoch fehlen noch 3 die ich bis jetzt nicht finden konnte, genau so wie alle Buttons. Für die 20 Fader habe ich auch die passenden Rückgabewerte, da es ja Motorfader sind, somit könnte ich ein MidiOut für die Fader realisieren.
-
rhino-du schrieb:
Die Lichtsoftware kann max. 72 Midi Werte verwalten und nur auf einen Channel. Zudem müsste ich sobald ich eine Änderung mache die jewalige Taste neu zuordnen.
Erklär mal genauer. Was ist das konkrete Problem mit Midi? Und wie meinst du das mit dem neu zuordnen?
rhino-du schrieb:
Dort in den Kommentaren steht, dass er die komplette Steuerung wohl mit Write-/Readprocessmemory realisiert hat.
Link?
Wenn du willst, guck ich mal (per Teamviewer zB) rüber und suche die Werte (oder du schickst mir das Programm zum Testen).
-
Ich habe mich da jetzt Tag und Nacht mit Cheat Engine durchgekämpft. Habe jetzt Werte aller Buttons die ich brauche und auch aller fader.
Was mich nun wundert ist das das Programm jedes mal andere Anfangs Adressen hat und immer die hinteren 4 Hex Werte bestehen bleiben zb. 0xXXXXCB60
Dann müsste ich mich da irgendwie noch durchkämpfen und auch noch ein Midi IO realisieren mit einem kleinen GUI.Der Link zu der Aussage in Bezug auf der Software ist dieser: http://notapage.net/wordpress/2012/01/endlich-ist-es-vollbracht-die-software-macht-fortschritte/
Das Problem bei der Software und Midi ist, man hat 72 Midi Werte auf 1 Kanal zur Verfügung. Die muss man für jede Show neu zuweisen, also das die Aktion der Taste auch über Midi abgerufen werden kann. Wenn ich dann die Art des Buttons ändere auf Flash um eine Lampe kurzzeitig an machen zu können schaltet sich diese Szene nach dem los lassen nicht mehr aus. Des weiteren muss ich erst die Buttons in der Software schon programmiert haben, damit ich die einem Midiwert zuweisen kann. Auf Dauer sehr Zeitaufwendig und Nervig.
-
rhino-du schrieb:
Ich habe mich da jetzt Tag und Nacht mit Cheat Engine durchgekämpft. Habe jetzt Werte aller Buttons die ich brauche und auch aller fader.
Was mich nun wundert ist das das Programm jedes mal andere Anfangs Adressen hat und immer die hinteren 4 Hex Werte bestehen bleiben zb. 0xXXXXCB60Guckst du hier:
ASLR.
Möglicherweise kannst du das für dein OS deaktivieren, dann hast du schon mal fixe Offsets. Auf der anderen Seite kannst du natürlich auch versuchen, die einzelnen Module der Anwendung zu identifizieren und die Offsets relativ zur Modulstartadresse bestimmen.
-
Gilt das ASLR nur ab Vista? Ich programmiere das ganze nämlich in Win7 und das Pult würde später auf WinXP laufen. Sprich da hätte ich das Problem dann nicht?
-
Hmm, das mit dem Midi kapiere ich immer noch nicht. Liegt wohl daran, dass ich davon (und Audio generell) sowieso null Ahnung habe.
Mach dir keine Gedanken um ASLR. Wenn sich die DLLs selbst nicht verändern, dann ist auch der Code immer an derselben Stelle (in der DLL). Lediglich die DLL Basisadressen können sich ändern, deshalb nimmt man offsets.
Also aktuelle Codeadresse minus aktueller Basisadresse ist der offset.
Wenn das Programm neu startet, einfach die Basisadresse der DLL holen (CreateToolhelp32Snapshot(TH32CS_SNAPMODULE...) plus dem offset ist dann wieder genau die Codestelle...
-
Ich versuche jetzt schon seit 2 Tagen mich irgendwie durch Examples und Tutorials zu lesen, aber ich komme mit den Adressen einfach nicht weiter.
Genau so wie mit Midi.
-
Zwei Zitate aus dem von dir verlinkten Thread
Chris schrieb:
Difficult to explain and no job for an evening. Finding the memory locations of the required informations took about half an year.
und
Bibi schrieb:
Since the adresses I’ve found for 6.615won’t work with 6.616, i’m affraid to have to do the process each time i’ll upgrade onpc
Und wenn das Programm nicht gerade globale Variablen für das ganze Zeug verwendet, dann gibt's sowieso keine fixen Adressen. D.h. man muss die Adressen über zwei, drei .... viele Zwischenschritte zusammenbasteln.
Nach dem Schema A = Read(Address1), B = Read(A + Offset1), C = Read(B + Offset2), .. .
Netterweise sagt einem aber keiner dass irgendwas nicht fix ist, und auf dem selben PC, unter ähnlichen Voraussetzungen, ergibt sich trotzdem immer die selbe Adresse. Bis sich eben eine andere ergibt.
-
Aber irgendwo muss dem Programm ja auch die Startadresse zugewiesen werden und das muss man ja irgendwo auslesen können oder?
-
Startadresse des Programms?