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 + -
显示快捷键?