C++ 实现客户端阿里云迁移准备工作

    最近在做客户端往阿里云上迁移,也就是在客户端上要求实现如下功能,判断操作系统是32位还是64位,获取内存大小,获取CPU信息(格式:型号;核数),检测阿里云Virtio驱动是否存在。

    下面附上各个功能模块的C++代码:

1. 判断操作系统是32位还是64位

BOOL IsSystem64()
{
	typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
	LPFN_ISWOW64PROCESS fnIsWow64Process;
	BOOL bIsWow64 = FALSE;
	fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(_T("kernel32")), "IsWow64Process");
	if (NULL != fnIsWow64Process)
	{
		fnIsWow64Process(GetCurrentProcess(), &bIsWow64);
	}
	return bIsWow64;
}

2. 获取内存大小(单位:MB)

要注意的地方是获取内存大小应该使用的API是GlobalMemoryStatusEx,因为对于超过4G内存的机器,GlobalMemoryStatus API就会返回错误的结果。详见MSDN官方说明文档。

而且非常重要的一点:代码中MemoryInfo.dwLengh = sizeof(MemoryInfo)这句初始化不能少,最开始没有写发现获取到的内存大小不对,后来查阅了官方文档的示例程序才发现。

DWORDLONG GetMemoryInfo()
{
	MEMORYSTATUSEX MemoryInfo;
	MemoryInfo.dwLength = sizeof(MemoryInfo);
	GlobalMemoryStatusEx(&MemoryInfo);

	DWORDLONG dwSize = MemoryInfo.ullTotalPhys / (1024 * 1024);
	return dwSize;
}

3. 获取CPU信息

CPU型号的信息在注册表中就可以查看到,核心数可以通过GetSystemInfo 这个API获取到


代码如下:

DWORD QueryRegKey(string KeyName,string ValueName,void *pValue,int Length)
{
	CRegKey *pRegKey = new CRegKey();
	ULONG nChars = 0;
	DWORD ret = 0;

	if(pRegKey->Open(HKEY_LOCAL_MACHINE,KeyName.c_str())!= ERROR_SUCCESS)
	{
		delete pRegKey;
		return EXIT_FAILURE;
	}
	
	nChars = Length;
	ret = pRegKey->QueryStringValue(ValueName.c_str(),(char *)pValue,&nChars);
		
	pRegKey->Close();
	delete pRegKey;
	return ret;
}

string GetCpuInfo()
{
	DWORD dwNum;
	char cpuInfo[128];
	memset(cpuInfo, 0, sizeof(cpuInfo));
	QueryRegKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", "ProcessorNameString", cpuInfo, sizeof(cpuInfo));

	SYSTEM_INFO si;
	memset(&si, 0, sizeof(SYSTEM_INFO));
	GetSystemInfo(&si);
	dwNum = si.dwNumberOfProcessors;
	sprintf(cpuInfo, "%s; %d %s", cpuInfo, dwNum, "cores");
	return cpuInfo;
}

4. 检测驱动:

主要是检测相应的注册表键值有没有被创建,drivers目录下有没有相应的sys文件。

然后传入相应的参数,判断balloon,netkvm,vioser,viostor,pvpanic这5个驱动是否正确安装

代码如下:

bool FindDriverReg(string target)
{
	bool flag = true;
	CRegKey *pRegKey = new CRegKey();
	string path = "SYSTEM\\CurrentControlSet\\Services\\";
	path = path + target;
	if (pRegKey->Open(HKEY_LOCAL_MACHINE, path.c_str()) != ERROR_SUCCESS)
		flag = false;
	delete pRegKey;
	return flag;
}

bool FindDriverFile(string fileName)
{
	bool flag = true;
	string path = "C:\\Windows\\System32\\drivers\\";
	path = path + fileName;
	WIN32_FIND_DATA pData;
	HANDLE hFile = FindFirstFile(path.c_str(), &pData);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		flag = false;
	}
	FindClose(hFile);
	return flag;
}


猜你喜欢

转载自blog.csdn.net/u010281829/article/details/80499541