?? reg_printing.c
字號:
regval_ctr_addvalue( values, "Port", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->sharename, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Share Name", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->drivername, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Printer Driver", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, info2->sepfile, UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Separator File", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, "WinPrint", UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Print Processor", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); init_unistr2( &data, "RAW", UNI_STR_TERMINATE); regval_ctr_addvalue( values, "Datatype", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); /* use a prs_struct for converting the devmode and security descriptor to REG_BINARY */ prs_init( &prs, RPC_MAX_PDU_FRAG_LEN, values, MARSHALL); /* stream the device mode */ snum = lp_servicenumber(info2->sharename); if ( (devmode = construct_dev_mode( snum )) != NULL ) { if ( spoolss_io_devmode( "devmode", &prs, 0, devmode ) ) { offset = prs_offset( &prs ); regval_ctr_addvalue( values, "Default Devmode", REG_BINARY, prs_data_p(&prs), offset ); } } prs_mem_clear( &prs ); prs_set_offset( &prs, 0 ); /* stream the printer security descriptor */ if ( info2->secdesc_buf && info2->secdesc_buf->len ) { if ( sec_io_desc("sec_desc", &info2->secdesc_buf->sec, &prs, 0 ) ) { offset = prs_offset( &prs ); regval_ctr_addvalue( values, "Security", REG_BINARY, prs_data_p(&prs), offset ); } } prs_mem_free( &prs ); return; }/********************************************************************** *********************************************************************/static int key_printers_fetch_values( const char *key, REGVAL_CTR *values ){ int num_values; char *printers_key; char *printername, *printerdatakey; NT_PRINTER_INFO_LEVEL *printer = NULL; NT_PRINTER_DATA *p_data; int i, key_index; printers_key = strip_printers_prefix( key ); /* top level key values stored in the registry has no values */ if ( !printers_key ) { /* normalize to the 'HKLM\SOFTWARE\...\Print\Printers' ket */ return regdb_fetch_values( KEY_WINNT_PRINTERS, values ); } /* lookup the printer object */ reg_split_path( printers_key, &printername, &printerdatakey ); if ( !W_ERROR_IS_OK( get_a_printer(NULL, &printer, 2, printername) ) ) goto done; if ( !printerdatakey ) { fill_in_printer_values( printer->info_2, values ); goto done; } /* iterate over all printer data keys and fill the regval container */ p_data = printer->info_2->data; if ( (key_index = lookup_printerkey( p_data, printerdatakey )) == -1 ) { /* failure....should never happen if the client has a valid open handle first */ DEBUG(10,("key_printers_fetch_values: Unknown keyname [%s]\n", printerdatakey)); if ( printer ) free_a_printer( &printer, 2 ); return -1; } num_values = regval_ctr_numvals( p_data->keys[key_index].values ); for ( i=0; i<num_values; i++ ) regval_ctr_copyvalue( values, regval_ctr_specific_value(p_data->keys[key_index].values, i) ); done: if ( printer ) free_a_printer( &printer, 2 ); return regval_ctr_numvals( values );}/********************************************************************** *********************************************************************/#define REG_IDX_ATTRIBUTES 1#define REG_IDX_PRIORITY 2#define REG_IDX_DEFAULT_PRIORITY 3#define REG_IDX_CHANGEID 4#define REG_IDX_STATUS 5#define REG_IDX_STARTTIME 6#define REG_IDX_NAME 7#define REG_IDX_LOCATION 8#define REG_IDX_DESCRIPTION 9#define REG_IDX_PARAMETERS 10#define REG_IDX_PORT 12#define REG_IDX_SHARENAME 13#define REG_IDX_DRIVER 14#define REG_IDX_SEP_FILE 15#define REG_IDX_PRINTPROC 16#define REG_IDX_DATATYPE 17#define REG_IDX_DEVMODE 18#define REG_IDX_SECDESC 19#define REG_IDX_UNTILTIME 20struct { const char *name; int index; } printer_values_map[] = { { "Attributes", REG_IDX_ATTRIBUTES }, { "Priority", REG_IDX_PRIORITY }, { "Default Priority", REG_IDX_DEFAULT_PRIORITY }, { "ChangeID", REG_IDX_CHANGEID }, { "Status", REG_IDX_STATUS }, { "StartTime", REG_IDX_STARTTIME }, { "UntilTime", REG_IDX_UNTILTIME }, { "Name", REG_IDX_NAME }, { "Location", REG_IDX_LOCATION }, { "Descrioption", REG_IDX_DESCRIPTION }, { "Parameters", REG_IDX_PARAMETERS }, { "Port", REG_IDX_PORT }, { "Share Name", REG_IDX_SHARENAME }, { "Printer Driver", REG_IDX_DRIVER }, { "Separator File", REG_IDX_SEP_FILE }, { "Print Processor", REG_IDX_PRINTPROC }, { "Datatype", REG_IDX_DATATYPE }, { "Default Devmode", REG_IDX_DEVMODE }, { "Security", REG_IDX_SECDESC }, { NULL, -1 }};static int find_valuename_index( const char *valuename ){ int i; for ( i=0; printer_values_map[i].name; i++ ) { if ( strequal( valuename, printer_values_map[i].name ) ) return printer_values_map[i].index; } return -1;}/********************************************************************** *********************************************************************/static void convert_values_to_printer_info_2( NT_PRINTER_INFO_LEVEL_2 *printer2, REGVAL_CTR *values ){ int num_values = regval_ctr_numvals( values ); uint32 value_index; REGISTRY_VALUE *val; int i; for ( i=0; i<num_values; i++ ) { val = regval_ctr_specific_value( values, i ); value_index = find_valuename_index( regval_name( val ) ); switch( value_index ) { case REG_IDX_ATTRIBUTES: printer2->attributes = (uint32)(*regval_data_p(val)); break; case REG_IDX_PRIORITY: printer2->priority = (uint32)(*regval_data_p(val)); break; case REG_IDX_DEFAULT_PRIORITY: printer2->default_priority = (uint32)(*regval_data_p(val)); break; case REG_IDX_CHANGEID: printer2->changeid = (uint32)(*regval_data_p(val)); break; case REG_IDX_STARTTIME: printer2->starttime = (uint32)(*regval_data_p(val)); break; case REG_IDX_UNTILTIME: printer2->untiltime = (uint32)(*regval_data_p(val)); break; case REG_IDX_NAME: rpcstr_pull( printer2->printername, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_LOCATION: rpcstr_pull( printer2->location, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_DESCRIPTION: rpcstr_pull( printer2->comment, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_PARAMETERS: rpcstr_pull( printer2->parameters, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_PORT: rpcstr_pull( printer2->portname, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_SHARENAME: rpcstr_pull( printer2->sharename, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_DRIVER: rpcstr_pull( printer2->drivername, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_SEP_FILE: rpcstr_pull( printer2->sepfile, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_PRINTPROC: rpcstr_pull( printer2->printprocessor, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_DATATYPE: rpcstr_pull( printer2->datatype, regval_data_p(val), sizeof(fstring), regval_size(val), 0 ); break; case REG_IDX_DEVMODE: break; case REG_IDX_SECDESC: break; default: /* unsupported value...throw away */ DEBUG(8,("convert_values_to_printer_info_2: Unsupported registry value [%s]\n", regval_name( val ) )); } } return;} /********************************************************************** *********************************************************************/static BOOL key_printers_store_values( const char *key, REGVAL_CTR *values ){ char *printers_key; char *printername, *keyname; NT_PRINTER_INFO_LEVEL *printer = NULL; WERROR result; printers_key = strip_printers_prefix( key ); /* values in the top level key get stored in the registry */ if ( !printers_key ) { /* normalize on the 'HKLM\SOFTWARE\....\Print\Printers' key */ return regdb_store_values( KEY_WINNT_PRINTERS, values ); } reg_split_path( printers_key, &printername, &keyname ); if ( !W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, printername) ) ) return False; /* deal with setting values directly under the printername */ if ( !keyname ) { convert_values_to_printer_info_2( printer->info_2, values ); } else { int num_values = regval_ctr_numvals( values ); int i; REGISTRY_VALUE *val; delete_printer_key( printer->info_2->data, keyname ); /* deal with any subkeys */ for ( i=0; i<num_values; i++ ) { val = regval_ctr_specific_value( values, i ); result = set_printer_dataex( printer, keyname, regval_name( val ), regval_type( val ), regval_data_p( val ), regval_size( val ) ); if ( !W_ERROR_IS_OK(result) ) { DEBUG(0,("key_printers_store_values: failed to set printer data [%s]!\n", keyname)); free_a_printer( &printer, 2 ); return False; } } } result = mod_a_printer( printer, 2 ); free_a_printer( &printer, 2 ); return W_ERROR_IS_OK(result);}/********************************************************************* ********************************************************************* ** "HKLM/SYSTEM/CURRENTCONTROLSET/CONTROL/PRINT/ENVIRONMENTS" ********************************************************************* *********************************************************************/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 version; DEBUG(10,("key_driver_fetch_keys key=>[%s]\n", key ? key : "NULL" )); keystr = reg_remaining_path( key + strlen(KEY_ENVIRONMENTS) ); /* list all possible architectures */ if ( !keystr ) { 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, keystr ); 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 ( !subkeypath ) { if ( strequal(base, "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 ); } else if ( strequal(base, "Print Processors") ) { if ( env_index == 1 || env_index == 5 || env_index == 6 ) regsubkey_ctr_addkey( subkeys, "winprint" ); return regsubkey_ctr_numkeys( subkeys ); } else return -1; /* bad path */ } /* we finally get to enumerate the drivers */ /* only one possible subkey below PrintProc key */ if ( strequal(base, "Print Processors") ) { keystr = subkeypath; reg_split_path( keystr, &base, &subkeypath ); /* no subkeys below this point */ if ( subkeypath ) return -1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -