Browse Source

VM-Detection implementiert

Rind 3 years ago
parent
commit
dd0781dd96
5 changed files with 59 additions and 6 deletions
  1. 4 1
      README.md
  2. 1 1
      gfaipc.pro
  3. 2 1
      src/gfaipc.h
  4. 51 3
      src/sysinfo.cpp
  5. 1 0
      src/sysinfo.h

+ 4 - 1
README.md

@@ -1,7 +1,7 @@
 ## libgfaipc  
 ## libgfaipc  
 
 
 ***Version:***  
 ***Version:***  
-libgfaipc.so.1.5.0  
+libgfaipc.so.1.6.0  
 
 
 ***SO-Name:***  
 ***SO-Name:***  
 libgfaipc.so.1
 libgfaipc.so.1
@@ -51,3 +51,6 @@ gfa/shm.h, gfa/mutex.h, gfa/sema.h, gfa/procmem.h, gfa/thread.h
 
 
 * **1.5.0**<br>
 * **1.5.0**<br>
 	Tiva-Erkennung implementiert. (gfasysinfo in ein eigenes Projekt verschoben.)
 	Tiva-Erkennung implementiert. (gfasysinfo in ein eigenes Projekt verschoben.)
+
+* **1.6.0**<br>
+	VM-Erkennung implementiert.

+ 1 - 1
gfaipc.pro

@@ -1,5 +1,5 @@
 TEMPLATE = lib
 TEMPLATE = lib
-VERSION = 1.5
+VERSION = 1.6
 CONFIG -= qt app_bundle
 CONFIG -= qt app_bundle
 CONFIG += c++11 shared thread
 CONFIG += c++11 shared thread
 
 

+ 2 - 1
src/gfaipc.h

@@ -45,7 +45,8 @@ typedef enum
 	GTT_GfATargetWithTiva
 	GTT_GfATargetWithTiva
 }GfATargetTypes;
 }GfATargetTypes;
 
 
-GfATargetTypes GfAIpcGetTargetType(char *pszTargetType, size_t nCChTargetType);
+GfATargetTypes	GfAIpcGetTargetType(char *pszTargetType, size_t nCChTargetType);
+bool			GfAIpcSystemIsHypervised(void);
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////

+ 51 - 3
src/sysinfo.cpp

@@ -41,6 +41,8 @@
 
 
 #define _BASEBOARD_PATH						"/tmp/BASEBOARD"
 #define _BASEBOARD_PATH						"/tmp/BASEBOARD"
 #define _DISPLAY_SIG_TIVA					"DISPLAY001"
 #define _DISPLAY_SIG_TIVA					"DISPLAY001"
+#define _CPUINFO_PATH						"/proc/cpuinfo"
+#define _VM_TAG								"hypervisor"
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
@@ -109,12 +111,12 @@ CSysInfo::~CSysInfo(void)
 
 
 static const char* _FileToStdString(const char *pszFilepath, std::string &str)
 static const char* _FileToStdString(const char *pszFilepath, std::string &str)
 {
 {
-	std::ifstream fBoot(pszFilepath);
+	std::ifstream ifs(pszFilepath);
 	str.clear();
 	str.clear();
 
 
-	if(fBoot.good())
+	if(ifs.good())
 	{
 	{
-		str.assign((std::istreambuf_iterator<char>(fBoot)), std::istreambuf_iterator<char>());
+		str.assign((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
 		return str.c_str();
 		return str.c_str();
 	}
 	}
 
 
@@ -201,6 +203,47 @@ GfATargetTypes CSysInfo::GetTargetType(char *pszTargetType, size_t nCChTargetTyp
 	return tt;
 	return tt;
 }
 }
 
 
+/////////////////////////////////////////////////////////////////////////////
+
+bool CSysInfo::IsHypervised(void)
+{
+	std::string sCpuInfo;
+	if(_FileToStdString(_CPUINFO_PATH, sCpuInfo))
+	{
+		size_t nPos = sCpuInfo.find("\nflags\t\t:");
+		
+		if(nPos != std::string::npos)
+		{
+			const char *pszStart = sCpuInfo.c_str() + nPos + 9;
+			const char *pszEnd = strchrnul(pszStart, '\n');
+			std::string sFlags(pszStart, pszEnd);
+	
+			if((nPos = sFlags.find(_VM_TAG)) != std::string::npos)
+			{
+				const char *pszStart2 = &sFlags[nPos];
+				const char *pszEnd2 = pszStart2 + 10;
+				
+				if(pszStart2 > pszStart)
+				{
+					if(isalnum((uint8_t)*(pszStart2 - 1)))
+						return false;
+				}
+				
+				if(pszEnd2 < pszEnd)
+				{
+					if(isalnum((uint8_t)*pszEnd2))
+						return false;
+				}
+				
+				return true;
+			}
+			//
+		}
+	}
+	
+	return false;
+}
+
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 // https://github.com/torvalds/linux/blob/master/Documentation/filesystems/proc.rst
 // https://github.com/torvalds/linux/blob/master/Documentation/filesystems/proc.rst
 
 
@@ -279,3 +322,8 @@ extern "C" GfATargetTypes GfAIpcGetTargetType(char *pszTargetType, size_t nCChTa
 {
 {
 	return CSysInfo::GetTargetType(pszTargetType, nCChTargetType);
 	return CSysInfo::GetTargetType(pszTargetType, nCChTargetType);
 }
 }
+
+extern "C" bool GfAIpcSystemIsHypervised(void)
+{
+	return CSysInfo::IsHypervised();
+}

+ 1 - 0
src/sysinfo.h

@@ -41,6 +41,7 @@ public:
 	bool GetBootInfo(bool &bootFromEMMC);
 	bool GetBootInfo(bool &bootFromEMMC);
 	bool Update(void);
 	bool Update(void);
 	static GfATargetTypes GetTargetType(char *pszTargetType, size_t nCChTargetType);
 	static GfATargetTypes GetTargetType(char *pszTargetType, size_t nCChTargetType);
+	static bool IsHypervised(void);
 
 
 	const SI_VAL& MemTotal(void) const {
 	const SI_VAL& MemTotal(void) const {
 		return m_memInfo.MemTotal;
 		return m_memInfo.MemTotal;