diff options
-rw-r--r-- | source3/include/proto.h | 14 | ||||
-rw-r--r-- | source3/include/rpc_perfcount.h | 126 | ||||
-rw-r--r-- | source3/include/rpc_perfcount_defs.h | 93 | ||||
-rw-r--r-- | source3/registry/reg_perfcount.c | 80 |
4 files changed, 39 insertions, 274 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 93bad7f0d0..c9f57b46a6 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -5130,20 +5130,6 @@ uint32 reg_perfcount_get_last_counter(uint32 base_index); uint32 reg_perfcount_get_last_help(uint32 last_counter); uint32 reg_perfcount_get_counter_help(uint32 base_index, char **retbuf); uint32 reg_perfcount_get_counter_names(uint32 base_index, char **retbuf); -bool _reg_perfcount_get_counter_data(TDB_DATA key, TDB_DATA *data); -bool _reg_perfcount_get_instance_info(struct PERF_INSTANCE_DEFINITION *inst, - TALLOC_CTX *mem_ctx, - int instId, - struct PERF_OBJECT_TYPE *obj, - TDB_CONTEXT *names); -bool _reg_perfcount_add_instance(struct PERF_OBJECT_TYPE *obj, - TALLOC_CTX *mem_ctx, - int instInd, - TDB_CONTEXT *names); -uint32 reg_perfcount_get_perf_data_block(uint32 base_index, - prs_struct *ps, - struct PERF_DATA_BLOCK *block, - const char *object_ids); WERROR reg_perfcount_get_hkpd(prs_struct *ps, uint32 max_buf_size, uint32 *outbuf_len, const char *object_ids); /* The following definitions come from registry/reg_util.c */ diff --git a/source3/include/rpc_perfcount.h b/source3/include/rpc_perfcount.h deleted file mode 100644 index 0cb2fdc212..0000000000 --- a/source3/include/rpc_perfcount.h +++ /dev/null @@ -1,126 +0,0 @@ -#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 */ diff --git a/source3/include/rpc_perfcount_defs.h b/source3/include/rpc_perfcount_defs.h deleted file mode 100644 index 6c84c270e5..0000000000 --- a/source3/include/rpc_perfcount_defs.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef _RPC_PERFCOUNT_DEFS_H -#define _RPC_PERFCOUNT_DEFS_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/>. - */ - -/* - * The following #defines match what is in winperf.h. - * See that include file for more details, or look up - * "Performance Data Format" on MSDN - * - * Rather than including them in rpc_perfcount.h, they - * were broken out into a separate .h file so that they - * can be included by other programs that need this info - * without pulling in everything else samba-related. - */ - -#define PERF_NO_INSTANCES -1 -#define PERF_NO_UNIQUE_ID -1 - -/* These determine the data size */ -#define PERF_SIZE_DWORD 0x00000000 -#define PERF_SIZE_LARGE 0x00000100 -#define PERF_SIZE_ZERO 0x00000200 -#define PERF_SIZE_VARIABLE_LEN 0x00000300 - -/* These determine the usage of the counter */ -#define PERF_TYPE_NUMBER 0x00000000 -#define PERF_TYPE_COUNTER 0x00000400 -#define PERF_TYPE_TEXT 0x00000800 -#define PERF_TYPE_ZERO 0x00000C00 - -/* If PERF_TYPE_NUMBER was selected, these provide display information */ -#define PERF_NUMBER_HEX 0x00000000 -#define PERF_NUMBER_DECIMAL 0x00010000 -#define PERF_NUMBER_DEC_1000 0x00020000 - -/* If PERF_TYPE_COUNTER was selected, these provide display information */ -#define PERF_COUNTER_VALUE 0x00000000 -#define PERF_COUNTER_RATE 0x00010000 -#define PERF_COUNTER_FRACTION 0x00020000 -#define PERF_COUNTER_BASE 0x00030000 -#define PERF_COUNTER_ELAPSED 0x00040000 -#define PERF_COUNTER_QUEUELEN 0x00050000 -#define PERF_COUNTER_HISTOGRAM 0x00060000 -#define PERF_COUNTER_PRECISION 0x00070000 - -/* If PERF_TYPE_TEXT was selected, these provide display information */ -#define PERF_TEXT_UNICODE 0x00000000 -#define PERF_TEXT_ASCII 0x00010000 - -/* These provide information for which tick count to use when computing elapsed interval */ -#define PERF_TIMER_TICK 0x00000000 -#define PERF_TIMER_100NS 0x00100000 -#define PERF_OBJECT_TIMER 0x00200000 - -/* These affect how the data is manipulated prior to being displayed */ -#define PERF_DELTA_COUNTER 0x00400000 -#define PERF_DELTA_BASE 0x00800000 -#define PERF_INVERSE_COUNTER 0x01000000 -#define PERF_MULTI_COUNTER 0x02000000 - -/* These determine if any text gets added when the value is displayed */ -#define PERF_DISPLAY_NO_SUFFIX 0x00000000 -#define PERF_DISPLAY_PER_SEC 0x10000000 -#define PERF_DISPLAY_PERCENT 0x20000000 -#define PERF_DISPLAY_SECONDS 0x30000000 -#define PERF_DISPLAY_NOSHOW 0x40000000 - -/* These determine the DetailLevel of the counter */ -#define PERF_DETAIL_NOVICE 100 -#define PERF_DETAIL_ADVANCED 200 -#define PERF_DETAIL_EXPERT 300 -#define PERF_DETAIL_WIZARD 400 - -#endif /* _RPC_PERFCOUNT_DEFS_H */ diff --git a/source3/registry/reg_perfcount.c b/source3/registry/reg_perfcount.c index 82b6ee277b..1991af10ca 100644 --- a/source3/registry/reg_perfcount.c +++ b/source3/registry/reg_perfcount.c @@ -365,6 +365,11 @@ static uint32 _reg_perfcount_get_numinst(int objInd, TDB_CONTEXT *names) /********************************************************************* *********************************************************************/ +static bool _reg_perfcount_add_instance(struct PERF_OBJECT_TYPE *obj, + TALLOC_CTX *mem_ctx, + int instInd, + TDB_CONTEXT *names); + static bool _reg_perfcount_add_object(struct PERF_DATA_BLOCK *block, TALLOC_CTX *mem_ctx, int num, @@ -407,7 +412,7 @@ static bool _reg_perfcount_add_object(struct PERF_DATA_BLOCK *block, /********************************************************************* *********************************************************************/ -bool _reg_perfcount_get_counter_data(TDB_DATA key, TDB_DATA *data) +static bool _reg_perfcount_get_counter_data(TDB_DATA key, TDB_DATA *data) { TDB_CONTEXT *counters; const char *fname = counters_directory( DATA_DB ); @@ -660,11 +665,11 @@ static bool _reg_perfcount_add_counter(struct PERF_DATA_BLOCK *block, /********************************************************************* *********************************************************************/ -bool _reg_perfcount_get_instance_info(struct PERF_INSTANCE_DEFINITION *inst, - TALLOC_CTX *mem_ctx, - int instId, - struct PERF_OBJECT_TYPE *obj, - TDB_CONTEXT *names) +static bool _reg_perfcount_get_instance_info(struct PERF_INSTANCE_DEFINITION *inst, + TALLOC_CTX *mem_ctx, + int instId, + struct PERF_OBJECT_TYPE *obj, + TDB_CONTEXT *names) { TDB_DATA key, data; char buf[PERFCOUNT_MAX_LEN], temp[PERFCOUNT_MAX_LEN]; @@ -754,10 +759,10 @@ bool _reg_perfcount_get_instance_info(struct PERF_INSTANCE_DEFINITION *inst, /********************************************************************* *********************************************************************/ -bool _reg_perfcount_add_instance(struct PERF_OBJECT_TYPE *obj, - TALLOC_CTX *mem_ctx, - int instInd, - TDB_CONTEXT *names) +static bool _reg_perfcount_add_instance(struct PERF_OBJECT_TYPE *obj, + TALLOC_CTX *mem_ctx, + int instInd, + TDB_CONTEXT *names) { struct PERF_INSTANCE_DEFINITION *inst; @@ -961,7 +966,7 @@ static bool _reg_perfcount_init_data_block(struct PERF_DATA_BLOCK *block, /********************************************************************* *********************************************************************/ -static uint32 _reg_perfcount_perf_data_block_fixup(struct PERF_DATA_BLOCK *block, prs_struct *ps) +static uint32 _reg_perfcount_perf_data_block_fixup(struct PERF_DATA_BLOCK *block, TALLOC_CTX *mem_ctx) { int obj, cnt, inst, pad, i; struct PERF_OBJECT_TYPE *object; @@ -992,7 +997,7 @@ static uint32 _reg_perfcount_perf_data_block_fixup(struct PERF_DATA_BLOCK *block counter_data = &(instance->counter_data); counter = &(object[obj].counters[object[obj].NumCounters - 1]); counter_data->ByteLength = counter->CounterOffset + counter->CounterSize + sizeof(counter_data->ByteLength); - temp = TALLOC_REALLOC_ARRAY(ps->mem_ctx, + temp = TALLOC_REALLOC_ARRAY(mem_ctx, temp, char, counter_data->ByteLength- sizeof(counter_data->ByteLength)); @@ -1013,7 +1018,7 @@ static uint32 _reg_perfcount_perf_data_block_fixup(struct PERF_DATA_BLOCK *block { pad = 8 - pad; } - counter_data->data = TALLOC_REALLOC_ARRAY(ps->mem_ctx, + counter_data->data = TALLOC_REALLOC_ARRAY(mem_ctx, counter_data->data, uint8, counter_data->ByteLength - sizeof(counter_data->ByteLength) + pad); @@ -1033,7 +1038,7 @@ static uint32 _reg_perfcount_perf_data_block_fixup(struct PERF_DATA_BLOCK *block if((pad = (object[obj].counter_data.ByteLength % 8))) { pad = 8 - pad; - object[obj].counter_data.data = TALLOC_REALLOC_ARRAY(ps->mem_ctx, + object[obj].counter_data.data = TALLOC_REALLOC_ARRAY(mem_ctx, object[obj].counter_data.data, uint8, object[obj].counter_data.ByteLength + pad); @@ -1055,10 +1060,11 @@ static uint32 _reg_perfcount_perf_data_block_fixup(struct PERF_DATA_BLOCK *block /********************************************************************* *********************************************************************/ -uint32 reg_perfcount_get_perf_data_block(uint32 base_index, - prs_struct *ps, - struct PERF_DATA_BLOCK *block, - const char *object_ids) +static uint32 reg_perfcount_get_perf_data_block(uint32 base_index, + TALLOC_CTX *mem_ctx, + struct PERF_DATA_BLOCK *block, + const char *object_ids, + bool bigendian_data) { uint32 buffer_size = 0; const char *fname = counters_directory( NAMES_DB ); @@ -1073,7 +1079,7 @@ uint32 reg_perfcount_get_perf_data_block(uint32 base_index, return 0; } - if (!_reg_perfcount_init_data_block(block, ps->mem_ctx, names, ps->bigendian_data)) { + if (!_reg_perfcount_init_data_block(block, mem_ctx, names, bigendian_data)) { DEBUG(0, ("_reg_perfcount_init_data_block failed\n")); tdb_close(names); return 0; @@ -1084,14 +1090,14 @@ uint32 reg_perfcount_get_perf_data_block(uint32 base_index, if(object_ids == NULL) { /* we're getting a request for "Global" here */ - retval = _reg_perfcount_assemble_global(block, ps->mem_ctx, base_index, names); + retval = _reg_perfcount_assemble_global(block, mem_ctx, base_index, names); } else { /* we're getting a request for a specific set of PERF_OBJECT_TYPES */ - retval = _reg_perfcount_assemble_global(block, ps->mem_ctx, base_index, names); + retval = _reg_perfcount_assemble_global(block, mem_ctx, base_index, names); } - buffer_size = _reg_perfcount_perf_data_block_fixup(block, ps); + buffer_size = _reg_perfcount_perf_data_block_fixup(block, mem_ctx); tdb_close(names); @@ -1362,20 +1368,6 @@ static bool _reg_perfcount_marshall_perf_objects(prs_struct *ps, struct PERF_DAT /********************************************************************* *********************************************************************/ -static bool _reg_perfcount_marshall_hkpd(prs_struct *ps, struct PERF_DATA_BLOCK block) -{ - int depth = 0; - if(_reg_perfcount_marshall_perf_data_block(ps, block, depth) == True) - { - if(_reg_perfcount_marshall_perf_objects(ps, block, depth) == True) - return True; - } - return False; -} - -/********************************************************************* -*********************************************************************/ - WERROR reg_perfcount_get_hkpd(prs_struct *ps, uint32 max_buf_size, uint32 *outbuf_len, const char *object_ids) { /* @@ -1393,20 +1385,26 @@ WERROR reg_perfcount_get_hkpd(prs_struct *ps, uint32 max_buf_size, uint32 *outbu base_index = reg_perfcount_get_base_index(); ZERO_STRUCT(block); - buffer_size = reg_perfcount_get_perf_data_block(base_index, ps, &block, object_ids); + buffer_size = reg_perfcount_get_perf_data_block(base_index, ps->mem_ctx, &block, object_ids, ps->bigendian_data); if(buffer_size < max_buf_size) { *outbuf_len = buffer_size; - if(_reg_perfcount_marshall_hkpd(ps, block) == True) - return WERR_OK; - else + + if (!_reg_perfcount_marshall_perf_data_block(ps, block, 0)) return WERR_NOMEM; + + if (!_reg_perfcount_marshall_perf_objects(ps, block, 0)) + return WERR_NOMEM; + + return WERR_OK; } else { *outbuf_len = max_buf_size; - _reg_perfcount_marshall_perf_data_block(ps, block, 0); + if (!_reg_perfcount_marshall_perf_data_block(ps, block, 0)) + return WERR_NOMEM; + return WERR_INSUFFICIENT_BUFFER; } } |