481 lines
15 KiB
C
481 lines
15 KiB
C
/*++
|
|
|
|
Copyright (C) 1996-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
perfname.c
|
|
|
|
Abstract:
|
|
|
|
<abstract>
|
|
|
|
--*/
|
|
|
|
#include <windows.h>
|
|
#include <winperf.h>
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <tchar.h>
|
|
#include <mbctype.h>
|
|
#include <pdh.h>
|
|
#include "pdhitype.h"
|
|
#include "pdhidef.h"
|
|
#include "pdhmsg.h"
|
|
#include "strings.h"
|
|
|
|
LPCWSTR
|
|
PdhiLookupPerfNameByIndex (
|
|
PPERF_MACHINE pMachine,
|
|
DWORD dwNameIndex
|
|
)
|
|
{
|
|
LPWSTR szReturn = NULL;
|
|
LONG lStatus = ERROR_SUCCESS;
|
|
|
|
SetLastError (lStatus);
|
|
|
|
if (pMachine != NULL) {
|
|
if (pMachine->dwStatus == ERROR_SUCCESS) {
|
|
if (dwNameIndex <= pMachine->dwLastPerfString) {
|
|
szReturn = pMachine->szPerfStrings[dwNameIndex];
|
|
} else {
|
|
lStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
} else {
|
|
lStatus = pMachine->dwStatus ;
|
|
}
|
|
} else {
|
|
lStatus = PDH_CSTATUS_NO_MACHINE;
|
|
}
|
|
|
|
SetLastError (lStatus);
|
|
return (LPCWSTR)szReturn;
|
|
}
|
|
|
|
DWORD
|
|
PdhiLookupPerfIndexByName (
|
|
PPERF_MACHINE pMachine,
|
|
LPCWSTR szNameBuffer
|
|
)
|
|
{
|
|
DWORD dwCurrentIndex = 2;
|
|
BOOL bDone = FALSE;
|
|
LPWSTR szThisPerfString;
|
|
|
|
SetLastError (ERROR_SUCCESS);
|
|
|
|
while (!bDone) {
|
|
// test even indices first
|
|
for (;
|
|
dwCurrentIndex <= pMachine->dwLastPerfString;
|
|
dwCurrentIndex += 2) {
|
|
szThisPerfString = pMachine->szPerfStrings[dwCurrentIndex];
|
|
if (szThisPerfString != NULL) {
|
|
if (lstrcmpiW(szNameBuffer, szThisPerfString) == 0) {
|
|
// match found
|
|
bDone = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (!bDone) {
|
|
// if doing an odd # & not done then exit because we've
|
|
// looked at them all and not found anything
|
|
if (dwCurrentIndex & 0x00000001) break;
|
|
dwCurrentIndex = 3;
|
|
} // else just go to the loop exit
|
|
}
|
|
|
|
if (!bDone) {
|
|
SetLastError (PDH_STRING_NOT_FOUND);
|
|
dwCurrentIndex = 0;
|
|
}
|
|
|
|
return dwCurrentIndex;
|
|
}
|
|
|
|
PDH_FUNCTION
|
|
PdhLookupPerfNameByIndexW (
|
|
LPCWSTR szMachineName,
|
|
DWORD dwNameIndex,
|
|
LPWSTR szNameBuffer,
|
|
LPDWORD pcchNameBufferSize
|
|
)
|
|
{
|
|
PPERF_MACHINE pMachine;
|
|
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
|
LPWSTR szLocalMachineName = NULL;
|
|
LPWSTR szLocalName;
|
|
DWORD dwNameLen;
|
|
DWORD dwLocalNameSize = 0;
|
|
|
|
if ((szNameBuffer == NULL) ||
|
|
(pcchNameBufferSize == NULL)) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
} else {
|
|
// test access to all the parameteres passed in before continuing
|
|
__try {
|
|
if (szMachineName == NULL) {
|
|
// use local machine name
|
|
szLocalMachineName = &szStaticLocalMachineName[0];
|
|
} else {
|
|
if (*szMachineName == 0) {
|
|
// NULL machine name
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
} else {
|
|
szLocalMachineName = (LPWSTR)szMachineName;
|
|
}
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
dwLocalNameSize = *pcchNameBufferSize;
|
|
if (dwLocalNameSize >= sizeof(DWORD)) {
|
|
//test write access to the beginning and the end of the buffer
|
|
CLEAR_FIRST_FOUR_BYTES (szNameBuffer);
|
|
szNameBuffer[dwLocalNameSize -1] = 0;
|
|
} else if (dwLocalNameSize >= sizeof (WORD)) {
|
|
// then just test the first char
|
|
*szNameBuffer = 0;
|
|
} else {
|
|
pdhStatus = PDH_INSUFFICIENT_BUFFER;
|
|
}
|
|
}
|
|
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
pMachine = GetMachine (szLocalMachineName, 0);
|
|
if (pMachine != NULL) {
|
|
if (pMachine->dwStatus == ERROR_SUCCESS) {
|
|
szLocalName = (LPWSTR)PdhiLookupPerfNameByIndex (
|
|
pMachine, dwNameIndex);
|
|
if (szLocalName != NULL) {
|
|
dwNameLen = lstrlenW(szLocalName) + 1;
|
|
if (dwNameLen < dwLocalNameSize) {
|
|
lstrcpyW (szNameBuffer, szLocalName);
|
|
} else {
|
|
*szNameBuffer = 0;
|
|
pdhStatus = PDH_INSUFFICIENT_BUFFER;
|
|
}
|
|
dwLocalNameSize = dwNameLen;
|
|
} else {
|
|
*szNameBuffer = 0;
|
|
dwLocalNameSize = 0;
|
|
pdhStatus = GetLastError();
|
|
}
|
|
} else {
|
|
pdhStatus = pMachine->dwStatus;
|
|
}
|
|
pMachine->dwRefCount--;
|
|
RELEASE_MUTEX (pMachine->hMutex);
|
|
} else {
|
|
*szNameBuffer = 0;
|
|
dwLocalNameSize = 0;
|
|
pdhStatus = GetLastError();
|
|
}
|
|
|
|
__try {
|
|
*pcchNameBufferSize = dwLocalNameSize;
|
|
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
|
|
return pdhStatus;
|
|
}
|
|
|
|
PDH_FUNCTION
|
|
PdhLookupPerfNameByIndexA (
|
|
LPCSTR szMachineName,
|
|
DWORD dwNameIndex,
|
|
LPSTR szNameBuffer,
|
|
LPDWORD pcchNameBufferSize
|
|
)
|
|
{
|
|
PPERF_MACHINE pMachine;
|
|
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
|
LPWSTR szLocalMachineName = NULL;
|
|
LPWSTR szLocalName;
|
|
DWORD dwNameLen;
|
|
DWORD dwLocalNameSize = 0;
|
|
|
|
if ((szNameBuffer == NULL) ||
|
|
(pcchNameBufferSize == NULL)) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
} else {
|
|
// test access to all the parameteres passed in before continuing
|
|
__try {
|
|
if (szMachineName == NULL) {
|
|
// use local machine name
|
|
szLocalMachineName = &szStaticLocalMachineName[0];
|
|
} else {
|
|
if (*szMachineName == 0) {
|
|
// NULL machine name
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
} else {
|
|
// then allocate a new buffer and convert the LPSTR to a LPWSTR
|
|
dwNameLen = lstrlenA(szMachineName) + 1;
|
|
szLocalMachineName = G_ALLOC (dwNameLen * sizeof(WCHAR));
|
|
if (szLocalMachineName != NULL) {
|
|
MultiByteToWideChar(_getmbcp(),
|
|
0,
|
|
szMachineName,
|
|
lstrlenA(szMachineName),
|
|
(LPWSTR) szLocalMachineName,
|
|
dwNameLen);
|
|
} else {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
dwLocalNameSize = *pcchNameBufferSize;
|
|
if (dwLocalNameSize >= sizeof(DWORD)) {
|
|
//test write access to the beginning and the end of the buffer
|
|
CLEAR_FIRST_FOUR_BYTES (szNameBuffer);
|
|
szNameBuffer[dwLocalNameSize -1] = 0;
|
|
} else if (dwLocalNameSize >= sizeof (CHAR)) {
|
|
// then just test the first char
|
|
*szNameBuffer = 0;
|
|
} else {
|
|
pdhStatus = PDH_INSUFFICIENT_BUFFER;
|
|
}
|
|
}
|
|
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
pMachine = GetMachine (szLocalMachineName, 0);
|
|
if (pMachine != NULL) {
|
|
if (pMachine->dwStatus == ERROR_SUCCESS) {
|
|
szLocalName = (LPWSTR)PdhiLookupPerfNameByIndex (
|
|
pMachine, dwNameIndex);
|
|
|
|
if (szLocalName != NULL) {
|
|
pdhStatus = PdhiConvertUnicodeToAnsi(_getmbcp(),
|
|
szLocalName, szNameBuffer, & dwLocalNameSize);
|
|
} else {
|
|
*szNameBuffer = 0;
|
|
dwLocalNameSize = 0;
|
|
pdhStatus = GetLastError();
|
|
}
|
|
} else {
|
|
pdhStatus = pMachine->dwStatus;
|
|
}
|
|
pMachine->dwRefCount--;
|
|
RELEASE_MUTEX (pMachine->hMutex);
|
|
} else {
|
|
*szNameBuffer = 0;
|
|
dwLocalNameSize = 0;
|
|
pdhStatus = GetLastError();
|
|
}
|
|
|
|
__try {
|
|
*pcchNameBufferSize = dwLocalNameSize;
|
|
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
|
|
if (szLocalMachineName != NULL) {
|
|
if (szLocalMachineName != &szStaticLocalMachineName[0]) {
|
|
G_FREE (szLocalMachineName);
|
|
}
|
|
}
|
|
|
|
return pdhStatus;
|
|
}
|
|
|
|
PDH_FUNCTION
|
|
PdhLookupPerfIndexByNameW (
|
|
LPCWSTR szMachineName,
|
|
LPCWSTR szNameBuffer,
|
|
LPDWORD pdwIndex
|
|
)
|
|
{
|
|
PPERF_MACHINE pMachine;
|
|
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
|
LPWSTR szLocalMachineName = NULL;
|
|
DWORD dwIndexFound;
|
|
|
|
if ((szNameBuffer == NULL) ||
|
|
(pdwIndex == NULL)) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
} else {
|
|
|
|
// test access to all the parameteres passed in before continuing
|
|
__try {
|
|
if (szMachineName == NULL) {
|
|
// use local machine name
|
|
szLocalMachineName = &szStaticLocalMachineName[0];
|
|
} else {
|
|
if (*szMachineName == 0) {
|
|
// NULL machine name
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
} else {
|
|
szLocalMachineName = (LPWSTR)szMachineName;
|
|
}
|
|
}
|
|
|
|
// test read access to name
|
|
if (*szNameBuffer == 0) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
// test write access
|
|
*pdwIndex = 0;
|
|
}
|
|
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
pMachine = GetMachine (szLocalMachineName, 0);
|
|
if (pMachine != NULL) {
|
|
if (pMachine->dwStatus == ERROR_SUCCESS) {
|
|
dwIndexFound = PdhiLookupPerfIndexByName (
|
|
pMachine, szNameBuffer);
|
|
if (dwIndexFound == 0) {
|
|
// match not found
|
|
pdhStatus = GetLastError();
|
|
} else {
|
|
__try {
|
|
// write value found
|
|
*pdwIndex = dwIndexFound;
|
|
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
} else {
|
|
pdhStatus = pMachine->dwStatus;
|
|
}
|
|
pMachine->dwRefCount--;
|
|
RELEASE_MUTEX (pMachine->hMutex);
|
|
} else {
|
|
pdhStatus = GetLastError();
|
|
}
|
|
}
|
|
|
|
return pdhStatus;
|
|
}
|
|
|
|
PDH_FUNCTION
|
|
PdhLookupPerfIndexByNameA (
|
|
LPCSTR szMachineName,
|
|
LPCSTR szNameBuffer,
|
|
LPDWORD pdwIndex
|
|
)
|
|
{
|
|
PPERF_MACHINE pMachine;
|
|
PDH_STATUS pdhStatus = ERROR_SUCCESS;
|
|
LPWSTR szLocalMachineName = NULL;
|
|
DWORD dwIndexFound;
|
|
LPWSTR szWideName;
|
|
DWORD dwNameLen;
|
|
|
|
if ((szNameBuffer == NULL) ||
|
|
(pdwIndex == NULL)) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
} else {
|
|
|
|
// test access to all the parameteres passed in before continuing
|
|
__try {
|
|
if (szMachineName == NULL) {
|
|
// use local machine name
|
|
szLocalMachineName = &szStaticLocalMachineName[0];
|
|
} else {
|
|
if (*szMachineName == 0) {
|
|
// NULL machine name
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
} else {
|
|
// then allocate a new buffer and convert the LPSTR to a LPWSTR
|
|
dwNameLen = lstrlenA(szMachineName) + 1;
|
|
szLocalMachineName = G_ALLOC (dwNameLen * sizeof(WCHAR));
|
|
if (szLocalMachineName != NULL) {
|
|
MultiByteToWideChar(_getmbcp(),
|
|
0,
|
|
szMachineName,
|
|
lstrlenA(szMachineName),
|
|
(LPWSTR) szLocalMachineName,
|
|
dwNameLen);
|
|
} else {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// test read access to name
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
if (*szNameBuffer == 0) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
// test write access
|
|
*pdwIndex = 0;
|
|
}
|
|
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
|
|
if (pdhStatus == ERROR_SUCCESS) {
|
|
pMachine = GetMachine (szLocalMachineName, 0);
|
|
if (pMachine != NULL) {
|
|
if (pMachine->dwStatus == ERROR_SUCCESS) {
|
|
// convert name string to wide characters for comparison
|
|
dwNameLen = lstrlenA (szNameBuffer) + 1;
|
|
szWideName = G_ALLOC (dwNameLen * sizeof(WCHAR));
|
|
if (szWideName != NULL) {
|
|
MultiByteToWideChar(_getmbcp(),
|
|
0,
|
|
szNameBuffer,
|
|
lstrlenA(szNameBuffer),
|
|
(LPWSTR) szWideName,
|
|
dwNameLen);
|
|
dwIndexFound = PdhiLookupPerfIndexByName (
|
|
pMachine, szWideName);
|
|
if (dwIndexFound == 0) {
|
|
// match not found
|
|
pdhStatus = GetLastError();
|
|
} else {
|
|
__try {
|
|
// write value found
|
|
*pdwIndex = dwIndexFound;
|
|
} __except (EXCEPTION_EXECUTE_HANDLER) {
|
|
pdhStatus = PDH_INVALID_ARGUMENT;
|
|
}
|
|
}
|
|
G_FREE (szWideName);
|
|
} else {
|
|
pdhStatus = PDH_MEMORY_ALLOCATION_FAILURE;
|
|
}
|
|
} else {
|
|
pdhStatus = pMachine->dwStatus;
|
|
}
|
|
pMachine->dwRefCount--;
|
|
RELEASE_MUTEX (pMachine->hMutex);
|
|
} else {
|
|
pdhStatus = GetLastError();
|
|
}
|
|
}
|
|
|
|
if ( szLocalMachineName != NULL
|
|
&& szLocalMachineName != & szStaticLocalMachineName[0]) {
|
|
G_FREE (szLocalMachineName);
|
|
}
|
|
|
|
return pdhStatus;
|
|
}
|