Line data Source code
1 : /* 2 : * Unix SMB/CIFS implementation. 3 : * Virtual Windows Registry Layer 4 : * Copyright (C) Gerald Carter 2002-2005 5 : * Copyright (C) Michael Adam 2008 6 : * 7 : * This program is free software; you can redistribute it and/or modify 8 : * it under the terms of the GNU General Public License as published by 9 : * the Free Software Foundation; either version 3 of the License, or 10 : * (at your option) any later version. 11 : * 12 : * This program is distributed in the hope that it will be useful, 13 : * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 : * GNU General Public License for more details. 16 : * 17 : * You should have received a copy of the GNU General Public License 18 : * along with this program; if not, see <http://www.gnu.org/licenses/>. 19 : */ 20 : 21 : /* 22 : * perflib registry backend. 23 : * 24 : * This is a virtual overlay, dynamically presenting perflib values. 25 : */ 26 : 27 : #include "includes.h" 28 : #include "registry.h" 29 : #include "reg_util_internal.h" 30 : #include "reg_perfcount.h" 31 : #include "reg_objects.h" 32 : 33 : #undef DBGC_CLASS 34 : #define DBGC_CLASS DBGC_REGISTRY 35 : 36 : extern struct registry_ops regdb_ops; 37 : 38 : #define KEY_PERFLIB_NORM "HKLM\\SOFTWARE\\MICROSOFT\\WINDOWS NT\\CURRENTVERSION\\PERFLIB" 39 : #define KEY_PERFLIB_009_NORM "HKLM\\SOFTWARE\\MICROSOFT\\WINDOWS NT\\CURRENTVERSION\\PERFLIB\\009" 40 : 41 0 : static int perflib_params(struct regval_ctr *regvals) 42 : { 43 0 : int base_index = -1; 44 0 : int last_counter = -1; 45 0 : int last_help = -1; 46 0 : int version = 0x00010001; 47 : 48 0 : base_index = reg_perfcount_get_base_index(); 49 0 : regval_ctr_addvalue(regvals, "Base Index", REG_DWORD, (uint8_t *)&base_index, sizeof(base_index)); 50 0 : last_counter = reg_perfcount_get_last_counter(base_index); 51 0 : regval_ctr_addvalue(regvals, "Last Counter", REG_DWORD, (uint8_t *)&last_counter, sizeof(last_counter)); 52 0 : last_help = reg_perfcount_get_last_help(last_counter); 53 0 : regval_ctr_addvalue(regvals, "Last Help", REG_DWORD, (uint8_t *)&last_help, sizeof(last_help)); 54 0 : regval_ctr_addvalue(regvals, "Version", REG_DWORD, (uint8_t *)&version, sizeof(version)); 55 : 56 0 : return regval_ctr_numvals( regvals ); 57 : } 58 : 59 0 : static int perflib_009_params(struct regval_ctr *regvals) 60 : { 61 0 : int base_index; 62 0 : int buffer_size; 63 0 : char *buffer = NULL; 64 : 65 0 : base_index = reg_perfcount_get_base_index(); 66 0 : buffer_size = reg_perfcount_get_counter_names(base_index, &buffer); 67 0 : regval_ctr_addvalue(regvals, "Counter", REG_MULTI_SZ, (uint8_t *)buffer, buffer_size); 68 0 : if(buffer_size > 0) 69 0 : SAFE_FREE(buffer); 70 0 : buffer_size = reg_perfcount_get_counter_help(base_index, &buffer); 71 0 : regval_ctr_addvalue(regvals, "Help", REG_MULTI_SZ, (uint8_t *)buffer, buffer_size); 72 0 : if(buffer_size > 0) 73 0 : SAFE_FREE(buffer); 74 : 75 0 : return regval_ctr_numvals( regvals ); 76 : } 77 : 78 0 : static int perflib_fetch_values(const char *key, struct regval_ctr *regvals) 79 : { 80 0 : char *path = NULL; 81 0 : TALLOC_CTX *ctx = talloc_tos(); 82 : 83 0 : path = talloc_strdup(ctx, key); 84 0 : if (path == NULL) { 85 0 : return -1; 86 : } 87 0 : path = normalize_reg_path(ctx, path); 88 0 : if (path == NULL) { 89 0 : return -1; 90 : } 91 : 92 0 : if (strncmp(path, KEY_PERFLIB_NORM, strlen(path)) == 0) { 93 0 : return perflib_params(regvals); 94 0 : } else if (strncmp(path, KEY_PERFLIB_009_NORM, strlen(path)) == 0) { 95 0 : return perflib_009_params(regvals); 96 : } else { 97 0 : return 0; 98 : } 99 : } 100 : 101 0 : static int perflib_fetch_subkeys(const char *key, 102 : struct regsubkey_ctr *subkey_ctr) 103 : { 104 0 : return regdb_ops.fetch_subkeys(key, subkey_ctr); 105 : } 106 : 107 : struct registry_ops perflib_reg_ops = { 108 : .fetch_values = perflib_fetch_values, 109 : .fetch_subkeys = perflib_fetch_subkeys, 110 : };