Function init_raw_smbios_data: Boolean;
var // These are all needed for the WMI querying process
p_Locator: ISWbemLocator;
p_service: ISWbemServices;
vNVS: OleVariant;
p_enumerator, p_instance: OleVariant;
// IEnumWbemClassObject;
dw_count: ULONG;
variant_bios_data: OleVariant;
ret: Boolean;
h_result: HRESULT;
types: Integer;
// CIMTYPE
p_data: PChar;
// unsigned char* p_data
begin
// zero raw dat memory
FillChar(global_buffer.smbios_table_data, MAX_DATA, #0);
// memset(global_buffer.smbios_table_data,0,MAX_DATA);
ret := false;
// Initialize COM.
h_result := CoInitializeEx(0, COINIT_MULTITHREADED);
if (h_result < 0)
then
Result := false;
// Program has failed.
// Obtain the initial locator to Windows Management on a particular host computer.
p_Locator :=
nil;
// h_result := CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,{ (LPVOID *) }p_locator);
if h_result < 0
then
begin
CoUninitialize;
Result := false;
// Program has failed.
end;
p_service :=
nil;
// Connect to the root\cimv2 namespace with thecurrent user and obtain pointer pSvc
// to make IWbemServices calls.
// h_result := p_locator.ConnectServer('ROOT\WMI', '', '', '', '', '', 0,&p_service); //vNVS
if (h_result < 0)
then
begin
p_Locator._Release;
CoUninitialize();
Result := false;
// Program has failed.
end;
// Set the IWbemServices proxy so that impersonation of the user (client) occurs.
h_result := CoSetProxyBlanket(p_service, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
nil, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE,
nil, EOAC_NONE);
if h_result < 0
then
begin
p_service._Release;
p_Locator._Release;
CoUninitialize();
Result := false;
// Program has failed.
end;
p_enumerator := 0;
// h_result := p_service.InstancesOf('MSSMBios_RawSMBiosTables', 0, &p_enumerator);
if h_result < 0
then
begin
p_service._Release;
p_Locator._Release;
CoUninitialize();
Result := false;
// Program has failed.
end
else
begin
repeat
begin
p_instance := 0;
h_result := p_enumerator.Next(WBEM_INFINITE, 1, &p_instance, &dw_count);
if h_result >= 0
then
begin
VariantInit(&variant_bios_data);
h_result := p_instance.Get('
SmbiosMajorVersion', 0, &variant_bios_data,
&types, 0);
if h_result < 0
then
VariantClear(&variant_bios_data)
else
begin
// global_buffer.smbios_major_version := {Char}(variant_bios_data.iVal);
VariantInit(&variant_bios_data);
h_result := p_instance.Get('
SmbiosMinorVersion', 0,
&variant_bios_data, &types, 0);
if h_result < 0
then
VariantClear(&variant_bios_data)
else
begin
// global_buffer.smbios_minor_version = (unsigned char)variant_bios_data.iVal;
VariantInit(&variant_bios_data);
h_result := p_instance.Get('
SMBiosData', 0, &variant_bios_data,
&types, 0);
if h_result >= 0
then
begin
// if ( ( VT_UI1 | VT_ARRAY ) != variant_bios_data.vt ) then
// begin
// end
// else
begin
// SAFEARRAY* p_array = NULL;
// p_array = V_ARRAY(&variant_bios_data);
// p_data := (unsigned char *)p_array->pvData;
//
// global_buffer.length := {p_array->}rgsabound[0].cElements;
if (global_buffer.length >= MAX_DATA)
then
begin
WriteLn('
Return global_buffer would overflow. Abort initialization of raw SMBIOS data.\n');
p_service._Release;
p_Locator._Release;
CoUninitialize();
Result := false;
end;
Move(p_data, global_buffer.smbios_table_data,
global_buffer.length);
end;
end;
VariantClear(&variant_bios_data);
end;
end;
Exit;
end;
end;
until h_result <> WBEM_S_NO_ERROR;
end;
p_service._Release;
p_Locator._Release;
CoUninitialize();
Result := True;
end;