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

📄 srv_reg_nt.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		return WERR_ACCESS_DENIED;		}			r_u->sec_desc = 0x00000078;	/* size for key's sec_desc */		/* Win9x set this to 0x0 since it does not keep timestamps.	   Doing the same here for simplicity   --jerry */	   	ZERO_STRUCT(r_u->mod_time);		return status;}/***************************************************************************** Implementation of REG_GETVERSION ****************************************************************************/ WERROR _reg_getversion(pipes_struct *p, REG_Q_GETVERSION *q_u, REG_R_GETVERSION *r_u){	WERROR 	status = WERR_OK;	REGISTRY_KEY	*regkey = find_regkey_index_by_hnd( p, &q_u->pol );		if ( !regkey )		return WERR_BADFID;		r_u->win_version = 0x00000005;	/* Windows 2000 registry API version */		return status;}/***************************************************************************** Implementation of REG_ENUM_KEY ****************************************************************************/ WERROR _reg_enum_key(pipes_struct *p, REG_Q_ENUM_KEY *q_u, REG_R_ENUM_KEY *r_u){	WERROR 	status = WERR_OK;	REGISTRY_KEY	*regkey = find_regkey_index_by_hnd( p, &q_u->pol );	char		*subkey = NULL;			if ( !regkey )		return WERR_BADFID; 	DEBUG(8,("_reg_enum_key: enumerating key [%s]\n", regkey->name));		if ( !fetch_reg_keys_specific( regkey, &subkey, q_u->key_index ) )	{		status = WERR_NO_MORE_ITEMS;		goto done;	}		DEBUG(10,("_reg_enum_key: retrieved subkey named [%s]\n", subkey));		/* subkey has the string name now */		init_reg_r_enum_key( r_u, subkey );	done:		SAFE_FREE( subkey );	return status;}/***************************************************************************** Implementation of REG_ENUM_VALUE ****************************************************************************/ WERROR _reg_enum_value(pipes_struct *p, REG_Q_ENUM_VALUE *q_u, REG_R_ENUM_VALUE *r_u){	WERROR 	status = WERR_OK;	REGISTRY_KEY	*regkey = find_regkey_index_by_hnd( p, &q_u->pol );	REGISTRY_VALUE	*val;			if ( !regkey )		return WERR_BADFID; 	DEBUG(8,("_reg_enum_value: enumerating values for key [%s]\n", regkey->name));	if ( !fetch_reg_values_specific( regkey, &val, q_u->val_index ) ) {		status = WERR_NO_MORE_ITEMS;		goto done;	}#if 0	/* JERRY TEST CODE */	if ( val->type == REG_MULTI_SZ ) {		char **str;		int num_strings = regval_convert_multi_sz( (uint16*)regval_data_p(val), regval_size(val), &str );		uint16 *buffer;		size_t buf_size;						if ( num_strings )			buf_size = regval_build_multi_sz( str, &buffer );				TALLOC_FREE( str );		TALLOC_FREE( buffer );	}#endif		DEBUG(10,("_reg_enum_value: retrieved value named  [%s]\n", val->valuename));		/* subkey has the string name now */		init_reg_r_enum_val( r_u, val );done:		free_registry_value( val );		return status;}/******************************************************************* reg_shutdwon ********************************************************************/WERROR _reg_shutdown(pipes_struct *p, REG_Q_SHUTDOWN *q_u, REG_R_SHUTDOWN *r_u){	REG_Q_SHUTDOWN_EX q_u_ex;	REG_R_SHUTDOWN_EX r_u_ex;		/* copy fields (including stealing memory) */		q_u_ex.server  = q_u->server;	q_u_ex.message = q_u->message;	q_u_ex.timeout = q_u->timeout;	q_u_ex.force   = q_u->force;	q_u_ex.reboot  = q_u->reboot;	q_u_ex.reason  = 0x0; 	/* don't care for now */		/* thunk down to _reg_shutdown_ex() (just returns a status) */		return _reg_shutdown_ex( p, &q_u_ex, &r_u_ex );}/******************************************************************* reg_shutdown_ex ********************************************************************/#define SHUTDOWN_R_STRING "-r"#define SHUTDOWN_F_STRING "-f"WERROR _reg_shutdown_ex(pipes_struct *p, REG_Q_SHUTDOWN_EX *q_u, REG_R_SHUTDOWN_EX *r_u){	pstring shutdown_script;	pstring message;	pstring chkmsg;	fstring timeout;	fstring reason;	fstring r;	fstring f;	int ret;	BOOL can_shutdown;	 	pstrcpy(shutdown_script, lp_shutdown_script());		if ( !*shutdown_script )		return WERR_ACCESS_DENIED;	/* pull the message string and perform necessary sanity checks on it */	pstrcpy( message, "" );	if ( q_u->message ) {		UNISTR2 *msg_string = q_u->message->string;				rpcstr_pull( message, msg_string->buffer, sizeof(message), msg_string->uni_str_len*2, 0 );	}	alpha_strcpy (chkmsg, message, NULL, sizeof(message));			fstr_sprintf(timeout, "%d", q_u->timeout);	fstr_sprintf(r, (q_u->reboot) ? SHUTDOWN_R_STRING : "");	fstr_sprintf(f, (q_u->force) ? SHUTDOWN_F_STRING : "");	fstr_sprintf( reason, "%d", q_u->reason );	all_string_sub( shutdown_script, "%z", chkmsg, sizeof(shutdown_script) );	all_string_sub( shutdown_script, "%t", timeout, sizeof(shutdown_script) );	all_string_sub( shutdown_script, "%r", r, sizeof(shutdown_script) );	all_string_sub( shutdown_script, "%f", f, sizeof(shutdown_script) );	all_string_sub( shutdown_script, "%x", reason, sizeof(shutdown_script) );	can_shutdown = user_has_privileges( p->pipe_user.nt_user_token, &se_remote_shutdown );			/* IF someone has privs, run the shutdown script as root. OTHERWISE run it as not root	   Take the error return from the script and provide it as the Windows return code. */	   	/********** BEGIN SeRemoteShutdownPrivilege BLOCK **********/		if ( can_shutdown ) 		become_root();	ret = smbrun( shutdown_script, NULL );			if ( can_shutdown )		unbecome_root();	/********** END SeRemoteShutdownPrivilege BLOCK **********/		DEBUG(3,("_reg_shutdown_ex: Running the command `%s' gave %d\n",		shutdown_script, ret));			return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED;}/******************************************************************* reg_abort_shutdwon ********************************************************************/WERROR _reg_abort_shutdown(pipes_struct *p, REG_Q_ABORT_SHUTDOWN *q_u, REG_R_ABORT_SHUTDOWN *r_u){	pstring abort_shutdown_script;	int ret;	BOOL can_shutdown;	pstrcpy(abort_shutdown_script, lp_abort_shutdown_script());	if ( !*abort_shutdown_script )		return WERR_ACCESS_DENIED;			can_shutdown = user_has_privileges( p->pipe_user.nt_user_token, &se_remote_shutdown );			/********** BEGIN SeRemoteShutdownPrivilege BLOCK **********/		if ( can_shutdown )		become_root();			ret = smbrun( abort_shutdown_script, NULL );		if ( can_shutdown )		unbecome_root();			/********** END SeRemoteShutdownPrivilege BLOCK **********/	DEBUG(3,("_reg_abort_shutdown: Running the command `%s' gave %d\n",		abort_shutdown_script, ret));			return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED;}/******************************************************************* ********************************************************************/static int validate_reg_filename( pstring fname ){	char *p;	int num_services = lp_numservices();	int snum;	pstring share_path;	pstring unix_fname;		/* convert to a unix path, stripping the C:\ along the way */		if ( !(p = valid_share_pathname( fname ) ))		return -1;	/* has to exist within a valid file share */				for ( snum=0; snum<num_services; snum++ ) {			if ( !lp_snum_ok(snum) || lp_print_ok(snum) )			continue;				pstrcpy( share_path, lp_pathname(snum) );		/* make sure we have a path (e.g. [homes] ) */		if ( strlen( share_path ) == 0 )			continue;		if ( strncmp( share_path, p, strlen( share_path )) == 0 )			break;	}		/* p and fname are overlapping memory so copy out and back in again */		pstrcpy( unix_fname, p );	pstrcpy( fname, unix_fname );		return (snum < num_services) ? snum : -1;}/******************************************************************* Note: topkeypat is the *full* path that this *key will be  loaded into (including the name of the key) ********************************************************************/static WERROR reg_load_tree( REGF_FILE *regfile, const char *topkeypath,                             REGF_NK_REC *key ){	REGF_NK_REC *subkey;	REGISTRY_KEY registry_key;	REGVAL_CTR *values;	REGSUBKEY_CTR *subkeys;	int i;	pstring path;	WERROR result = WERR_OK;		/* initialize the REGISTRY_KEY structure */		if ( !(registry_key.hook = reghook_cache_find(topkeypath)) ) {		DEBUG(0,("reg_load_tree: Failed to assigned a REGISTRY_HOOK to [%s]\n",			topkeypath ));		return WERR_BADFILE;	}	pstrcpy( registry_key.name, topkeypath );		/* now start parsing the values and subkeys */	if ( !(subkeys = TALLOC_ZERO_P( regfile->mem_ctx, REGSUBKEY_CTR )) )		return WERR_NOMEM;		if ( !(values = TALLOC_ZERO_P( subkeys, REGVAL_CTR )) )		return WERR_NOMEM;	/* copy values into the REGVAL_CTR */		for ( i=0; i<key->num_values; i++ ) {		regval_ctr_addvalue( values, key->values[i].valuename, key->values[i].type,			(char*)key->values[i].data, (key->values[i].data_size & ~VK_DATA_IN_OFFSET) );	}	/* copy subkeys into the REGSUBKEY_CTR */		key->subkey_index = 0;	while ( (subkey = regfio_fetch_subkey( regfile, key )) ) {		regsubkey_ctr_addkey( subkeys, subkey->keyname );	}		/* write this key and values out */		if ( !store_reg_values( &registry_key, values ) 		|| !store_reg_keys( &registry_key, subkeys ) )	{		DEBUG(0,("reg_load_tree: Failed to load %s!\n", topkeypath));		result = WERR_REG_IO_FAILURE;	}		TALLOC_FREE( subkeys );		if ( !W_ERROR_IS_OK(result) )		return result;		/* now continue to load each subkey registry tree */	key->subkey_index = 0;	while ( (subkey = regfio_fetch_subkey( regfile, key )) ) {		pstr_sprintf( path, "%s%s%s", topkeypath, "\\", subkey->keyname );		result = reg_load_tree( regfile, path, subkey );		if ( !W_ERROR_IS_OK(result) )			break;	}	return result;}/******************************************************************* ********************************************************************/static WERROR restore_registry_key ( REGISTRY_KEY *krecord, const char *fname ){	REGF_FILE *regfile;	REGF_NK_REC *rootkey;	WERROR result;			/* open the registry file....fail if the file already exists */		if ( !(regfile = regfio_open( fname, (O_RDONLY), 0 )) ) {                DEBUG(0,("backup_registry_key: failed to open \"%s\" (%s)\n", 			fname, strerror(errno) ));		return ( ntstatus_to_werror(map_nt_error_from_unix( errno )) );        }		/* get the rootkey from the regf file and then load the tree	   via recursive calls */	   	if ( !(rootkey = regfio_rootkey( regfile )) )		return WERR_REG_FILE_INVALID;		result = reg_load_tree( regfile, krecord->name, rootkey );			/* cleanup */		regfio_close( regfile );		return result;}/******************************************************************* ********************************************************************/WERROR _reg_restore_key(pipes_struct *p, REG_Q_RESTORE_KEY  *q_u, REG_R_RESTORE_KEY *r_u){	REGISTRY_KEY	*regkey = find_regkey_index_by_hnd( p, &q_u->pol );	pstring         filename;	int             snum;		if ( !regkey )		return WERR_BADFID; 	rpcstr_pull(filename, q_u->filename.string->buffer, sizeof(filename), q_u->filename.string->uni_str_len*2, STR_TERMINATE);	DEBUG(8,("_reg_restore_key: verifying restore of key [%s] from \"%s\"\n", regkey->name, filename));	if ( (snum = validate_reg_filename( filename )) == -1 )		return WERR_OBJECT_PATH_INVALID;			/* user must posses SeRestorePrivilege for this this proceed */		if ( !user_has_privileges( p->pipe_user.nt_user_token, &se_restore ) )		return WERR_ACCESS_DENIED;			DEBUG(2,("_reg_restore_key: Restoring [%s] from %s in share %s\n", regkey->name, filename, lp_servicename(snum) ));	return restore_registry_key( regkey, filename );}/****************************************************************************************************************************************/static WERROR reg_write_tree( REGF_FILE *regfile, const char *keypath,                              REGF_NK_REC *parent, SEC_DESC *sec_desc ){	REGF_NK_REC *key;	REGVAL_CTR *values;	REGSUBKEY_CTR *subkeys;	int i, num_subkeys;	pstring key_tmp;	char *keyname, *parentpath;	pstring subkeypath;	char *subkeyname;	REGISTRY_KEY registry_key;	WERROR result = WERR_OK;		if ( !regfile )		return WERR_GENERAL_FAILURE;			if ( !keypath )		return WERR_OBJECT_PATH_INVALID;			/* split up the registry key path */		pstrcpy( key_tmp, keypath );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -