Function init_raw_smbios_data: Boolean;
var // These are all needed for the WMI querying process
p_Locator: ISWbemLocator;
p_service: ISWbemServices;
p_enumerator, p_instance: OleVariant;
// IEnumWbemClassObject?;
dw_count: ULONG;
variant_bios_data: OleVariant;
ret: Boolean;
h_result: HRESULT;
types: Integer;
// CIMTYPE
p_data: PByte;
// unsigned char* p_data Wirkklich ein PByte?
p_array: PSAFEARRAY;
Locator: ISWbemLocator;
Services: ISWbemServices;
begin
// zero raw dat memory
FillChar(global_buffer.smbios_table_data, MAX_DATA, #0);
ret := false;
Result := false;
// Initialize COM.
h_result := CoInitializeEx(0, COINIT_MULTITHREADED);
if (h_result < 0)
then
Exit;
// 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)); //Inkompatible Typen: 'IInterface' und 'Integer'
if h_result < 0
then
begin
CoUninitialize;
Exit;
// 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); //Inkompatible Typen: 'HRESULT' und 'ISWbemServices'
if (h_result < 0)
then
begin
p_Locator._Release;
CoUninitialize();
Exit;
// 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();
Exit;
// Program has failed.
end;
p_enumerator := 0;
h_result := p_service.InstancesOf('
MSSMBios_RawSMBiosTables', 0,
p_enumerator);
// Inkompatible Typen: 'HRESULT' und 'ISWbemObjectSet'
if h_result < 0
then
begin
p_service._Release;
p_Locator._Release;
CoUninitialize();
Exit;
// 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 := 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 := 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
or VT_ARRAY) <> variant_bios_data.vt
then
begin
//Habs erstmal stur mit übersetzt
end
else
begin
p_array := PSAFEARRAY(TVariantArg(variant_bios_data).ppArray);
// 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();
Exit;
end;
Move(p_data, global_buffer.smbios_table_data,
global_buffer.length);
end;
end;
VariantClear(variant_bios_data);
end;
end;
Break;
end;
end;
until h_result <> WBEM_S_NO_ERROR;
end;
p_service._Release;
p_Locator._Release;
CoUninitialize();
Result := True;
end;