From c8f8e0c1f0a3687539a92169735845814e18c187 Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周六, 31 10月 2020 10:15:16 +0800
Subject: [PATCH] read dmi information segfault on windows

---
 src/library/os/windows/cpu_info.cpp |   45 ++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 38 insertions(+), 7 deletions(-)

diff --git a/src/library/os/windows/cpu_info.cpp b/src/library/os/windows/cpu_info.cpp
index 764b2fe..a58cc6c 100644
--- a/src/library/os/windows/cpu_info.cpp
+++ b/src/library/os/windows/cpu_info.cpp
@@ -12,9 +12,45 @@
 #include "../cpu_info.hpp"
 
 namespace license {
+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() {}
 /**
@@ -37,11 +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};
-	__cpuid(cpui, 0x0);
-	return string(reinterpret_cast<const char *>(cpui), 12);
-}
 
+}  // namespace os
 } /* namespace license */

--
Gitblit v1.9.1