[Win] Check registry keys before accessing

Fixes crashes when using OpenTK over the Remote Desktop Client for Mac
(version 2010).
This commit is contained in:
Stefanos A. 2014-01-09 00:10:41 +01:00
parent 811126c47b
commit 1b3b510376
2 changed files with 18 additions and 5 deletions

View file

@ -103,10 +103,11 @@ namespace OpenTK.Platform.Windows
// This is a keyboard or USB keyboard device. In the latter case, discover if it really is a // This is a keyboard or USB keyboard device. In the latter case, discover if it really is a
// keyboard device by qeurying the registry. // keyboard device by qeurying the registry.
RegistryKey regkey = GetRegistryKey(name); RegistryKey regkey = GetRegistryKey(name);
string deviceDesc = (string)regkey.GetValue("DeviceDesc"); if (regkey == null)
continue;
string deviceDesc = (string)regkey.GetValue("DeviceDesc");
string deviceClass = (string)regkey.GetValue("Class"); string deviceClass = (string)regkey.GetValue("Class");
string deviceClassGUID = (string)regkey.GetValue("ClassGUID"); // for windows 8 support via OpenTK issue 3198 string deviceClassGUID = (string)regkey.GetValue("ClassGUID"); // for windows 8 support via OpenTK issue 3198
// making a guess at backwards compatability. Not sure what older windows returns in these cases... // making a guess at backwards compatability. Not sure what older windows returns in these cases...
@ -205,10 +206,15 @@ namespace OpenTK.Platform.Windows
static RegistryKey GetRegistryKey(string name) static RegistryKey GetRegistryKey(string name)
{ {
if (name.Length < 4)
return null;
// remove the \??\ // remove the \??\
name = name.Substring(4); name = name.Substring(4);
string[] split = name.Split('#'); string[] split = name.Split('#');
if (split.Length < 3)
return null;
string id_01 = split[0]; // ACPI (Class code) string id_01 = split[0]; // ACPI (Class code)
string id_02 = split[1]; // PNP0303 (SubClass code) string id_02 = split[1]; // PNP0303 (SubClass code)

View file

@ -110,11 +110,13 @@ namespace OpenTK.Platform.Windows
// This is a mouse or a USB mouse device. In the latter case, discover if it really is a // This is a mouse or a USB mouse device. In the latter case, discover if it really is a
// mouse device by qeurying the registry. // mouse device by qeurying the registry.
RegistryKey regkey = FindRegistryKey(name); RegistryKey regkey = FindRegistryKey(name);
string deviceDesc = (string)regkey.GetValue("DeviceDesc"); if (regkey == null)
continue;
string deviceDesc = (string)regkey.GetValue("DeviceDesc");
string deviceClass = (string)regkey.GetValue("Class") as string; string deviceClass = (string)regkey.GetValue("Class") as string;
if(deviceClass == null){ if(deviceClass == null)
{
// Added to address OpenTK issue 3198 with mouse on Windows 8 // Added to address OpenTK issue 3198 with mouse on Windows 8
string deviceClassGUID = (string)regkey.GetValue("ClassGUID"); string deviceClassGUID = (string)regkey.GetValue("ClassGUID");
RegistryKey classGUIDKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Class\" + deviceClassGUID); RegistryKey classGUIDKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Class\" + deviceClassGUID);
@ -266,10 +268,15 @@ namespace OpenTK.Platform.Windows
static RegistryKey FindRegistryKey(string name) static RegistryKey FindRegistryKey(string name)
{ {
if (name.Length < 4)
return null;
// remove the \??\ // remove the \??\
name = name.Substring(4); name = name.Substring(4);
string[] split = name.Split('#'); string[] split = name.Split('#');
if (split.Length < 3)
return null;
string id_01 = split[0]; // ACPI (Class code) string id_01 = split[0]; // ACPI (Class code)
string id_02 = split[1]; // PNP0303 (SubClass code) string id_02 = split[1]; // PNP0303 (SubClass code)