How To Determine Physical Memory on a Remote Machine (254074)
The information in this article applies to:
- Microsoft Win32 Application Programming Interface (API), when used with:
- the operating system: Microsoft Windows NT 4.0
- the operating system: Microsoft Windows 2000
- the operating system: Microsoft Windows XP
This article was previously published under Q254074 SUMMARY
You can approximate the physical memory on a remote machine by querying the following performance counters and summing the total:
Memory -> Available Bytes
Memory -> Cache Bytes
Process -> Working Set -> _Total
MORE INFORMATION
Use the following sample code to obtain the physical memory on a remote machine:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <pdh.h>
void _tmain(int argc, TCHAR *argv[])
{
TCHAR szAvailBytes[256] = TEXT("");
TCHAR szCacheBytes[256] = TEXT("");
TCHAR szWorkingSet[256] = TEXT("");
DWORD dwBufferSize = sizeof(szAvailBytes);
HCOUNTER hAvailBytes, hCacheBytes, hWorkingSet;
HQUERY hQuery = NULL;
PDH_COUNTER_PATH_ELEMENTS pdhCpe;
PDH_STATUS pdhStatus;
PDH_FMT_COUNTERVALUE pdhfmtAvail,pdhfmtCache,pdhfmtWorking;
__try{
if (argc != 2)
__leave;
pdhStatus = PdhOpenQuery(NULL, 0, &hQuery);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhOpenQuery failed with %u\n"), pdhStatus);
__leave;
}
//
// Make Counter Path
//
pdhCpe.szMachineName = argv[1];
pdhCpe.szObjectName = TEXT("Memory");
pdhCpe.szInstanceName = NULL;
pdhCpe.szParentInstance = NULL;
pdhCpe.dwInstanceIndex = -1;
pdhCpe.szCounterName = TEXT("Available Bytes");
pdhStatus = PdhMakeCounterPath(&pdhCpe, szAvailBytes,
&dwBufferSize, 0);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhMakeCounterPath failed with %u\n"),
pdhStatus);
__leave;
}
pdhCpe.szCounterName = TEXT("Cache Bytes");
dwBufferSize = sizeof(szCacheBytes);
pdhStatus = PdhMakeCounterPath(&pdhCpe, szCacheBytes,
&dwBufferSize, 0);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhMakeCounterPath failed with %u\n"),
pdhStatus);
__leave;
}
pdhCpe.szObjectName = TEXT("Process");
pdhCpe.szInstanceName = TEXT("_Total");
pdhCpe.szCounterName = TEXT("Working Set");
dwBufferSize = sizeof(szWorkingSet);
pdhStatus = PdhMakeCounterPath(&pdhCpe, szWorkingSet,
&dwBufferSize, 0);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhMakeCounterPath failed with %u\n"),
pdhStatus);
__leave;
}
//
// Add counters.
//
pdhStatus = PdhAddCounter(hQuery, szAvailBytes, 0, &hAvailBytes);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhAddCounter failed with %u\n"), pdhStatus);
__leave;
}
pdhStatus = PdhAddCounter(hQuery, szCacheBytes, 0, &hCacheBytes);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhAddCounter failed with %u\n"), pdhStatus);
__leave;
}
pdhStatus = PdhAddCounter(hQuery, szWorkingSet, 0, &hWorkingSet);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhAddCounter failed with %u\n"), pdhStatus);
__leave;
}
//
// Get the data.
//
pdhStatus = PdhCollectQueryData(hQuery);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhCollectQueryData failed with %u\n"),
pdhStatus);
__leave;
}
//
// Format counter values.
//
pdhStatus = PdhGetFormattedCounterValue(hAvailBytes, PDH_FMT_LONG | PDH_FMT_NOSCALE, NULL, &pdhfmtAvail);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhGetFormattedCounterValue failed with %u\n"), pdhStatus);
__leave;
}
pdhStatus = PdhGetFormattedCounterValue(hCacheBytes, PDH_FMT_LONG | PDH_FMT_NOSCALE, NULL, &pdhfmtCache);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhGetFormattedCounterValue failed with %u\n"), pdhStatus);
__leave;
}
pdhStatus = PdhGetFormattedCounterValue(hWorkingSet, PDH_FMT_LONG | PDH_FMT_NOSCALE, NULL, &pdhfmtWorking);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhGetFormattedCounterValue failed with %u\n"), pdhStatus);
__leave;
}
_tprintf(TEXT("Avail Bytes = %u\n"), pdhfmtAvail.longValue);
_tprintf(TEXT("Cache Bytes = %u\n"), pdhfmtCache.longValue);
_tprintf(TEXT("Working Set = %u\n"), pdhfmtWorking.longValue);
_tprintf(TEXT("Physical Mem = %u mb\n"), (pdhfmtAvail.longValue + pdhfmtCache.longValue + pdhfmtWorking.longValue)/(1024*1024));
}
__finally{
if (hQuery != NULL){
pdhStatus = PdhCloseQuery(hQuery);
if (pdhStatus != ERROR_SUCCESS){
_tprintf(TEXT("PdhCloseQuery failed with %u\n"),
pdhStatus);
}
}
}
}
Modification Type: | Minor | Last Reviewed: | 7/1/2004 |
---|
Keywords: | kbhowto kbKernBase KB254074 |
---|
|