void IOKitEventPublisher::newEvent(const io_service_t& device, IOKitEventContext::Action action) { auto ec = createEventContext(); ec->action = action; { // The IORegistry name is not needed. io_name_t class_name = {0}; if (IOObjectGetClass(device, class_name) != kIOReturnSuccess) { return; } ec->type = std::string(class_name); } // Get the device details CFMutableDictionaryRef details; IORegistryEntryCreateCFProperties( device, &details, kCFAllocatorDefault, kNilOptions); if (ec->type == kIOUSBDeviceClassName_) { ec->path = getIOKitProperty(details, "USB Address") + ":"; ec->path += getIOKitProperty(details, "PortNum"); ec->model = getIOKitProperty(details, "USB Product Name"); ec->model_id = getIOKitProperty(details, "idProduct"); ec->vendor = getIOKitProperty(details, "USB Vendor Name"); ec->vendor_id = getIOKitProperty(details, "idVendor"); idToHex(ec->vendor_id); idToHex(ec->model_id); ec->serial = getIOKitProperty(details, "USB Serial Number"); if (ec->serial.size() == 0) { ec->serial = getIOKitProperty(details, "iSerialNumber"); } ec->version = ""; ec->driver = getIOKitProperty(details, "IOUserClientClass"); } else if (ec->type == kIOPCIDeviceClassName_) { auto compatible = getIOKitProperty(details, "compatible"); auto properties = IOKitPCIProperties(compatible); ec->model_id = properties.model_id; ec->vendor_id = properties.vendor_id; ec->driver = properties.driver; if (ec->driver.empty()) { ec->driver = getIOKitProperty(details, "IOName"); } ec->path = getIOKitProperty(details, "pcidebug"); ec->version = getIOKitProperty(details, "revision-id"); ec->model = getIOKitProperty(details, "model"); } else { // Get the name as the model. io_name_t name = {0}; IORegistryEntryGetName(device, name); if (name[0] != 0) { ec->model = std::string(name); } } CFRelease(details); fire(ec); }
void genPCIDevice(const io_service_t& device, QueryData& results) { Row r; // Get the device details CFMutableDictionaryRef details; IORegistryEntryCreateCFProperties( device, &details, kCFAllocatorDefault, kNilOptions); r["pci_slot"] = getIOKitProperty(details, "pcidebug"); auto compatible = getIOKitProperty(details, "compatible"); auto properties = IOKitPCIProperties(compatible); r["vendor_id"] = properties.vendor_id; r["model_id"] = properties.model_id; r["pci_class"] = properties.pci_class; r["driver"] = properties.driver; results.push_back(r); CFRelease(details); }