registry/reg_dynamic.c

説明を見る。
00001 /* 
00002  *  Unix SMB/CIFS implementation.
00003  *  Virtual Windows Registry Layer
00004  *  Copyright (C) Gerald Carter                     2002-2005
00005  *
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License as published by
00008  *  the Free Software Foundation; either version 2 of the License, or
00009  *  (at your option) any later version.
00010  *  
00011  *  This program is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *  GNU General Public License for more details.
00015  *  
00016  *  You should have received a copy of the GNU General Public License
00017  *  along with this program; if not, write to the Free Software
00018  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00019  */
00020 
00021 /* Implementation of registry frontend view functions. */
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         /* This is ALMOST the same as perflib_009_params, but HKPT has
00154            a "Counters" entry instead of a "Counter" key. <Grrrr> */
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  Structure holding the registry paths and pointers to the value 
00197  enumeration functions
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",          &current_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                 /* can't write to dynamic keys */
00243                 if ( strcmp( path, dynamic_values[i].path ) == 0 )
00244                         return True;
00245         }
00246         
00247         return False;
00248 }
00249 

Sambaに対してSat Aug 29 21:23:15 2009に生成されました。  doxygen 1.4.7