Probleme mit Zugriffssteuerung auf Registry-Keys

Für allgemeine Fragen zur Programmierung mit PureBasic.
Pollux
Beiträge: 23
Registriert: 23.09.2010 18:46
Computerausstattung: Eigenbau: CPU Intel i7-960 Windows 7 64-Bit 12 GB RAM
Toshiba Notebook Windows XP 32-Bit
weitere
Wohnort: Gilching bei München

Probleme mit Zugriffssteuerung auf Registry-Keys

Beitrag von Pollux »

Aufgrund mehrerer Hinweise im PureBasic-Forum kann ich meine Joysticks über die WINMM.DLL mit den API-Funktionen 'joyGetNumDevs', 'joyGetDevCaps' und 'joyGetPosEx' abfragen. Leider steht in dem JOYCAPS-Feld 'Pname' statt der Joystick-Bezeichnung immer nur 'Microsoft-PC-Joysticktreiber'. Da ich aber auch die Joystick-Bezeichnung haben wollte, habe ich mit 'RegEdt32.exe' nach einer Möglichkeit gesucht, den Joystick-Namen zu ermitteln.

Diese Möglichkeit besteht über die Mid- und Pid-Felder der JOYCAPS Struktur. Wenn man diese Felder zu einem String:

Code: Alles auswählen

VID_PID_Id = "VID_" + RSet(Hex(JoyStickCaps\Mid,#PB_Word),4,"0") + "&PID_" + RSet(Hex(JoyStickCaps\Pid,#PB_Word),4,"0")
;dabei ist JoyStickCaps mein JOYCAPS-Feld
verbindet, hat man einen zum Joystick gehörenden Registry-Key, mit dem man den 'OEMName' abfragen kann. Ich habe dazu den Hauptschlüssel HKEY_LOCAL_MACHINE und folgenden Sub-Key verwendet:

Code: Alles auswählen

SubKey = "SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEM\" + VID_PID_Id
Testweise habe ich 3 verschiedene Joysticks (Logitech Force 3D Pro, Saitec X52 Flight Controller und Speed-Link Competition Pro) gleichzeitig angeschlossen. Unter den generierten Registry-Keys werden mir auch die jeweiligen Joystick-Namen von 'RegEdt32.exe' angezeigt.

Im PureBasic-Programm bekomme ich den Namen des Logitech-Joysticks aber nur angezeigt, wenn ich bei der API-Funktion 'RegOpenKeyEx' das Flag #KEY_READ benutze. Will ich den Saitek-Joystick-Namen auslesen, muß ich das Flag #KEY_ALL_ACCESS benutzen. Für den Speed-Link Joystick muß das Flag #KEY_QUERY_VALUE verwendet werden. Mit keinem der einzelnen Flags (oder einer Kombination) bekomme ich alle 3 Joystick-Namen angezeigt. Offenbar liegt das an unterschiedlichen Berechtigungen der Registry-Keys. Die spezialisierten Abfragen reichen zwar für meine 3 Joysticks (ich rufe einfach alle 3 Fälle auf), es ist aber etwas unbefriedigend, da ich das gerne für den allgemeinen Fall gelöst hätte.

Meine Frage ist: Kann mir da jemand einen Tipp geben, wie man das allgemein oder besser oder auch ganz anders löst?

Anmerkung: Ich habe mir auch die offenbar neuere API-Funktion 'RegGetValueA' der ADVAPI32.DLL zugänglich gemacht (statt der Folge RegOpenKeyEx, RegQueryValueEx, RegCloseKey). Auch die verhält sich ähnlich und liefert (erwartungsgemäß) nicht für alle Joysticks die Namen.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Probleme mit Zugriffssteuerung auf Registry-Keys

Beitrag von HeX0R »

Eigentlich besteht das #KEY_READ Flag bereits aus einer Kombination von #KEY_QUERY_VALUE, #KEY_ENUMERATE_SUB_KEYS und #KEY_NOTIFY,
von daher halte ich das eigentlich für ziemlich unwahrscheinlich.
Von welchem OS reden wir überhaupt?

Aber, da ich nicht mal einen Joystick besitze, kann ich auch nix ausprobieren.
Pollux
Beiträge: 23
Registriert: 23.09.2010 18:46
Computerausstattung: Eigenbau: CPU Intel i7-960 Windows 7 64-Bit 12 GB RAM
Toshiba Notebook Windows XP 32-Bit
weitere
Wohnort: Gilching bei München

Re: Probleme mit Zugriffssteuerung auf Registry-Keys

Beitrag von Pollux »

Hallo HeXOR

Wir reden von Windows 7 Professional 64 Bit. Nach meinen Unterlagen (Applemann) gilt:

KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))

KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))


Ich war auch ziemlich überrascht, daß es scheinbar nicht ein einzelnes Flag gibt, das es erlaubt den OEMNamen aller drei Joysticks (nacheinander) auszulesen. Zumal REGEDT32.EXE diese ohne weiteres anzeigt. Wenn man sich mit dem Registrierungs-Editor unter 'Bearbeiten / Berechtigungen' die Registry-Keys der Joysticks ansieht, sind die tatsächlich in den Berechtigungen unterschiedlich. Auch mit dem binären Aufschlüsseln der Flags bin ich nicht so recht weiter gekommen.

Vermutlich habe ich jetzt durch die mehrfache Abfrage mit verschiedenen Lese-Flags bis ein nicht leerer OEMName geliefert wird, sowieso schon fast alle Möglichkeiten abgedeckt
Antworten