#include "..\include_eapi_header.h"#include <map>#include <functional>#include <algorithm>//想了一下还是选择使用cpu指令来获取如果有特殊需求可以更换为com获取,代码依然提供#include<intrin.h>//主频//inline int GetCpuTime()//{// LARGE_INTEGER nFreq = {}, nCtrStop = {}, nCtrStart = {};// QueryPerformanceFrequency(&nFreq);// QueryPerformanceCounter(&nCtrStop);// nCtrStop.QuadPart += nFreq.QuadPart;// DWORD64 cuStart = __rdtsc();// do {// QueryPerformanceCounter(&nCtrStart);// } while (nCtrStart.QuadPart < nCtrStop.QuadPart);// //最后取整// return static_cast<int>((__rdtsc() - cuStart) / 1000000);//}//效率优先,选择第二个,cpu各种信息毫秒级inline int GetCpuTime(){DWORD dwCPU = 0;HKEY hKey;DWORD dwSpeed;// Get the key namestd::string szKey = "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\" + std::to_string(dwCPU) + "\\";;std::wstring szKeyW = std::wstring(szKey.begin(), szKey.end());// Open the keyif (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyW.c_str(), 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS){return 0;}// Read the valueDWORD dwLen = 4;if (RegQueryValueEx(hKey, L"~MHz", nullptr, nullptr, LPBYTE(&dwSpeed), &dwLen) != ERROR_SUCCESS){RegCloseKey(hKey);return 0;}// Cleanup and returnRegCloseKey(hKey);return dwSpeed;}//数据宽度inline int GetDataWidth(){int cpuid[4] = {};__cpuid(cpuid, 1);int result = 0;if (cpuid[3] & (1 << 28)) {result = 64;}else {result = 32;}return result;}//制造商inline char* GetCPUcomp(){char vendor[13];int cpu_info[4];memset(vendor, 0, sizeof(vendor));memset(cpu_info, 0, sizeof(cpu_info));__cpuid(cpu_info, 0);*reinterpret_cast<int*>(vendor) = cpu_info[1];*reinterpret_cast<int*>(vendor + 4) = cpu_info[3];*reinterpret_cast<int*>(vendor + 8) = cpu_info[2];std::map<std::string_view, const char*> manufacturers = {{"GenuineIntel", "Intel Corporation."},{"AuthenticAMD", "Advanced Micro Devices."},{"AMD ISBETTER", "Advanced Micro Devices."},{"Geode By NSC", "National Semiconductor."},{"CyrixInstead", "Cyrix Corp., VIA Inc."},{"NexGenDriven", "NexGen Inc., Advanced Micro Devices."},{"CentaurHauls", "IDT\\Centaur, Via Inc."},{"UMC UMC UMC ", "United Microelectronics Corp."},{"RiseRiseRise", "Rise."},{"GenuineTMx86", "Transmeta."},{"TransmetaCPU", "Transmeta."}};return CloneTextData(manufacturers.find(vendor) != manufacturers.end() ? manufacturers[vendor] : "Unknown Manufacturer.");}//序列号inline char* GetCpuID(){int cpuid[4]{ 0 };char cpuid_buf[17]{ 0 };__cpuid(cpuid, 1);sprintf_s(cpuid_buf, "%08X%08X", cpuid[3], cpuid[0]);return CloneTextData(cpuid_buf);}//多级缓存inline void GetCacheSize(long long* n_l1_cache_Size, long long* n_l2_cache_Size, long long* n_l3_cache_Size){DWORD bytes = 0;GetLogicalProcessorInformation(0, &bytes);size_t size = bytes / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);std::vector<SYSTEM_LOGICAL_PROCESSOR_INFORMATION> info(size);GetLogicalProcessorInformation(info.data(), &bytes);long long l1_cache_Size = 0, l2_cache_Size = 0, l3_cache_Size = 0;for (size_t i = 0; i < size; i++){if (info[i].Relationship == RelationCache){if (info[i].Cache.Level == 1)l1_cache_Size += info[i].Cache.Size;if (info[i].Cache.Level == 2)l2_cache_Size += info[i].Cache.Size;if (info[i].Cache.Level == 3)l3_cache_Size += info[i].Cache.Size;}}if (n_l1_cache_Size){*n_l1_cache_Size = l1_cache_Size / 1024;}if (n_l2_cache_Size){*n_l2_cache_Size = l2_cache_Size / 1024;}if (n_l3_cache_Size){*n_l3_cache_Size = l3_cache_Size / 1024;}}//名称inline char* GetCpuName(){char name[49]{ 0 };int cpu_info[4]{ 0 };__cpuid(cpu_info, 0x80000000);if (cpu_info[0] < 0x80000004){return CloneTextData("Unknown CPU");}int nExIds = cpu_info[0];for (int i = 0x80000000; i <= nExIds; ++i){memset(cpu_info, 0, sizeof(cpu_info));__cpuid(cpu_info, i);if (i == 0x80000002){memcpy(name, cpu_info, sizeof(cpu_info));}else if (i == 0x80000003){memcpy(name + 16, cpu_info, sizeof(cpu_info));}else if (i == 0x80000004){memcpy(name + 32, cpu_info, sizeof(cpu_info));break;}}return CloneTextData(name);}//核心数inline int GetCoreNum() {int cores = 0;DWORD bufferSize = 0;GetLogicalProcessorInformation(NULL, &bufferSize);SYSTEM_LOGICAL_PROCESSOR_INFORMATION* buffer = new SYSTEM_LOGICAL_PROCESSOR_INFORMATION[bufferSize / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)];GetLogicalProcessorInformation(buffer, &bufferSize);int count = bufferSize / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);for (int i = 0; i != count; ++i) {if (buffer[i].Relationship == RelationProcessorCore) {cores++;}}delete[]buffer;return cores;}//核心线程数inline int GetThreads() {SYSTEM_INFO sysInfo;GetSystemInfo(&sysInfo);return sysInfo.dwNumberOfProcessors;}//描述inline char* GetDescription(){//获取架构const char* cpu_ = "unknown";int CPUInfo[4];__cpuid(CPUInfo, 0);int vendor[3] = { CPUInfo[1], CPUInfo[3], CPUInfo[2] };if (vendor[0] == 0x756e6547 && vendor[1] == 0x49656e69 && vendor[2] == 0x6c65746e) {cpu_ = "Intel";__cpuid(CPUInfo, 0x80000000);if (CPUInfo[0] >= 0x80000000) {__cpuid(CPUInfo, 0x80000001);if (CPUInfo[3] & (1 << 29)) {cpu_ = "Intel64";}else {cpu_ = "Intelx86";}}}else if (vendor[0] == 0x68747541 && vendor[1] == 0x69746e65 && vendor[2] == 0x444d4163) {cpu_ = "AMD";__cpuid(CPUInfo, 0x80000000);if (CPUInfo[0] >= 0x80000000) {__cpuid(CPUInfo, 0x80000001);if (CPUInfo[3] & (1 << 31)) {cpu_ = "AMD64";}else {cpu_ = "AMDx86";}}}//获取Stepping,ModelID和FamilyIDint cpuid[4] = {};char cpu_desc[50] = {};__cpuid(cpuid, 1);int FamilyID = ((cpuid[0] >> 8) & 0xF) + ((cpuid[0] >> 20) & 0xFF);int ModelID = ((cpuid[0] >> 4) & 0xF) + ((cpuid[0] >> 12) & 0xF0);int SteppingCode = cpuid[0] & 0xF;sprintf_s(cpu_desc, "%s Family %d Model %d Stepping %d", cpu_, FamilyID, ModelID, SteppingCode);return CloneTextData(cpu_desc);}typedef struct CPUINFO{char* m_Vendor;char* m_name;//单位:MHz。int m_hz;char* m_Description;long long m_L1;long long m_L2;char* m_ID;//CPU位宽单位:位。int m_Bit;long long m_L3;int m_cores;int m_threadcount;CPUINFO() {memset(this, 0, sizeof(*this));}}*PCPUINFO;//#include <iphlpapi.h>//#include <Wbemidl.h>//#include <comdef.h>//#pragma comment(lib, "wbemuuid.lib")////inline void GetCacheSize(long long* n_l1_cache_Size)//{// DWORD bytes = 0;// GetLogicalProcessorInformation(0, &bytes);// size_t size = bytes / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);// std::vector<SYSTEM_LOGICAL_PROCESSOR_INFORMATION> info(size);// GetLogicalProcessorInformation(info.data(), &bytes);// long long l1_cache_Size = 0;// for (size_t i = 0; i < size; i++)// {// if (info[i].Relationship == RelationCache)// {// if (info[i].Cache.Level == 1)// l1_cache_Size += info[i].Cache.Size;// }// }// if (n_l1_cache_Size)// {// *n_l1_cache_Size = l1_cache_Size / 1024;// }//}//static bool GetCpuInfo(PCPUINFO pCpuinfo)//{// std::map<std::wstring_view, const char*> manufacturers = {// {L"GenuineIntel", "Intel Corporation."},// {L"AuthenticAMD", "Advanced Micro Devices."},// {L"AMD ISBETTER", "Advanced Micro Devices."},// {L"Geode By NSC", "National Semiconductor."},// {L"CyrixInstead", "Cyrix Corp., VIA Inc."},// {L"NexGenDriven", "NexGen Inc., Advanced Micro Devices."},// {L"CentaurHauls", "IDT\\Centaur, Via Inc."},// {L"UMC UMC UMC ", "United Microelectronics Corp."},// {L"RiseRiseRise", "Rise."},// {L"GenuineTMx86", "Transmeta."},// {L"TransmetaCPU", "Transmeta."}// };// IWbemServices* pSvc = NULL;// IWbemLocator* pLoc = NULL;// IEnumWbemClassObject* pEnumerator = NULL;// HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);// if (FAILED(hr))// {// return false;// }//// hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);// if (FAILED(hr))// {// CoUninitialize();// return false;// }//// hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);// if (FAILED(hr) || !pLoc)// {// CoUninitialize();// return false;// }//// hr = pLoc->ConnectServer(_bstr_t((L"ROOT\\CIMV2")), NULL, NULL, NULL, 0, NULL, NULL, &pSvc);// if (FAILED(hr) || !pSvc)// {// pLoc->Release();// CoUninitialize();// return false;// }//// hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);// if (FAILED(hr))// {// pSvc->Release();// pLoc->Release();// CoUninitialize();// return false;// }// BSTR strQuery = bstr_t((L"SELECT * FROM Win32_Processor"));// hr = pSvc->ExecQuery(bstr_t((L"WQL")), strQuery, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);// if (FAILED(hr) || !pEnumerator)// {// pSvc->Release();// pLoc->Release();// CoUninitialize();// return false;// }// IWbemClassObject* pclsObj = NULL;// while (pEnumerator)// {// ULONG uReturn = 0;// hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);// if (0 == uReturn)// break;// VARIANT vtProp = { 0 };// //序列号// hr = pclsObj->Get(L"ProcessorId", 0, &vtProp, 0, 0);// pCpuinfo->m_ID = clone_text(vtProp.bstrVal);// VariantClear(&vtProp);// //名称// hr = pclsObj->Get(L"name", 0, &vtProp, 0, 0);// pCpuinfo->m_name = clone_text(vtProp.bstrVal);// VariantClear(&vtProp);// //制造商// hr = pclsObj->Get(L"Manufacturer", 0, &vtProp, 0, 0);// pCpuinfo->m_Vendor = CloneTextData(manufacturers.find(vtProp.bstrVal) != manufacturers.end() ? manufacturers[vtProp.bstrVal] : "Unknown Manufacturer.");// VariantClear(&vtProp);// //描述// hr = pclsObj->Get(L"Description", 0, &vtProp, 0, 0);// pCpuinfo->m_Description = clone_text(vtProp.bstrVal);// VariantClear(&vtProp);// //数据宽度// hr = pclsObj->Get(L"DataWidth", 0, &vtProp, 0, 0);// pCpuinfo->m_Bit = vtProp.intVal;// VariantClear(&vtProp);// //L1// GetCacheSize(&pCpuinfo->m_L1);// //L2// hr = pclsObj->Get(L"L2CacheSize", 0, &vtProp, 0, 0);// pCpuinfo->m_L2 = vtProp.llVal;// VariantClear(&vtProp);// //L3// hr = pclsObj->Get(L"L3CacheSize", 0, &vtProp, 0, 0);// pCpuinfo->m_L3 = vtProp.llVal;// VariantClear(&vtProp);// //核心数// hr = pclsObj->Get(L"NumberOfCores", 0, &vtProp, 0, 0);// pCpuinfo->m_cores = vtProp.intVal;// VariantClear(&vtProp);// //线程数// hr = pclsObj->Get(L"ThreadCount", 0, &vtProp, 0, 0);// pCpuinfo->m_threadcount = vtProp.intVal;// VariantClear(&vtProp);// hr = pclsObj->Get(L"CurrentClockSpeed", 0, &vtProp, 0, 0);// pCpuinfo->m_hz = vtProp.intVal;// VariantClear(&vtProp);// }////// if (pclsObj != NULL) {// pclsObj->Release();// }// if (pEnumerator != NULL) {// pEnumerator->Release();// }// pSvc->Release();// pLoc->Release();// CoUninitialize();// return true;//}// 调用格式: SDT_BOOL 取CPU信息, 命令说明: "取CPU信息。"// 参数<1>: &CPU信息 MAKELONG(0x03, 0), 参数说明: "待取得的CPU信息。"EAPI_EXTERN_C void eapi_GetCpuInfo_17_eapi(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf){PCPUINFO pCpuinfo = *reinterpret_cast <PCPUINFO*>(pArgInf[0].m_pCompoundData);//GetCpuInfo(pCpuinfo);pCpuinfo->m_name = GetCpuName();pCpuinfo->m_Vendor = GetCPUcomp();pCpuinfo->m_hz = GetCpuTime();pCpuinfo->m_ID = GetCpuID();pCpuinfo->m_Description = GetDescription();pCpuinfo->m_cores = GetCoreNum();pCpuinfo->m_Bit = GetDataWidth();pCpuinfo->m_threadcount = GetThreads();GetCacheSize(&pCpuinfo->m_L1, &pCpuinfo->m_L2, &pCpuinfo->m_L3);}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。