void genSMBIOSMemoryDevices(size_t index, const SMBStructHeader* hdr, uint8_t* address, size_t size, QueryData& results) { if (hdr->type != kSMBIOSTypeMemoryDevice || size < 0x12) { return; } Row r; r["handle"] = dmiWordToHexStr(address, 0x02); r["array_handle"] = dmiWordToHexStr(address, 0x04); auto formFactor = kSMBIOSMemoryFormFactorTable.find(address[0x0E]); if (formFactor != kSMBIOSMemoryFormFactorTable.end()) { r["form_factor"] = formFactor->second; } auto memBits = dmiToWord(address, 0x08); if (memBits != 0xFFFF) { r["total_width"] = INTEGER(memBits); } memBits = dmiToWord(address, 0x0A); if (memBits != 0xFFFF) { r["data_width"] = INTEGER(memBits); } memBits = dmiToWord(address, 0x0C); if (memBits != 0xFFFF) { r["size"] = (memBits != 0x7FFF) ? INTEGER(memBits) : INTEGER(dmiToDWord(address, 0x1C)); } if (address[0x0F] != 0xFF) { r["set"] = INTEGER(static_cast<int>(address[0x0F])); } uint8_t* data = address + hdr->length; r["device_locator"] = dmiString(data, address, 0x10); r["bank_locator"] = dmiString(data, address, 0x11); auto memoryType = kSMBIOSMemoryTypeTable.find(address[0x12]); if (memoryType != kSMBIOSMemoryTypeTable.end()) { r["memory_type"] = memoryType->second; } r["memory_type_details"] = dmiBitFieldToStr(dmiToWord(address, 0x13), kSMBIOSMemoryDetailsTable); auto speed = dmiToWord(address, 0x15); if (speed != 0x0000 && speed != 0xFFFF) { r["max_speed"] = INTEGER(speed); } speed = dmiToWord(address, 0x20); if (speed != 0x0000 && speed != 0xFFFF) { r["configured_clock_speed"] = INTEGER(speed); } r["manufacturer"] = dmiString(data, address, 0x17); r["serial_number"] = dmiString(data, address, 0x18); r["asset_tag"] = dmiString(data, address, 0x19); r["part_number"] = dmiString(data, address, 0x1A); auto vt = dmiToWord(address, 0x22); if (vt != 0) { r["min_voltage"] = INTEGER(vt); } vt = dmiToWord(address, 0x24); if (vt != 0) { r["max_voltage"] = INTEGER(vt); } vt = dmiToWord(address, 0x26); if (vt != 0) { r["configured_voltage"] = INTEGER(vt); } results.push_back(std::move(r)); }
QueryData genSystemInfo(QueryContext& context) { Row r; r["hostname"] = osquery::getHostname(); r["computer_name"] = r["hostname"]; std::string uuid; r["uuid"] = (osquery::getHostUUID(uuid)) ? uuid : ""; auto qd = SQL::selectAllFrom("cpuid"); for (const auto& row : qd) { if (row.at("feature") == "product_name") { r["cpu_brand"] = row.at("value"); boost::trim(r["cpu_brand"]); } } // Can parse /proc/cpuinfo or /proc/meminfo for this data. static long cores = sysconf(_SC_NPROCESSORS_CONF); if (cores > 0) { r["cpu_logical_cores"] = INTEGER(cores); r["cpu_physical_cores"] = INTEGER(cores); } else { r["cpu_logical_cores"] = "-1"; r["cpu_physical_cores"] = "-1"; } static long pages = sysconf(_SC_PHYS_PAGES); static long pagesize = sysconf(_SC_PAGESIZE); if (pages > 0 && pagesize > 0) { r["physical_memory"] = BIGINT((long long)pages * (long long)pagesize); } else { r["physical_memory"] = "-1"; } r["cpu_type"] = "0"; r["cpu_subtype"] = "0"; // Read the types from CPU info within proc. std::string content; if (readFile("/proc/cpuinfo", content)) { for (const auto& line : osquery::split(content, "\n")) { // Iterate each line and look for labels (there is also a model type). if (line.find("cpu family") == 0 || line.find("model\t") == 0) { auto details = osquery::split(line, ":"); if (details.size() == 2) { // Not the most elegant but prevents us from splitting each line. r[(line[0] == 'c') ? "cpu_type" : "cpu_subtype"] = details[1]; } } } } { LinuxSMBIOSParser parser; if (!parser.discover()) { r["hardware_model"] = ""; } else { parser.tables(([&r](size_t index, const SMBStructHeader* hdr, uint8_t* address, size_t size) { if (hdr->type != kSMBIOSTypeSystem || size < 0x12) { return; } uint8_t* data = address + hdr->length; r["hardware_vendor"] = dmiString(data, address, 0x04); r["hardware_model"] = dmiString(data, address, 0x05); r["hardware_version"] = dmiString(data, address, 0x06); r["hardware_serial"] = dmiString(data, address, 0x07); })); } } return {r}; }