// --monshare.h-----------------------------------------------------------------
//
//  Header file containing the definition of the performance monitoring shared 
//  memory structure.  The shared memory is used to communicate between the 
//  monitored object side and the performance DLL called by the NT Performance 
//  Monitor.
//
// Copyright 1986 - 1998 Microsoft Corporation.  All Rights Reserved.
// -----------------------------------------------------------------------------
#if !defined(_MONSHARE_H)
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
#define _MONSHARE_H

//
// Mapping and Mutex Object Names
//

// NOTE: "" and L"" versions must be the same!!!

#define MON_MAPPING_NAME_TEMPLATE	"MS Exchange SDK PerfMon Mapping %s"
#define MON_MAPPING_NAME_TEMPLATE_W	L"MS Exchange SDK PerfMon Mapping %s"

#define MON_MUTEX_NAME_TEMPLATE 	"MS Exchange SDK PerfMon Mutex %s"
#define MON_MUTEX_NAME_TEMPLATE_W	L"MS Exchange SDK PerfMon Mutex %s"

//
// Defined Constants
//

// MON_SHARED_MEMORY_SIGNATURE identifies the shared memory section as an 
// Exchange SDK performance monitoring shared memory communication block.
// This constant should be incremented when the structure of the shared 
// memory section is changed to catch version mismatches between the  
// monitored object and the DLL.

#define MON_SHARED_MEMORY_SIGNATURE     0x47575011

// MON_DATA_BLOCK_SIZE is the size of the buffer within the shared block 
// in which is built the structure that is sent to the Windows NT 
// Performance Monitor.  This value may be increased if needed to hold 
// a larger number of counters.  A change in this value does not require 
// any other values to be changed.

#define MON_DATA_BLOCK_SIZE			    4000

// MON_MUTEX_TIMEOUT is the number of miliseconds to wait for the 
// mutex that locks the shared memory section.  May be defined as 
// INFINITE to wait forever.

#define MON_MUTEX_TIMEOUT               (5*60*1000)

//
// Structure Definitions
//

//$--MONSHAREDMEMORY------------------------------------------------------------
//  This is the structure of the shared memory block used to communicate with 
//  the performance DLL.  The _PERF_* structures are all built inside the 
//  rgbDataBlock array within this structure.
// -----------------------------------------------------------------------------
typedef struct _MonSharedMemory			// (hungarian notation = msm)
{
    DWORD dwSignature;                  // value that identifies this as an 
                                        // Exchange SDK perf mon memory block
	DWORD fDataIsValid;					// safe for DLL to use shared mem data
	DWORD ibHeaderOffset;				// offset of _PERF_OBJECT_TYPE and 
										// _PERF_COUNTER_DEFINITION structures
										// in this shared memory block
	DWORD cbHeaderSize;					// size of _PERF_OBJECT_TYPE and 
										// _PERF_COUNTER_DEFINITION structures
										// in this shared memory block
	DWORD ibInstanceOffset;				// offset of _PERF_INSTANCE_DEFINITION,
										// _PERF_COUNTER_BLOCK and counters
										// in this shared memory block
	DWORD cbInstanceSize;				// size of _PERF_INSTANCE_DEFINITION,
										// _PERF_COUNTER_BLOCK and counters
										// in this shared memory block
	BYTE rgbDataBlock[MON_DATA_BLOCK_SIZE];	// the actual data block containing
										// both of the structures listed above
} MONSHAREDMEMORY, *LPMONSHAREDMEMORY;

#pragma option pop /*P_O_Pop*/
#endif
