⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reg_printing.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -