[Win] Check registry keys before accessing
authorStefanos A. <stapostol@gmail.com>
Wed, 8 Jan 2014 23:10:41 +0000 (00:10 +0100)
committerStefanos A. <stapostol@gmail.com>
Wed, 8 Jan 2014 23:10:41 +0000 (00:10 +0100)
Fixes crashes when using OpenTK over the Remote Desktop Client for Mac
(version 2010).

Source/OpenTK/Platform/Windows/WinRawKeyboard.cs
Source/OpenTK/Platform/Windows/WinRawMouse.cs

index 81f6e6e..84b17a1 100644 (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
                         // keyboard device by qeurying the registry.
                         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 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...
@@ -205,10 +206,15 @@ namespace OpenTK.Platform.Windows
 
         static RegistryKey GetRegistryKey(string name)
         {
+            if (name.Length < 4)
+                return null;
+
             // remove the \??\
             name = name.Substring(4);
 
             string[] split = name.Split('#');
+            if (split.Length < 3)
+                return null;
 
             string id_01 = split[0];    // ACPI (Class code)
             string id_02 = split[1];    // PNP0303 (SubClass code)
index 727d3b6..15ae043 100644 (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
                         // mouse device by qeurying the registry.
                         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;
-                        if(deviceClass == null){
+                        if(deviceClass == null)
+                        {
                             // Added to address OpenTK issue 3198 with mouse on Windows 8
                             string deviceClassGUID = (string)regkey.GetValue("ClassGUID");
                             RegistryKey classGUIDKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Class\" + deviceClassGUID);
@@ -266,10 +268,15 @@ namespace OpenTK.Platform.Windows
 
         static RegistryKey FindRegistryKey(string name)
         {
+            if (name.Length < 4)
+                return null;
+
             // remove the \??\
             name = name.Substring(4);
 
             string[] split = name.Split('#');
+            if (split.Length < 3)
+                return null;
 
             string id_01 = split[0];    // ACPI (Class code)
             string id_02 = split[1];    // PNP0303 (SubClass code)