Не знаю, правильно ли это вообще, но это сборка с Swift 3 и Xcode 8.0. Ключ был в том, чтобы написать var deviceInterfaceVoidPtr: UnsafeMutableRawPointer? = nil
.
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
func ptrFromAddress<T>(_ p: UnsafeMutablePointer<T>) -> UnsafeMutablePointer<T> {
return p
}
var myInterface:IOCFPlugInInterface = IOCFPlugInInterface()
var plugInInterfacePtr: UnsafeMutablePointer<IOCFPlugInInterface>? = ptrFromAddress(&myInterface)
var plugInInterfacePtrPtr: UnsafeMutablePointer<UnsafeMutablePointer<IOCFPlugInInterface>?>? = ptrFromAddress(&plugInInterfacePtr)
// From: CFPlugInCOM.h: public typealias LPVOID = UnsafeMutablePointer<Void>()
var deviceInterfaceVoidPtr: UnsafeMutableRawPointer? = nil
// 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](repeating: 0, count: 128)
let deviceNameResult = IORegistryEntryGetName(usbDevice, &deviceNameCString)
if deviceNameResult != kIOReturnSuccess {
print("Error getting device name")
exit(EXIT_FAILURE)
}
let deviceName = String(cString: &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!.pointee!.pointee
// 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 opaquePtr = OpaquePointer(deviceInterfaceVoidPtr!)
let deviceInterface = UnsafeMutablePointer<IOUSBDeviceInterface>(opaquePtr).pointee
// 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)
Кроме того, обратите внимание, что, согласно основному комментарию от cellininicholas, вы должны удалить одно из двух вхождений
usbDevice = IOIteratorNext(usbIterator)
person
Cœur
schedule
08.12.2016
let deviceInterfaceResult:HRESULT = {(_: plugInInterfacePtrPtr, _: CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), _: &deviceInterfaceVoidPtr) -> HRESULT in }()
не работает - person Arti   schedule 08.12.2016