parse_lsa.c

来自「samba-3.0.22.tar.gz 编译smb服务器的源码」· C语言 代码 · 共 2,414 行 · 第 1/5 页

C
2,414
字号
}/******************************************************************* Reads or writes an LSA_Q_ENUM_TRUST_DOM structure.********************************************************************/BOOL lsa_io_q_enum_trust_dom(const char *desc, LSA_Q_ENUM_TRUST_DOM *q_e, 			     prs_struct *ps, int depth){	prs_debug(ps, depth, desc, "lsa_io_q_enum_trust_dom");	depth++;	if(!smb_io_pol_hnd("", &q_e->pol, ps, depth))		return False;	if(!prs_uint32("enum_context ", ps, depth, &q_e->enum_context))		return False;	if(!prs_uint32("preferred_len", ps, depth, &q_e->preferred_len))		return False;	return True;}/******************************************************************* Inits an LSA_R_ENUM_TRUST_DOM structure.********************************************************************/void init_r_enum_trust_dom(TALLOC_CTX *ctx, LSA_R_ENUM_TRUST_DOM *out, uint32 enum_context,			   uint32 req_num_domains, uint32 num_domains, TRUSTDOM **td){	unsigned int i;        DEBUG(5, ("init_r_enum_trust_dom\n"));	        out->enum_context  = enum_context;	out->count         = num_domains;				if ( num_domains != 0 ) {			/* allocate container memory */				out->domlist = TALLOC_P( ctx, DOMAIN_LIST );		out->domlist->domains = TALLOC_ARRAY( ctx, DOMAIN_INFO, out->count );				if ( !out->domlist || !out->domlist->domains ) {			out->status = NT_STATUS_NO_MEMORY;			return;		}				out->domlist->count = out->count;				/* initialize the list of domains and their sid */				for (i = 0; i < num_domains; i++) {				if ( !(out->domlist->domains[i].sid = TALLOC_P(ctx, DOM_SID2)) ) {				out->status = NT_STATUS_NO_MEMORY;				return;			}							init_dom_sid2(out->domlist->domains[i].sid, &(td[i])->sid);			init_unistr4_w(ctx, &out->domlist->domains[i].name, (td[i])->name);			}	}}/***************************************************************************************************************************************/BOOL lsa_io_domain_list( const char *desc, prs_struct *ps, int depth, DOMAIN_LIST *domlist ){	int i;		prs_debug(ps, depth, desc, "lsa_io_domain_list");	depth++;	if(!prs_uint32("count", ps, depth, &domlist->count))		return False;	if ( domlist->count == 0 )		return True;			if ( UNMARSHALLING(ps) ) {		if ( !(domlist->domains = PRS_ALLOC_MEM( ps, DOMAIN_INFO, domlist->count )) )			return False;	}		/* headers */		for ( i=0; i<domlist->count; i++ ) {		if ( !prs_unistr4_hdr("name_header", ps, depth, &domlist->domains[i].name) )			return False;		if ( !smb_io_dom_sid2_p("sid_header", ps, depth, &domlist->domains[i].sid) )			return False;	}	/* data */		for ( i=0; i<domlist->count; i++ ) {		if ( !prs_unistr4_str("name", ps, depth, &domlist->domains[i].name) )			return False;		if( !smb_io_dom_sid2("sid", domlist->domains[i].sid, ps, depth) )			return False;	}		return True;}/******************************************************************* Reads or writes an LSA_R_ENUM_TRUST_DOM structure.********************************************************************/BOOL lsa_io_r_enum_trust_dom(const char *desc, LSA_R_ENUM_TRUST_DOM *out, 			     prs_struct *ps, int depth){	prs_debug(ps, depth, desc, "lsa_io_r_enum_trust_dom");	depth++;	if(!prs_uint32("enum_context", ps, depth, &out->enum_context))		return False;	if(!prs_uint32("count", ps, depth, &out->count))		return False;	if ( !prs_pointer("trusted_domains", ps, depth, (void**)&out->domlist, sizeof(DOMAIN_LIST), (PRS_POINTER_CAST)lsa_io_domain_list))		return False;			if(!prs_ntstatus("status", ps, depth, &out->status))		return False;	return True;}/*******************************************************************reads or writes a dom query structure.********************************************************************/static BOOL lsa_io_dom_query(const char *desc, DOM_QUERY *d_q, prs_struct *ps, int depth){	if (d_q == NULL)		return False;	prs_debug(ps, depth, desc, "lsa_io_dom_query");	depth++;	if(!prs_align(ps))		return False;	if(!prs_uint16("uni_dom_max_len", ps, depth, &d_q->uni_dom_max_len)) /* domain name string length * 2 */		return False;	if(!prs_uint16("uni_dom_str_len", ps, depth, &d_q->uni_dom_str_len)) /* domain name string length * 2 */		return False;	if(!prs_uint32("buffer_dom_name", ps, depth, &d_q->buffer_dom_name)) /* undocumented domain name string buffer pointer */		return False;	if(!prs_uint32("buffer_dom_sid ", ps, depth, &d_q->buffer_dom_sid)) /* undocumented domain SID string buffer pointer */		return False;	if(!smb_io_unistr2("unistr2", &d_q->uni_domain_name, d_q->buffer_dom_name, ps, depth)) /* domain name (unicode string) */		return False;	if(!prs_align(ps))		return False;	if (d_q->buffer_dom_sid != 0) {		if(!smb_io_dom_sid2("", &d_q->dom_sid, ps, depth)) /* domain SID */			return False;	} else {		memset((char *)&d_q->dom_sid, '\0', sizeof(d_q->dom_sid));	}	return True;}/*******************************************************************reads or writes a structure.********************************************************************/static BOOL lsa_io_dom_query_2(const char *desc, DOM_QUERY_2 *d_q, prs_struct *ps, int depth){	uint32 ptr = 1;	if (d_q == NULL)		return False;	prs_debug(ps, depth, desc, "lsa_io_dom_query_2");	depth++;	if (!prs_align(ps))		return False;	if (!prs_uint32("auditing_enabled", ps, depth, &d_q->auditing_enabled))		return False;	if (!prs_uint32("ptr   ", ps, depth, &ptr))		return False;	if (!prs_uint32("count1", ps, depth, &d_q->count1))		return False;	if (!prs_uint32("count2", ps, depth, &d_q->count2))		return False;	if (UNMARSHALLING(ps)) {		d_q->auditsettings = TALLOC_ZERO_ARRAY(ps->mem_ctx, uint32, d_q->count2);	}	if (d_q->auditsettings == NULL) {		DEBUG(1, ("lsa_io_dom_query_2: NULL auditsettings!\n"));		return False;	}	if (!prs_uint32s(False, "auditsettings", ps, depth, d_q->auditsettings, d_q->count2))		return False;    return True;}/******************************************************************* Reads or writes a dom query structure.********************************************************************/static BOOL lsa_io_dom_query_3(const char *desc, DOM_QUERY_3 *d_q, prs_struct *ps, int depth){	return lsa_io_dom_query("", d_q, ps, depth);}/******************************************************************* Reads or writes a dom query structure.********************************************************************/static BOOL lsa_io_dom_query_5(const char *desc, DOM_QUERY_5 *d_q, prs_struct *ps, int depth){	return lsa_io_dom_query("", d_q, ps, depth);}/******************************************************************* Reads or writes a dom query structure.********************************************************************/static BOOL lsa_io_dom_query_6(const char *desc, DOM_QUERY_6 *d_q, prs_struct *ps, int depth){	if (d_q == NULL)		return False;	prs_debug(ps, depth, desc, "lsa_io_dom_query_6");	depth++;	if (!prs_uint16("server_role", ps, depth, &d_q->server_role))		return False;	return True;}/******************************************************************* Reads or writes an LSA_R_QUERY_INFO structure.********************************************************************/BOOL lsa_io_r_query(const char *desc, LSA_R_QUERY_INFO *out, prs_struct *ps, int depth){	prs_debug(ps, depth, desc, "lsa_io_r_query");	depth++;	if(!prs_uint32("undoc_buffer", ps, depth, &out->undoc_buffer))		return False;	if (out->undoc_buffer != 0) {		if(!prs_uint16("info_class", ps, depth, &out->info_class))			return False;		if(!prs_align(ps))			return False;		switch (out->info_class) {		case 2:			if(!lsa_io_dom_query_2("", &out->dom.id2, ps, depth))				return False;			break;		case 3:			if(!lsa_io_dom_query_3("", &out->dom.id3, ps, depth))				return False;			break;		case 5:			if(!lsa_io_dom_query_5("", &out->dom.id5, ps, depth))				return False;			break;		case 6:			if(!lsa_io_dom_query_6("", &out->dom.id6, ps, depth))				return False;			break;		default:			/* PANIC! */			break;		}	}	if(!prs_align(ps))		return False;	if(!prs_ntstatus("status", ps, depth, &out->status))		return False;	return True;}/******************************************************************* Inits a LSA_SID_ENUM structure.********************************************************************/static void init_lsa_sid_enum(TALLOC_CTX *mem_ctx, LSA_SID_ENUM *sen, 		       int num_entries, const DOM_SID *sids){	int i;	DEBUG(5, ("init_lsa_sid_enum\n"));	sen->num_entries  = num_entries;	sen->ptr_sid_enum = (num_entries != 0);	sen->num_entries2 = num_entries;	/* Allocate memory for sids and sid pointers */	if (num_entries == 0) return;	if ((sen->ptr_sid = TALLOC_ZERO_ARRAY(mem_ctx, uint32, num_entries )) == NULL) {		DEBUG(3, ("init_lsa_sid_enum(): out of memory for ptr_sid\n"));		return;	}	if ((sen->sid = TALLOC_ZERO_ARRAY(mem_ctx, DOM_SID2, num_entries)) == NULL) {		DEBUG(3, ("init_lsa_sid_enum(): out of memory for sids\n"));		return;	}	/* Copy across SIDs and SID pointers */	for (i = 0; i < num_entries; i++) {		sen->ptr_sid[i] = 1;		init_dom_sid2(&sen->sid[i], &sids[i]);	}}/******************************************************************* Reads or writes a LSA_SID_ENUM structure.********************************************************************/static BOOL lsa_io_sid_enum(const char *desc, LSA_SID_ENUM *sen, prs_struct *ps, 			    int depth){	unsigned int i;	prs_debug(ps, depth, desc, "lsa_io_sid_enum");	depth++;	if(!prs_align(ps))		return False;		if(!prs_uint32("num_entries ", ps, depth, &sen->num_entries))		return False;	if(!prs_uint32("ptr_sid_enum", ps, depth, &sen->ptr_sid_enum))		return False;	/*	   if the ptr is NULL, leave here. checked from a real w2k trace.	   JFM, 11/23/2001	 */		if (sen->ptr_sid_enum==0)		return True;	if(!prs_uint32("num_entries2", ps, depth, &sen->num_entries2))		return False;	/* Mallocate memory if we're unpacking from the wire */	if (UNMARSHALLING(ps)) {		if ((sen->ptr_sid = PRS_ALLOC_MEM( ps, uint32, sen->num_entries)) == NULL) {			DEBUG(3, ("init_lsa_sid_enum(): out of memory for "				  "ptr_sid\n"));			return False;		}		if ((sen->sid = PRS_ALLOC_MEM( ps, DOM_SID2, sen->num_entries)) == NULL) {			DEBUG(3, ("init_lsa_sid_enum(): out of memory for "				  "sids\n"));			return False;		}	}	for (i = 0; i < sen->num_entries; i++) {			fstring temp;		slprintf(temp, sizeof(temp) - 1, "ptr_sid[%d]", i);		if(!prs_uint32(temp, ps, depth, &sen->ptr_sid[i])) {			return False;		}	}	for (i = 0; i < sen->num_entries; i++) {		fstring temp;		slprintf(temp, sizeof(temp) - 1, "sid[%d]", i);		if(!smb_io_dom_sid2(temp, &sen->sid[i], ps, depth)) {			return False;		}	}	return True;}/******************************************************************* Inits an LSA_R_ENUM_TRUST_DOM structure.********************************************************************/void init_q_lookup_sids(TALLOC_CTX *mem_ctx, LSA_Q_LOOKUP_SIDS *q_l, 			POLICY_HND *hnd, int num_sids, const DOM_SID *sids,			uint16 level){	DEBUG(5, ("init_q_lookup_sids\n"));	ZERO_STRUCTP(q_l);	memcpy(&q_l->pol, hnd, sizeof(q_l->pol));	init_lsa_sid_enum(mem_ctx, &q_l->sids, num_sids, sids);		q_l->level = level;}/******************************************************************* Reads or writes a LSA_Q_LOOKUP_SIDS structure.********************************************************************/BOOL lsa_io_q_lookup_sids(const char *desc, LSA_Q_LOOKUP_SIDS *q_s, prs_struct *ps,			  int depth){	prs_debug(ps, depth, desc, "lsa_io_q_lookup_sids");	depth++;	if(!prs_align(ps))		return False;		if(!smb_io_pol_hnd("pol_hnd", &q_s->pol, ps, depth)) /* policy handle */		return False;	if(!lsa_io_sid_enum("sids   ", &q_s->sids, ps, depth)) /* sids to be looked up */		return False;	if(!lsa_io_trans_names("names  ", &q_s->names, ps, depth)) /* translated names */		return False;	if(!prs_uint16("level", ps, depth, &q_s->level)) /* lookup level */		return False;	if(!prs_align(ps))		return False;	if(!prs_uint32("mapped_count", ps, depth, &q_s->mapped_count))		return False;	return True;}/******************************************************************* Reads or writes a structure.********************************************************************/static BOOL lsa_io_trans_names(const char *desc, LSA_TRANS_NAME_ENUM *trn,                prs_struct *ps, int depth){	unsigned int i;	prs_debug(ps, depth, desc, "lsa_io_trans_names");	depth++;	if(!prs_align(ps))		return False;   	if(!prs_uint32("num_entries    ", ps, depth, &trn->num_entries))		return False;	if(!prs_uint32("ptr_trans_names", ps, depth, &trn->ptr_trans_names))		return False;	if (trn->ptr_trans_names != 0) {		if(!prs_uint32("num_entries2   ", ps, depth, 			       &trn->num_entries2))			return False;		if (UNMARSHALLING(ps)) {			if ((trn->name = PRS_ALLOC_MEM(ps, LSA_TRANS_NAME, trn->num_entries)) == NULL) {

⌨️ 快捷键说明

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