From 5a6057b696ec1176b06cd38a513c4e4b4fc1db54 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Thu, 30 Jun 2005 17:46:06 +0000 Subject: [PATCH] r8022: * implement default actions rather than having to define functions for every fetch/store callback (some keys should never have a value) --- source/registry/reg_printing.c | 1124 +++++++++++++++++++--------------------- 1 file changed, 532 insertions(+), 592 deletions(-) diff --git a/source/registry/reg_printing.c b/source/registry/reg_printing.c index 1d101315a14..c5898f8e755 100644 --- a/source/registry/reg_printing.c +++ b/source/registry/reg_printing.c @@ -30,6 +30,8 @@ #define KEY_MONITORS "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRINT/MONITORS" #define KEY_FORMS "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRINT/FORMS" #define KEY_CONTROL_PRINTERS "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRINT/PRINTERS" +#define KEY_DRIVERS "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRINT/ENVIRONMENTS/.../DRIVERS" +#define KEY_PRINTPROC "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRINT/ENVIRONMENTS/.../PRINTPROC" #define KEY_ENVIRONMENTS "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRINT/ENVIRONMENTS" #define KEY_CONTROL_PRINT "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRINT" #define KEY_WINNT_PRINTERS "HKLM/SOFTWARE/MICROSOFT/WINDOWS NT/CURRENTVERSION/PRINT/PRINTERS" @@ -51,458 +53,111 @@ struct reg_dyn_tree { #if 0 /* UNUSED */ -#define MAX_TOP_LEVEL_KEYS 3 - -/* some symbolic indexes into the top_level_keys */ - -#define KEY_INDEX_ENVIR 0 -#define KEY_INDEX_FORMS 1 -#define KEY_INDEX_PRINTER 2 - -static const char *top_level_keys[MAX_TOP_LEVEL_KEYS] = { - "Environments", - "Forms", - "Printers" -}; - /********************************************************************** - handle enumeration of subkeys below KEY_PRINTING\Environments - Environments\$ARCH\Print Processors - Environments\$ARCH\Drivers\{0,2,3} + handle enumeration of subkeys below KEY_PRINTING\Printers *********************************************************************/ -#define ENVIRONMENT_DRIVERS 1 -#define ENVIRONMENT_PRINTPROC 2 - -static int print_subpath_environments( char *key, REGSUBKEY_CTR *subkeys ) +static int print_subpath_printers( char *key, REGSUBKEY_CTR *subkeys ) { - const char *environments[] = { - "Windows 4.0", - "Windows NT x86", - "Windows NT R4000", - "Windows NT Alpha_AXP", - "Windows NT PowerPC", - "Windows IA64", - "Windows x64", - NULL }; - fstring *drivers = NULL; - int i, env_index, num_drivers; - char *keystr, *base, *subkeypath; - pstring key2; - int num_subkeys = -1; - int env_subkey_type = 0; - int version; - - DEBUG(10,("print_subpath_environments: key=>[%s]\n", key ? key : "NULL" )); + int n_services = lp_numservices(); + int snum; + fstring sname; + int i; + int num_subkeys = 0; + char *keystr, *key2 = NULL; + char *base, *new_path; + NT_PRINTER_INFO_LEVEL *printer = NULL; + fstring *subkey_names = NULL; - /* list all possible architectures */ + DEBUG(10,("print_subpath_printers: key=>[%s]\n", key ? key : "NULL" )); - if ( !key ) { - for ( num_subkeys=0; environments[num_subkeys]; num_subkeys++ ) - regsubkey_ctr_addkey( subkeys, environments[num_subkeys] ); + if ( !key ) + { + /* enumerate all printers */ + + for (snum=0; snuminfo_2->data, new_path?new_path:"", &subkey_names ); - if ( !subkeypath ) { - num_drivers = get_ntdrivers( &drivers, environments[env_index], version ); - for ( i=0; i\\ + handle enumeration of values below KEY_PRINTING\Printers *********************************************************************/ -static int print_subpath_values_environments( char *key, REGVAL_CTR *val ) +static int print_subpath_values_printers( char *key, REGVAL_CTR *val ) { - char *keystr, *base, *subkeypath; - pstring key2; - fstring arch_environment; - fstring driver; - int version; - NT_PRINTER_DRIVER_INFO_LEVEL driver_ctr; - NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3; - WERROR w_result; - char *buffer = NULL; - char *buffer2 = NULL; - int buffer_size = 0; - int i, length; - char *filename; + int num_values = 0; + char *keystr, *key2 = NULL; + char *base, *new_path; + NT_PRINTER_INFO_LEVEL *printer = NULL; + NT_PRINTER_INFO_LEVEL_2 *info2; + DEVICEMODE *devmode; + prs_struct prs; + uint32 offset; + int snum; + fstring printername; + NT_PRINTER_DATA *p_data; + int i, key_index; UNISTR2 data; - int env_subkey_type = 0; - - - DEBUG(8,("print_subpath_values_environments: Enter key => [%s]\n", key ? key : "NULL")); - - if ( !key ) - return 0; - - /* The only keys below KEY_PRINTING\Environments is the - specific printer driver info */ - /* environment */ + /* + * Theres are tw cases to deal with here + * (1) enumeration of printer_info_2 values + * (2) enumeration of the PrinterDriverData subney + */ + + if ( !key ) { + /* top level key has no values */ + goto done; + } - pstrcpy( key2, key ); + key2 = SMB_STRDUP( key ); keystr = key2; - reg_split_path( keystr, &base, &subkeypath ); - if ( !subkeypath ) - return 0; - fstrcpy( arch_environment, base ); + reg_split_path( keystr, &base, &new_path ); - /* Driver */ + fstrcpy( printername, base ); - keystr = subkeypath; - reg_split_path( keystr, &base, &subkeypath ); - - if ( strequal(base, "Drivers") ) - env_subkey_type = ENVIRONMENT_DRIVERS; - else if ( strequal(base, "Print Processors") ) - env_subkey_type = ENVIRONMENT_PRINTPROC; - else - /* invalid path */ - return -1; - - if ( !subkeypath ) - return 0; - - /* for now bail out if we are seeing anything other than the drivers key */ - - if ( env_subkey_type == ENVIRONMENT_PRINTPROC ) - return 0; - - keystr = subkeypath; - reg_split_path( keystr, &base, &subkeypath ); - - version = atoi(&base[strlen(base)-1]); - - /* printer driver name */ - - keystr = subkeypath; - reg_split_path( keystr, &base, &subkeypath ); - /* don't go any deeper for now */ - if ( subkeypath ) - return 0; - fstrcpy( driver, base ); - - w_result = get_a_printer_driver( &driver_ctr, 3, driver, arch_environment, version ); - - if ( !W_ERROR_IS_OK(w_result) ) - return -1; - - /* build the values out of the driver information */ - info3 = driver_ctr.info_3; - - filename = dos_basename( info3->driverpath ); - init_unistr2( &data, filename, UNI_STR_TERMINATE); - regval_ctr_addvalue( val, "Driver", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); - - filename = dos_basename( info3->configfile ); - init_unistr2( &data, filename, UNI_STR_TERMINATE); - regval_ctr_addvalue( val, "Configuration File", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); - - filename = dos_basename( info3->datafile ); - init_unistr2( &data, filename, UNI_STR_TERMINATE); - regval_ctr_addvalue( val, "Data File", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); - - filename = dos_basename( info3->helpfile ); - init_unistr2( &data, filename, UNI_STR_TERMINATE); - regval_ctr_addvalue( val, "Help File", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); - - init_unistr2( &data, info3->defaultdatatype, UNI_STR_TERMINATE); - regval_ctr_addvalue( val, "Data Type", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); - - regval_ctr_addvalue( val, "Version", REG_DWORD, (char*)&info3->cversion, sizeof(info3->cversion) ); - - if ( info3->dependentfiles ) { - /* place the list of dependent files in a single - character buffer, separating each file name by - a NULL */ - - for ( i=0; strcmp(info3->dependentfiles[i], ""); i++ ) { - /* strip the path to only the file's base name */ - - filename = dos_basename( info3->dependentfiles[i] ); - - length = strlen(filename); - - buffer2 = SMB_REALLOC( buffer, buffer_size + (length + 1)*sizeof(uint16) ); - if ( !buffer2 ) - break; - buffer = buffer2; - - init_unistr2( &data, filename, UNI_STR_TERMINATE); - memcpy( buffer+buffer_size, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); - - buffer_size += (length + 1)*sizeof(uint16); - } - - /* terminated by double NULL. Add the final one here */ - - buffer2 = SMB_REALLOC( buffer, buffer_size + 2 ); - if ( !buffer2 ) { - SAFE_FREE( buffer ); - buffer_size = 0; - } else { - buffer = buffer2; - buffer[buffer_size++] = '\0'; - buffer[buffer_size++] = '\0'; - } - } - - regval_ctr_addvalue( val, "Dependent Files", REG_MULTI_SZ, buffer, buffer_size ); - - free_a_printer_driver( driver_ctr, 3 ); - - SAFE_FREE( buffer ); - - DEBUG(8,("print_subpath_values_environments: Exit\n")); - - return regval_ctr_numvals( val ); -} - - -/********************************************************************** - handle enumeration of subkeys below KEY_PRINTING\Forms - Really just a stub function, but left here in case it needs to - be expanded later on - *********************************************************************/ - -static int print_subpath_forms( char *key, REGSUBKEY_CTR *subkeys ) -{ - DEBUG(10,("print_subpath_forms: key=>[%s]\n", key ? key : "NULL" )); - - /* there are no subkeys */ - - if ( key ) - return -1; - - return 0; -} - -/********************************************************************** - handle enumeration of subkeys below KEY_PRINTING\Printers - *********************************************************************/ - -static int print_subpath_printers( char *key, REGSUBKEY_CTR *subkeys ) -{ - int n_services = lp_numservices(); - int snum; - fstring sname; - int i; - int num_subkeys = 0; - char *keystr, *key2 = NULL; - char *base, *new_path; - NT_PRINTER_INFO_LEVEL *printer = NULL; - fstring *subkey_names = NULL; - - DEBUG(10,("print_subpath_printers: key=>[%s]\n", key ? key : "NULL" )); - - if ( !key ) - { - /* enumerate all printers */ - - for (snum=0; snuminfo_2->data, new_path?new_path:"", &subkey_names ); - - for ( i=0; i[%s]\n", key ? key : "NULL" )); + + nt_forms_struct *forms_list = NULL; + nt_forms_struct *form = NULL; + + if ( (num_values = get_ntforms( &forms_list )) == 0 ) + return 0; + + DEBUG(10,("hive_forms_fetch_values: [%d] user defined forms returned\n", + num_values)); + + /* handle user defined forms */ + + for ( i=0; iwidth; + data[1] = form->length; + data[2] = form->left; + data[3] = form->top; + data[4] = form->right; + data[5] = form->bottom; + data[6] = form_index++; + data[7] = form->flag; + + regval_ctr_addvalue( values, form->name, REG_BINARY, (char*)data, sizeof(data) ); + } + + SAFE_FREE( forms_list ); + forms_list = NULL; + + /* handle built-on forms */ + + if ( (num_values = get_builtin_ntforms( &forms_list )) == 0 ) + return 0; + + DEBUG(10,("print_subpath_values_forms: [%d] built-in forms returned\n", + num_values)); + + for ( i=0; iwidth; + data[1] = form->length; + data[2] = form->left; + data[3] = form->top; + data[4] = form->right; + data[5] = form->bottom; + data[6] = form_index++; + data[7] = form->flag; + + regval_ctr_addvalue( values, form->name, REG_BINARY, (char*)data, sizeof(data) ); + } + + SAFE_FREE( forms_list ); + + return regval_ctr_numvals( values ); +} + +static BOOL key_forms_store_values( const char *key, REGVAL_CTR *values ) +{ + return True; +} + +/********************************************************************** + *********************************************************************/ + +static int key_printer_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys ) +{ + return 0; +} + +static BOOL key_printer_store_keys( const char *key, REGSUBKEY_CTR *subkeys ) +{ + return True; +} + +static int key_printer_fetch_values( const char *key, REGVAL_CTR *values ) +{ + return 0; +} + +static BOOL key_printer_store_values( const char *key, REGVAL_CTR *values ) +{ + return True; +} + +/********************************************************************** + *********************************************************************/ +#define ENVIRONMENT_DRIVERS 1 +#define ENVIRONMENT_PRINTPROC 2 + +static int key_driver_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys ) +{ + const char *environments[] = { + "Windows 4.0", + "Windows NT x86", + "Windows NT R4000", + "Windows NT Alpha_AXP", + "Windows NT PowerPC", + "Windows IA64", + "Windows x64", + NULL }; + fstring *drivers = NULL; + int i, env_index, num_drivers; + char *keystr, *base, *subkeypath; + pstring key2; + int num_subkeys = -1; + int env_subkey_type = 0; + int version; + + DEBUG(10,("print_subpath_environments: key=>[%s]\n", key ? key : "NULL" )); + + /* list all possible architectures */ + + if ( !key ) { + for ( num_subkeys=0; environments[num_subkeys]; num_subkeys++ ) + regsubkey_ctr_addkey( subkeys, environments[num_subkeys] ); + + return num_subkeys; + } + + /* we are dealing with a subkey of "Environments */ + + pstrcpy( key2, key ); + keystr = key2; + reg_split_path( keystr, &base, &subkeypath ); + + /* sanity check */ + + for ( env_index=0; environments[env_index]; env_index++ ) { + if ( strequal( environments[env_index], base ) ) + break; + } + if ( !environments[env_index] ) + return -1; + + /* ...\Print\Environements\...\ */ + + if ( !subkeypath ) { + regsubkey_ctr_addkey( subkeys, "Drivers" ); + regsubkey_ctr_addkey( subkeys, "Print Processors" ); + + return 2; + } + + /* more of the key path to process */ + + keystr = subkeypath; + reg_split_path( keystr, &base, &subkeypath ); + + /* ...\Print\Environements\...\Drivers\ */ + + if ( strequal(base, "Drivers") ) + env_subkey_type = ENVIRONMENT_DRIVERS; + else if ( strequal(base, "Print Processors") ) + env_subkey_type = ENVIRONMENT_PRINTPROC; + else + /* invalid path */ + return -1; + + if ( !subkeypath ) { + switch ( env_subkey_type ) { + case ENVIRONMENT_DRIVERS: + switch ( env_index ) { + case 0: /* Win9x */ + regsubkey_ctr_addkey( subkeys, "Version-0" ); + break; + default: /* Windows NT based systems */ + regsubkey_ctr_addkey( subkeys, "Version-2" ); + regsubkey_ctr_addkey( subkeys, "Version-3" ); + break; + } + + return regsubkey_ctr_numkeys( subkeys ); + + case ENVIRONMENT_PRINTPROC: + if ( env_index == 1 || env_index == 5 || env_index == 6 ) + regsubkey_ctr_addkey( subkeys, "winprint" ); + + return regsubkey_ctr_numkeys( subkeys ); + } + } + + /* we finally get to enumerate the drivers */ + + keystr = subkeypath; + reg_split_path( keystr, &base, &subkeypath ); + + /* get thr print processors key out of the way */ + if ( env_subkey_type == ENVIRONMENT_PRINTPROC ) { + if ( !strequal( base, "winprint" ) ) + return -1; + return !subkeypath ? 0 : -1; + } + + /* only dealing with drivers from here on out */ + + version = atoi(&base[strlen(base)-1]); + + switch (env_index) { + case 0: + if ( version != 0 ) + return -1; + break; + default: + if ( version != 2 && version != 3 ) + return -1; + break; + } + + + if ( !subkeypath ) { + num_drivers = get_ntdrivers( &drivers, environments[env_index], version ); + for ( i=0; i [%s]\n", key ? key : "NULL")); + + if ( !key ) + return 0; + + /* The only keys below KEY_PRINTING\Environments is the + specific printer driver info */ + + /* environment */ - p = strchr( new_path, '/' ); + pstrcpy( key2, key ); + keystr = key2; + reg_split_path( keystr, &base, &subkeypath ); + if ( !subkeypath ) + return 0; + fstrcpy( arch_environment, base ); - if ( p ) - p++; + /* Driver */ + + keystr = subkeypath; + reg_split_path( keystr, &base, &subkeypath ); + + if ( strequal(base, "Drivers") ) + env_subkey_type = ENVIRONMENT_DRIVERS; + else if ( strequal(base, "Print Processors") ) + env_subkey_type = ENVIRONMENT_PRINTPROC; else - p = new_path; - - return p; -} + /* invalid path */ + return -1; + + if ( !subkeypath ) + return 0; -/********************************************************************** - *********************************************************************/ + /* for now bail out if we are seeing anything other than the drivers key */ + + if ( env_subkey_type == ENVIRONMENT_PRINTPROC ) + return 0; + + keystr = subkeypath; + reg_split_path( keystr, &base, &subkeypath ); + + version = atoi(&base[strlen(base)-1]); -static int key_forms_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return 0; -} + /* printer driver name */ + + keystr = subkeypath; + reg_split_path( keystr, &base, &subkeypath ); + /* don't go any deeper for now */ + if ( subkeypath ) + return 0; + fstrcpy( driver, base ); -static BOOL key_forms_store_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return True; -} + w_result = get_a_printer_driver( &driver_ctr, 3, driver, arch_environment, version ); -static int key_forms_fetch_values( const char *key, REGVAL_CTR *values ) -{ - int num_values = 0; - uint32 data[8]; - int form_index = 1; - int i; + if ( !W_ERROR_IS_OK(w_result) ) + return -1; + + /* build the values out of the driver information */ + info3 = driver_ctr.info_3; - DEBUG(10,("print_values_forms: key=>[%s]\n", key ? key : "NULL" )); + filename = dos_basename( info3->driverpath ); + init_unistr2( &data, filename, UNI_STR_TERMINATE); + regval_ctr_addvalue( values, "Driver", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); - nt_forms_struct *forms_list = NULL; - nt_forms_struct *form = NULL; - - if ( (num_values = get_ntforms( &forms_list )) == 0 ) - return 0; + filename = dos_basename( info3->configfile ); + init_unistr2( &data, filename, UNI_STR_TERMINATE); + regval_ctr_addvalue( values, "Configuration File", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); + + filename = dos_basename( info3->datafile ); + init_unistr2( &data, filename, UNI_STR_TERMINATE); + regval_ctr_addvalue( values, "Data File", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); + + filename = dos_basename( info3->helpfile ); + init_unistr2( &data, filename, UNI_STR_TERMINATE); + regval_ctr_addvalue( values, "Help File", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); + + init_unistr2( &data, info3->defaultdatatype, UNI_STR_TERMINATE); + regval_ctr_addvalue( values, "Data Type", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); + + regval_ctr_addvalue( values, "Version", REG_DWORD, (char*)&info3->cversion, sizeof(info3->cversion) ); + + if ( info3->dependentfiles ) { + /* place the list of dependent files in a single + character buffer, separating each file name by + a NULL */ + + for ( i=0; strcmp(info3->dependentfiles[i], ""); i++ ) { + /* strip the path to only the file's base name */ - DEBUG(10,("hive_forms_fetch_values: [%d] user defined forms returned\n", - num_values)); - - /* handle user defined forms */ - - for ( i=0; iwidth; - data[1] = form->length; - data[2] = form->left; - data[3] = form->top; - data[4] = form->right; - data[5] = form->bottom; - data[6] = form_index++; - data[7] = form->flag; + filename = dos_basename( info3->dependentfiles[i] ); - regval_ctr_addvalue( values, form->name, REG_BINARY, (char*)data, sizeof(data) ); - } + length = strlen(filename); - SAFE_FREE( forms_list ); - forms_list = NULL; + buffer2 = SMB_REALLOC( buffer, buffer_size + (length + 1)*sizeof(uint16) ); + if ( !buffer2 ) + break; + buffer = buffer2; + + init_unistr2( &data, filename, UNI_STR_TERMINATE); + memcpy( buffer+buffer_size, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); - /* handle built-on forms */ + buffer_size += (length + 1)*sizeof(uint16); + } - if ( (num_values = get_builtin_ntforms( &forms_list )) == 0 ) - return 0; + /* terminated by double NULL. Add the final one here */ - DEBUG(10,("print_subpath_values_forms: [%d] built-in forms returned\n", - num_values)); - - for ( i=0; iwidth; - data[1] = form->length; - data[2] = form->left; - data[3] = form->top; - data[4] = form->right; - data[5] = form->bottom; - data[6] = form_index++; - data[7] = form->flag; - - regval_ctr_addvalue( values, form->name, REG_BINARY, (char*)data, sizeof(data) ); + buffer2 = SMB_REALLOC( buffer, buffer_size + 2 ); + if ( !buffer2 ) { + SAFE_FREE( buffer ); + buffer_size = 0; + } else { + buffer = buffer2; + buffer[buffer_size++] = '\0'; + buffer[buffer_size++] = '\0'; + } } + + regval_ctr_addvalue( values, "Dependent Files", REG_MULTI_SZ, buffer, buffer_size ); + + free_a_printer_driver( driver_ctr, 3 ); + + SAFE_FREE( buffer ); - SAFE_FREE( forms_list ); + DEBUG(8,("print_subpath_values_environments: Exit\n")); return regval_ctr_numvals( values ); } -static BOOL key_forms_store_values( const char *key, REGVAL_CTR *values ) -{ - return True; -} - -/********************************************************************** - *********************************************************************/ - -static int key_printer_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return 0; -} - -static BOOL key_printer_store_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return True; -} - -static int key_printer_fetch_values( const char *key, REGVAL_CTR *values ) -{ - return 0; -} - -static BOOL key_printer_store_values( const char *key, REGVAL_CTR *values ) -{ - return True; -} - -/********************************************************************** - *********************************************************************/ - -static int key_driver_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return 0; -} - -static BOOL key_driver_store_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return True; -} - -static int key_driver_fetch_values( const char *key, REGVAL_CTR *values ) -{ - return 0; -} - static BOOL key_driver_store_values( const char *key, REGVAL_CTR *values ) { return True; } /********************************************************************** + Deal with the 'Print' key the same whether it came from SYSTEM + or SOFTWARE *********************************************************************/ static int key_print_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return 0; -} - -static BOOL key_print_store_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return True; -} - -static int key_print_fetch_values( const char *key, REGVAL_CTR *values ) -{ - return 0; -} +{ + int key_len = strlen(key); + + /* no keys below 'Print' handled here */ + + if ( (key_len != strlen(KEY_CONTROL_PRINT)) && (key_len != strlen(KEY_WINNT_PRINT)) ) + return -1; -static BOOL key_print_store_values( const char *key, REGVAL_CTR *values ) -{ - return True; + regsubkey_ctr_addkey( subkeys, "Environments" ); + regsubkey_ctr_addkey( subkeys, "Monitors" ); + regsubkey_ctr_addkey( subkeys, "Forms" ); + regsubkey_ctr_addkey( subkeys, "Printers" ); + + return regsubkey_ctr_numkeys( subkeys ); } /********************************************************************** @@ -957,40 +904,18 @@ static BOOL key_ports_store_values( const char *key, REGVAL_CTR *values ) } /********************************************************************** - *********************************************************************/ - -static int key_monitor_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return regdb_fetch_keys( key, subkeys ); -} - -static BOOL key_monitor_store_keys( const char *key, REGSUBKEY_CTR *subkeys ) -{ - return regdb_store_keys( key, subkeys ); -} - -static int key_monitor_fetch_values( const char *key, REGVAL_CTR *values ) -{ - return regdb_fetch_values( key, values ); -} - -static BOOL key_monitor_store_values( const char *key, REGVAL_CTR *values ) -{ - return regdb_store_values( key, values ); -} - -/********************************************************************** Structure to hold dispatch table of ops for various printer keys. Make sure to always store deeper keys along the same path first so we ge a more specific match. *********************************************************************/ static struct reg_dyn_tree print_registry[] = { +/* just pass the monitor onto the regostry tdb */ { KEY_MONITORS, - &key_monitor_fetch_keys, - &key_monitor_store_keys, - &key_monitor_fetch_values, - &key_monitor_store_values }, + ®db_fetch_keys, + ®db_store_keys, + ®db_fetch_values, + ®db_store_values }, { KEY_FORMS, &key_forms_fetch_keys, &key_forms_store_keys, @@ -1008,9 +933,9 @@ static struct reg_dyn_tree print_registry[] = { &key_driver_store_values }, { KEY_CONTROL_PRINT, &key_print_fetch_keys, - &key_print_store_keys, - &key_print_fetch_values, - &key_print_store_values }, + NULL, + NULL, + NULL }, { KEY_WINNT_PRINTERS, &key_printer_fetch_keys, &key_printer_store_keys, @@ -1018,9 +943,9 @@ static struct reg_dyn_tree print_registry[] = { &key_printer_store_values }, { KEY_WINNT_PRINT, &key_print_fetch_keys, - &key_print_store_keys, - &key_print_fetch_values, - &key_print_store_values }, + NULL, + NULL, + NULL }, { KEY_PORTS, &key_ports_fetch_keys, &key_ports_store_keys, @@ -1062,7 +987,10 @@ static int regprint_fetch_reg_keys( const char *key, REGSUBKEY_CTR *subkeys ) if ( i == -1 ) return -1; - + + if ( !print_registry[i].fetch_subkeys ) + return -1; + return print_registry[i].fetch_subkeys( key, subkeys ); } @@ -1076,6 +1004,9 @@ static BOOL regprint_store_reg_keys( const char *key, REGSUBKEY_CTR *subkeys ) if ( i == -1 ) return False; + if ( !print_registry[i].store_subkeys ) + return False; + return print_registry[i].store_subkeys( key, subkeys ); } @@ -1089,6 +1020,12 @@ static int regprint_fetch_reg_values( const char *key, REGVAL_CTR *values ) if ( i == -1 ) return -1; + /* return 0 values by default since we know the key had + to exist because the client opened a handle */ + + if ( !print_registry[i].fetch_values ) + return 0; + return print_registry[i].fetch_values( key, values ); } @@ -1102,6 +1039,9 @@ static BOOL regprint_store_reg_values( const char *key, REGVAL_CTR *values ) if ( i == -1 ) return False; + if ( !print_registry[i].store_values ) + return False; + return print_registry[i].store_values( key, values ); } -- 2.11.4.GIT