PROCLIST.C
/* 
    proclist.c 
 
    sample program to list current processes using the PDH.DLL 
    browsing functions 
 
*/ 
#ifdef UNICODE 
#ifndef _UNICODE 
#define _UNICODE            1 
#endif 
#define tmain   wmain 
#else 
#define tmain   main 
#endif 
 
// this program only needs the "bare essential" windows header files 
#define WIN32_LEAN_AND_MEAN 1 
#include <windows.h> 
#include <winperf.h> 
#include <malloc.h> 
#include <stdio.h> 
#include <tchar.h> 
#include <pdh.h> 
  
int 
tmain () 
{ 
    PDH_STATUS  pdhStatus               = ERROR_SUCCESS; 
    LPTSTR      szCounterListBuffer     = NULL; 
    DWORD       dwCounterListSize       = 0; 
    LPTSTR      szInstanceListBuffer    = NULL; 
    DWORD       dwInstanceListSize      = 0; 
    LPTSTR      szThisInstance          = NULL; 
 
 
    // call the function to determine the required buffer size for the data 
    pdhStatus = PdhEnumObjectItems ( 
        NULL,                   // reserved 
        NULL,                   // local machine 
        TEXT("Process"),        // object to enumerate 
        szCounterListBuffer,    // pass in NULL buffers 
        &dwCounterListSize,     // an 0 length to get 
        szInstanceListBuffer,   // required size  
        &dwInstanceListSize,    // of the buffers in chars 
        PERF_DETAIL_WIZARD,     // counter detail level 
        0);  
 
    if (pdhStatus == ERROR_SUCCESS) { 
        // allocate the buffers and try the call again 
        szCounterListBuffer = (LPTSTR)malloc ( 
            (dwCounterListSize * sizeof (TCHAR))); 
        szInstanceListBuffer = (LPTSTR)malloc ( 
            (dwInstanceListSize * sizeof (TCHAR))); 
        if ((szCounterListBuffer != NULL) && 
            (szInstanceListBuffer != NULL)) { 
            pdhStatus = PdhEnumObjectItems ( 
                NULL,   // reserved 
                NULL,   // local machine 
                TEXT("Process"), // object to enumerate 
                szCounterListBuffer,    // pass in NULL buffers 
                &dwCounterListSize,     // an 0 length to get 
                szInstanceListBuffer,   // required size  
                &dwInstanceListSize,    // of the buffers in chars 
                PERF_DETAIL_WIZARD,     // counter detail level 
                0);      
            if (pdhStatus == ERROR_SUCCESS) { 
                _tprintf (TEXT("\nRunning Processes:")); 
                // walk the return instance list 
                for (szThisInstance = szInstanceListBuffer; 
                     *szThisInstance != 0; 
                     szThisInstance += lstrlen(szThisInstance) + 1) { 
                     _tprintf (TEXT("\n  %s"), szThisInstance); 
                } 
            } 
        } else { 
            _tprintf (TEXT("\nPROCLIST: unable to allocate buffers")); 
        } 
        if (szCounterListBuffer != NULL) free (szCounterListBuffer); 
        if (szInstanceListBuffer != NULL) free (szInstanceListBuffer); 
    } else { 
        _tprintf (TEXT("\nPROCLIST: unable to determine the necessary buffer size required")); 
    } 
    return 0; 
}