#ifndef _RPC_PERFCOUNT_H
#define _RPC_PERFCOUNT_H
/* 
 *  Unix SMB/CIFS implementation.
 *  Virtual Windows Registry Layer
 *
 *  Copyright (C) Marcin Krzysztof Porwit    2005,
 *  Copyright (C) Gerald (Jerry) Carter      2005.
 *  
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *  
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

typedef struct perf_counter_definition
{
	/* sizeof(PERF_COUNTER_DEFINITION) */
	uint32 ByteLength;
	uint32 CounterNameTitleIndex;
	uint32 CounterNameTitlePointer;
	uint32 CounterHelpTitleIndex;
	uint32 CounterHelpTitlePointer;
	uint32 DefaultScale;
	uint32 DetailLevel;
	uint32 CounterType;
	uint32 CounterSize;
	uint32 CounterOffset;
}
PERF_COUNTER_DEFINITION;

typedef struct perf_counter_block
{
	/* Total size of the data block, including all data plus this header */
	uint32 ByteLength;
	uint8 *data;
}
PERF_COUNTER_BLOCK;

typedef struct perf_instance_definition
{
	/* Total size of the instance definition, including the length of the terminated Name string */
	uint32 ByteLength;
	uint32 ParentObjectTitleIndex;
	uint32 ParentObjectTitlePointer;
	uint32 UniqueID;
	/* From the start of the PERF_INSTANCE_DEFINITION, the byte offset to the start of the Name string */
	uint32 NameOffset;
	uint32 NameLength;
	/* Unicode string containing the name for the instance */
	uint8 *data;
	PERF_COUNTER_BLOCK counter_data;
}
PERF_INSTANCE_DEFINITION;

typedef struct perf_object_type
{
	/* Total size of the object block, including all PERF_INSTANCE_DEFINITIONs,
	   PERF_COUNTER_DEFINITIONs and PERF_COUNTER_BLOCKs in bytes */
	uint32 TotalByteLength;
	/* Size of this PERF_OBJECT_TYPE plus all PERF_COUNTER_DEFINITIONs in bytes */
	uint32 DefinitionLength;
	/* Size of this PERF_OBJECT_TYPE */
	uint32 HeaderLength;
	uint32 ObjectNameTitleIndex;
	uint32 ObjectNameTitlePointer;
	uint32 ObjectHelpTitleIndex;
	uint32 ObjectHelpTitlePointer;
	uint32 DetailLevel;
	uint32 NumCounters;
	uint32 DefaultCounter;
	uint32 NumInstances;
	uint32 CodePage;
	uint64 PerfTime;
	uint64 PerfFreq;
	PERF_COUNTER_DEFINITION *counters;
	PERF_INSTANCE_DEFINITION *instances;
	PERF_COUNTER_BLOCK counter_data;
}
PERF_OBJECT_TYPE;

/* PerfCounter Inner Buffer structs */
typedef struct perf_data_block
{
	/* hardcoded to read "P.E.R.F" */
	uint16 Signature[4];
	uint32 LittleEndian;
	/* both currently hardcoded to 1 */
	uint32 Version;
	uint32 Revision;
	/* bytes of PERF_OBJECT_TYPE data, does NOT include the PERF_DATA_BLOCK */
	uint32 TotalByteLength;
	/* size of PERF_DATA_BLOCK including the uint8 *data */
	uint32 HeaderLength;
	/* number of PERF_OBJECT_TYPE structures encoded */
	uint32 NumObjectTypes;
	uint32 DefaultObject;
	SYSTEMTIME SystemTime;
	/* This will guarantee that we're on a 64-bit boundary before we encode
	   PerfTime, and having it there will make my offset math much easier. */
	uint32 Padding;
	/* Now when I'm marshalling this, I'll need to call prs_align_uint64() 
	   before I start encodint the uint64 structs */
	/* clock rate * seconds uptime */
	uint64 PerfTime;
	/* The clock rate of the CPU */
	uint64 PerfFreq; 
	/* used for high-res timers -- for now PerfTime * 10e7 */
	uint64 PerfTime100nSec;
	uint32 SystemNameLength;
	uint32 SystemNameOffset;
	/* The SystemName, in unicode, terminated */
	uint8* data;
	PERF_OBJECT_TYPE *objects;
} 
PERF_DATA_BLOCK;

#endif /* _RPC_PERFCOUNT_H */
