#include #include 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; }