TYPEDEFS.H

//======================================// 
// Options Data Type //
//======================================//


typedef struct OPTIONSSTRUCT
{
BOOL bMenubar ;
BOOL bToolbar ;
BOOL bStatusbar ;
BOOL bAlwaysOnTop ;
} OPTIONS ;


//======================================//
// Basic "Derived" Types //
//======================================//


typedef HANDLE HLIBRARY ;
typedef HANDLE HMEMORY ;
typedef HWND HDLG ;
typedef HWND HCONTROL ;
typedef VOID *LPMEMORY ;


//======================================//
// Perfmon-Specific Types //
//======================================//


typedef PERF_DATA_BLOCK *PPERFDATA ;
typedef PERF_OBJECT_TYPE *PPERFOBJECT ;
typedef PERF_COUNTER_DEFINITION *PPERFCOUNTERDEF ;
typedef PERF_INSTANCE_DEFINITION *PPERFINSTANCEDEF ;





// This structure links together the Performance data for multiple
// systems, each of which has some counter instance which the user
// is interested in.

typedef struct _COUNTERTEXT {
struct _COUNTERTEXT *pNextTable;
DWORD dwLangId;
DWORD dwLastId;
DWORD dwCounterSize;
DWORD dwHelpSize;
LPWSTR *TextString;
LPWSTR HelpTextString;
} COUNTERTEXT;

typedef COUNTERTEXT *PCOUNTERTEXT;

// System states used mainly by Alert view to report system up/down
#define SYSTEM_OK 0
#define SYSTEM_DOWN 1
#define SYSTEM_DOWN_RPT 2
#define SYSTEM_RECONNECT 3
#define SYSTEM_RECONNECT_RPT 4

typedef struct PERFSYSTEMSTRUCT
{
struct PERFSYSTEMSTRUCT *pSystemNext;
TCHAR sysName[MAX_SYSTEM_NAME_LENGTH+1];
HKEY sysDataKey;
COUNTERTEXT CounterInfo;
DWORD FailureTime;
LPTSTR lpszValue;
BOOL bSystemNoLongerNeeded;
BOOL bSystemCounterNameSaved;

// the following used by perf data thread
DWORD dwThreadID ;
HANDLE hThread ;
DWORD StateData ;
HANDLE hStateDataMutex ;
HANDLE hPerfDataEvent ;
PPERFDATA pSystemPerfData ;

// mainly used by Alert to report system up/down
DWORD dwSystemState ;

// system version
DWORD SysVersion ;

} PERFSYSTEM, *PPERFSYSTEM, **PPPERFSYSTEM ;


typedef struct _graph_options {
BOOL bLegendChecked ;
BOOL bMenuChecked ;
BOOL bLabelsChecked;
BOOL bVertGridChecked ;
BOOL bHorzGridChecked ;
BOOL bStatusBarChecked ;
INT iVertMax ;
FLOAT eTimeInterval ;
INT iGraphOrHistogram ;
INT GraphVGrid,
GraphHGrid,
HistVGrid,
HistHGrid ;

} GRAPH_OPTIONS ;



//======================================//
// Line Data Type //
//======================================//


#define LineTypeChart 1
#define LineTypeAlert 2
#define LineTypeReport 3



typedef struct LINEVISUALSTRUCT
{
COLORREF crColor ;
int iColorIndex ;

int iStyle ;
int iStyleIndex ;

int iWidth ;
int iWidthIndex ;
} LINEVISUAL ;

typedef LINEVISUAL *PLINEVISUAL ;


typedef struct _LINESTRUCT
{
struct _LINESTRUCT *pLineNext;
int bFirstTime;
int iLineType ;
LPTSTR lnSystemName;

struct _PERF_OBJECT_TYPE lnObject;
LPTSTR lnObjectName;

struct _PERF_COUNTER_DEFINITION lnCounterDef;
LPTSTR lnCounterName;

struct _PERF_INSTANCE_DEFINITION lnInstanceDef;
LPTSTR lnInstanceName;

LPTSTR lnPINName;
LPTSTR lnParentObjName;
DWORD lnUniqueID; // Of instance, if any

LONGLONG lnNewTime;
LONGLONG lnOldTime;

LONGLONG lnOldTime100Ns ;
LONGLONG lnNewTime100Ns ;

LONGLONG lnaCounterValue[2];
LONGLONG lnaOldCounterValue[2];

DWORD lnCounterType;
DWORD lnCounterLength;
LONGLONG lnPerfFreq ;

LINEVISUAL Visual ;


//=============================//
// Chart-related fields //
//=============================//

HPEN hPen ;
int iScaleIndex ;
FLOAT eScale;
FLOAT FAR *lnValues;
int *aiLogIndexes ;
FLOAT lnMaxValue ;
FLOAT lnMinValue ;
FLOAT lnAveValue ;
INT lnValidValues;

//=============================//
// Alert-related fields //
//=============================//

HBRUSH hBrush ;
BOOL bAlertOver ; // over or under?
FLOAT eAlertValue ; // value to compare
LPTSTR lpszAlertProgram ; // program to run
BOOL bEveryTime ; // run every time or once?
BOOL bAlerted ; // alert happened on line?


//=============================//
// Report-related fields //
//=============================//
int iReportColumn ;
struct _LINESTRUCT *pLineCounterNext;
int xReportPos ;
int yReportPos ;
}LINESTRUCT ;


typedef LINESTRUCT *PLINESTRUCT ;
typedef PLINESTRUCT PLINE ;
typedef PLINE *PPLINE ;


//======================================//
// DISKLINE data type //
//======================================//

#define dwLineSignature (MAKELONG ('L', 'i'))

typedef struct DISKSTRINGSTRUCT
{
DWORD dwLength ;
DWORD dwOffset ;
} DISKSTRING ;
typedef DISKSTRING *PDISKSTRING ;


typedef struct DISKLINESTRUCT
{
int iLineType ;
DISKSTRING dsSystemName ;
DISKSTRING dsObjectName ;
DISKSTRING dsCounterName ;
DISKSTRING dsInstanceName ;
DISKSTRING dsPINName ;
DISKSTRING dsParentObjName ;
DWORD dwUniqueID ;
LINEVISUAL Visual ;
int iScaleIndex ;
FLOAT eScale ;
BOOL bAlertOver ;
FLOAT eAlertValue ;
DISKSTRING dsAlertProgram ;
BOOL bEveryTime ;
} DISKLINE ;

typedef DISKLINE *PDISKLINE ;



typedef FLOAT DFN (PLINESTRUCT);
typedef DFN *PDFN;

typedef struct _TIMELINESTRUCT
{
INT ppd ; // Pixels Per DataPoint
INT rppd ; // Remaining Pixels Per DataPoint
INT xLastTime ; // X coordinate of last time line.
INT iValidValues ; // High water mark for valid data.
}TIMELINESTRUCT;




//======================================//
// Graph Data Type //
//======================================//


#define iGraphMaxTics 26



// This structure describes the characteristics of one visual
// graph. It is linked for the day when multiple graphs are
// displayed within one instance of the application.

typedef struct _GRAPHSTRUCT
{
BOOL bManualRefresh ;
HWND hWnd ;
BOOL bModified ;

PPERFSYSTEM pSystemFirst;
PLINESTRUCT pLineFirst;

int xNumTics ;
int yNumTics ;
int axTics [iGraphMaxTics] ;
int ayTics [iGraphMaxTics] ;

RECT rectHorzScale ;
RECT rectVertScale ;
RECT rectData ;
HRGN hGraphRgn ;

INT gMaxValues;
INT gKnownValue;

LINEVISUAL Visual ;

DWORD gInterval;
GRAPH_OPTIONS gOptions;
TIMELINESTRUCT gTimeLine;

PPOINT pptDataPoints ;
SYSTEMTIME *pDataTime ;

HPEN hGridPen ;
HANDLE hbRed ;
BOOL HighLightOnOff ;
} GRAPHSTRUCT ;
typedef GRAPHSTRUCT *PGRAPHSTRUCT;
// minor version 3 to support alert, report, log intervals in msec
#define ChartMajorVersion 1
#define ChartMinorVersion 3


typedef struct DISKCHARTSTRUCT
{
DWORD dwNumLines ;
INT gMaxValues;
LINEVISUAL Visual ;
GRAPH_OPTIONS gOptions ;
BOOL bManualRefresh ;
OPTIONS perfmonOptions ;
} DISKCHART ;


typedef struct _SAVESTRUCT
{
INT version;
INT type;
INT iPerfmonView ;
INT graph_offset;
INT alert_offset;
INT log_offset;
}SAVESTRUCT;
typedef SAVESTRUCT *PSAVESTRUCT;

typedef struct _GRAPH_COUNTERS
{
INT sys_name_len;
INT sys_name_offset;
INT obj_name_len;
INT obj_name_offset;
INT cnt_name_len;
INT cnt_name_offset;
INT inst_name_len;
INT inst_name_offset;
INT PIN_name_len;
INT PIN_name_offset;
INT POB_name_len;
INT POB_name_offset;
DWORD inst_unique_id;
DWORD counter_type;
DWORD counter_length;
int iScaleIndex ;
FLOAT eScale;
LINEVISUAL Visual ;
INT updated;
}GRAPH_COUNTERS;

typedef struct _SAVGRAFSTRUCT
{
INT preference;
INT MaxValues;
RECT GraphArea;
GRAPH_OPTIONS options;
INT num_counters;
GRAPH_COUNTERS counters[1];
}SAVGRAFSTRUCT;
typedef SAVGRAFSTRUCT *PSAVGRAFSTRUCT;


typedef struct _SAVLOGSTRUCT
{
DWORDlogInterval;
BOOL logActive;
LPTSTRlogFileName;
DWORDlogFileSize;
}SAVLOGSTRUCT;
typedef SAVLOGSTRUCT *PSAVLOGSTRUCT;


#define DEF_GRAPH_INTERVAL 1000 // milliseconds
#define LINE_GRAPH 1
#define BAR_GRAPH 2
#define DEF_GRAPH_VMAX 100
#define SUCCESS 0
#define MIN_TIMER_INTERVAL 50
#define GRAPH_TIMER_ID 1


#define NO_VALUES_YET -1
// initial value for index to known and drawn values
#define MIN_NMAXVALUES 10
// minimum number of values that a graph needs to be displayed ( >1 )
#define DX_CALIBRATION_LEFT 1
// space between calibration value and left window edge
#define DX_LEGEND_RIGHT 1
// space between right window edge and legend
#define DY_AXIS_TOP 0
// space to allow at top of graph
#define DY_AXIS_BOTTOM 0
// space to allow at bottom of graph
#define LG_TO_CALIBRATION_RATIO 5
// width of calibration values * this number can't exceed screen width
#define LG_TO_LEGEND_RATIO 2
// width of legend * this number can't exceed screen width


// LINEGRAPH
#define DEFAULT_VAL_BOTTOM 0
#define DEFAULT_DVAL_AXISHEIGHT 100
#define DEFAULT_MAX_VALUES 100
#define GRAPH_INWARD_EDGE 5
#define GRAPH_LEFT_PAD 5
#define GRAPH_DOWNWARD_EDGE 5
#define ROOM_FOR_LEGEND 40

// LINEGRAPH DISP
#define DEFAULT_F_DISPLAY_LEGEND TRUE
#define DEFAULT_F_DISPLAY_CALIBRATION TRUE

#define NONE_LEN MAX_SYSTEM_NAME_LENGTH + 1



//======================================//
// Log/Playback/Alert Status IDs //
//======================================//


#define iPMStatusClosed 100
#define iPMStatusPaused 200
#define iPMStatusCollecting 300
#define iPMStatusPlaying 400


//======================================//
// Log Data Type //
//======================================//


typedef struct _LOGENTRYSTRUCT
{
DWORD ObjectTitleIndex ;
TCHAR szComputer [MAX_SYSTEM_NAME_LENGTH + 1] ;
TCHAR szObject [PerfObjectLen + 1] ;
BOOL bSaveCurrentName ;
struct _LOGENTRYSTRUCT *pNextLogEntry ;
} LOGENTRY ;

typedef LOGENTRY *PLOGENTRY ;


typedef struct LOGSTRUCT
{
int iStatus ;
BOOL bManualRefresh ;
BOOL bModified ;

PPERFSYSTEM pSystemFirst;
TCHAR szFilePath [FilePathLen + 1] ;
HANDLE hFile ;
long lIndexBlockOffset ;
int iIndex ;
PPERFDATA pLogData ;
DWORD dwDetailLevel ;
long lFileSize ;
DWORD iIntervalMSecs ;
int xCol1Width ;
PLOGENTRY pLogEntryFirst ;

// the following is used for saving system counter names into a
// log file. They are reset every the user changes log files.
BOOL bSaveCounterName ;
LPTSTR pBaseCounterName ;
long lBaseCounterNameSize ;
long lBaseCounterNameOffset ;

// this is used for checking system time when re-logging.
// this is to avoid log data not in chronological order.
SYSTEMTIME LastLogTime ;

// the following is used for wait for data event handles
HANDLE *lpHandles ;
int NumberOfHandles ;

//==========================================================================//
// Macros //
//==========================================================================//



} LOG ;

typedef LOG *PLOG ;


//======================================//
// Log File Data Types //
//======================================//


#define LogFileSignatureLen 6
#define LogFileBlockMaxIndexes 100


#define LogFileSignature TEXT("Loges")
#define LogFileVersion 2
#define LogFileRevision 0


#define LogFileIndexData 0x01
#define LogFileIndexBookmark 0x02
#define LogFileIndexNextBlock 0x04
#define LogFileIndexEOF 0x08
#define LogFileIndexCounterName 0x010


typedef struct LOGHEADERSTRUCT
{ // LOGHEADER
TCHAR szSignature [LogFileSignatureLen] ;
int iLength ;
WORD wVersion ;
WORD wRevision ;
long lBaseCounterNameOffset ;
} LOGHEADER ;

typedef LOGHEADER *PLOGHEADER ;


typedef struct LOGINDEXSTRUCT
{ // LOGINDEX
UINT uFlags ;
SYSTEMTIME SystemTime ;
long lDataOffset ;
int iSystemsLogged ;
} LOGINDEX ;

typedef LOGINDEX *PLOGINDEX ;


#define LogIndexSignatureLen 7
#define LogIndexSignature TEXT("Index ")
#define LogIndexSignature1 "Perfmon Index"

typedef struct LOGFILEINDEXBLOCKSTRUCT
{
TCHAR szSignature [LogIndexSignatureLen] ;
int iNumIndexes ;
LOGINDEX aIndexes [LogFileBlockMaxIndexes] ;
DWORD lNextBlockOffset ;
} LOGINDEXBLOCK ;

typedef LOGINDEXBLOCK *PLOGINDEXBLOCK ;


typedef struct LOGPOSITIONSTRUCT
{
PLOGINDEXBLOCK pIndexBlock ;
int iIndex ;
int iPosition ;
} LOGPOSITION ;

typedef LOGPOSITION *PLOGPOSITION ;


//======================================//
// Bookmark Data Type //
//======================================//


#define BookmarkCommentLen 256

typedef struct BOOKMARKSTRUCT
{
struct BOOKMARKSTRUCT *pBookmarkNext;
SYSTEMTIME SystemTime ;
TCHAR szComment [BookmarkCommentLen] ;
int iTic ;
} BOOKMARK, *PBOOKMARK, **PPBOOKMARK ;

typedef struct _LOGFILECOUNTERNAME
{
TCHAR szComputer [MAX_SYSTEM_NAME_LENGTH] ;
DWORD dwLastCounterId ;
DWORD dwLangId;
long lBaseCounterNameOffset ;
long lCurrentCounterNameOffset ;
long lMatchLength ;
long lUnmatchCounterNames ;
} LOGFILECOUNTERNAME, *PLOGFILECOUNTERNAME, **PPLOGFILECOUNTERNAME ;

typedef struct COUNTERNAMESTRUCT
{
struct COUNTERNAMESTRUCT *pCounterNameNext ;
LOGFILECOUNTERNAME CounterName ;
LPTSTR pRemainNames ;
} LOGCOUNTERNAME, *PLOGCOUNTERNAME ;

typedef struct PLAYBACKLOGSTRUCT
{
LPTSTR szFilePath ;
LPTSTR szFileTitle ;
// TCHAR szFilePath [FilePathLen + 1] ;
// TCHAR szFileTitle [FilePathLen + 1] ;
int iStatus ;
HANDLE hFile ;
PLOGHEADER pHeader ;
HANDLE hMapHandle ;
int iTotalTics ;
int iSelectedTics ;
LOGPOSITION BeginIndexPos ;
LOGPOSITION EndIndexPos ;
LOGPOSITION StartIndexPos ;
LOGPOSITION StopIndexPos ;
PBOOKMARK pBookmarkFirst ;
LPTSTR pBaseCounterNames ;
long lBaseCounterNameSize ;
long lBaseCounterNameOffset ;
PLOGCOUNTERNAME pLogCounterNameFirst ;
} PLAYBACKLOG ;

//=====================================//
// Log File Counter Name data type //
//=====================================//


// minor version 3 to support alert, report, log intervals in msec
// minor version 5 to support storing Log file name in setting
// and start logging after reading the file.
#define LogMajorVersion 1
#define LogMinorVersion 5


typedef struct DISKLOGSTRUCT
{
DWORD dwNumLines ;
DWORD dwIntervalSecs ;
BOOL bManualRefresh ;
OPTIONS perfmonOptions ;
TCHAR LogFileName[260] ;
} DISKLOG ;




//======================================//
// Alert Data Type //
//======================================//


typedef struct ALERTSTRUCT
{
HWND hWnd ;
HWND hAlertListBox ;
int iStatus ;
BOOL bManualRefresh ;
BOOL bModified ;


PPERFSYSTEM pSystemFirst ;
PLINESTRUCT pLineFirst ;

DWORD iIntervalMSecs ;

LINEVISUAL Visual ;

HFONT hFontItems ;
int yItemHeight ;

int xColorWidth ;
int xDateWidth ;
int xTimeWidth ;
int xNumberWidth ;
int xConditionWidth ;

// used in controlling the horz scrollbar
int xTextExtent ;

BOOL bSwitchToAlert ;
BOOL bNetworkAlert ;
BOOL bEventLog ;
TCHAR MessageName [16] ;

// used for the network alert thread
HANDLE hNetAlertThread ;
DWORD dwNetAlertThreadID ;

// option to turn alert legend on/off
BOOL bLegendOn ;
} ALERT ;

typedef ALERT *PALERT ;



#define AlertMajorVersion 1

// minor version 2 to support Alert msg name
// minor version 3 to support alert, report, log intervals in msec
// minor version 4 to support alert event logging
// minor version 6 to support alert misc options
#define AlertMinorVersion 6


typedef struct DISKALERTSTRUCT
{
LINEVISUAL Visual ;
DWORD dwNumLines ;
DWORD dwIntervalSecs ;
BOOL bManualRefresh ;
BOOL bSwitchToAlert ;
BOOL bNetworkAlert ;
TCHAR MessageName [16] ;
OPTIONS perfmonOptions ;
DWORD MiscOptions ;
} DISKALERT ;


//======================================//
// Report Data Type //
//======================================//


typedef struct COLUMNGROUPSTRUCT
{
struct COLUMNGROUPSTRUCT *pColumnGroupNext ;
struct COLUMNGROUPSTRUCT *pColumnGroupPrevious ;
struct OBJECTGROUPSTRUCT *pParentObject ;
LPTSTR lpszParentName ;
LPTSTR lpszInstanceName ;
int ParentNameTextWidth ;
int InstanceNameTextWidth ;
int xPos ;
int xWidth ;
int yFirstLine ;
int ColumnNumber ; // start from 0
} COLUMNGROUP ;


typedef COLUMNGROUP *PCOLUMNGROUP ;


typedef struct COUNTERGROUPSTRUCT
{
struct COUNTERGROUPSTRUCT *pCounterGroupNext ;
struct COUNTERGROUPSTRUCT *pCounterGroupPrevious ;
struct OBJECTGROUPSTRUCT *pParentObject ;
DWORD dwCounterIndex ;
PLINE pLineFirst ;
int yLine ;
int xWidth ;
} COUNTERGROUP ;

typedef COUNTERGROUP *PCOUNTERGROUP ;


typedef struct OBJECTGROUPSTRUCT
{
struct OBJECTGROUPSTRUCT *pObjectGroupNext ;
struct OBJECTGROUPSTRUCT *pObjectGroupPrevious ;
struct SYSTEMGROUPSTRUCT *pParentSystem ;
LPTSTR lpszObjectName ;
PCOUNTERGROUP pCounterGroupFirst ;
PCOLUMNGROUP pColumnGroupFirst ;
int yFirstLine ;
int yLastLine ;
int xWidth ;
} OBJECTGROUP ;

typedef OBJECTGROUP *POBJECTGROUP ;


typedef struct SYSTEMGROUPSTRUCT
{ // SystemGroup
struct SYSTEMGROUPSTRUCT *pSystemGroupNext ;
struct SYSTEMGROUPSTRUCT *pSystemGroupPrevious ;
LPTSTR lpszSystemName ;
POBJECTGROUP pObjectGroupFirst ;
int yFirstLine ;
int yLastLine ;
int xWidth ;
} SYSTEMGROUP ;

typedef SYSTEMGROUP *PSYSTEMGROUP ;

enum REPORT_ITEM_TYPE
{
REPORT_TYPE_NOTHING,
REPORT_TYPE_SYSTEM,
REPORT_TYPE_OBJECT,
REPORT_TYPE_COLUMN,
REPORT_TYPE_COUNTER,
REPORT_TYPE_LINE
} ;

typedef union REPORT_ITEM_TAG
{
PSYSTEMGROUP pSystem ;
POBJECTGROUP pObject ;
PCOLUMNGROUP pColumn ;
PCOUNTERGROUP pCounter ;
PLINE pLine ;
} REPORT_ITEM ;


typedef struct REPORTSTRUCT
{ // REPORT
HWND hWnd ;
int iStatus ;
BOOL bManualRefresh ;
BOOL bModified ;

TCHAR szTitle [120] ;
SYSTEMTIME SystemTime ;

PPERFSYSTEM pSystemFirst ;
PLINE pLineFirst ;

PSYSTEMGROUP pSystemGroupFirst ;

REPORT_ITEM CurrentItem ;
enum REPORT_ITEM_TYPE CurrentItemType ;

LINEVISUAL Visual ;


DWORD iIntervalMSecs ;
FLOAT eTimeInterval ;
HFONT hFont ;
HFONT hFontHeaders ;
int yLineHeight ;

int xMaxCounterWidth ;
int xValueWidth ;

int xWidth ;
int yHeight ;
} REPORT ;

typedef REPORT *PREPORT ;

// minor version 3 to support alert, report, log intervals in msec
#define ReportMajorVersion 1
#define ReportMinorVersion 3


typedef struct DISKREPORTSTRUCT
{
LINEVISUAL Visual ;
DWORD dwNumLines ;
DWORD dwIntervalSecs ;
BOOL bManualRefresh ;
OPTIONS perfmonOptions ;
} DISKREPORT ;


//======================================//
// File Header Type //
//======================================//


#define PerfSignatureLen 20

#define szPerfChartSignature TEXT("PERF CHART")
#define szPerfAlertSignature TEXT("PERF ALERT")
#define szPerfLogSignature TEXT("PERF LOG")
#define szPerfReportSignature TEXT("PERF REPORT")
#define szPerfWorkspaceSignature TEXT("PERF WORKSPACE")


typedef struct PERFFILEHEADERSTRUCT
{ // PERFFILEHEADER
TCHAR szSignature [PerfSignatureLen] ;
DWORD dwMajorVersion ;
DWORD dwMinorVersion ;
BYTE abyUnused [100] ;
} PERFFILEHEADER ;

#define WorkspaceMajorVersion 1

// minor version 1 to support window placement data
// minor version 2 to support alert msg name
// minor version 3 to support alert, report, log intervals in msec
// minor version 4 to support alert eventlog
// minor version 5 to support log file name in log setting
// minor version 6 to support alert misc options
#define WorkspaceMinorVersion 6

typedef struct DISKWORKSPACESTRUCT
{
INT iPerfmonView ;
DWORD ChartOffset ;
DWORD AlertOffset ;
DWORD LogOffset ;
DWORD ReportOffset ;
WINDOWPLACEMENT WindowPlacement ;
} DISKWORKSPACE ;