1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
// sm.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <WbemIdl.h>
#include <iostream>
using namespace std;
bool smbios();
#define MAX_DATA 0xFA00
#define NULL 0
struct rsd
{
unsigned char smbios_major_version;
unsigned char smbios_minor_version;
unsigned int length;
unsigned char smbios_table_data[MAX_DATA];
};
int _tmain(int argc, _TCHAR* argv[])
{
smbios();
return 0;
}
bool smbios()
{
rsd t;
memset(t.smbios_table_data,0,MAX_DATA);
HRESULT result,type;
result = CoInitializeEx(0,COINIT_MULTITHREADED);
if ( result < 0)
return false;
//Obtain an initial pointer to IWbemServices interface for WMI
IWbemLocator *locator = NULL;
result = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID *)&locator);
if(result < 0)
{
CoUninitialize();
return false;
}
// Connecting and obtain pointer to make IWbemServices Calls
IWbemServices* service = NULL;
result = locator->ConnectServer(_T("ROOT\\WMI"),NULL,NULL,NULL,NULL,NULL,NULL,&service);
if(result < 0)
{
locator->Release();
CoUninitialize();
}
//set the IWbemServices proxy
result = CoSetProxyBlanket(service,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
if(result < 0)
{
service->Release();
locator->Release();
CoUninitialize();
return false;
}
IEnumWbemClassObject* enume = NULL;
result = service->CreateInstanceEnum( _T("MSSMBios_RawSMBiosTables"), NULL, NULL, &enume);
if(result < 0)
{
service->Release();
locator->Release();
CoUninitialize();
return false;
} else {
do
{
IWbemClassObject* classobject = NULL;
ULONG counter = NULL;
result = enume->Next(WBEM_INFINITE,1,&classobject,&counter);
if (result >= 0)
{
VARIANT vbd;
VariantInit(&vbd);
long type;
result = classobject->Get(_T("SmbiosMajorVersion"),0,&vbd,&type,NULL);
if (result < 0)
{
VariantClear(&vbd);
} else {
t.smbios_major_version = (unsigned char)vbd.iVal;
result = classobject->Get(_T("SMbiosMinorVersion"),0,&vbd,&type,NULL);
if ( result < 0)
{
VariantClear(&vbd);
} else {
t.smbios_minor_version = (unsigned char)vbd.iVal;
VariantInit(&vbd);
result = classobject->Get(_T("SMBiosData"),0,&vbd,&type,NULL);
if(result >=0)
{
SAFEARRAY *sarray = NULL;
sarray = V_ARRAY(&vbd);
unsigned char *data = (unsigned char*)sarray->pvData;
t.length = sarray->rgsabound[0].cElements;
if(t.length >= MAX_DATA)
{
cout << "SMBios Data Table would over flow" << endl;
service->Release();
locator->Release();
CoUninitialize();
}
memcpy(t.smbios_table_data,data,t.length);
}
}
VariantClear(&vbd);
}
}
break;
}while(result = WBEM_S_NO_ERROR);
}
service->Release();
locator->Release();
CoUninitialize();
system("PAUSE");
return true;
}
|