//#---------------------------------------------------------------
//  File:		perfutil.h
//
//  Synopsis:	This file supports routines used to parse and
//				create Performance Monitor Data Structures.
//				It actually supports Performance Object types with
//				multiple instances
//
//	Copyright (C) 1995 Microsoft Corporation
//	All rights reserved.
//
//  Authors:	rkamicar - based on msn sources by Russ Blake
//----------------------------------------------------------------

#ifndef _PERFUTIL_H_
#define _PERFUTIL_H_

// enable this define to log process heap data to the event log
#ifdef PROBE_HEAP_USAGE
#undef PROBE_HEAP_USAGE
#endif
//
//  Utility macro.  This is used to reserve a DWORD multiple of
//  bytes for Unicode strings embedded in the definitional data,
//  viz., object instance names.
//
#define DWORD_MULTIPLE(x) (((x+sizeof(DWORD)-1)/sizeof(DWORD))*sizeof(DWORD))

//	(assumes dword is 4 bytes long and pointer is a dword in size)
#define ALIGN_ON_DWORD(x) ((VOID *)(((DWORD) x & 0x00000003) ? (((DWORD) x & 0xFFFFFFFC) + 4) : ((DWORD) x)))

extern WCHAR  GLOBAL_STRING[];	// Global command (get all local ctrs)
extern WCHAR  FOREIGN_STRING[];		// get data from foreign computers
extern WCHAR  COSTLY_STRING[];
extern WCHAR  NULL_STRING[];

#define QUERY_GLOBAL	1
#define QUERY_ITEMS	2
#define QUERY_FOREIGN   3
#define QUERY_COSTLY	4

//
// The definition of the only routine of perfutil.c, It builds part of a
// performance data instance (PERF_INSTANCE_DEFINITION) as described in
// winperf.h
//

HANDLE MonOpenEventLog ();
VOID MonCloseEventLog ();
DWORD GetQueryType (IN LPWSTR);
BOOL IsNumberInUnicodeList (DWORD, LPWSTR);

typedef struct _LOCAL_HEAP_INFO_BLOCK {
	DWORD   AllocatedEntries;
	DWORD   AllocatedBytes;
	DWORD   FreeEntries;
	DWORD   FreeBytes;
} LOCAL_HEAP_INFO, *PLOCAL_HEAP_INFO;


//
//  Memory Probe macro
//
#ifdef PROBE_HEAP_USAGE

#define HEAP_PROBE()	{ \
	DWORD   dwHeapStatus[5]; \
	NTSTATUS CallStatus; \
	dwHeapStatus[4] = __LINE__; \
	if (!(CallStatus = memprobe (dwHeapStatus, 16L, NULL))) { \
		REPORT_INFORMATION_DATA (TCP_HEAP_STATUS, LOG_DEBUG,	\
			&dwHeapStatus, sizeof(dwHeapStatus));  \
	} else {  \
		REPORT_ERROR_DATA (TCP_HEAP_STATUS_ERROR, LOG_DEBUG, \
			&CallStatus, sizeof (DWORD)); \
	} \
}

#else

#define HEAP_PROBE()	;

#endif

#endif  //_PERFUTIL_H_