00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "includes.h"
00024
00025 #undef DBGC_CLASS
00026 #define DBGC_CLASS DBGC_RPC_SRV
00027
00028 struct reg_dyn_values {
00029 const char *path;
00030 int (*fetch_values) ( REGVAL_CTR *val );
00031 };
00032
00033
00034
00035
00036 static int netlogon_params( REGVAL_CTR *regvals )
00037 {
00038 uint32 dwValue;
00039
00040 if ( !pdb_get_account_policy(AP_REFUSE_MACHINE_PW_CHANGE, &dwValue) )
00041 dwValue = 0;
00042
00043 regval_ctr_addvalue( regvals, "RefusePasswordChange", REG_DWORD,
00044 (char*)&dwValue, sizeof(dwValue) );
00045
00046 return regval_ctr_numvals( regvals );
00047 }
00048
00049
00050
00051
00052 static int prod_options( REGVAL_CTR *regvals )
00053 {
00054 const char *value_ascii = "";
00055 fstring value;
00056 int value_length;
00057
00058 switch (lp_server_role()) {
00059 case ROLE_DOMAIN_PDC:
00060 case ROLE_DOMAIN_BDC:
00061 value_ascii = "LanmanNT";
00062 break;
00063 case ROLE_STANDALONE:
00064 value_ascii = "ServerNT";
00065 break;
00066 case ROLE_DOMAIN_MEMBER:
00067 value_ascii = "WinNT";
00068 break;
00069 }
00070
00071 value_length = push_ucs2( value, value, value_ascii, sizeof(value),
00072 STR_TERMINATE|STR_NOALIGN );
00073 regval_ctr_addvalue( regvals, "ProductType", REG_SZ, value,
00074 value_length );
00075
00076 return regval_ctr_numvals( regvals );
00077 }
00078
00079
00080
00081
00082 static int tcpip_params( REGVAL_CTR *regvals )
00083 {
00084 fstring value;
00085 int value_length;
00086 char *hname;
00087 fstring mydomainname;
00088
00089
00090 hname = myhostname();
00091 value_length = push_ucs2( value, value, hname, sizeof(value), STR_TERMINATE|STR_NOALIGN);
00092 regval_ctr_addvalue( regvals, "Hostname",REG_SZ, value, value_length );
00093
00094 get_mydnsdomname( mydomainname );
00095 value_length = push_ucs2( value, value, mydomainname, sizeof(value), STR_TERMINATE|STR_NOALIGN);
00096 regval_ctr_addvalue( regvals, "Domain", REG_SZ, value, value_length );
00097
00098 return regval_ctr_numvals( regvals );
00099 }
00100
00101
00102
00103
00104 static int perflib_params( REGVAL_CTR *regvals )
00105 {
00106 int base_index = -1;
00107 int last_counter = -1;
00108 int last_help = -1;
00109 int version = 0x00010001;
00110
00111 base_index = reg_perfcount_get_base_index();
00112 regval_ctr_addvalue(regvals, "Base Index", REG_DWORD, (char *)&base_index, sizeof(base_index));
00113 last_counter = reg_perfcount_get_last_counter(base_index);
00114 regval_ctr_addvalue(regvals, "Last Counter", REG_DWORD, (char *)&last_counter, sizeof(last_counter));
00115 last_help = reg_perfcount_get_last_help(last_counter);
00116 regval_ctr_addvalue(regvals, "Last Help", REG_DWORD, (char *)&last_help, sizeof(last_help));
00117 regval_ctr_addvalue(regvals, "Version", REG_DWORD, (char *)&version, sizeof(version));
00118
00119 return regval_ctr_numvals( regvals );
00120 }
00121
00122
00123
00124
00125 static int perflib_009_params( REGVAL_CTR *regvals )
00126 {
00127 int base_index;
00128 int buffer_size;
00129 char *buffer = NULL;
00130
00131 base_index = reg_perfcount_get_base_index();
00132 buffer_size = reg_perfcount_get_counter_names(base_index, &buffer);
00133 regval_ctr_addvalue(regvals, "Counter", REG_MULTI_SZ, buffer, buffer_size);
00134 if(buffer_size > 0)
00135 SAFE_FREE(buffer);
00136 buffer_size = reg_perfcount_get_counter_help(base_index, &buffer);
00137 regval_ctr_addvalue(regvals, "Help", REG_MULTI_SZ, buffer, buffer_size);
00138 if(buffer_size > 0)
00139 SAFE_FREE(buffer);
00140
00141 return regval_ctr_numvals( regvals );
00142 }
00143
00144
00145
00146
00147 static int hkpt_params( REGVAL_CTR *regvals )
00148 {
00149 uint32 base_index;
00150 uint32 buffer_size;
00151 char *buffer = NULL;
00152
00153
00154
00155
00156 base_index = reg_perfcount_get_base_index();
00157 buffer_size = reg_perfcount_get_counter_names(base_index, &buffer);
00158 regval_ctr_addvalue(regvals, "Counters", REG_MULTI_SZ, buffer, buffer_size);
00159
00160 if(buffer_size > 0)
00161 SAFE_FREE(buffer);
00162
00163 buffer_size = reg_perfcount_get_counter_help(base_index, &buffer);
00164 regval_ctr_addvalue(regvals, "Help", REG_MULTI_SZ, buffer, buffer_size);
00165 if(buffer_size > 0)
00166 SAFE_FREE(buffer);
00167
00168 return regval_ctr_numvals( regvals );
00169 }
00170
00171
00172
00173
00174 static int current_version( REGVAL_CTR *values )
00175 {
00176 const char *sysroot_string = "c:\\Windows";
00177 fstring sysversion;
00178 fstring value;
00179 uint32 value_length;
00180
00181 value_length = push_ucs2( value, value, sysroot_string, sizeof(value),
00182 STR_TERMINATE|STR_NOALIGN );
00183 regval_ctr_addvalue( values, "SystemRoot", REG_SZ, value, value_length );
00184
00185 fstr_sprintf( sysversion, "%d.%d", lp_major_announce_version(), lp_minor_announce_version() );
00186 value_length = push_ucs2( value, value, sysversion, sizeof(value),
00187 STR_TERMINATE|STR_NOALIGN );
00188 regval_ctr_addvalue( values, "CurrentVersion", REG_SZ, value, value_length );
00189
00190
00191 return regval_ctr_numvals( values );
00192 }
00193
00194
00195
00196
00197
00198
00199
00200 static struct reg_dyn_values dynamic_values[] = {
00201 { "HKLM/SYSTEM/CURRENTCONTROLSET/SERVICES/NETLOGON/PARAMETERS", &netlogon_params },
00202 { "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRODUCTOPTIONS", &prod_options },
00203 { "HKLM/SYSTEM/CURRENTCONTROLSET/SERVICES/TCPIP/PARAMETERS", &tcpip_params },
00204 { "HKLM/SOFTWARE/MICROSOFT/WINDOWS NT/CURRENTVERSION/PERFLIB", &perflib_params },
00205 { "HKLM/SOFTWARE/MICROSOFT/WINDOWS NT/CURRENTVERSION/PERFLIB/009", &perflib_009_params },
00206 { "HKLM/SOFTWARE/MICROSOFT/WINDOWS NT/CURRENTVERSION", ¤t_version },
00207 { "HKPT", &hkpt_params },
00208 { NULL, NULL }
00209 };
00210
00211
00212
00213
00214 int fetch_dynamic_reg_values( REGISTRY_KEY *key, REGVAL_CTR *val )
00215 {
00216 int i;
00217 pstring path;
00218
00219 pstrcpy( path, key->name );
00220 normalize_reg_path( path );
00221
00222 for ( i=0; dynamic_values[i].path; i++ ) {
00223 if ( strcmp( path, dynamic_values[i].path ) == 0 )
00224 return dynamic_values[i].fetch_values( val );
00225 }
00226
00227 return -1;
00228 }
00229
00230
00231
00232
00233 BOOL check_dynamic_reg_values( REGISTRY_KEY *key )
00234 {
00235 int i;
00236 pstring path;
00237
00238 pstrcpy( path, key->name );
00239 normalize_reg_path( path );
00240
00241 for ( i=0; dynamic_values[i].path; i++ ) {
00242
00243 if ( strcmp( path, dynamic_values[i].path ) == 0 )
00244 return True;
00245 }
00246
00247 return False;
00248 }
00249