From 36ce07093b68b07513149577c209ae7a57ab356b Mon Sep 17 00:00:00 2001
From: Gabriele Contini <contini.mailing@gmail.com>
Date: 周日, 15 3月 2020 16:26:21 +0800
Subject: [PATCH] Merge branch 'feature/pc_identifiers' into develop issues #2 #3 #14 #49

---
 src/library/os/windows/cpu_info.cpp |   78 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 78 insertions(+), 0 deletions(-)

diff --git a/src/library/os/windows/cpu_info.cpp b/src/library/os/windows/cpu_info.cpp
new file mode 100644
index 0000000..a58cc6c
--- /dev/null
+++ b/src/library/os/windows/cpu_info.cpp
@@ -0,0 +1,78 @@
+/*
+ * cpu_info.cpp
+ *
+ *  Created on: Dec 14, 2019
+ *      Author: devel
+ */
+
+
+#include <intrin.h>
+#include <string>
+#include <unordered_set>
+#include "../cpu_info.hpp"
+
+namespace license {
+namespace os {
+using namespace std;
+
+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() {}
+/**
+ * Detect Virtual machine using hypervisor bit.
+ * @return true if the cpu hypervisor bit is set to 1
+ */
+bool CpuInfo::is_hypervisor_set() const {
+	int cpui[4] = {0};
+	__cpuid(cpui, 0x1);
+
+	return ((cpui[2] >> 31) & 1);
+}
+
+uint32_t CpuInfo::model() const {
+	int cpui[4] = {0};
+	__cpuid(cpui, 0x1);
+	// ax bits 0-3 stepping,4-7 model,8-11 family id,12-13 processor type
+	//        14-15 reserved, 16-19 extended model, 20-27 extended family, 27-31 reserved
+	// bx bits 0-7 brand index
+	return (cpui[0] & 0x3FFF) | (cpui[0] & 0x3FF8000) >> 2 | (cpui[1] & 0xff) << 24;
+}
+
+
+}  // namespace os
+} /* namespace license */

--
Gitblit v1.9.1