From 6dd7902d6f148a4ac78e5478edb3a2ca8624f74c Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周日, 15 3月 2020 16:07:14 +0800
Subject: [PATCH] cpu brand

---
 src/library/os/windows/cpu_info.cpp |   48 ++++++++++++++++++++++++++++++++++++------------
 1 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/src/library/os/windows/cpu_info.cpp b/src/library/os/windows/cpu_info.cpp
index f4b0e81..a58cc6c 100644
--- a/src/library/os/windows/cpu_info.cpp
+++ b/src/library/os/windows/cpu_info.cpp
@@ -15,7 +15,42 @@
 namespace os {
 using namespace std;
 
-CpuInfo::CpuInfo() {}
+static string get_cpu_vendor() {
+	// hypervisor flag false, try to get the vendor name, see if it's a virtual cpu
+	int cpui[4] = {0};
+	__cpuidex(cpui, 0x0, 0x0);
+
+	char vendor[13];
+	memset(vendor, 0, sizeof(vendor));
+	*reinterpret_cast<int *>(vendor) = cpui[1];
+	*reinterpret_cast<int *>(vendor + 4) = cpui[3];
+	*reinterpret_cast<int *>(vendor + 8) = cpui[2];
+	return string(vendor, 12);
+}
+
+static string get_cpu_brand() {
+	int cpui[4] = {0};
+	__cpuid(cpui, 0x80000000);
+	int maxSupported = cpui[0];
+
+	char brand[0x41];
+	memset(brand, 0, sizeof(brand));
+	string result;
+	if (maxSupported >= 0x80000004) {
+		int instruction = 0x80000002;
+		for (int i = 0; i <= 2; ++i) {
+			__cpuidex(cpui, instruction + i, 0);
+			memcpy(&brand[i * sizeof(cpui)], cpui, sizeof(cpui));
+		}
+		result = string(brand);
+	} else {
+		result = "NA";
+	}
+
+	return result;
+}
+
+CpuInfo::CpuInfo() : m_vendor(get_cpu_vendor()), m_brand(get_cpu_brand()) {}
 
 CpuInfo::~CpuInfo() {}
 /**
@@ -38,17 +73,6 @@
 	return (cpui[0] & 0x3FFF) | (cpui[0] & 0x3FF8000) >> 2 | (cpui[1] & 0xff) << 24;
 }
 
-string CpuInfo::vendor() const {
-	// hypervisor flag false, try to get the vendor name, see if it's a virtual cpu
-	int cpui[4] = {0};
-	__cpuidex(cpui, 0x0, 0x0);
 
-	char vendor[13];
-	memset(vendor, 0, sizeof(vendor));
-	*reinterpret_cast<int *>(vendor) = cpui[1];
-	*reinterpret_cast<int *>(vendor +4) = cpui[3];
-	*reinterpret_cast<int *>(vendor + 8) = cpui[2];
-	return string(vendor, 12);
-}
 }  // namespace os
 } /* namespace license */

--
Gitblit v1.9.1