Created
December 15, 2015 16:29
-
-
Save zachbadgett/471d72e83fee413d0f38 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import IOKit | |
import IOKit.usb | |
import IOKit.usb.IOUSBLib | |
print("Scanning USB Bus.....\n\n\n") | |
// | |
// These constants are not imported into Swift from IOUSBLib.h as they | |
// are all #define constants | |
// | |
let kIOUSBDeviceUserClientTypeID: CFUUID = CFUUIDGetConstantUUIDWithBytes(kCFAllocatorDefault, | |
0x9d, 0xc7, 0xb7, 0x80, 0x9e, 0xc0, 0x11, 0xD4, | |
0xa5, 0x4f, 0x00, 0x0a, 0x27, 0x05, 0x28, 0x61) | |
let kIOCFPlugInInterfaceID: CFUUID = CFUUIDGetConstantUUIDWithBytes(kCFAllocatorDefault, | |
0xC2, 0x44, 0xE8, 0x58, 0x10, 0x9C, 0x11, 0xD4, | |
0x91, 0xD4, 0x00, 0x50, 0xE4, 0xC6, 0x42, 0x6F) | |
let kIOUSBDeviceInterfaceID: CFUUID = CFUUIDGetConstantUUIDWithBytes(kCFAllocatorDefault, | |
0x5c, 0x81, 0x87, 0xd0, 0x9e, 0xf3, 0x11, 0xD4, | |
0x8b, 0x45, 0x00, 0x0a, 0x27, 0x05, 0x28, 0x61) | |
var usbIterator: io_iterator_t = io_iterator_t() | |
var usbDevice: io_service_t = io_service_t() | |
var usbVendorID: UInt16 = 0 | |
var score: Int32 = 0 | |
var plugInInterfacePtrPtr = UnsafeMutablePointer<UnsafeMutablePointer<IOCFPlugInInterface>>() | |
// From: CFPlugInCOM.h: public typealias LPVOID = UnsafeMutablePointer<Void>() | |
var deviceInterfaceVoidPtr = UnsafeMutablePointer<Void>() | |
// create dictionary with IOUSBDevice as IOProviderClass | |
let matchingDictionary: NSMutableDictionary = IOServiceMatching(kIOUSBDeviceClassName) | |
// get iterator for matching USB devices | |
let matchingServicesResult = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDictionary, &usbIterator) | |
if (matchingServicesResult != kIOReturnSuccess) { | |
print("Error getting deviceList!") | |
exit(EXIT_FAILURE) | |
} | |
// usbDevice = 0 when finished iterating all devices | |
repeat { | |
usbDevice = IOIteratorNext(usbIterator) | |
// io_name_t imports to swift as a tuple (Int8, ..., Int8) 128 ints | |
// although in device_types.h it's defined: | |
// typedef char io_name_t[128]; | |
var deviceNameCString: [CChar] = [CChar](count: 128, repeatedValue: 0) | |
let deviceNameResult = IORegistryEntryGetName(usbDevice, &deviceNameCString) | |
if(deviceNameResult != kIOReturnSuccess) { | |
print("Error getting device name") | |
exit(EXIT_FAILURE) | |
} | |
let deviceName = String.fromCString(&deviceNameCString)! | |
print("usb Device Name: \(deviceName)") | |
// Get plugInInterface for current USB device | |
let plugInInterfaceResult = IOCreatePlugInInterfaceForService( | |
usbDevice, | |
kIOUSBDeviceUserClientTypeID, | |
kIOCFPlugInInterfaceID, | |
&plugInInterfacePtrPtr, | |
&score) | |
if ( (plugInInterfacePtrPtr == nil) || (plugInInterfaceResult != kIOReturnSuccess)) { | |
print("Unable to get Plug-In Interface") | |
continue | |
} | |
// dereference pointer for the plug in interface | |
let plugInInterface: IOCFPlugInInterface = plugInInterfacePtrPtr.memory.memory | |
// use plug in interface to get a device interface | |
// public var QueryInterface: (@convention(c) (UnsafeMutablePointer<Void>, REFIID, UnsafeMutablePointer<LPVOID>) -> HRESULT)! | |
let deviceInterfaceResult = plugInInterface.QueryInterface( | |
plugInInterfacePtrPtr, | |
CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), | |
&deviceInterfaceVoidPtr) | |
if( (deviceInterfaceResult != kIOReturnSuccess) || (deviceInterfaceVoidPtr == nil) ) { | |
print("Unable to get Device Interface") | |
exit(EXIT_FAILURE) | |
} | |
// dereference the IOUSBDeviceInterface struct from pointer var after | |
// converting from a void to a IOUSBDeviceInterface pointer | |
let deviceInterface = (UnsafeMutablePointer<IOUSBDeviceInterface>(deviceInterfaceVoidPtr)).memory | |
// get USB Vendor ID --> CRASH | |
let vendorResult = deviceInterface.GetDeviceVendor(deviceInterfaceVoidPtr, &usbVendorID) | |
if(vendorResult != kIOReturnSuccess) { | |
print("Unable to get Device Vendor ID") | |
exit(EXIT_FAILURE) | |
} | |
print("usb Vendor ID: \(usbVendorID)") | |
usbDevice = IOIteratorNext(usbIterator) | |
} while (usbDevice != 0); | |
exit(EXIT_SUCCESS) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
the VIDPID command is not recognized.