/// <summary> /// Uses a series of API calls to locate a HID-class device /// by its Vendor ID and Product ID. /// </summary> /// /// <returns> /// True if the device is detected, False if not detected. /// </returns> private Boolean FindTheHid(Int32 myVendorID, Int32 myProductID) { Boolean deviceFound = false; String[] devicePathName = new String[128]; String functionName = ""; Guid hidGuid = Guid.Empty; Int32 memberIndex = 0; Boolean success = false; try { myDeviceDetected = false; Tracer.Trace(string.Format("FindTheHid(0x{0:X04}, 0x{1:X04})", myVendorID, myProductID)); // *** // API function: 'HidD_GetHidGuid // Purpose: Retrieves the interface class GUID for the HID class. // Accepts: 'A System.Guid object for storing the GUID. // *** Hid.HidD_GetHidGuid(ref hidGuid); functionName = "GetHidGuid"; Tracer.Trace(MyDebugging.ResultOfAPICall(functionName)); Tracer.Trace(" GUID for system HIDs: " + hidGuid.ToString()); // Fill an array with the device path names of all attached HIDs. deviceFound = MyDeviceManagement.FindDeviceFromGuid(hidGuid, ref devicePathName); // If there is at least one HID, attempt to read the Vendor ID and Product ID // of each device until there is a match or all devices have been examined. if (deviceFound) { memberIndex = 0; do { // *** // API function: // CreateFile // Purpose: // Retrieves a handle to a device. // Accepts: // A device path name returned by SetupDiGetDeviceInterfaceDetail // The type of access requested (read/write). // FILE_SHARE attributes to allow other processes to access the device while this handle is open. // A Security structure or IntPtr.Zero. // A creation disposition value. Use OPEN_EXISTING for devices. // Flags and attributes for files. Not used for devices. // Handle to a template file. Not used. // Returns: a handle without read or write access. // This enables obtaining information about all HIDs, even system // keyboards and mice. // Separate handles are used for reading and writing. // *** hidHandle = FileIO.CreateFile(devicePathName[memberIndex], 0, FileIO.FILE_SHARE_READ | FileIO.FILE_SHARE_WRITE, IntPtr.Zero, FileIO.OPEN_EXISTING, 0, 0); functionName = "CreateFile"; Tracer.Trace(MyDebugging.ResultOfAPICall(functionName)); Tracer.Trace(" Returned handle: " + hidHandle.ToString()); if (!hidHandle.IsInvalid) { // The returned handle is valid, // so find out if this is the device we're looking for. // Set the Size property of DeviceAttributes to the number of bytes in the structure. MyHid.DeviceAttributes.Size = Marshal.SizeOf(MyHid.DeviceAttributes); // *** // API function: // HidD_GetAttributes // Purpose: // Retrieves a HIDD_ATTRIBUTES structure containing the Vendor ID, // Product ID, and Product Version Number for a device. // Accepts: // A handle returned by CreateFile. // A pointer to receive a HIDD_ATTRIBUTES structure. // Returns: // True on success, False on failure. // *** success = Hid.HidD_GetAttributes(hidHandle, ref MyHid.DeviceAttributes); if (success) { Tracer.Trace(" HIDD_ATTRIBUTES structure filled without error."); Tracer.Trace(" Structure size: " + MyHid.DeviceAttributes.Size); Tracer.Trace(" Vendor ID: " + Convert.ToString(MyHid.DeviceAttributes.VendorID, 16)); Tracer.Trace(" Product ID: " + Convert.ToString(MyHid.DeviceAttributes.ProductID, 16)); Tracer.Trace(" Version Number: " + Convert.ToString(MyHid.DeviceAttributes.VersionNumber, 16)); // Find out if the device matches the one we're looking for. if ((MyHid.DeviceAttributes.VendorID == myVendorID) && (MyHid.DeviceAttributes.ProductID == myProductID)) { Tracer.Trace(" My device detected"); // Display the information in form's list box. Tracer.Trace("Device detected:"); Tracer.Trace(" Vendor ID= " + Convert.ToString(MyHid.DeviceAttributes.VendorID, 16)); Tracer.Trace(" Product ID = " + Convert.ToString(MyHid.DeviceAttributes.ProductID, 16)); myDeviceDetected = true; // Save the DevicePathName for OnDeviceChange(). myDevicePathName = devicePathName[memberIndex]; } else { // It's not a match, so close the handle. myDeviceDetected = false; hidHandle.Close(); } } else { // There was a problem in retrieving the information. Tracer.Trace(" Error in filling HIDD_ATTRIBUTES structure."); myDeviceDetected = false; hidHandle.Close(); } } // Keep looking until we find the device or there are no devices left to examine. memberIndex = memberIndex + 1; } while (!((myDeviceDetected || (memberIndex == devicePathName.Length)))); } if (myDeviceDetected) { // The device was detected. // Register to receive notifications if the device is removed or attached. success = MyDeviceManagement.RegisterForDeviceNotifications(myDevicePathName, m_mainForm.Handle, hidGuid, ref deviceNotificationHandle); Tracer.Trace("RegisterForDeviceNotifications = " + success); // Learn the capabilities of the device. MyHid.Capabilities = MyHid.GetDeviceCapabilities(hidHandle); if (success) { // Find out if the device is a system mouse or keyboard. hidUsage = MyHid.GetHidUsage(MyHid.Capabilities); // Get the Input report buffer size. GetInputReportBufferSize(); // Get handles to use in requesting Input and Output reports. readHandle = FileIO.CreateFile(myDevicePathName, FileIO.GENERIC_READ, FileIO.FILE_SHARE_READ | FileIO.FILE_SHARE_WRITE, IntPtr.Zero, FileIO.OPEN_EXISTING, FileIO.FILE_FLAG_OVERLAPPED, 0); functionName = "CreateFile, ReadHandle"; Tracer.Trace(MyDebugging.ResultOfAPICall(functionName)); Tracer.Trace(" Returned handle: " + readHandle.ToString()); if (readHandle.IsInvalid) { exclusiveAccess = true; Tracer.Error("The device is a system " + hidUsage + ". Applications can access Feature reports only."); } else { writeHandle = FileIO.CreateFile(myDevicePathName, FileIO.GENERIC_WRITE, FileIO.FILE_SHARE_READ | FileIO.FILE_SHARE_WRITE, IntPtr.Zero, FileIO.OPEN_EXISTING, 0, 0); functionName = "CreateFile, WriteHandle"; Tracer.Trace(MyDebugging.ResultOfAPICall(functionName)); Tracer.Trace(" Returned handle: " + writeHandle.ToString()); // Flush any waiting reports in the input buffer. (optional) MyHid.FlushQueue(readHandle); } } } else { // The device wasn't detected. Tracer.Error("Device not found."); } return myDeviceDetected; } catch (Exception ex) { Tracer.Error(ex); throw; } }
public String[] FindTheHids() { Boolean deviceFound = false; String[] devicePathName = new String[128]; String functionName = ""; Guid hidGuid = Guid.Empty; Int32 memberIndex = 0; Int16 myProductID = 0; Int16 myVendorID = 0; //Int32 product = 0; //Int32 vendor = 0; Boolean success = false; try { myDeviceDetected = false; //TODO: WTF is going on with this formatting? //vendor = 0xAFEF; //product = 0x0F01; myVendorID = -20497; myProductID = 3841; // *** // API function: 'HidD_GetHidGuid // Purpose: Retrieves the interface class GUID for the HID class. // Accepts: 'A System.Guid object for storing the GUID. // *** Hid.HidD_GetHidGuid(ref hidGuid); functionName = "GetHidGuid"; Debug.WriteLine(MyDebugging.ResultOfAPICall(functionName)); //Console.Out.WriteLine(MyDebugging.ResultOfAPICall(functionName)); Debug.WriteLine(" GUID for system HIDs: " + hidGuid.ToString()); //Console.Out.WriteLine(" GUID for system HIDs: " + hidGuid.ToString()); // Fill an array with the device path names of all attached HIDs. deviceFound = MyDeviceManagement.FindDeviceFromGuid(hidGuid, ref devicePathName); for (int p = 0; p < devicePathName.Length; p++) { Console.Out.WriteLine(devicePathName[p]); } if (deviceFound) { for (int m = 0; m < devicePathName.Length; m++) { hidHandle = FileIO.CreateFile(devicePathName[memberIndex], 0, FileIO.FILE_SHARE_READ | FileIO.FILE_SHARE_WRITE, IntPtr.Zero, FileIO.OPEN_EXISTING, 0, 0); functionName = "CreateFile"; Debug.WriteLine(MyDebugging.ResultOfAPICall(functionName)); if (!hidHandle.IsInvalid) { MyHid.DeviceAttributes.Size = Marshal.SizeOf(MyHid.DeviceAttributes); success = Hid.HidD_GetAttributes(hidHandle, ref MyHid.DeviceAttributes); if (success) { if ((MyHid.DeviceAttributes.VendorID == myVendorID) & (MyHid.DeviceAttributes.ProductID == myProductID)) { Debug.WriteLine(" My device detected"); //Console.Out.WriteLine(" My device detected"); myDeviceDetected = true; // Save the DevicePathName for OnDeviceChange(). myDevicePathName = devicePathName[memberIndex]; } else { // It's not a match, so close the handle. myDeviceDetected = false; hidHandle.Close(); } } else { // There was a problem in retrieving the information. Debug.WriteLine(" Error in filling HIDD_ATTRIBUTES structure."); //Console.Out.WriteLine(" Error in filling HIDD_ATTRIBUTES structure."); myDeviceDetected = false; hidHandle.Close(); } } } if (myDeviceDetected) { MyHid.Capabilities = MyHid.GetDeviceCapabilities(hidHandle); if (success) { // Find out if the device is a system mouse or keyboard. hidUsage = MyHid.GetHidUsage(MyHid.Capabilities); // Get the Input report buffer size. //GetInputReportBufferSize(); //cmdInputReportBufferSize.Enabled = true; // Get handles to use in requesting Input and Output reports. readHandle = FileIO.CreateFile(myDevicePathName, FileIO.GENERIC_READ, FileIO.FILE_SHARE_READ | FileIO.FILE_SHARE_WRITE, IntPtr.Zero, FileIO.OPEN_EXISTING, FileIO.FILE_FLAG_OVERLAPPED, 0); functionName = "CreateFile, ReadHandle"; Debug.WriteLine(MyDebugging.ResultOfAPICall(functionName)); //Console.Out.WriteLine(MyDebugging.ResultOfAPICall(functionName)); Debug.WriteLine(" Returned handle: " + readHandle.ToString()); //Console.Out.WriteLine(" Returned handle: " + readHandle.ToString()); if (readHandle.IsInvalid) { exclusiveAccess = true; //lstResults.Items.Add("The device is a system " + hidUsage + "."); //lstResults.Items.Add("Windows 2000 and Windows XP obtain exclusive access to Input and Output reports for this devices."); //lstResults.Items.Add("Applications can access Feature reports only."); //ScrollToBottomOfListBox(); } else { writeHandle = FileIO.CreateFile(myDevicePathName, FileIO.GENERIC_WRITE, FileIO.FILE_SHARE_READ | FileIO.FILE_SHARE_WRITE, IntPtr.Zero, FileIO.OPEN_EXISTING, 0, 0); functionName = "CreateFile, WriteHandle"; Debug.WriteLine(MyDebugging.ResultOfAPICall(functionName)); //Console.Out.WriteLine(MyDebugging.ResultOfAPICall(functionName)); Debug.WriteLine(" Returned handle: " + writeHandle.ToString()); //Console.Out.WriteLine(" Returned handle: " + writeHandle.ToString()); // Flush any waiting reports in the input buffer. (optional) MyHid.FlushQueue(readHandle); } } else { // The device wasn't detected. //lstResults.Items.Add("Device not found."); //cmdInputReportBufferSize.Enabled = false; //cmdOnce.Enabled = true; Debug.WriteLine(" Device not found."); //Console.Out.WriteLine(" Device not found."); //ScrollToBottomOfListBox(); } //return myDeviceDetected; } } return devicePathName; } catch (Exception ex) { Console.Out.WriteLine(ex.ToString()); throw; } }