#include <Windows.h>
|
#include <cstdio>
|
|
VOID PrintHex(PBYTE Data, ULONG dwBytes) {
|
for (ULONG i = 0; i < dwBytes; i += 16) {
|
printf("%.8x: ", i);
|
|
for (ULONG j = 0; j < 16; j++) {
|
if (i + j < dwBytes) {
|
printf("%.2x ", Data[i + j]);
|
}
|
else {
|
printf("?? ");
|
}
|
}
|
|
for (ULONG j = 0; j < 16; j++) {
|
if (i + j < dwBytes && Data[i + j] >= 0x20 && Data[i + j] <= 0x7e) {
|
printf("%c", Data[i + j]);
|
}
|
else {
|
printf(".");
|
}
|
}
|
|
printf("\n");
|
}
|
}
|
|
int main() {
|
HMODULE hAdvapi32 = LoadLibrary(L"advapi32.dll");
|
DWORD (WINAPI *WmiOpenBlock)(
|
_In_ GUID *DataBlockGuid,
|
_In_ ULONG DesiredAccess,
|
_Out_ PVOID *DataBlockObject
|
) = (DWORD (WINAPI *)(GUID *, ULONG, PVOID *))GetProcAddress(hAdvapi32, "WmiOpenBlock");
|
DWORD (WINAPI *WmiQueryAllDataW)(
|
_In_ PVOID DataBlockObject,
|
_Inout_ ULONG *InOutBufferSize,
|
_Out_opt_ PVOID OutBuffer
|
) = (DWORD (WINAPI *)(PVOID, ULONG *, PVOID))GetProcAddress(hAdvapi32, "WmiQueryAllDataW");
|
DWORD(WINAPI *WmiCloseBlock)(
|
_In_ HANDLE Handle
|
) = (DWORD (WINAPI *)(HANDLE))GetProcAddress(hAdvapi32, "WmiCloseBlock");
|
|
// Open the disk perf WMI block.
|
DWORD DiskPerfGuid[] = { 0xBDD865D1, 0x11D0D7C1, 0xA00001A5, 0x102906C9 };
|
HANDLE hwmi = NULL;
|
DWORD st = WmiOpenBlock((GUID *)DiskPerfGuid, GENERIC_READ, &hwmi);
|
|
if (st != ERROR_SUCCESS) {
|
printf("WmiOpenBlock failed, %d\n", st);
|
return 1;
|
}
|
|
// Request the necessary buffer size.
|
DWORD InOutBufferSize = 0;
|
st = WmiQueryAllDataW(hwmi, &InOutBufferSize, NULL);
|
if (st != ERROR_INSUFFICIENT_BUFFER) {
|
printf("WmiQueryAllDataW#1 failed, %d\n", st);
|
WmiCloseBlock(hwmi);
|
return 1;
|
}
|
|
// Allocate memory and read the output data in full.
|
LPVOID lpBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, InOutBufferSize);
|
st = WmiQueryAllDataW(hwmi, &InOutBufferSize, lpBuffer);
|
if (st == ERROR_SUCCESS) {
|
PrintHex((PBYTE)lpBuffer, InOutBufferSize);
|
} else {
|
printf("WmiQueryAllDataW#2 failed, %d\n", st);
|
}
|
|
// Free resources.
|
HeapFree(GetProcessHeap(), 0, lpBuffer);
|
WmiCloseBlock(hwmi);
|
|
return 0;
|
}
|