#include "..\include_eapi_header.h"#include <comdef.h>#include <wbemidl.h>#pragma comment(lib, "wbemuuid.lib")typedef struct BIOSINFO {char* name;char* manufacturer;char* version;char* data;char* ID;char* OEM;BIOSINFO() {memset(this, 0, sizeof(*this));}}*PEBIOSINFO;namespace eapilib {using namespace std;namespace biosinfo {typedef struct _dmi_header{BYTE type;BYTE length;WORD handle;}dmi_header;typedef struct _RawSMBIOSData{BYTE Used20CallingMethod;BYTE SMBIOSMajorVersion;BYTE SMBIOSMinorVersion;BYTE DmiRevision;DWORD Length;#pragma warning(disable : 4200)BYTE SMBIOSTableData[];}RawSMBIOSData;static char* dmi_string(const dmi_header* dm, BYTE s){char* bp = (char*)dm;size_t i, len;if (s == 0)return CloneTextData("Not Specified");bp += dm->length;while (s > 1 && *bp){bp += strlen(bp);bp++;s--;}if (!*bp)return CloneTextData("BAD_INDEX");/* ASCII filtering */len = strlen(bp);for (i = 0; i < len; i++)if (bp[i] < 32 || bp[i] == 127)bp[i] = '.';return CloneTextData(bp);}//我本身是比较不喜欢使用COM的,但是BIOS在启动之后转交给操作系统了有些信息只能通过微软的接口获得。static BOOL GetBiosOther(wstring* ID, wstring* EMO, wstring* NAME) {BOOL Ret = FALSE;HRESULT hr = CoInitialize(0);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); // Reservedif (FAILED(hr)){CoUninitialize();return Ret;}IWbemLocator* pLoc = 0;hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);if (FAILED(hr)){CoUninitialize();return Ret;}IWbemServices* pSvc = 0;hr = pLoc->ConnectServer(BSTR(L"root\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc);if (FAILED(hr)){pLoc->Release();CoUninitialize();return Ret;}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 Ret;}IEnumWbemClassObject* pEnumerator = NULL;hr = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("Select * FROM Win32_BIOS"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);if (FAILED(hr)){pSvc->Release();pLoc->Release();CoUninitialize();return Ret;}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"Name", 0, &vtProp, 0, 0);wchar_t* _NAME = vtProp.bstrVal;*NAME = _NAME;hr = pclsObj->Get(L"Version", 0, &vtProp, 0, 0);wchar_t* _EMO = vtProp.bstrVal;*EMO = _EMO;hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);wchar_t* _ID = vtProp.bstrVal;*ID = _ID;VariantClear(&vtProp);}if (pclsObj != NULL) {pclsObj->Release();}if (pEnumerator != NULL) {pEnumerator->Release();}pSvc->Release();pLoc->Release();CoUninitialize();return TRUE;}static void GetBiosInfo(BIOSINFO* pBIOSINFO){int ret = 0;RawSMBIOSData* Smbios;dmi_header* h = NULL;int flag = 1;ret = GetSystemFirmwareTable('RSMB', 0, 0, 0);if (!ret){return;}DWORD bufsize = ret;char* buf = new char[bufsize];memset(buf, 0, bufsize);ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize);if (!ret){return;}Smbios = (RawSMBIOSData*)buf;BYTE* p = Smbios->SMBIOSTableData;if (Smbios->Length != bufsize - 8){delete[]buf;return;}for (DWORD i = 0; i < Smbios->Length; i++) {h = (dmi_header*)p;}for (DWORD i = 0; i < Smbios->Length; i++) {if (h->type == 0 && flag) {pBIOSINFO->manufacturer = dmi_string(h, p[0x4]);pBIOSINFO->version = dmi_string(h, p[0x5]);pBIOSINFO->data = dmi_string(h, p[0x8]);}}wstring ID, OEM, NAME;GetBiosOther(&ID, &OEM, &NAME);pBIOSINFO->name = clone_text(NAME);pBIOSINFO->ID = clone_text(ID);pBIOSINFO->OEM = clone_text(OEM);delete[]buf;return;}}}EAPI_EXTERN_C void eapi_GetBiosInfo_15_eapi(PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf){PEBIOSINFO pHDInfo = *(PEBIOSINFO*)pArgInf[0].m_pCompoundData;eapilib::biosinfo::GetBiosInfo(pHDInfo);}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。