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

📄 srv_srvsvc_nt.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		ss1->num_entries_read2 = 0;				(*stot) = 0;	}}/******************************************************************* makes a SRV_R_NET_SESS_ENUM structure.********************************************************************/static WERROR init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr,				int switch_value, uint32 *resume_hnd, uint32 *total_entries){	WERROR status = WERR_OK;	DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__));	ctr->switch_value = switch_value;	switch (switch_value) {	case 0:		init_srv_sess_info_0(&(ctr->sess.info0), resume_hnd, total_entries);		ctr->ptr_sess_ctr = 1;		break;	case 1:		init_srv_sess_info_1(&(ctr->sess.info1), resume_hnd, total_entries);		ctr->ptr_sess_ctr = 1;		break;	default:		DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value));		(*resume_hnd) = 0;		(*total_entries) = 0;		ctr->ptr_sess_ctr = 0;		status = WERR_UNKNOWN_LEVEL;		break;	}	return status;}/******************************************************************* makes a SRV_R_NET_SESS_ENUM structure.********************************************************************/static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n,				uint32 resume_hnd, int sess_level, int switch_value)  {	DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__));	r_n->sess_level  = sess_level;	if (sess_level == -1)		r_n->status = WERR_UNKNOWN_LEVEL;	else		r_n->status = init_srv_sess_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);	if (!W_ERROR_IS_OK(r_n->status))		resume_hnd = 0;	init_enum_hnd(&r_n->enum_hnd, resume_hnd);}/******************************************************************* fill in a conn info level 0 structure. ********************************************************************/static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot){	uint32 num_entries = 0;	(*stot) = 1;	if (ss0 == NULL) {		(*snum) = 0;		return;	}	DEBUG(5,("init_srv_conn_0_ss0\n"));	if (snum) {		for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {			init_srv_conn_info0(&ss0->info_0[num_entries], (*stot));			/* move on to creating next connection */			/* move on to creating next conn */			num_entries++;		}		ss0->num_entries_read  = num_entries;		ss0->ptr_conn_info     = num_entries > 0 ? 1 : 0;		ss0->num_entries_read2 = num_entries;				if ((*snum) >= (*stot)) {			(*snum) = 0;		}	} else {		ss0->num_entries_read = 0;		ss0->ptr_conn_info = 0;		ss0->num_entries_read2 = 0;		(*stot) = 0;	}}/******************************************************************* fill in a conn info level 1 structure. ********************************************************************/static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1,				uint32 id, uint32 type,				uint32 num_opens, uint32 num_users, uint32 open_time,				const char *usr_name, const char *net_name){	init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name);	init_srv_conn_info1_str(str1, usr_name, net_name);}/******************************************************************* fill in a conn info level 1 structure. ********************************************************************/static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot){	uint32 num_entries = 0;	(*stot) = 1;	if (ss1 == NULL) {		(*snum) = 0;		return;	}	DEBUG(5,("init_srv_conn_1_ss1\n"));	if (snum) {		for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {			init_srv_conn_1_info(&ss1->info_1[num_entries],								 &ss1->info_1_str[num_entries],			                     (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$");			/* move on to creating next connection */			/* move on to creating next conn */			num_entries++;		}		ss1->num_entries_read  = num_entries;		ss1->ptr_conn_info     = num_entries > 0 ? 1 : 0;		ss1->num_entries_read2 = num_entries;				if ((*snum) >= (*stot)) {			(*snum) = 0;		}	} else {		ss1->num_entries_read = 0;		ss1->ptr_conn_info = 0;		ss1->num_entries_read2 = 0;				(*stot) = 0;	}}/******************************************************************* makes a SRV_R_NET_CONN_ENUM structure.********************************************************************/static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,				int switch_value, uint32 *resume_hnd, uint32 *total_entries){	WERROR status = WERR_OK;	DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__));	ctr->switch_value = switch_value;	switch (switch_value) {	case 0:		init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries);		ctr->ptr_conn_ctr = 1;		break;	case 1:		init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries);		ctr->ptr_conn_ctr = 1;		break;	default:		DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value));		(*resume_hnd = 0);		(*total_entries) = 0;		ctr->ptr_conn_ctr = 0;		status = WERR_UNKNOWN_LEVEL;		break;	}	return status;}/******************************************************************* makes a SRV_R_NET_CONN_ENUM structure.********************************************************************/static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,				uint32 resume_hnd, int conn_level, int switch_value)  {	DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__));	r_n->conn_level  = conn_level;	if (conn_level == -1)		r_n->status = WERR_UNKNOWN_LEVEL;	else		r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);	if (!W_ERROR_IS_OK(r_n->status))		resume_hnd = 0;	init_enum_hnd(&r_n->enum_hnd, resume_hnd);}/******************************************************************* makes a SRV_R_NET_FILE_ENUM structure.********************************************************************/static WERROR init_srv_file_info_ctr(pipes_struct *p, SRV_FILE_INFO_CTR *ctr,				     int switch_value, uint32 *resume_hnd, 				     uint32 *total_entries)  {	WERROR status = WERR_OK;	TALLOC_CTX *ctx = p->mem_ctx;	DEBUG(5,("init_srv_file_info_ctr: %d\n", __LINE__));	*total_entries = 1; /* dummy entries only, for */	ctr->switch_value = switch_value;	ctr->num_entries = *total_entries - *resume_hnd;	ctr->num_entries2 = ctr->num_entries;	switch (switch_value) {	case 3: {		int i;		if (*total_entries > 0) {			ctr->ptr_entries = 1;			ctr->file.info3 = TALLOC_ARRAY(ctx, SRV_FILE_INFO_3, ctr->num_entries);		}		for (i=0 ;i<ctr->num_entries;i++) {			init_srv_file_info3(&ctr->file.info3[i].info_3, i+*resume_hnd, 0x35, 0, "\\PIPE\\samr", "dummy user");			init_srv_file_info3_str(&ctr->file.info3[i].info_3_str,  "\\PIPE\\samr", "dummy user");					}		ctr->ptr_file_info = 1;		*resume_hnd = 0;		break;	}	default:		DEBUG(5,("init_srv_file_info_ctr: unsupported switch value %d\n", switch_value));		(*resume_hnd = 0);		(*total_entries) = 0;		ctr->ptr_entries = 0;		status = WERR_UNKNOWN_LEVEL;		break;	}	return status;}/******************************************************************* makes a SRV_R_NET_FILE_ENUM structure.********************************************************************/static void init_srv_r_net_file_enum(pipes_struct *p, SRV_R_NET_FILE_ENUM *r_n,				uint32 resume_hnd, int file_level, int switch_value)  {	DEBUG(5,("init_srv_r_net_file_enum: %d\n", __LINE__));	r_n->file_level  = file_level;	if (file_level == 0)		r_n->status = WERR_UNKNOWN_LEVEL;	else		r_n->status = init_srv_file_info_ctr(p, &r_n->ctr, switch_value, &resume_hnd, &(r_n->total_entries));	if (!W_ERROR_IS_OK(r_n->status))		resume_hnd = 0;	init_enum_hnd(&r_n->enum_hnd, resume_hnd);}/*******************************************************************net server get info********************************************************************/WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u){	WERROR status = WERR_OK;	SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR);	if (!ctr)		return WERR_NOMEM;	ZERO_STRUCTP(ctr);	DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));	if (!pipe_access_check(p)) {		DEBUG(3, ("access denied to srv_net_srv_get_info\n"));		return WERR_ACCESS_DENIED;	}	switch (q_u->switch_value) {		/* Technically level 102 should only be available to		   Administrators but there isn't anything super-secret		   here, as most of it is made up. */	case 102:		init_srv_info_102(&ctr->srv.sv102,		                  500, global_myname(), 				  string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH),		                  lp_major_announce_version(), lp_minor_announce_version(),		                  lp_default_server_announce(),		                  0xffffffff, /* users */		                  0xf, /* disc */		                  0, /* hidden */		                  240, /* announce */		                  3000, /* announce delta */		                  100000, /* licenses */		                  "c:\\"); /* user path */		break;	case 101:		init_srv_info_101(&ctr->srv.sv101,		                  500, global_myname(),		                  lp_major_announce_version(), lp_minor_announce_version(),		                  lp_default_server_announce(),		                  string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH));		break;	case 100:		init_srv_info_100(&ctr->srv.sv100, 500, global_myname());		break;	default:		status = WERR_UNKNOWN_LEVEL;		break;	}	/* set up the net server get info structure */	init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status);	DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));	return r_u->status;}/*******************************************************************net server set info********************************************************************/WERROR _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u){	WERROR status = WERR_OK;	DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));	/* Set up the net server set info structure. */	init_srv_r_net_srv_set_info(r_u, 0x0, status);	DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));	return r_u->status;}/*******************************************************************net file enum********************************************************************/WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u){	DEBUG(5,("srv_net_file_enum: %d\n", __LINE__));	/* set up the */	init_srv_r_net_file_enum(p, r_u,				get_enum_hnd(&q_u->enum_hnd),				q_u->file_level,				q_u->ctr.switch_value);	DEBUG(5,("srv_net_file_enum: %d\n", __LINE__));	return r_u->status;}/*******************************************************************net conn enum********************************************************************/WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u){	DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));	r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR);	if (!r_u->ctr)		return WERR_NOMEM;	ZERO_STRUCTP(r_u->ctr);	/* set up the */	init_srv_r_net_conn_enum(r_u,				get_enum_hnd(&q_u->enum_hnd),				q_u->conn_level,				q_u->ctr->switch_value);	DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));	return r_u->status;}/*******************************************************************net sess enum********************************************************************/WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u){	DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));	r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR);	if (!r_u->ctr)		return WERR_NOMEM;	ZERO_STRUCTP(r_u->ctr);	/* set up the */	init_srv_r_net_sess_enum(r_u,				get_enum_hnd(&q_u->enum_hnd),				q_u->sess_level,				q_u->ctr->switch_value);	DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));	return r_u->status;}/*******************************************************************net sess del********************************************************************/WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u){	struct sessionid *session_list;	struct current_user user;	int num_sessions, snum;	fstring username;	fstring machine;	BOOL not_root = False;	rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name);	rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name);	/* strip leading backslashes if any */	while (machine[0] == '\\') {		memmove(machine, &machine[1], strlen(machine));	}	num_sessions = list_sessions(&session_list);	DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));	r_u->status = WERR_ACCESS_DENIED;	get_current_user(&user, p);	/* fail out now if you are not root or not a domain admin */	if ((user.uid != sec_initial_uid()) && 		( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) {		goto done;

⌨️ 快捷键说明

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