Copy #include <Windows.h>
#pragma comment(lib, "advapi32.lib")
typedef NTSTATUS(WINAPI* WMIOPENBLOCK)(GUID, ULONG, PHANDLE);
typedef NTSTATUS(WINAPI* WMICLOSEBLOCK)(HANDLE);
typedef NTSTATUS(WINAPI* WMIQUERYALLDATA)(HANDLE, PULONG, PBYTE);
typedef struct _WNODE_HEADER
{
ULONG BufferSize;
ULONG ProviderId;
union
{
ULONG64 HistoricalContext;
struct
{
ULONG Version;
ULONG Linkage;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
union
{
ULONG CountLost;
HANDLE KernelHandle;
LARGE_INTEGER TimeStamp;
} DUMMYUNIONNAME2;
GUID Guid;
ULONG ClientContext;
ULONG Flags;
} WNODE_HEADER, * PWNODE_HEADER;
typedef struct _OFFSETINSTANCEDATAANDLENGTH {
ULONG OffsetInstanceData;
ULONG LengthInstanceData;
} OFFSETINSTANCEDATAANDLENGTH, *POFFSETINSTANCEDATAANDLENGTH;
typedef struct tagWNODE_ALL_DATA
{
struct _WNODE_HEADER WnodeHeader;
ULONG DataBlockOffset;
ULONG InstanceCount;
ULONG OffsetInstanceNameOffsets;
union
{
ULONG FixedInstanceSize;
OFFSETINSTANCEDATAANDLENGTH OffsetInstanceDataAndLength[];
} DUMMYUNIONNAME;
}WNODE_ALL_DATA, *PWNODE_ALL_DATA;
PWCHAR WmiGetStringFromDataBlockW(PBYTE* Pointer, PBYTE End)
{
PBYTE LocalPointer = *Pointer;
USHORT Length = 0;
PWCHAR String = NULL;
if (LocalPointer + sizeof(USHORT) > End)
goto EXIT_ROUTINE;
Length = *(PUSHORT)LocalPointer;
LocalPointer += sizeof(USHORT);
if (Length == 0 || LocalPointer + Length > End)
{
*Pointer = LocalPointer;
goto EXIT_ROUTINE;
}
String = (PWCHAR)LocalPointer;
LocalPointer += Length;
if ((ULONGLONG)LocalPointer & 1)
++LocalPointer;
*Pointer = LocalPointer;
EXIT_ROUTINE:
return (String != NULL ? String : (PWCHAR)L"");
}
INT main(VOID)
{
HMODULE Module = NULL;
BOOL bFlag = FALSE;
DWORD dwError = ERROR_SUCCESS;
WMIOPENBLOCK WmiOpenBlock = NULL;
WMICLOSEBLOCK WmiCloseBlock = NULL;
WMIQUERYALLDATA WmiQueryAllDataW = NULL;
HANDLE WmiHandle = NULL;
ULONG DataSize = 0;
GUID SystemInformation = { 0x98A2B9D7, 0x94DD, 0x496a, { 0x84, 0x7E, 0x67, 0xA5, 0x55, 0x7a, 0x59, 0xF2 } };
PWNODE_ALL_DATA WmiData = NULL;
PBYTE RawData = NULL;
PBYTE Base = NULL;
PBYTE BaseNodePointer = NULL;
PBYTE BaseNodeEnd = NULL;
ULONG InstanceOffset = 0;
ULONG InstanceLength = 0;
UCHAR BiosMajorRelease = 0;
UCHAR BiosMinorRelease = 0;
UCHAR ECFirmwareMajorRelease = 0;
UCHAR ECFirmwareMinorRelease = 0;
PWCHAR SystemInformationArray[11] = { 0 };
Module = LoadLibraryA("advapi32.dll");
if (!Module)
goto EXIT_ROUTINE;
WmiOpenBlock = (WMIOPENBLOCK)GetProcAddress(Module, "WmiOpenBlock");
WmiCloseBlock = (WMICLOSEBLOCK)GetProcAddress(Module, "WmiCloseBlock");
WmiQueryAllDataW = (WMIQUERYALLDATA)GetProcAddress(Module, "WmiQueryAllDataW");
if (!WmiOpenBlock || !WmiCloseBlock || !WmiQueryAllDataW)
goto EXIT_ROUTINE;
if (WmiOpenBlock(SystemInformation, GENERIC_READ, &WmiHandle) != ERROR_SUCCESS)
goto EXIT_ROUTINE;
WmiQueryAllDataW(WmiHandle, &DataSize, nullptr);
if (DataSize == 0)
goto EXIT_ROUTINE;
RawData = (PBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, DataSize);
if (!RawData)
goto EXIT_ROUTINE;
if (WmiQueryAllDataW(WmiHandle, &DataSize, RawData) != ERROR_SUCCESS)
goto EXIT_ROUTINE;
WmiData = (PWNODE_ALL_DATA)RawData;
if (WmiData->InstanceCount == 0)
goto EXIT_ROUTINE;
InstanceOffset = WmiData->OffsetInstanceDataAndLength[0].OffsetInstanceData;
InstanceLength = WmiData->OffsetInstanceDataAndLength[0].LengthInstanceData;
if (InstanceOffset + InstanceLength > DataSize)
goto EXIT_ROUTINE;
Base = RawData + InstanceOffset;
BaseNodePointer = Base;
BaseNodeEnd = Base + InstanceLength;
for (DWORD Ordinal = 0; Ordinal < 11; Ordinal++)
SystemInformationArray[Ordinal] = (PWCHAR)WmiGetStringFromDataBlockW(&BaseNodePointer, BaseNodeEnd);
if (BaseNodePointer + 4 <= BaseNodeEnd)
{
BiosMajorRelease = BaseNodePointer[0];
BiosMinorRelease = BaseNodePointer[1];
ECFirmwareMajorRelease = BaseNodePointer[2];
ECFirmwareMinorRelease = BaseNodePointer[3];
}
bFlag = TRUE;
EXIT_ROUTINE:
if (!bFlag)
dwError = GetLastError();
if (RawData)
HeapFree(GetProcessHeap(), 0, RawData);
if (WmiHandle)
WmiCloseBlock(WmiHandle);
return dwError;
}