?? reg_printing.c
字號:
/* only allow one keyname here -- 'winprint' */ return strequal( base, "winprint" ) ? 0 : -1; } /* only dealing with drivers from here on out */ keystr = subkeypath; reg_split_path( keystr, &base, &subkeypath ); 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<num_drivers; i++ ) regsubkey_ctr_addkey( subkeys, drivers[i] ); return regsubkey_ctr_numkeys( subkeys ); } /* if anything else left, just say if has no subkeys */ DEBUG(1,("key_driver_fetch_keys unhandled key [%s] (subkey == %s\n", key, subkeypath )); return 0;}/********************************************************************** *********************************************************************/static void fill_in_driver_values( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3, REGVAL_CTR *values ){ char *buffer = NULL; char *buffer2 = NULL; int buffer_size = 0; int i, length; char *filename; UNISTR2 data; 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) ); 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 */ 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( values, "Dependent Files", REG_MULTI_SZ, buffer, buffer_size ); SAFE_FREE( buffer ); return;}/********************************************************************** *********************************************************************/static int driver_arch_fetch_values( char *key, REGVAL_CTR *values ){ char *keystr, *base, *subkeypath; fstring arch_environment; fstring driver; int version; NT_PRINTER_DRIVER_INFO_LEVEL driver_ctr; WERROR w_result; reg_split_path( key, &base, &subkeypath ); /* no values in 'Environments\Drivers\Windows NT x86' */ if ( !subkeypath ) return 0; /* We have the Architecture string and some subkey name: Currently we only support * Drivers * Print Processors Anything else is an error. */ fstrcpy( arch_environment, base ); keystr = subkeypath; reg_split_path( keystr, &base, &subkeypath ); if ( strequal(base, "Print Processors") ) return 0; /* only Drivers key can be left */ if ( !strequal(base, "Drivers") ) return -1; if ( !subkeypath ) return 0; /* We know that we have Architechure\Drivers with some subkey name The subkey name has to be Version-XX */ keystr = subkeypath; reg_split_path( keystr, &base, &subkeypath ); if ( !subkeypath ) return 0; version = atoi(&base[strlen(base)-1]); /* BEGIN PRINTER DRIVER NAME BLOCK */ keystr = subkeypath; reg_split_path( keystr, &base, &subkeypath ); /* don't go any deeper for now */ 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; fill_in_driver_values( driver_ctr.info_3, values ); free_a_printer_driver( driver_ctr, 3 ); /* END PRINTER DRIVER NAME BLOCK */ DEBUG(8,("key_driver_fetch_values: Exit\n")); return regval_ctr_numvals( values );}/********************************************************************** *********************************************************************/static int key_driver_fetch_values( const char *key, REGVAL_CTR *values ){ char *keystr; pstring subkey; DEBUG(8,("key_driver_fetch_values: Enter key => [%s]\n", key ? key : "NULL")); /* no values in the Environments key */ if ( !(keystr = reg_remaining_path( key + strlen(KEY_ENVIRONMENTS) )) ) return 0; pstrcpy( subkey, keystr); /* pass off to handle subkeys */ return driver_arch_fetch_values( subkey, values );}/********************************************************************* ********************************************************************* ** "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRINT" ********************************************************************* *********************************************************************/static int key_print_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys ){ 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; 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 );}/********************************************************************** ********************************************************************* ** 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 registry tdb */{ KEY_MONITORS, ®db_fetch_keys, ®db_store_keys, ®db_fetch_values, ®db_store_values },{ KEY_FORMS, &key_forms_fetch_keys, NULL, &key_forms_fetch_values, NULL },{ KEY_CONTROL_PRINTERS, &key_printers_fetch_keys, &key_printers_store_keys, &key_printers_fetch_values, &key_printers_store_values },{ KEY_ENVIRONMENTS, &key_driver_fetch_keys, NULL, &key_driver_fetch_values, NULL },{ KEY_CONTROL_PRINT, &key_print_fetch_keys, NULL, NULL, NULL },{ KEY_WINNT_PRINTERS, &key_printers_fetch_keys, &key_printers_store_keys, &key_printers_fetch_values, &key_printers_store_values },{ KEY_PORTS, ®db_fetch_keys, ®db_store_keys, ®db_fetch_values, ®db_store_values }, { NULL, NULL, NULL, NULL, NULL }};/********************************************************************** ********************************************************************* ** Main reg_printing interface functions ********************************************************************* *********************************************************************//*********************************************************************** Lookup a key in the print_registry table, returning its index. -1 on failure **********************************************************************/static int match_registry_path( const char *key ){ int i; pstring path; if ( !key ) return -1; pstrcpy( path, key ); normalize_reg_path( path ); for ( i=0; print_registry[i].path; i++ ) { if ( strncmp( path, print_registry[i].path, strlen(print_registry[i].path) ) == 0 ) return i; } return -1;}/*********************************************************************** **********************************************************************/static int regprint_fetch_reg_keys( const char *key, REGSUBKEY_CTR *subkeys ){ int i = match_registry_path( key ); if ( i == -1 ) return -1; if ( !print_registry[i].fetch_subkeys ) return -1; return print_registry[i].fetch_subkeys( key, subkeys );}/********************************************************************** *********************************************************************/static BOOL regprint_store_reg_keys( const char *key, REGSUBKEY_CTR *subkeys ){ int i = match_registry_path( key ); if ( i == -1 ) return False; if ( !print_registry[i].store_subkeys ) return False; return print_registry[i].store_subkeys( key, subkeys );}/********************************************************************** *********************************************************************/static int regprint_fetch_reg_values( const char *key, REGVAL_CTR *values ){ int i = match_registry_path( key ); 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 );}/********************************************************************** *********************************************************************/static BOOL regprint_store_reg_values( const char *key, REGVAL_CTR *values ){ int i = match_registry_path( key ); if ( i == -1 ) return False; if ( !print_registry[i].store_values ) return False; return print_registry[i].store_values( key, values );}/* * Table of function pointers for accessing printing data */ REGISTRY_OPS printing_ops = { regprint_fetch_reg_keys, regprint_fetch_reg_values, regprint_store_reg_keys, regprint_store_reg_values, NULL};
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -