in an attempt to create samrtdbd, i noticed comments that sam op code 0x3
authorLuke Leighton <lkcl@samba.org>
Thu, 3 Feb 2000 00:58:59 +0000 (00:58 +0000)
committerLuke Leighton <lkcl@samba.org>
Thu, 3 Feb 2000 00:58:59 +0000 (00:58 +0000)
is actually a query security object call.  *dur*!  explains why that
code was such a mess :)

added rpcclient samquerysec command to help write a proper opcode 0x3
response (first the client, now the server :)

15 files changed:
source/Makefile.in
source/include/proto.h
source/include/rpc_client_proto.h
source/include/rpc_parse_proto.h
source/include/rpc_samr.h
source/rpc_client/cli_samr.c
source/rpc_parse/parse_prs.c
source/rpc_parse/parse_samr.c
source/rpc_parse/parse_sec.c
source/rpc_server/srv_samr.c
source/rpcclient/cmd_samr.c
source/rpcclient/display_sec.c
source/rpcclient/rpcclient.c
source/samrd/srv_samr_passdb.c
source/samrd/srv_samr_usr_tdb.c

index 8165000d1b8f2f1a8c3b3a51df34cdecf16b1a70..96fc2d7ba7a092850651e3f4f02688e647bcd532 100644 (file)
@@ -509,7 +509,7 @@ PROTO_OBJ =  $(LIB_OBJ) $(LIBNMB_OBJ) $(PARAM_OBJ) \
                $(GROUPDB_OBJ) $(PASSDB_OBJ) $(SAMPASSDB_OBJ) \
                $(SMBPASSWD_OBJ) $(SIDDB_OBJ) \
                $(RPC_SRVUTIL_OBJ) \
-               $(RPC_CLIENT_OBJ) $(RPC_PARSE_OBJ) \
+               $(RPC_CLIENT_OBJ) $(RPC_PARSE_OBJ2) \
                $(PASSDB_OBJ) $(SAMPASSDB_OBJ) $(GROUPDB_OBJ)
 
 SMBWRAPPERPICOBJS = $(SMBWRAPPER_OBJ:.o=.po)
index 5b9b6a441538d85dc3a98bd0213176485c29a0a9..c8d5c7e89fd8b0173e81fca0475613c446d15a7b 100644 (file)
@@ -2214,6 +2214,9 @@ uint32 samr_enum_dom_users(  POLICY_HND *pol, uint32 *start_idx,
                                uint32 *num_sam_users);
 BOOL samr_connect(  const char *srv_name, uint32 access_mask,
                                POLICY_HND *connect_pol);
+BOOL samr_query_sec_obj(  const POLICY_HND *pol,
+                               uint32 type,
+                               SEC_DESC_BUF *buf);
 BOOL samr_open_user(  const POLICY_HND *pol,
                                uint32 unk_0, uint32 rid, 
                                POLICY_HND *user_pol);
@@ -2577,24 +2580,6 @@ BOOL msrpc_sam_ntpasswd_set(const char* srv_name, const char *user,
                                const uchar nt_newpass[516],
                                const uchar nt_hshhash[16]);
 
-/*The following definitions come from  rpc_parse/parse_at.c  */
-
-BOOL make_at_q_add_job(AT_Q_ADD_JOB *q_a, char *server,
-                       AT_JOB_INFO *info, char *command);
-BOOL at_io_job_info(char *desc, AT_JOB_INFO *info, prs_struct *ps, int depth);
-BOOL at_io_q_add_job(char *desc, AT_Q_ADD_JOB *q_a, prs_struct *ps, int depth);
-BOOL at_io_r_add_job(char *desc, AT_R_ADD_JOB *r_a, prs_struct *ps, int depth);
-BOOL make_at_q_del_job(AT_Q_DEL_JOB *q_a, char *server, uint32 min_jobid,
-                      uint32 max_jobid);
-BOOL at_io_q_del_job(char *desc, AT_Q_DEL_JOB *q_d, prs_struct *ps, int depth);
-BOOL at_io_r_del_job(char *desc, AT_R_DEL_JOB *r_d, prs_struct *ps, int depth);
-BOOL make_at_q_enum_jobs(AT_Q_ENUM_JOBS *q_e, char *server);
-BOOL at_io_q_enum_jobs(char *desc, AT_Q_ENUM_JOBS *q_e, prs_struct *ps, int depth);
-BOOL at_io_r_enum_jobs(char *desc, AT_R_ENUM_JOBS *r_e, prs_struct *ps, int depth);
-BOOL make_at_q_query_job(AT_Q_QUERY_JOB *q_q, char *server, uint32 jobid);
-BOOL at_io_q_query_job(char *desc, AT_Q_QUERY_JOB *q_q, prs_struct *ps, int depth);
-BOOL at_io_r_query_job(char *desc, AT_R_QUERY_JOB *r_q, prs_struct *ps, int depth);
-
 /*The following definitions come from  rpc_parse/parse_creds.c  */
 
 BOOL make_creds_unix(CREDS_UNIX *r_u, const char* user_name,
@@ -2636,77 +2621,6 @@ BOOL create_user_creds( prs_struct *ps,
                                uint32 pid,
                                const struct user_creds *usr);
 
-/*The following definitions come from  rpc_parse/parse_eventlog.c  */
-
-BOOL make_eventlog_q_open(EVENTLOG_Q_OPEN *q_u, const char *journal, char *unk);
-BOOL eventlog_io_q_open(char *desc, EVENTLOG_Q_OPEN *q_u, prs_struct *ps, int depth);
-BOOL eventlog_io_r_open(char *desc, EVENTLOG_R_OPEN *r_u, prs_struct *ps, int depth);
-BOOL make_eventlog_q_close(EVENTLOG_Q_CLOSE *q_u, POLICY_HND *pol);
-BOOL eventlog_io_q_close(char *desc, EVENTLOG_Q_CLOSE *q_u, prs_struct *ps, int depth);
-BOOL eventlog_io_r_close(char *desc, EVENTLOG_R_CLOSE *r_u, prs_struct *ps, int depth);
-BOOL make_eventlog_q_numofeventlogrec(EVENTLOG_Q_NUMOFEVENTLOGREC *q_u, POLICY_HND *pol);
-BOOL eventlog_io_q_numofeventlogrec(char *desc,EVENTLOG_Q_NUMOFEVENTLOGREC  *q_u, prs_struct *ps, int depth);
-BOOL eventlog_io_r_numofeventlogrec(char *desc, EVENTLOG_R_NUMOFEVENTLOGREC *r_u, prs_struct *ps, int depth);
-BOOL make_eventlog_q_readeventlog(EVENTLOG_Q_READEVENTLOG *q_u, POLICY_HND *pol,
-                                  uint32 flags, uint32 offset, uint32 number_of_bytes);
-BOOL eventlog_io_q_readeventlog(char *desc, EVENTLOG_Q_READEVENTLOG *q_u, prs_struct *ps, int depth);
-BOOL eventlog_io_r_readeventlog(char *desc, EVENTLOG_R_READEVENTLOG *r_u, prs_struct *ps, int depth);
-
-/*The following definitions come from  rpc_parse/parse_lsa.c  */
-
-BOOL make_lsa_trans_name(LSA_TRANS_NAME *trn, UNISTR2 *uni_name,
-                       uint32 sid_name_use, char *name, uint32 idx);
-BOOL make_lsa_sec_qos(LSA_SEC_QOS *qos, uint16 imp_lev, uint8 ctxt, uint8 eff,
-                               uint32 unknown);
-BOOL make_lsa_obj_attr(LSA_OBJ_ATTR *attr, uint32 attributes, LSA_SEC_QOS *qos);
-BOOL make_q_open_pol(LSA_Q_OPEN_POL *r_q, uint16 system_name,
-                       uint32 attributes,
-                       uint32 desired_access,
-                       LSA_SEC_QOS *qos);
-BOOL lsa_io_q_open_pol(char *desc,  LSA_Q_OPEN_POL *r_q, prs_struct *ps, int depth);
-BOOL lsa_io_r_open_pol(char *desc,  LSA_R_OPEN_POL *r_p, prs_struct *ps, int depth);
-BOOL make_q_open_pol2(LSA_Q_OPEN_POL2 *r_q, const char *server_name,
-                       uint32 attributes,
-                       uint32 desired_access,
-                       LSA_SEC_QOS *qos);
-BOOL lsa_io_q_open_pol2(char *desc,  LSA_Q_OPEN_POL2 *r_q, prs_struct *ps, int depth);
-BOOL lsa_io_r_open_pol2(char *desc,  LSA_R_OPEN_POL2 *r_p, prs_struct *ps, int depth);
-BOOL make_q_query(LSA_Q_QUERY_INFO *q_q, POLICY_HND *hnd, uint16 info_class);
-BOOL lsa_io_q_query(char *desc,  LSA_Q_QUERY_INFO *q_q, prs_struct *ps, int depth);
-BOOL make_q_open_secret(LSA_Q_OPEN_SECRET *q_o, const POLICY_HND *pol_hnd,
-                       const char *secret_name, uint32 desired_access);
-BOOL lsa_io_q_open_secret(char *desc, LSA_Q_OPEN_SECRET *q_o, prs_struct *ps, int depth);
-BOOL lsa_io_r_open_secret(char *desc, LSA_R_OPEN_SECRET *r_o, prs_struct *ps, int depth);
-BOOL lsa_io_secret_value(char *desc, LSA_SECRET_VALUE *value, prs_struct *ps, int depth);
-BOOL lsa_io_secret_info(char *desc, LSA_SECRET_INFO *info, prs_struct *ps, int depth);
-BOOL make_q_query_secret(LSA_Q_QUERY_SECRET *q_q, POLICY_HND *pol);
-BOOL lsa_io_q_query_secret(char *desc, LSA_Q_QUERY_SECRET *q_q, prs_struct *ps, int depth);
-BOOL lsa_io_r_query_secret(char *desc, LSA_R_QUERY_SECRET *r_q, prs_struct *ps, int depth);
-BOOL make_q_enum_trust_dom(LSA_Q_ENUM_TRUST_DOM *q_e,
-                               POLICY_HND *pol,
-                               uint32 enum_context, uint32 preferred_len);
-BOOL lsa_io_q_enum_trust_dom(char *desc,  LSA_Q_ENUM_TRUST_DOM *q_e, prs_struct *ps, int depth);
-BOOL make_r_enum_trust_dom(LSA_R_ENUM_TRUST_DOM *r_e, int32 enum_context,
-                          uint32 num_domains, 
-                          UNISTR2 *domain_names, DOM_SID **domain_sids,
-                          uint32 status);
-BOOL lsa_io_r_enum_trust_dom(char *desc, LSA_R_ENUM_TRUST_DOM *r_e, prs_struct *ps, int depth);
-void lsa_free_r_enum_trust_dom(LSA_R_ENUM_TRUST_DOM *r_e);
-BOOL lsa_io_r_query(char *desc,  LSA_R_QUERY_INFO *r_q, prs_struct *ps, int depth);
-BOOL make_lsa_sid_enum(LSA_SID_ENUM *sen, uint32 num_entries, DOM_SID **sids);
-BOOL make_q_lookup_sids(LSA_Q_LOOKUP_SIDS *q_l, POLICY_HND *hnd,
-                               int num_sids, DOM_SID **sids,
-                               uint16 level);
-BOOL lsa_io_q_lookup_sids(char *desc, LSA_Q_LOOKUP_SIDS *q_s, prs_struct *ps, int depth);
-BOOL lsa_io_r_lookup_sids(char *desc,  LSA_R_LOOKUP_SIDS *r_s, prs_struct *ps, int depth);
-BOOL make_q_lookup_names(LSA_Q_LOOKUP_NAMES *q_l, POLICY_HND *hnd,
-                               uint32 num_names, char **names);
-BOOL lsa_io_q_lookup_names(char *desc,  LSA_Q_LOOKUP_NAMES *q_r, prs_struct *ps, int depth);
-BOOL lsa_io_r_lookup_names(char *desc,  LSA_R_LOOKUP_NAMES *r_r, prs_struct *ps, int depth);
-BOOL make_lsa_q_close(LSA_Q_CLOSE *q_c, POLICY_HND *hnd);
-BOOL lsa_io_q_close(char *desc,  LSA_Q_CLOSE *q_c, prs_struct *ps, int depth);
-BOOL lsa_io_r_close(char *desc,  LSA_R_CLOSE *r_c, prs_struct *ps, int depth);
-
 /*The following definitions come from  rpc_parse/parse_misc.c  */
 
 BOOL smb_io_bigint(char *desc, BIGINT *bigint, prs_struct *ps, int depth);
@@ -2784,120 +2698,6 @@ BOOL smb_io_dom_query_3(char *desc,  DOM_QUERY_3 *d_q, prs_struct *ps, int depth
 BOOL smb_io_dom_query_5(char *desc,  DOM_QUERY_3 *d_q, prs_struct *ps, int depth);
 BOOL smb_io_unistr3(char *desc,  UNISTR3 *name, prs_struct *ps, int depth);
 
-/*The following definitions come from  rpc_parse/parse_net.c  */
-
-BOOL make_q_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l, 
-                               const char* srv_name,
-                               uint32 function_code,
-                               uint32 query_level,
-                               uint32 switch_value);
-BOOL net_io_q_logon_ctrl2(char *desc,  NET_Q_LOGON_CTRL2 *q_l, prs_struct *ps, int depth);
-BOOL make_r_logon_ctrl2(NET_R_LOGON_CTRL2 *r_l, uint32 query_level,
-                               uint32 flags, uint32 pdc_status, uint32 logon_attempts,
-                               uint32 tc_status, char *trusted_domain_name);
-BOOL net_io_r_logon_ctrl2(char *desc,  NET_R_LOGON_CTRL2 *r_l, prs_struct *ps, int depth);
-BOOL make_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
-                       uint32 num_doms, char **dom_name);
-BOOL net_io_r_trust_dom(char *desc,  NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth);
-BOOL net_io_q_trust_dom(char *desc,  NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth);
-BOOL make_q_req_chal(NET_Q_REQ_CHAL *q_c,
-                               const char *logon_srv, const char *logon_clnt,
-                               DOM_CHAL *clnt_chal);
-BOOL net_io_q_req_chal(char *desc,  NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth);
-BOOL net_io_r_req_chal(char *desc,  NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth);
-BOOL make_q_auth(NET_Q_AUTH *q_a,
-               const char *logon_srv, const char *acct_name,
-               uint16 sec_chan, const char *comp_name,
-               DOM_CHAL *clnt_chal);
-BOOL net_io_q_auth(char *desc,  NET_Q_AUTH *q_a, prs_struct *ps, int depth);
-BOOL net_io_r_auth(char *desc,  NET_R_AUTH *r_a, prs_struct *ps, int depth);
-BOOL make_q_auth_2(NET_Q_AUTH_2 *q_a,
-               const char *logon_srv, const char *acct_name,
-               uint16 sec_chan, const char *comp_name,
-               DOM_CHAL *clnt_chal, uint32 clnt_flgs);
-BOOL net_io_q_auth_2(char *desc,  NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth);
-BOOL net_io_r_auth_2(char *desc,  NET_R_AUTH_2 *r_a, prs_struct *ps, int depth);
-BOOL make_q_srv_pwset(NET_Q_SRV_PWSET *q_s,
-                               const char *logon_srv, const char *acct_name, 
-                               uint16 sec_chan, const char *comp_name,
-                               DOM_CRED *cred, char nt_cypher[16]);
-BOOL net_io_q_srv_pwset(char *desc,  NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth);
-BOOL net_io_r_srv_pwset(char *desc,  NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth);
-BOOL make_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
-                               uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
-                               const char *user_name, const char *wksta_name,
-                               char sess_key[16],
-                               uchar lm_cypher[16], uchar nt_cypher[16]);
-BOOL make_id_info4(NET_ID_INFO_4 *id, const char *domain_name,
-                               uint32 param_ctrl,
-                               uint32 log_id_low, uint32 log_id_high,
-                               const char *user_name, const char *wksta_name,
-                               const char *general);
-BOOL make_id_info2(NET_ID_INFO_2 *id, const char *domain_name,
-                               uint32 param_ctrl,
-                               uint32 log_id_low, uint32 log_id_high,
-                               const char *user_name, const char *wksta_name,
-                               uchar lm_challenge[8],
-                               uchar *lm_chal_resp,
-                               int lm_chal_len,
-                               uchar *nt_chal_resp,
-                               int nt_chal_len);
-BOOL make_sam_info(DOM_SAM_INFO *sam,
-                               const char *logon_srv, const char *comp_name,
-                               DOM_CRED *clnt_cred,
-                               DOM_CRED *rtn_cred, uint16 logon_level,
-                               NET_ID_INFO_CTR *ctr);
-BOOL make_net_user_info3(NET_USER_INFO_3 *usr,
-
-       NTTIME *logon_time,
-       NTTIME *logoff_time,
-       NTTIME *kickoff_time,
-       NTTIME *pass_last_set_time,
-       NTTIME *pass_can_change_time,
-       NTTIME *pass_must_change_time,
-
-       char *user_name,
-       char *full_name,
-       char *logon_script,
-       char *profile_path,
-       char *home_dir,
-       char *dir_drive,
-
-       uint16 logon_count,
-       uint16 bad_pw_count,
-
-       uint32 user_id,
-       uint32 group_id,
-       uint32 num_groups,
-       DOM_GID *gids,
-       uint32 user_flgs,
-
-       char sess_key[16],
-
-       char *logon_srv,
-       char *logon_dom,
-
-       char *padding,
-
-       DOM_SID *dom_sid,
-       char *other_sids);
-BOOL net_io_q_sam_logon(char *desc,  NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth);
-BOOL net_io_r_sam_logon(char *desc,  NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth);
-BOOL net_io_q_sam_logoff(char *desc,  NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth);
-BOOL net_io_r_sam_logoff(char *desc,  NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth);
-BOOL make_q_sam_sync(NET_Q_SAM_SYNC *q_s,
-                               const char *srv_name,
-                               const char *cli_name,
-                               DOM_CRED *cli_creds, uint32 database_id);
-BOOL net_io_q_sam_sync(char *desc, NET_Q_SAM_SYNC *q_s, prs_struct *ps, int depth);
-BOOL make_sam_delta_hdr(SAM_DELTA_HDR *delta, uint16 type, uint32 rid);
-BOOL make_sam_account_info(SAM_ACCOUNT_INFO *info, char *user_name,
-                          char *full_name, uint32 user_rid, uint32 group_rid,
-                          char *home_dir, char *dir_drive, char *logon_script,
-                          char *acct_desc, uint32 acb_info, char *profile);
-BOOL net_io_r_sam_sync(char *desc, uint8 sess_key[16],
-                               NET_R_SAM_SYNC *r_s, prs_struct *ps, int depth);
-
 /*The following definitions come from  rpc_parse/parse_netsec.c  */
 
 BOOL rpc_hdr_netsec_auth_chk(RPC_HDR_AUTH *rai);
@@ -2986,8 +2786,6 @@ BOOL _prs_uint32_post(char *name, prs_struct *ps, int depth, uint32 *data32,
 int prs_tdb_store(TDB_CONTEXT *tdb, int flgs, prs_struct *pk, prs_struct *pd);
 void prs_tdb_fetch(TDB_CONTEXT *tdb, prs_struct *pk, prs_struct *pd);
 
-/*The following definitions come from  rpc_parse/parse_reg.c  */
-
 /*The following definitions come from  rpc_parse/parse_rpc.c  */
 
 BOOL make_rpc_hdr(RPC_HDR *hdr, enum RPC_PKT_TYPE pkt_type, uint8 flags,
@@ -3025,436 +2823,6 @@ BOOL smb_io_rpc_auth_verifier(char *desc, RPC_AUTH_VERIFIER *rav, prs_struct *ps
 BOOL rpc_auth_verifier_chk(RPC_AUTH_VERIFIER *rav,
                                char *signature, uint32 msg_type);
 
-/*The following definitions come from  rpc_parse/parse_samr.c  */
-
-BOOL make_samr_q_close_hnd(SAMR_Q_CLOSE_HND *q_c, POLICY_HND *hnd);
-BOOL samr_io_q_close_hnd(char *desc,  SAMR_Q_CLOSE_HND *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_close_hnd(char *desc,  SAMR_R_CLOSE_HND *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_lookup_domain(SAMR_Q_LOOKUP_DOMAIN *q_u,
-               POLICY_HND *pol, const char *dom_name);
-BOOL samr_io_q_lookup_domain(char *desc, SAMR_Q_LOOKUP_DOMAIN *q_u, prs_struct *ps, int depth);
-BOOL make_samr_r_lookup_domain(SAMR_R_LOOKUP_DOMAIN *r_u,
-               DOM_SID *dom_sid, uint32 status);
-BOOL samr_io_r_lookup_domain(char *desc, SAMR_R_LOOKUP_DOMAIN *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN *q_u,
-                               const POLICY_HND *connect_pol, uint32 flags,
-                               const DOM_SID *sid);
-BOOL samr_io_q_open_domain(char *desc,  SAMR_Q_OPEN_DOMAIN *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_open_domain(char *desc,  SAMR_R_OPEN_DOMAIN *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_get_usrdom_pwinfo(SAMR_Q_GET_USRDOM_PWINFO *q_u, POLICY_HND *user_pol);
-BOOL samr_io_q_get_usrdom_pwinfo(char *desc,  SAMR_Q_GET_USRDOM_PWINFO *q_u, prs_struct *ps, int depth);
-BOOL make_samr_r_get_usrdom_pwinfo(SAMR_R_GET_USRDOM_PWINFO *q_u, uint32 status);
-BOOL samr_io_r_get_usrdom_pwinfo(char *desc,  SAMR_R_GET_USRDOM_PWINFO *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_query_sec_obj(SAMR_Q_QUERY_SEC_OBJ *q_u,
-                               POLICY_HND *user_pol, uint16 switch_value);
-BOOL samr_io_q_query_sec_obj(char *desc,  SAMR_Q_QUERY_SEC_OBJ *q_u, prs_struct *ps, int depth);
-BOOL make_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO *q_u,
-                               POLICY_HND *domain_pol, uint16 switch_value);
-BOOL samr_io_q_query_dom_info(char *desc,  SAMR_Q_QUERY_DOMAIN_INFO *q_u, prs_struct *ps, int depth);
-BOOL make_unk_info3(SAM_UNK_INFO_3 *u_3);
-BOOL make_unk_info6(SAM_UNK_INFO_6 *u_6);
-BOOL make_unk_info7(SAM_UNK_INFO_7 *u_7);
-BOOL make_unk_info2(SAM_UNK_INFO_2 *u_2, char *domain, char *server);
-BOOL make_unk_info1(SAM_UNK_INFO_1 *u_1);
-BOOL make_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO *r_u, 
-                               uint16 switch_value, SAM_UNK_CTR *ctr,
-                               uint32 status);
-BOOL samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO *r_u, prs_struct *ps, int depth);
-BOOL make_dom_sid3(DOM_SID3 *sid3, uint16 unk_0, uint16 unk_1, DOM_SID *sid);
-BOOL make_sam_sid_stuff(SAM_SID_STUFF *stf,
-                               uint16 unknown_2, uint16 unknown_3,
-                               uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
-                               int num_sid3s);
-BOOL samr_io_r_query_sec_obj(char *desc,  SAMR_R_QUERY_SEC_OBJ *r_u, prs_struct *ps, int depth);
-BOOL make_sam_entry(SAM_ENTRY *sam, uint32 len_sam_name, uint32 rid);
-BOOL make_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_e, POLICY_HND *pol,
-                               uint32 start_idx, 
-                               uint16 acb_mask, uint16 unk_1, uint32 size);
-BOOL samr_io_q_enum_dom_users(char *desc,  SAMR_Q_ENUM_DOM_USERS *q_e, prs_struct *ps, int depth);
-BOOL make_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS *r_u,
-               uint32 next_idx,
-               uint32 num_sam_entries);
-BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO *q_e, POLICY_HND *pol,
-                               uint16 switch_level, uint32 start_idx,
-                               uint32 max_entries);
-BOOL samr_io_q_query_dispinfo(char *desc,  SAMR_Q_QUERY_DISPINFO *q_e, prs_struct *ps, int depth);
-BOOL make_sam_dispinfo_1(SAM_DISPINFO_1 *sam, uint32 *num_entries,
-                        uint32 *data_size, uint32 start_idx,
-                        SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]);
-BOOL make_sam_dispinfo_2(SAM_DISPINFO_2 *sam, uint32 *num_entries,
-                        uint32 *data_size, uint32 start_idx,
-                        SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]);
-BOOL make_sam_dispinfo_3(SAM_DISPINFO_3 *sam, uint32 *num_entries,
-                        uint32 *data_size, uint32 start_idx,
-                        DOMAIN_GRP *grp);
-BOOL make_sam_dispinfo_4(SAM_DISPINFO_4 *sam, uint32 *num_entries,
-                        uint32 *data_size, uint32 start_idx,
-                        SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES]);
-BOOL make_sam_dispinfo_5(SAM_DISPINFO_5 *sam, uint32 *num_entries,
-                        uint32 *data_size, uint32 start_idx,
-                        DOMAIN_GRP *grp);
-BOOL make_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO *r_u,
-                               uint32 num_entries, uint32 data_size,
-                               uint16 switch_level, SAM_DISPINFO_CTR *ctr,
-                               uint32 status);
-BOOL samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_open_group(SAMR_Q_OPEN_GROUP *q_c,
-                               const POLICY_HND *hnd,
-                               uint32 access_mask, uint32 rid);
-BOOL samr_io_q_open_group(char *desc,  SAMR_Q_OPEN_GROUP *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_open_group(char *desc,  SAMR_R_OPEN_GROUP *r_u, prs_struct *ps, int depth);
-BOOL make_samr_group_info1(GROUP_INFO1 *gr1,
-                               char *acct_name, char *acct_desc,
-                               uint32 num_members);
-BOOL samr_io_group_info1(char *desc,  GROUP_INFO1 *gr1, prs_struct *ps, int depth);
-BOOL make_samr_group_info4(GROUP_INFO4 *gr4, const char *acct_desc);
-BOOL samr_io_group_info4(char *desc,  GROUP_INFO4 *gr4, prs_struct *ps, int depth);
-BOOL samr_group_info_ctr(char *desc,  GROUP_INFO_CTR *ctr, prs_struct *ps, int depth);
-BOOL make_samr_q_create_dom_group(SAMR_Q_CREATE_DOM_GROUP *q_e,
-                               POLICY_HND *pol,
-                               const char *acct_desc);
-BOOL samr_io_q_create_dom_group(char *desc,  SAMR_Q_CREATE_DOM_GROUP *q_e, prs_struct *ps, int depth);
-BOOL samr_io_r_create_dom_group(char *desc,  SAMR_R_CREATE_DOM_GROUP *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_delete_dom_group(SAMR_Q_DELETE_DOM_GROUP *q_c, POLICY_HND *hnd);
-BOOL samr_io_q_delete_dom_group(char *desc,  SAMR_Q_DELETE_DOM_GROUP *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_delete_dom_group(char *desc,  SAMR_R_DELETE_DOM_GROUP *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_del_groupmem(SAMR_Q_DEL_GROUPMEM *q_e,
-                               POLICY_HND *pol,
-                               uint32 rid);
-BOOL samr_io_q_del_groupmem(char *desc,  SAMR_Q_DEL_GROUPMEM *q_e, prs_struct *ps, int depth);
-BOOL make_samr_r_del_groupmem(SAMR_R_DEL_GROUPMEM *r_u, POLICY_HND *pol,
-               uint32 status);
-BOOL samr_io_r_del_groupmem(char *desc,  SAMR_R_DEL_GROUPMEM *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_add_groupmem(SAMR_Q_ADD_GROUPMEM *q_e,
-                               POLICY_HND *pol,
-                               uint32 rid);
-BOOL samr_io_q_add_groupmem(char *desc,  SAMR_Q_ADD_GROUPMEM *q_e, prs_struct *ps, int depth);
-BOOL make_samr_r_add_groupmem(SAMR_R_ADD_GROUPMEM *r_u, POLICY_HND *pol,
-               uint32 status);
-BOOL samr_io_r_add_groupmem(char *desc,  SAMR_R_ADD_GROUPMEM *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_set_groupinfo(SAMR_Q_SET_GROUPINFO *q_e,
-                               POLICY_HND *pol, GROUP_INFO_CTR *ctr);
-BOOL samr_io_q_set_groupinfo(char *desc,  SAMR_Q_SET_GROUPINFO *q_e, prs_struct *ps, int depth);
-BOOL make_samr_r_set_groupinfo(SAMR_R_SET_GROUPINFO *r_u, 
-               uint32 status);
-BOOL samr_io_r_set_groupinfo(char *desc,  SAMR_R_SET_GROUPINFO *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_query_groupinfo(SAMR_Q_QUERY_GROUPINFO *q_e,
-                               POLICY_HND *pol,
-                               uint16 switch_level);
-BOOL samr_io_q_query_groupinfo(char *desc,  SAMR_Q_QUERY_GROUPINFO *q_e, prs_struct *ps, int depth);
-BOOL make_samr_r_query_groupinfo(SAMR_R_QUERY_GROUPINFO *r_u, GROUP_INFO_CTR *ctr,
-               uint32 status);
-BOOL samr_io_r_query_groupinfo(char *desc,  SAMR_R_QUERY_GROUPINFO *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_query_groupmem(SAMR_Q_QUERY_GROUPMEM *q_c, POLICY_HND *hnd);
-BOOL samr_io_q_query_groupmem(char *desc,  SAMR_Q_QUERY_GROUPMEM *q_u, prs_struct *ps, int depth);
-BOOL make_samr_r_query_groupmem(SAMR_R_QUERY_GROUPMEM *r_u,
-               uint32 num_entries, uint32 *rid, uint32 *attr, uint32 status);
-BOOL samr_io_r_query_groupmem(char *desc,  SAMR_R_QUERY_GROUPMEM *r_u, prs_struct *ps, int depth);
-void samr_free_r_query_groupmem(SAMR_R_QUERY_GROUPMEM *r_u);
-BOOL make_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS *q_u,
-                               POLICY_HND *hnd);
-BOOL samr_io_q_query_usergroups(char *desc,  SAMR_Q_QUERY_USERGROUPS *q_u, prs_struct *ps, int depth);
-BOOL make_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS *r_u,
-               uint32 num_gids, DOM_GID *gid, uint32 status);
-BOOL samr_io_r_query_usergroups(char *desc,  SAMR_R_QUERY_USERGROUPS *r_u, prs_struct *ps, int depth);
-void samr_free_r_query_usergroups(SAMR_R_QUERY_USERGROUPS *r_u);
-BOOL make_samr_q_enum_domains(SAMR_Q_ENUM_DOMAINS *q_e, POLICY_HND *pol,
-                               uint32 start_idx, uint32 size);
-BOOL samr_io_q_enum_domains(char *desc, SAMR_Q_ENUM_DOMAINS *q_e, prs_struct *ps, int depth);
-BOOL make_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS *r_u,
-               uint32 next_idx, uint32 num_sam_entries);
-BOOL samr_io_r_enum_domains(char *desc, SAMR_R_ENUM_DOMAINS *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_e, POLICY_HND *pol,
-                               uint32 start_idx, uint32 size);
-BOOL samr_io_q_enum_dom_groups(char *desc, SAMR_Q_ENUM_DOM_GROUPS *q_e, prs_struct *ps, int depth);
-BOOL make_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS *r_u,
-               uint32 next_idx, uint32 num_sam_entries);
-BOOL samr_io_r_enum_dom_groups(char *desc, SAMR_R_ENUM_DOM_GROUPS *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_e, POLICY_HND *pol,
-                               uint32 start_idx, uint32 size);
-BOOL samr_io_q_enum_dom_aliases(char *desc,  SAMR_Q_ENUM_DOM_ALIASES *q_e, prs_struct *ps, int depth);
-BOOL make_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u,
-               uint32 next_idx,
-               uint32 num_sam_entries);
-BOOL samr_io_r_enum_dom_aliases(char *desc, SAMR_R_ENUM_DOM_ALIASES *r_u, prs_struct *ps, int depth);
-BOOL make_samr_alias_info3(ALIAS_INFO3 *al3, const char *acct_desc);
-BOOL samr_io_alias_info3(char *desc,  ALIAS_INFO3 *al3, prs_struct *ps, int depth);
-BOOL samr_alias_info_ctr(char *desc,  ALIAS_INFO_CTR *ctr, prs_struct *ps, int depth);
-BOOL make_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_e,
-                               POLICY_HND *pol,
-                               uint16 switch_level);
-BOOL samr_io_q_query_aliasinfo(char *desc,  SAMR_Q_QUERY_ALIASINFO *q_e, prs_struct *ps, int depth);
-BOOL make_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *r_u, ALIAS_INFO_CTR *ctr,
-               uint32 status);
-BOOL samr_io_r_query_aliasinfo(char *desc,  SAMR_R_QUERY_ALIASINFO *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_set_aliasinfo(SAMR_Q_SET_ALIASINFO *q_u, POLICY_HND *hnd,
-                               ALIAS_INFO_CTR *ctr);
-BOOL samr_io_q_set_aliasinfo(char *desc,  SAMR_Q_SET_ALIASINFO *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_set_aliasinfo(char *desc,  SAMR_R_SET_ALIASINFO *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_query_useraliases(SAMR_Q_QUERY_USERALIASES *q_u,
-                               const POLICY_HND *hnd,
-                               uint32 *ptr_sid, DOM_SID2 *sid);
-BOOL samr_io_q_query_useraliases(char *desc,  SAMR_Q_QUERY_USERALIASES *q_u, prs_struct *ps, int depth);
-void samr_free_q_query_useraliases(SAMR_Q_QUERY_USERALIASES *q_u);
-BOOL make_samr_r_query_useraliases(SAMR_R_QUERY_USERALIASES *r_u,
-               uint32 num_rids, uint32 *rid, uint32 status);
-BOOL samr_io_r_query_useraliases(char *desc,  SAMR_R_QUERY_USERALIASES *r_u, prs_struct *ps, int depth);
-void samr_free_r_query_useraliases(SAMR_R_QUERY_USERALIASES *r_u);
-BOOL make_samr_q_open_alias(SAMR_Q_OPEN_ALIAS *q_u, const POLICY_HND *pol,
-                               uint32 unknown_0, uint32 rid);
-BOOL samr_io_q_open_alias(char *desc,  SAMR_Q_OPEN_ALIAS *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_open_alias(char *desc,  SAMR_R_OPEN_ALIAS *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_lookup_rids(SAMR_Q_LOOKUP_RIDS *q_u,
-               const POLICY_HND *pol, uint32 flags,
-               uint32 num_rids, const uint32 *rid);
-BOOL samr_io_q_lookup_rids(char *desc,  SAMR_Q_LOOKUP_RIDS *q_u, prs_struct *ps, int depth);
-void samr_free_q_lookup_rids(SAMR_Q_LOOKUP_RIDS *q_u);
-BOOL make_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS *r_u,
-               uint32 num_names, UNIHDR *hdr_name, UNISTR2 *uni_name,
-               uint32 *type);
-BOOL samr_io_r_lookup_rids(char *desc, SAMR_R_LOOKUP_RIDS *r_u, prs_struct *ps, int depth);
-void samr_free_r_lookup_rids(SAMR_R_LOOKUP_RIDS *r_u);
-BOOL make_samr_q_delete_alias(SAMR_Q_DELETE_DOM_ALIAS *q_u, POLICY_HND *hnd);
-BOOL samr_io_q_delete_alias(char *desc,  SAMR_Q_DELETE_DOM_ALIAS *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_delete_alias(char *desc,  SAMR_R_DELETE_DOM_ALIAS *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_create_dom_alias(SAMR_Q_CREATE_DOM_ALIAS *q_u, POLICY_HND *hnd,
-                               const char *acct_desc);
-BOOL samr_io_q_create_dom_alias(char *desc,  SAMR_Q_CREATE_DOM_ALIAS *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_create_dom_alias(char *desc,  SAMR_R_CREATE_DOM_ALIAS *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_add_aliasmem(SAMR_Q_ADD_ALIASMEM *q_u, POLICY_HND *hnd,
-                               DOM_SID *sid);
-BOOL samr_io_q_add_aliasmem(char *desc,  SAMR_Q_ADD_ALIASMEM *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_add_aliasmem(char *desc,  SAMR_R_ADD_ALIASMEM *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_del_aliasmem(SAMR_Q_DEL_ALIASMEM *q_u, POLICY_HND *hnd,
-                               DOM_SID *sid);
-BOOL samr_io_q_del_aliasmem(char *desc,  SAMR_Q_DEL_ALIASMEM *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_del_aliasmem(char *desc,  SAMR_R_DEL_ALIASMEM *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_delete_dom_alias(SAMR_Q_DELETE_DOM_ALIAS *q_c, POLICY_HND *hnd);
-BOOL samr_io_q_delete_dom_alias(char *desc,  SAMR_Q_DELETE_DOM_ALIAS *q_u, prs_struct *ps, int depth);
-BOOL make_samr_r_delete_dom_alias(SAMR_R_DELETE_DOM_ALIAS *r_u,
-               uint32 status);
-BOOL samr_io_r_delete_dom_alias(char *desc,  SAMR_R_DELETE_DOM_ALIAS *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_query_aliasmem(SAMR_Q_QUERY_ALIASMEM *q_c,
-                               const POLICY_HND *hnd);
-BOOL samr_io_q_query_aliasmem(char *desc,  SAMR_Q_QUERY_ALIASMEM *q_u, prs_struct *ps, int depth);
-BOOL make_samr_r_query_aliasmem(SAMR_R_QUERY_ALIASMEM *r_u,
-               uint32 num_sids, DOM_SID2 *sid, uint32 status);
-BOOL samr_io_r_query_aliasmem(char *desc,  SAMR_R_QUERY_ALIASMEM *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_lookup_names(SAMR_Q_LOOKUP_NAMES *q_u,
-                             const POLICY_HND *pol, uint32 flags,
-                             uint32 num_names, const char **name);
-BOOL samr_io_q_lookup_names(char *desc,  SAMR_Q_LOOKUP_NAMES *q_u, prs_struct *ps, int depth);
-void samr_free_q_lookup_names(SAMR_Q_LOOKUP_NAMES *q_l);
-BOOL make_samr_r_lookup_names(SAMR_R_LOOKUP_NAMES *r_u,
-                             uint32 num_rids,
-                             const uint32 *rid, const uint32 *type,
-                             uint32 status);
-BOOL samr_io_r_lookup_names(char *desc,  SAMR_R_LOOKUP_NAMES *r_u, prs_struct *ps, int depth);
-void samr_free_r_lookup_names(SAMR_R_LOOKUP_NAMES *r_l);
-BOOL make_samr_q_open_user(SAMR_Q_OPEN_USER *q_u,
-                               const POLICY_HND *pol,
-                               uint32 access_mask, uint32 rid);
-BOOL samr_io_q_open_user(char *desc,  SAMR_Q_OPEN_USER *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_open_user(char *desc,  SAMR_R_OPEN_USER *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_create_user(SAMR_Q_CREATE_USER *q_u,
-                               POLICY_HND *pol,
-                               const char *name,
-                               uint16 acb_info, uint32 access_mask);
-BOOL samr_io_q_create_user(char *desc,  SAMR_Q_CREATE_USER *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_create_user(char *desc,  SAMR_R_CREATE_USER *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u,
-                               POLICY_HND *hnd, uint16 switch_value);
-BOOL samr_io_q_query_userinfo(char *desc,  SAMR_Q_QUERY_USERINFO *q_u, prs_struct *ps, int depth);
-BOOL make_sam_user_info10(SAM_USER_INFO_10 *usr,
-                               uint32 acb_info);
-BOOL sam_io_user_info10(char *desc,  SAM_USER_INFO_10 *usr, prs_struct *ps, int depth);
-BOOL make_sam_user_info11(SAM_USER_INFO_11 *usr,
-                               NTTIME *expiry,
-                               char *mach_acct,
-                               uint32 rid_user,
-                               uint32 rid_group,
-                               uint16 acct_ctrl);
-BOOL sam_io_user_info11(char *desc,  SAM_USER_INFO_11 *usr, prs_struct *ps, int depth);
-BOOL make_sam_user_info24(SAM_USER_INFO_24 *usr,
-       char newpass[516], uint16 passlen);
-BOOL make_sam_user_info23W(SAM_USER_INFO_23 *usr,
-
-       const NTTIME *logon_time, /* all zeros */
-       const NTTIME *logoff_time, /* all zeros */
-       const NTTIME *kickoff_time, /* all zeros */
-       const NTTIME *pass_last_set_time, /* all zeros */
-       const NTTIME *pass_can_change_time, /* all zeros */
-       const NTTIME *pass_must_change_time, /* all zeros */
-
-       const UNISTR2 *user_name, 
-       const UNISTR2 *full_name,
-       const UNISTR2 *home_dir,
-       const UNISTR2 *dir_drive,
-       const UNISTR2 *log_scr,
-       const UNISTR2 *prof_path,
-       const UNISTR2 *desc,
-       const UNISTR2 *wkstas,
-       const UNISTR2 *unk_str,
-       const UNISTR2 *mung_dial,
-
-       uint32 user_rid, /* 0x0000 0000 */
-       uint32 group_rid,
-       uint16 acb_info, 
-
-       uint32 unknown_3,
-       uint16 logon_divs,
-       LOGON_HRS *hrs,
-       uint32 unknown_5,
-       char newpass[516]
-#if 0
-       , uint32 unknown_6
-#endif
-                       );
-BOOL make_sam_user_info23A(SAM_USER_INFO_23 *usr,
-
-       NTTIME *logon_time, /* all zeros */
-       NTTIME *logoff_time, /* all zeros */
-       NTTIME *kickoff_time, /* all zeros */
-       NTTIME *pass_last_set_time, /* all zeros */
-       NTTIME *pass_can_change_time, /* all zeros */
-       NTTIME *pass_must_change_time, /* all zeros */
-
-       char *user_name, /* NULL */
-       char *full_name,
-       char *home_dir,
-       char *dir_drive,
-       char *log_scr,
-       char *prof_path,
-       char *desc,
-       char *wkstas,
-       char *unk_str,
-       char *mung_dial,
-
-       uint32 user_rid, /* 0x0000 0000 */
-       uint32 group_rid,
-       uint16 acb_info, 
-
-       uint32 unknown_3,
-       uint16 logon_divs,
-       LOGON_HRS *hrs,
-       uint32 unknown_5,
-       char newpass[516]
-#if 0
-       , uint32 unknown_6
-#endif
-                       );
-BOOL make_sam_user_info21W(SAM_USER_INFO_21 *usr,
-
-       const NTTIME *logon_time,
-       const NTTIME *logoff_time,
-       const NTTIME *kickoff_time,
-       const NTTIME *pass_last_set_time,
-       const NTTIME *pass_can_change_time,
-       const NTTIME *pass_must_change_time,
-
-       const UNISTR2 *user_name, 
-       const UNISTR2 *full_name,
-       const UNISTR2 *home_dir,
-       const UNISTR2 *dir_drive,
-       const UNISTR2 *log_scr,
-       const UNISTR2 *prof_path,
-       const UNISTR2 *desc,
-       const UNISTR2 *wkstas,
-       const UNISTR2 *unk_str,
-       const UNISTR2 *mung_dial,
-
-       const uchar lm_pwd[16],
-       const uchar nt_pwd[16],
-
-       uint32 user_rid,
-       uint32 group_rid,
-       uint16 acb_info, 
-
-       uint32 unknown_3,
-       uint16 logon_divs,
-       const LOGON_HRS *hrs,
-       uint32 unknown_5,
-       uint32 unknown_6);
-BOOL make_sam_user_info21A(SAM_USER_INFO_21 *usr,
-
-       NTTIME *logon_time,
-       NTTIME *logoff_time,
-       NTTIME *kickoff_time,
-       NTTIME *pass_last_set_time,
-       NTTIME *pass_can_change_time,
-       NTTIME *pass_must_change_time,
-
-       char *user_name,
-       char *full_name,
-       char *home_dir,
-       char *dir_drive,
-       char *log_scr,
-       char *prof_path,
-       char *desc,
-       char *wkstas,
-       char *unk_str,
-       char *mung_dial,
-
-       uint32 user_rid,
-       uint32 group_rid,
-       uint16 acb_info, 
-
-       uint32 unknown_3,
-       uint16 logon_divs,
-       LOGON_HRS *hrs,
-       uint32 unknown_5,
-       uint32 unknown_6);
-BOOL sam_io_user_info21(char *desc,  SAM_USER_INFO_21 *usr, prs_struct *ps, int depth);
-BOOL make_samr_userinfo_ctr(SAM_USERINFO_CTR *ctr, const uchar *sess_key,
-                               uint16 switch_value, void *info);
-BOOL samr_io_userinfo_ctr(char *desc,  SAM_USERINFO_CTR *ctr, prs_struct *ps, int depth);
-void free_samr_userinfo_ctr(SAM_USERINFO_CTR *ctr);
-BOOL make_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO *r_u,
-                               SAM_USERINFO_CTR *ctr, uint32 status);
-BOOL samr_io_r_query_userinfo(char *desc,  SAMR_R_QUERY_USERINFO *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_set_userinfo(SAMR_Q_SET_USERINFO *q_u,
-                               POLICY_HND *hnd,
-                               uint16 switch_value, void *info);
-BOOL samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO *q_u, prs_struct *ps, int depth);
-void free_samr_q_set_userinfo(SAMR_Q_SET_USERINFO *q_u);
-BOOL make_samr_r_set_userinfo(SAMR_R_SET_USERINFO *r_u, uint32 status);
-BOOL samr_io_r_set_userinfo(char *desc,  SAMR_R_SET_USERINFO *r_u, prs_struct *ps, int depth);
-BOOL samr_io_userinfo2_ctr(char *desc,  SAM_USERINFO2_CTR *ctr, prs_struct *ps, int depth);
-void free_samr_userinfo2_ctr(SAM_USERINFO2_CTR *ctr);
-BOOL make_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 *q_u,
-                               POLICY_HND *hnd,
-                               uint16 switch_value, 
-                               SAM_USERINFO2_CTR *ctr);
-BOOL samr_io_q_set_userinfo2(char *desc, SAMR_Q_SET_USERINFO2 *q_u, prs_struct *ps, int depth);
-void free_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 *q_u);
-BOOL make_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 *r_u,
-                               uint32 status);
-BOOL samr_io_r_set_userinfo2(char *desc,  SAMR_R_SET_USERINFO2 *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_connect(SAMR_Q_CONNECT *q_u,
-                               const char *srv_name, uint32 access_mask);
-BOOL samr_io_q_connect(char *desc,  SAMR_Q_CONNECT *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_connect(char *desc,  SAMR_R_CONNECT *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_connect_anon(SAMR_Q_CONNECT_ANON *q_u);
-BOOL samr_io_q_connect_anon(char *desc,  SAMR_Q_CONNECT_ANON *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_connect_anon(char *desc,  SAMR_R_CONNECT_ANON *r_u, prs_struct *ps, int depth);
-BOOL make_samr_q_get_dom_pwinfo(SAMR_Q_GET_DOM_PWINFO *q_u, const char *srv_name);
-BOOL samr_io_q_get_dom_pwinfo(char *desc,  SAMR_Q_GET_DOM_PWINFO *q_u, prs_struct *ps, int depth);
-BOOL samr_io_r_get_dom_pwinfo(char *desc,  SAMR_R_GET_DOM_PWINFO *r_u, prs_struct *ps, int depth);
-BOOL make_enc_passwd(SAMR_ENC_PASSWD *pwd, const char pass[512]);
-BOOL samr_io_enc_passwd(char *desc, SAMR_ENC_PASSWD *pwd, prs_struct *ps, int depth);
-BOOL make_enc_hash(SAMR_ENC_HASH *hsh, const uchar hash[16]);
-BOOL samr_io_enc_hash(char *desc, SAMR_ENC_HASH *hsh, prs_struct *ps, int depth);
-BOOL make_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER *q_u,
-                               const char *dest_host, const char *user_name,
-                               const char nt_newpass[516],
-                               const uchar nt_oldhash[16],
-                               const char lm_newpass[516],
-                               const uchar lm_oldhash[16]);
-BOOL samr_io_q_chgpasswd_user(char *desc, SAMR_Q_CHGPASSWD_USER *q_u, prs_struct *ps, int depth);
-BOOL make_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER *r_u, uint32 status);
-BOOL samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER *r_u, prs_struct *ps, int depth);
-
 /*The following definitions come from  rpc_parse/parse_sec.c  */
 
 BOOL make_sec_access(SEC_ACCESS *t, uint32 mask);
@@ -3472,326 +2840,6 @@ BOOL make_sec_desc_buf(SEC_DESC_BUF *buf, int len, SEC_DESC *data);
 void free_sec_desc_buf(SEC_DESC_BUF *buf);
 BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF *sec, prs_struct *ps, int depth);
 
-/*The following definitions come from  rpc_parse/parse_spoolss.c  */
-
-BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime);
-BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
-                                     prs_struct *ps, int depth);
-BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth);
-BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, 
-               const char *printername,
-               uint32 cbbuf, uint32 devmod, uint32 des_access,
-               const char *station,
-               const char *username);
-BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth);
-BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
-                               POLICY_HND *handle,
-                               char *valuename,
-                               uint32 size);
-BOOL spoolss_io_q_getprinterdata(char *desc, SPOOL_Q_GETPRINTERDATA *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_getprinterdata(char *desc, SPOOL_R_GETPRINTERDATA *r_u, prs_struct *ps, int depth);
-BOOL make_spoolss_q_closeprinter(SPOOL_Q_CLOSEPRINTER *q_u, POLICY_HND *hnd);
-BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_startdocprinter(char *desc, SPOOL_Q_STARTDOCPRINTER *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_startdocprinter(char *desc, SPOOL_R_STARTDOCPRINTER *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_enddocprinter(char *desc, SPOOL_Q_ENDDOCPRINTER *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enddocprinter(char *desc, SPOOL_R_ENDDOCPRINTER *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_startpageprinter(char *desc, SPOOL_Q_STARTPAGEPRINTER *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_startpageprinter(char *desc, SPOOL_R_STARTPAGEPRINTER *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_endpageprinter(char *desc, SPOOL_Q_ENDPAGEPRINTER *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_endpageprinter(char *desc, SPOOL_R_ENDPAGEPRINTER *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_writeprinter(char *desc, SPOOL_Q_WRITEPRINTER *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_writeprinter(char *desc, SPOOL_R_WRITEPRINTER *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_rffpcnex(char *desc, SPOOL_Q_RFFPCNEX *q_u,
-                           prs_struct *ps, int depth);
-BOOL spoolss_io_r_rffpcnex(char *desc, SPOOL_R_RFFPCNEX *r_u, 
-                           prs_struct *ps, int depth);
-BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u,
-                           prs_struct *ps, int depth);
-BOOL spoolss_io_r_rfnpcnex(char *desc, 
-                           SPOOL_R_RFNPCNEX *r_u, 
-                           prs_struct *ps, int depth);
-BOOL spoolss_io_free_buffer(BUFFER *buffer);
-BOOL spoolss_io_q_getprinterdriver2(char *desc, 
-                                   SPOOL_Q_GETPRINTERDRIVER2 *q_u,
-                                    prs_struct *ps, int depth);
-BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u,
-                               prs_struct *ps, int depth);
-BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u,
-                               uint32 flags,
-                               const char* servername,
-                               uint32 level,
-                               uint32 size);
-BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u,
-                               prs_struct *ps, int depth);
-void free_r_enumprinters(SPOOL_R_ENUMPRINTERS *r_u);
-BOOL spoolss_io_r_enumprinters(char *desc,
-                               SPOOL_R_ENUMPRINTERS *r_u, 
-                               prs_struct *ps, int depth);
-BOOL spoolss_io_r_getprinter(char *desc,
-                               SPOOL_R_GETPRINTER *r_u, 
-                               prs_struct *ps, int depth);
-BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u,
-                               POLICY_HND *hnd,
-                               uint32 level,
-                               uint32 buf_size);
-BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u,
-                               prs_struct *ps, int depth);
-BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth);
-void free_job_info_ctr(JOB_INFO_CTR *ctr, uint32 level, uint32 numofjobs);
-void free_r_enumjobs(SPOOL_R_ENUMJOBS *r_u);
-BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth);
-BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
-                               uint32 firstjob,
-                               uint32 numofjobs,
-                               uint32 level,
-                               uint32 buf_size);
-BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enumdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth);
-void free_spoolss_r_enumdrivers(SPOOL_R_ENUMPRINTERDRIVERS *r_u);
-BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth);
-void spoolss_free_r_enumforms(SPOOL_R_ENUMFORMS *r_u);
-BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth);
-void spoolss_free_r_enumports(SPOOL_R_ENUMPORTS *r_u);
-BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth);
-BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 **q_u, prs_struct *ps, int depth);
-BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth);
-BOOL spool_io_user_level_1(char *desc, SPOOL_USER_LEVEL_1 **q_u, prs_struct *ps, int depth);
-BOOL spool_io_user_level(char *desc, SPOOL_USER_LEVEL *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u, prs_struct *ps, int depth);
-BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u, 
-                                          prs_struct *ps, int depth);
-BOOL uniarray_2_ascarray(BUFFER5 *buf5, char ***ar);
-BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth);
-BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth);
-BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth);
-BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
-                                NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc);
-BOOL uni_2_asc_printer_info_2(const SPOOL_PRINTER_INFO_LEVEL_2 *uni,
-                              NT_PRINTER_INFO_LEVEL_2  **asc);
-BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth);
-BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
-                               uint32 type, const uint8 *data, uint32 len);
-BOOL spoolss_io_q_addform(char *desc, SPOOL_Q_ADDFORM *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_addform(char *desc, SPOOL_R_ADDFORM *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_q_setform(char *desc, SPOOL_Q_SETFORM *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth);
-void free_spoolss_r_getjob(SPOOL_R_GETJOB *r_u);
-BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth);
-void free_devmode(DEVICEMODE *devmode);
-void free_printer_info_2(PRINTER_INFO_2 *printer);
-void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries);
-PRINTER_INFO_2 *add_print2_to_array(uint32 *len, PRINTER_INFO_2 ***array,
-                               const PRINTER_INFO_2 *prt);
-void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries);
-PRINTER_INFO_1 *add_print1_to_array(uint32 *len, PRINTER_INFO_1 ***array,
-                               const PRINTER_INFO_1 *prt);
-void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries);
-JOB_INFO_1 *add_job1_to_array(uint32 *len, JOB_INFO_1 ***array,
-                               const JOB_INFO_1 *job);
-void free_job_info_2(JOB_INFO_2 *job);
-void free_job2_array(uint32 num_entries, JOB_INFO_2 **entries);
-JOB_INFO_2 *add_job2_to_array(uint32 *len, JOB_INFO_2 ***array,
-                               const JOB_INFO_2 *job);
-
-/*The following definitions come from  rpc_parse/parse_srv.c  */
-
-BOOL make_srv_share_info1_str(SH_INFO_1_STR *sh1, char *net_name, char *remark);
-BOOL make_srv_share_info1(SH_INFO_1 *sh1, char *net_name, uint32 type, char *remark);
-BOOL make_srv_share_info2_str(SH_INFO_2_STR *sh2,
-                               char *net_name, char *remark,
-                               char *path, char *pass);
-BOOL make_srv_share_info2(SH_INFO_2 *sh2,
-                               char *net_name, uint32 type, char *remark,
-                               uint32 perms, uint32 max_uses, uint32 num_uses,
-                               char *path, char *pass);
-BOOL make_srv_q_net_share_enum(SRV_Q_NET_SHARE_ENUM *q_n, 
-                               const char *srv_name, 
-                               uint32 share_level, SRV_SHARE_INFO_CTR *ctr,
-                               uint32 preferred_len,
-                               ENUM_HND *hnd);
-BOOL srv_io_q_net_share_enum(char *desc,  SRV_Q_NET_SHARE_ENUM *q_n, prs_struct *ps, int depth);
-BOOL srv_io_r_net_share_enum(char *desc,  SRV_R_NET_SHARE_ENUM *r_n, prs_struct *ps, int depth);
-BOOL make_srv_sess_info0_str(SESS_INFO_0_STR *ss0, char *name);
-BOOL make_srv_sess_info0(SESS_INFO_0 *ss0, char *name);
-BOOL make_srv_sess_info1_str(SESS_INFO_1_STR *ss1, char *name, char *user);
-BOOL make_srv_sess_info1(SESS_INFO_1 *ss1, 
-                               char *name, char *user,
-                               uint32 num_opens, uint32 open_time, uint32 idle_time,
-                               uint32 user_flags);
-BOOL make_srv_q_net_sess_enum(SRV_Q_NET_SESS_ENUM *q_n, 
-                               const char *srv_name, const char *qual_name,
-                               char *user_name,
-                               uint32 sess_level, SRV_SESS_INFO_CTR *ctr,
-                               uint32 preferred_len,
-                               ENUM_HND *hnd);
-BOOL srv_io_q_net_sess_enum(char *desc,  SRV_Q_NET_SESS_ENUM *q_n, prs_struct *ps, int depth);
-BOOL srv_io_r_net_sess_enum(char *desc,  SRV_R_NET_SESS_ENUM *r_n, prs_struct *ps, int depth);
-BOOL make_srv_conn_info0(CONN_INFO_0 *ss0, uint32 id);
-BOOL make_srv_conn_info1_str(CONN_INFO_1_STR *ss1, char *usr_name, char *net_name);
-BOOL make_srv_conn_info1(CONN_INFO_1 *ss1, 
-                               uint32 id, uint32 type,
-                               uint32 num_opens, uint32 num_users, uint32 open_time,
-                               char *usr_name, char *net_name);
-BOOL make_srv_q_net_conn_enum(SRV_Q_NET_CONN_ENUM *q_n, 
-                               const char *srv_name, const char *qual_name,
-                               uint32 conn_level, SRV_CONN_INFO_CTR *ctr,
-                               uint32 preferred_len,
-                               ENUM_HND *hnd);
-BOOL srv_io_q_net_conn_enum(char *desc,  SRV_Q_NET_CONN_ENUM *q_n, prs_struct *ps, int depth);
-BOOL srv_io_r_net_conn_enum(char *desc,  SRV_R_NET_CONN_ENUM *r_n, prs_struct *ps, int depth);
-BOOL make_srv_tprt_info0_str(TPRT_INFO_0_STR *tp0,
-                               char *trans_name,
-                               char *trans_addr, uint32 trans_addr_len,
-                               char *addr_name);
-BOOL make_srv_tprt_info0(TPRT_INFO_0 *tp0, 
-                               uint32 num_vcs, uint32 trans_addr_len,
-                               char *trans_name, char *trans_addr,
-                               char *addr_name);
-void free_srv_tprt_info_0(SRV_TPRT_INFO_0 *tp0);
-void free_srv_tprt_ctr(SRV_TPRT_INFO_CTR *ctr);
-BOOL make_srv_q_net_tprt_enum(SRV_Q_NET_TPRT_ENUM *q_n, 
-                               const char *srv_name, 
-                               uint32 tprt_level, SRV_TPRT_INFO_CTR *ctr,
-                               uint32 preferred_len,
-                               ENUM_HND *hnd);
-BOOL srv_io_q_net_tprt_enum(char *desc,  SRV_Q_NET_TPRT_ENUM *q_n, prs_struct *ps, int depth);
-BOOL srv_io_r_net_tprt_enum(char *desc,  SRV_R_NET_TPRT_ENUM *r_n, prs_struct *ps, int depth);
-BOOL make_srv_file_info3_str(FILE_INFO_3_STR *fi3, char *user_name, char *path_name);
-BOOL make_srv_file_info3(FILE_INFO_3 *fl3,
-                               uint32 id, uint32 perms, uint32 num_locks,
-                               char *path_name, char *user_name);
-BOOL make_srv_q_net_file_enum(SRV_Q_NET_FILE_ENUM *q_n, 
-                               const char *srv_name, const char *qual_name,
-                               uint32 file_id,
-                               uint32 file_level, SRV_FILE_INFO_CTR *ctr,
-                               uint32 preferred_len,
-                               ENUM_HND *hnd);
-BOOL srv_io_q_net_file_enum(char *desc,  SRV_Q_NET_FILE_ENUM *q_n, prs_struct *ps, int depth);
-BOOL srv_io_r_net_file_enum(char *desc,  SRV_R_NET_FILE_ENUM *r_n, prs_struct *ps, int depth);
-BOOL make_srv_q_net_srv_get_info(SRV_Q_NET_SRV_GET_INFO *srv,
-                               char *server_name, uint32 switch_value);
-BOOL srv_io_q_net_srv_get_info(char *desc,  SRV_Q_NET_SRV_GET_INFO *q_n, prs_struct *ps, int depth);
-BOOL make_srv_r_net_srv_get_info(SRV_R_NET_SRV_GET_INFO *srv,
-                               uint32 switch_value, SRV_INFO_CTR *ctr, uint32 status);
-BOOL srv_io_r_net_srv_get_info(char *desc,  SRV_R_NET_SRV_GET_INFO *r_n, prs_struct *ps, int depth);
-BOOL make_srv_q_net_remote_tod(SRV_Q_NET_REMOTE_TOD *q_t, char *server_name);
-BOOL srv_io_q_net_remote_tod(char *desc,  SRV_Q_NET_REMOTE_TOD *q_n, prs_struct *ps, int depth);
-BOOL make_time_of_day_info(TIME_OF_DAY_INFO *tod, uint32 elapsedt, uint32 msecs,
-                           uint32 hours, uint32 mins, uint32 secs, uint32 hunds,
-                          uint32 zone, uint32 tintervals, uint32 day,
-                          uint32 month, uint32 year, uint32 weekday);
-BOOL srv_io_r_net_remote_tod(char *desc, SRV_R_NET_REMOTE_TOD *r_n, prs_struct *ps, int depth);
-
-/*The following definitions come from  rpc_parse/parse_svc.c  */
-
-BOOL make_svc_q_open_sc_man(SVC_Q_OPEN_SC_MAN *q_u,
-                               const char *server, const char *database,
-                               uint32 des_access)  ;
-BOOL svc_io_q_open_sc_man(char *desc, SVC_Q_OPEN_SC_MAN *q_u, prs_struct *ps, int depth);
-BOOL make_svc_r_open_sc_man(SVC_R_OPEN_SC_MAN *r_u, POLICY_HND *hnd,
-                               uint32 status)  ;
-BOOL svc_io_r_open_sc_man(char *desc,  SVC_R_OPEN_SC_MAN *r_u, prs_struct *ps, int depth);
-BOOL make_svc_q_open_service(SVC_Q_OPEN_SERVICE *q_u,
-                               POLICY_HND *hnd,
-                               const char *server,
-                               uint32 des_access)  ;
-BOOL svc_io_q_open_service(char *desc, SVC_Q_OPEN_SERVICE *q_u, prs_struct *ps, int depth);
-BOOL make_svc_r_open_service(SVC_R_OPEN_SERVICE *r_u, POLICY_HND *hnd,
-                               uint32 status)  ;
-BOOL svc_io_r_open_service(char *desc,  SVC_R_OPEN_SERVICE *r_u, prs_struct *ps, int depth);
-BOOL make_svc_q_stop_service(SVC_Q_STOP_SERVICE *q_c, POLICY_HND *hnd,
-                               uint32 unk);
-BOOL svc_io_q_stop_service(char *desc, SVC_Q_STOP_SERVICE *q_s, prs_struct *ps, int depth);
-BOOL svc_io_r_stop_service(char *desc,  SVC_R_STOP_SERVICE *r_s, prs_struct *ps, int depth);
-BOOL make_svc_q_start_service(SVC_Q_START_SERVICE *q_c, POLICY_HND *hnd,
-                               uint32 argc,
-                               char **argv);
-BOOL svc_io_q_start_service(char *desc, SVC_Q_START_SERVICE *q_s, prs_struct *ps, int depth);
-BOOL svc_io_r_start_service(char *desc,  SVC_R_START_SERVICE *r_s, prs_struct *ps, int depth);
-BOOL make_svc_query_svc_cfg(QUERY_SERVICE_CONFIG *q_u,
-                               uint32 service_type, uint32 start_type,
-                               uint32 error_control,
-                               char* bin_path_name, char* load_order_grp, 
-                               uint32 tag_id,
-                               char* dependencies, char* service_start_name,
-                               char* disp_name);
-BOOL svc_io_query_svc_cfg(char *desc, QUERY_SERVICE_CONFIG *q_u, prs_struct *ps, int depth);
-BOOL make_svc_q_enum_svcs_status(SVC_Q_ENUM_SVCS_STATUS *q_c, POLICY_HND *hnd,
-                               uint32 service_type, uint32 service_state,
-                               uint32 buf_size, uint32 resume_hnd );
-BOOL svc_io_q_enum_svcs_status(char *desc,  SVC_Q_ENUM_SVCS_STATUS *q_u, prs_struct *ps, int depth);
-BOOL make_svc_r_enum_svcs_status(SVC_R_ENUM_SVCS_STATUS *r_c, 
-                               ENUM_SRVC_STATUS *svcs, uint32 more_buf_size,
-                               uint32 num_svcs, uint32 resume_hnd,
-                               uint32 dos_status);
-BOOL svc_io_r_enum_svcs_status(char *desc, SVC_R_ENUM_SVCS_STATUS *svc, prs_struct *ps, int depth);
-BOOL svc_io_svc_status(char *desc,  SVC_STATUS *svc, prs_struct *ps, int depth);
-BOOL make_svc_q_query_svc_config(SVC_Q_QUERY_SVC_CONFIG *q_c, POLICY_HND *hnd,
-                               uint32 buf_size);
-BOOL svc_io_q_query_svc_config(char *desc,  SVC_Q_QUERY_SVC_CONFIG *q_u, prs_struct *ps, int depth);
-BOOL make_svc_r_query_svc_config(SVC_R_QUERY_SVC_CONFIG *r_c, 
-                               QUERY_SERVICE_CONFIG *cfg,
-                               uint32 buf_size);
-BOOL svc_io_r_query_svc_config(char *desc,  SVC_R_QUERY_SVC_CONFIG *r_u, prs_struct *ps, int depth);
-BOOL svc_io_q_query_disp_name(char *desc, SVC_Q_QUERY_DISP_NAME *q_u, prs_struct *ps, int depth);
-BOOL make_svc_r_query_disp_name(SVC_R_QUERY_DISP_NAME *r_d, 
-                               char *disp_name, uint32 status);
-BOOL svc_io_r_query_disp_name(char *desc, SVC_R_QUERY_DISP_NAME *r_u, prs_struct *ps, int depth);
-BOOL make_svc_q_close(SVC_Q_CLOSE *q_c, POLICY_HND *hnd);
-BOOL svc_io_q_close(char *desc,  SVC_Q_CLOSE *q_u, prs_struct *ps, int depth);
-BOOL svc_io_r_close(char *desc,  SVC_R_CLOSE *r_u, prs_struct *ps, int depth);
-BOOL make_svc_q_change_svc_config(SVC_Q_CHANGE_SVC_CONFIG *q_u, POLICY_HND *hnd,
-                               uint32 service_type, uint32 start_type,
-                               uint32 unknown_0,
-                               uint32 error_control,
-                               char* bin_path_name, char* load_order_grp, 
-                               uint32 tag_id,
-                               char* dependencies, char* service_start_name,
-                               char* password,
-                               char* disp_name);
-BOOL svc_io_q_change_svc_config(char *desc,  SVC_Q_CHANGE_SVC_CONFIG *q_u, prs_struct *ps, int depth);
-BOOL make_svc_r_change_svc_config(SVC_R_CHANGE_SVC_CONFIG *r_c, 
-                               uint32 unknown_0, uint32 status);
-BOOL svc_io_r_change_svc_config(char *desc,  SVC_R_CHANGE_SVC_CONFIG *r_u, prs_struct *ps, int depth);
-
-/*The following definitions come from  rpc_parse/parse_wks.c  */
-
-BOOL make_wks_q_query_info(WKS_Q_QUERY_INFO *q_u,
-                               char *server, uint16 switch_value)  ;
-BOOL wks_io_q_query_info(char *desc, WKS_Q_QUERY_INFO *q_u, prs_struct *ps, int depth);
-BOOL make_wks_info_100(WKS_INFO_100 *inf,
-                               uint32 platform_id, uint32 ver_major, uint32 ver_minor,
-                               char *my_name, char *domain_name);
-BOOL make_wks_r_query_info(WKS_R_QUERY_INFO *r_u,
-                               uint32 switch_value, WKS_INFO_100 *wks100,
-                               int status)  ;
-BOOL wks_io_r_query_info(char *desc,  WKS_R_QUERY_INFO *r_u, prs_struct *ps, int depth);
-
 /*The following definitions come from  rpc_server/srv_brs.c  */
 
 BOOL api_brs_rpc(rpcsrv_struct *p);
@@ -3937,6 +2985,7 @@ void cmd_sam_create_dom_group(struct client_info *info, int argc, char *argv[]);
 void cmd_sam_enum_users(struct client_info *info, int argc, char *argv[]);
 void cmd_sam_query_groupmem(struct client_info *info, int argc, char *argv[]);
 void cmd_sam_query_group(struct client_info *info, int argc, char *argv[]);
+void cmd_sam_query_sec_obj(struct client_info *info, int argc, char *argv[]);
 void cmd_sam_query_user(struct client_info *info, int argc, char *argv[]);
 void cmd_sam_set_userinfo2(struct client_info *info, int argc, char *argv[]);
 void cmd_sam_set_userinfo(struct client_info *info, int argc, char *argv[]);
@@ -4282,7 +3331,7 @@ uint32 _samr_open_domain(const POLICY_HND *connect_pol,
 uint32 _samr_get_usrdom_pwinfo(const POLICY_HND *user_pol,
                                uint32 *unknown_0,
                                uint32 *unknown_1);
-uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SAM_SID_STUFF *sid_stuff);
+uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SEC_DESC_BUF *buf);
 uint32 _samr_enum_dom_users(  const POLICY_HND *pol, uint32 *start_idx, 
                                uint16 acb_mask, uint16 unk_1, uint32 size,
                                SAM_ENTRY **sam,
@@ -4454,7 +3503,7 @@ uint32 samr_open_by_tdbrid( TDB_CONTEXT *tdb,
 uint32 _samr_get_usrdom_pwinfo(const POLICY_HND *user_pol,
                                uint32 *unknown_0,
                                uint32 *unknown_1);
-uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SAM_SID_STUFF *sid_stuff);
+uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SEC_DESC_BUF *buf);
 uint32 _samr_query_usergroups(const POLICY_HND *pol,
                                uint32 *num_groups,
                                DOM_GID **gids);
index 0b3311ecda87034491a53205d867c051f19cdc08..111615ece236fde711ab8687eea36484957d3f02 100644 (file)
@@ -311,6 +311,9 @@ uint32 samr_enum_dom_users(  POLICY_HND *pol, uint32 *start_idx,
                                uint32 *num_sam_users);
 BOOL samr_connect(  const char *srv_name, uint32 access_mask,
                                POLICY_HND *connect_pol);
+BOOL samr_query_sec_obj(  const POLICY_HND *pol,
+                               uint32 type,
+                               SEC_DESC_BUF *buf);
 BOOL samr_open_user(  const POLICY_HND *pol,
                                uint32 unk_0, uint32 rid, 
                                POLICY_HND *user_pol);
index 12948258f987d2748a00c4376dfcbd65981dbdd2..df982a3f5df2986af13d2aea8b5cc2d3b30c37a6 100644 (file)
@@ -88,6 +88,7 @@ BOOL eventlog_io_r_readeventlog(char *desc, EVENTLOG_R_READEVENTLOG *r_u, prs_st
 
 BOOL make_lsa_trans_name(LSA_TRANS_NAME *trn, UNISTR2 *uni_name,
                        uint32 sid_name_use, char *name, uint32 idx);
+int make_dom_ref(DOM_R_REF *ref, const char *dom_name, const DOM_SID *dom_sid);
 BOOL make_lsa_sec_qos(LSA_SEC_QOS *qos, uint16 imp_lev, uint8 ctxt, uint8 eff,
                                uint32 unknown);
 BOOL make_lsa_obj_attr(LSA_OBJ_ATTR *attr, uint32 attributes, LSA_SEC_QOS *qos);
@@ -417,7 +418,7 @@ BOOL samr_io_q_get_usrdom_pwinfo(char *desc,  SAMR_Q_GET_USRDOM_PWINFO *q_u, prs
 BOOL make_samr_r_get_usrdom_pwinfo(SAMR_R_GET_USRDOM_PWINFO *q_u, uint32 status);
 BOOL samr_io_r_get_usrdom_pwinfo(char *desc,  SAMR_R_GET_USRDOM_PWINFO *r_u, prs_struct *ps, int depth);
 BOOL make_samr_q_query_sec_obj(SAMR_Q_QUERY_SEC_OBJ *q_u,
-                               POLICY_HND *user_pol, uint16 switch_value);
+                               const POLICY_HND *user_pol, uint32 sec_info);
 BOOL samr_io_q_query_sec_obj(char *desc,  SAMR_Q_QUERY_SEC_OBJ *q_u, prs_struct *ps, int depth);
 BOOL make_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO *q_u,
                                POLICY_HND *domain_pol, uint16 switch_value);
@@ -431,11 +432,6 @@ BOOL make_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO *r_u,
                                uint16 switch_value, SAM_UNK_CTR *ctr,
                                uint32 status);
 BOOL samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO *r_u, prs_struct *ps, int depth);
-BOOL make_dom_sid3(DOM_SID3 *sid3, uint16 unk_0, uint16 unk_1, DOM_SID *sid);
-BOOL make_sam_sid_stuff(SAM_SID_STUFF *stf,
-                               uint16 unknown_2, uint16 unknown_3,
-                               uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
-                               int num_sid3s);
 BOOL samr_io_r_query_sec_obj(char *desc,  SAMR_R_QUERY_SEC_OBJ *r_u, prs_struct *ps, int depth);
 BOOL make_sam_entry(SAM_ENTRY *sam, uint32 len_sam_name, uint32 rid);
 BOOL make_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_e, POLICY_HND *pol,
index ff8b6b3fdc22352bc290d279eb9eea48097bd466..c8c6f975bac52cd47891302a68575fe6bf541cbb 100644 (file)
@@ -389,69 +389,15 @@ SAMR_Q_QUERY_SEC_OBJ - info level 4.  returns SIDs.
 typedef struct q_samr_query_sec_obj_info
 {
        POLICY_HND user_pol;          /* policy handle */
-       uint16 switch_value;     /* 0x0000 0004 */
-       /* uint8 pad[2] */
+       uint32 sec_info;     /* xxxx_SECURITY_INFORMATION 0x0000 0004 */
 
 } SAMR_Q_QUERY_SEC_OBJ;
 
-/* DOM_SID3 example:
-   0x14 0x035b 0x0002 S-1-1
-   0x18 0x07ff 0x000f S-1-5-20-DOMAIN_ALIAS_RID_ADMINS
-   0x18 0x07ff 0x000f S-1-5-20-DOMAIN_ALIAS_RID_ACCOUNT_OPS
-   0x24 0x0044 0x0002 S-1-5-21-nnn-nnn-nnn-0x03f1
- */
-
-/* DOM_SID3 example:
-   0x24 0x0044 0x0002 S-1-5-21-nnn-nnn-nnn-0x03ee
-   0x18 0x07ff 0x000f S-1-5-20-DOMAIN_ALIAS_RID_ADMINS
-   0x14 0x035b 0x0002 S-1-1
- */
-
-/* DOM_SID3 - security id */
-typedef struct sid_info_3
-{
-       uint16 len; /* length, bytes, including length of len :-) */
-       /* uint8  pad[2]; */
-       
-       DOM_SID sid;
-
-} DOM_SID3;
-
-
-#define MAX_SAM_SIDS 15
-
-/* SAM_SID_STUFF */
-typedef struct sid_stuff_info
-{
-       uint16 unknown_2; /* 0x0001 */
-       uint16 unknown_3; /* 0x8004 */
-
-       uint8 padding1[8];
-
-       uint32 unknown_4; /* 0x0000 0014 */
-       uint32 unknown_5; /* 0x0000 0014 */
-
-       uint16 unknown_6; /* 0x0002 */
-       uint16 unknown_7; /* 0x5800 */
-
-       uint32 num_sids;
-
-       uint16 padding2;
-
-       DOM_SID3 sid[MAX_SAM_SIDS];
-
-} SAM_SID_STUFF;
-
 /* SAMR_R_QUERY_SEC_OBJ - probably an open */
 typedef struct r_samr_query_sec_obj_info
 {
-       uint32 ptr_0;
-       uint32 sid_stuff_len0;
-
-       uint32 ptr_1;
-       uint32 sid_stuff_len1;
-
-       SAM_SID_STUFF sid_stuff;
+       uint32 ptr;
+       SEC_DESC_BUF buf;
 
        uint32 status;         /* return status */
 
index 4c47a94efde84869583ae63e8d24641adaec7efa..1b91c587bdf0df08fc4c51508dfa983db1c137bf 100644 (file)
@@ -684,6 +684,65 @@ BOOL samr_connect(  const char *srv_name, uint32 access_mask,
        return valid_pol;
 }
 
+/****************************************************************************
+do a SAMR Query Security Object
+****************************************************************************/
+BOOL samr_query_sec_obj(  const POLICY_HND *pol,
+                               uint32 type,
+                               SEC_DESC_BUF *buf)
+{
+       prs_struct data;
+       prs_struct rdata;
+
+       SAMR_Q_QUERY_SEC_OBJ q_o;
+       BOOL valid_pol = False;
+
+       DEBUG(4,("SAMR Query Sec Object: type %x\n", type));
+
+       if (pol == NULL) return False;
+
+       /* create and send a MSRPC command with api SAMR_QUERY_SEC_OBJ */
+
+       prs_init(&data , 0, 4, False);
+       prs_init(&rdata, 0, 4, True );
+
+       /* store the parameters */
+       make_samr_q_query_sec_obj(&q_o, pol, type);
+
+       /* turn parameters into data stream */
+       samr_io_q_query_sec_obj("", &q_o,  &data, 0);
+
+       /* send the data on \PIPE\ */
+       if (rpc_hnd_pipe_req(pol, SAMR_QUERY_SEC_OBJECT, &data, &rdata))
+       {
+               SAMR_R_QUERY_SEC_OBJ r_o;
+               BOOL p;
+
+               ZERO_STRUCT(r_o);
+
+               samr_io_r_query_sec_obj("", &r_o, &rdata, 0);
+               p = rdata.offset != 0;
+               
+               if (p && r_o.status != 0)
+               {
+                       /* report error code */
+                       DEBUG(4,("SAMR_R_QUERY_SEC_OBJ: %s\n", get_nt_error_msg(r_o.status)));
+                       p = False;
+               }
+
+               if (p)
+               {
+                       valid_pol = True;
+                       buf->sec = r_o.buf.sec;
+               }
+       }
+
+       prs_free_data(&data   );
+       prs_free_data(&rdata  );
+
+       return valid_pol;
+}
+
 /****************************************************************************
 do a SAMR Open User
 ****************************************************************************/
index 582b5ec98a6170784023ff036375725ca5918726..b56cf5dc6654bc7f40f61cca31643b7518f11691 100644 (file)
@@ -600,8 +600,10 @@ BOOL _prs_uint32(char *name, prs_struct *ps, int depth, uint32 *data32)
        q = prs_data(ps, ps->offset);
        if (q == NULL)
        {
+               fstring str;
+               slprintf(str, sizeof(str)-1, "_prs_uint32 error (%s)", name);
                ps->error = True;
-               prs_debug_out(ps, "_prs_uint32 error", 5);
+               prs_debug_out(ps, str, 5);
                return False;
        }
 
index 40ac1d2fd57aafce5b1aa4ebcb316f614cf8644c..987fc1b677d257b71317eb3904ea60698fc87684 100644 (file)
@@ -305,14 +305,14 @@ BOOL samr_io_r_get_usrdom_pwinfo(char *desc,  SAMR_R_GET_USRDOM_PWINFO *r_u, prs
 reads or writes a structure.
 ********************************************************************/
 BOOL make_samr_q_query_sec_obj(SAMR_Q_QUERY_SEC_OBJ *q_u,
-                               POLICY_HND *user_pol, uint16 switch_value)
+                               const POLICY_HND *user_pol, uint32 sec_info)
 {
        if (q_u == NULL) return False;
 
        DEBUG(5,("samr_make_samr_q_query_sec_obj\n"));
 
        memcpy(&q_u->user_pol, user_pol, sizeof(q_u->user_pol));
-       q_u->switch_value = switch_value;
+       q_u->sec_info = sec_info;
 
        return True;
 }
@@ -333,8 +333,7 @@ BOOL samr_io_q_query_sec_obj(char *desc,  SAMR_Q_QUERY_SEC_OBJ *q_u, prs_struct
        smb_io_pol_hnd("user_pol", &(q_u->user_pol), ps, depth); 
        prs_align(ps);
 
-       prs_uint16("switch_value", ps, depth, &(q_u->switch_value));
-       prs_align(ps);
+       prs_uint32("sec_info", ps, depth, &(q_u->sec_info));
 
        return True;
 }
@@ -673,111 +672,6 @@ BOOL samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO *r_u, prs_str
 }
 
 
-/*******************************************************************
- makes a DOM_SID3 structure.
-
- calculate length by adding up the size of the components.
- ********************************************************************/
-BOOL make_dom_sid3(DOM_SID3 *sid3, uint16 unk_0, uint16 unk_1, DOM_SID *sid)
-{
-       if (sid3 == NULL) return False;
-
-    sid3->sid = *sid;
-       sid3->len = 2 + 8 + sid3->sid.num_auths * 4;
-
-       return True;
-}
-
-/*******************************************************************
-reads or writes a SAM_SID3 structure.
-
-this one's odd, because the length (in bytes) is specified at the beginning.
-the length _includes_ the length of the length, too :-)
-
-********************************************************************/
-static BOOL sam_io_dom_sid3(char *desc,  DOM_SID3 *sid3, prs_struct *ps, int depth)
-{
-       if (sid3 == NULL) return False;
-
-       prs_debug(ps, depth, desc, "sam_io_dom_sid3");
-       depth++;
-
-       prs_uint16("len", ps, depth, &(sid3->len));
-       prs_align(ps);
-       smb_io_dom_sid("", &(sid3->sid), ps, depth); 
-
-       return True;
-}
-
-/*******************************************************************
-makes a SAMR_R_UNKNOWN3 structure.
-
-unknown_2   : 0x0001
-unknown_3   : 0x8004
-
-unknown_4,5 : 0x0000 0014
-
-unknown_6   : 0x0002
-unknown_7   : 0x5800 or 0x0070
-
-********************************************************************/
-BOOL make_sam_sid_stuff(SAM_SID_STUFF *stf,
-                               uint16 unknown_2, uint16 unknown_3,
-                               uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
-                               int num_sid3s)
-{
-       stf->unknown_2 = unknown_2;
-       stf->unknown_3 = unknown_3;
-
-       bzero(stf->padding1, sizeof(stf->padding1));
-
-       stf->unknown_4 = unknown_4;
-       stf->unknown_5 = unknown_4;
-
-       stf->unknown_6 = unknown_6;
-       stf->unknown_7 = unknown_7;
-
-       stf->num_sids  = num_sid3s;
-
-       stf->padding2  = 0x0000;
-
-       return True;
-}
-
-/*******************************************************************
-reads or writes a SAM_SID_STUFF structure.
-********************************************************************/
-static BOOL sam_io_sid_stuff(char *desc,  SAM_SID_STUFF *stf, prs_struct *ps, int depth)
-{
-       uint32 i;
-
-       if (stf == NULL) return False;
-
-       DEBUG(5,("make_sam_sid_stuff\n"));
-
-       prs_uint16("unknown_2", ps, depth, &(stf->unknown_2));
-       prs_uint16("unknown_3", ps, depth, &(stf->unknown_3));
-
-       prs_uint8s(False, "padding1", ps, depth, stf->padding1, sizeof(stf->padding1)); 
-       
-       prs_uint32("unknown_4", ps, depth, &(stf->unknown_4));
-       prs_uint32("unknown_5", ps, depth, &(stf->unknown_5));
-       prs_uint16("unknown_6", ps, depth, &(stf->unknown_6));
-       prs_uint16("unknown_7", ps, depth, &(stf->unknown_7));
-
-       prs_uint32("num_sids ", ps, depth, &(stf->num_sids ));
-       prs_uint16("padding2 ", ps, depth, &(stf->padding2 ));
-
-       SMB_ASSERT_ARRAY(stf->sid, stf->num_sids);
-
-       for (i = 0; i < stf->num_sids; i++)
-       {
-               sam_io_dom_sid3("", &(stf->sid[i]), ps, depth); 
-       }
-
-       return True;
-}
-
 /*******************************************************************
 reads or writes a SAMR_R_QUERY_SEC_OBJ structure.
 
@@ -792,10 +686,6 @@ wierd.
 ********************************************************************/
 BOOL samr_io_r_query_sec_obj(char *desc,  SAMR_R_QUERY_SEC_OBJ *r_u, prs_struct *ps, int depth)
 {
-       int ptr_len0=0;
-       int ptr_len1=0;
-       int ptr_sid_stuff = 0;
-
        if (r_u == NULL) return False;
 
        prs_debug(ps, depth, desc, "samr_io_r_query_sec_obj");
@@ -803,57 +693,11 @@ BOOL samr_io_r_query_sec_obj(char *desc,  SAMR_R_QUERY_SEC_OBJ *r_u, prs_struct
 
        prs_align(ps);
 
-       prs_uint32("ptr_0         ", ps, depth, &(r_u->ptr_0         ));
-
-       if (ps->io) 
-       {
-               /* reading.  do the length later */
-               prs_uint32("sid_stuff_len0", ps, depth, &(r_u->sid_stuff_len0));
-       }
-       else
-       {
-               /* storing */
-               ptr_len0 = ps->offset; ps->offset += 4;
-       }
-
-       if (r_u->ptr_0 != 0)
-       {
-               prs_uint32("ptr_1         ", ps, depth, &(r_u->ptr_1         ));
-               if (ps->io)
-               {
-                       /* reading.  do the length later */
-                       prs_uint32("sid_stuff_len1", ps, depth, &(r_u->sid_stuff_len1));
-               }
-               else
-               {
-                       /* storing */
-                       ptr_len1 = ps->offset; ps->offset += 4;
-               }
-
-               if (r_u->ptr_1 != 0)
-               {
-                       ptr_sid_stuff = ps->offset;
-                       sam_io_sid_stuff("", &(r_u->sid_stuff), ps, depth); 
-               }
-       }
-
-       if (!(ps->io)) /* storing not reading.  do the length, now. */
+       prs_uint32("ptr", ps, depth, &(r_u->ptr));
+       if (r_u->ptr != 0x0)
        {
-               if (ptr_sid_stuff != 0)
-               {
-                       uint32 sid_stuff_len = ps->offset - ptr_sid_stuff;
-                       int old_len = ps->offset;
-
-                       ps->offset = ptr_len0;
-                       prs_uint32("sid_stuff_len0", ps, depth, &sid_stuff_len); 
-
-                       ps->offset = ptr_len1;
-                       prs_uint32("sid_stuff_len1", ps, depth, &sid_stuff_len);
-
-                       ps->offset = old_len;
-               }
+               sec_io_desc_buf("sec", &r_u->buf, ps, depth);
        }
-
        prs_uint32("status", ps, depth, &(r_u->status));
 
        return True;
index ef7300925ab7d4722e2acff9d0541400e603f561..1564252f115c1254c711ee23051e939f45787b6d 100644 (file)
@@ -305,6 +305,7 @@ static BOOL sec_io_desc(char *desc, SEC_DESC *t, prs_struct *ps, int depth)
        
        /* start of security descriptor stored for back-calc offset purposes */
        old_offset = ps->offset;
+       max_offset = old_offset;
 
        prs_uint16("revision ", ps, depth, &(t->revision ));
        prs_uint16("type     ", ps, depth, &(t->type     ));
@@ -527,6 +528,8 @@ BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF *sec, prs_struct *ps, int depth)
        prs_uint32_post("max_len", ps, depth, &(sec->max_len), off_max_len, size == 0 ? sec->max_len : size + 8);
        prs_uint32_post("len    ", ps, depth, &(sec->len    ), off_len    , size == 0 ? 0 : size + 8);
 
+       ps->offset = old_offset + sec->max_len;
+
        return True;
 }
 
index 4f3750a76245b0dea8df11b8c01b30a5e4d64ec9..edf2e8aec6d96a41dddb7156959c56f0959d0184 100644 (file)
@@ -94,15 +94,7 @@ static void api_samr_query_sec_obj( rpcsrv_struct *p, prs_struct *data, prs_stru
        ZERO_STRUCT(q_u);
 
        samr_io_q_query_sec_obj("", &q_u, data, 0);
-
-       r_u.status = _samr_query_sec_obj(&q_u.user_pol, &r_u.sid_stuff);
-
-       if (r_u.status == 0)
-       {
-               r_u.ptr_0 = 1;
-               r_u.ptr_1 = 1;
-       }
-               
+       r_u.status = _samr_query_sec_obj(&q_u.user_pol, &r_u.buf);
        samr_io_r_query_sec_obj("", &r_u, rdata, 0);
 }
 
index fc4ea0d8b50abdd1e033b25e092307f2a74c2c1a..bdd1240751dbb187743799eacda1d83e3b81a9b9 100644 (file)
@@ -999,6 +999,7 @@ void cmd_sam_create_dom_user(struct client_info *info, int argc, char *argv[])
                        case 'j':
                        {
                                join_domain = True;
+                               break;
                        }
                }
        }
@@ -1840,6 +1841,117 @@ void cmd_sam_query_group(struct client_info *info, int argc, char *argv[])
 }
 
 
+/****************************************************************************
+experimental SAM query security object.
+****************************************************************************/
+void cmd_sam_query_sec_obj(struct client_info *info, int argc, char *argv[])
+{
+       fstring srv_name;
+       fstring domain;
+       fstring sid_str;
+       DOM_SID sid;
+       BOOL res = True;
+       BOOL res1 = True;
+
+       char *user_name;
+       const char *names[1];
+       uint32 num_rids;
+       uint32 *rids;
+       uint32 *types;
+       POLICY_HND sam_pol;
+       POLICY_HND pol_dom;
+
+       fstrcpy(domain, info->dom.level5_dom);
+       sid_copy(&sid, &info->dom.level5_sid);
+
+       if (sid.num_auths == 0)
+       {
+               report(out_hnd, "please use 'lsaquery' first, to ascertain the SID\n");
+               return;
+       }
+
+       if (argc < 2)
+       {
+               report(out_hnd, "samsecquery <name>\n");
+               return;
+       }
+
+       user_name = argv[1];
+
+       argc--;
+       argv++;
+
+       fstrcpy(srv_name, "\\\\");
+       fstrcat(srv_name, info->dest_host);
+       strupper(srv_name);
+
+       sid_to_string(sid_str, &sid);
+
+       report(out_hnd, "SAM Query User: %s\n", user_name);
+       report(out_hnd, "From: %s To: %s Domain: %s SID: %s\n",
+                         info->myhostname, srv_name, domain, sid_str);
+
+       /* establish a connection. */
+       res = res ? samr_connect( srv_name, 0x02000000,
+                               &sam_pol) : False;
+
+       /* connect to the domain */
+       res = res ? samr_open_domain( &sam_pol, 0x304, &sid,
+                   &pol_dom) : False;
+
+       /* look up user rid */
+       names[0] = user_name;
+       res1 = res ? samr_query_lookup_names( &pol_dom, 0x3e8,
+                                       1, names,
+                                       &num_rids, &rids, &types) : False;
+
+       /* send user info query */
+       if (res1 && num_rids == 1)
+       {
+               POLICY_HND pol_usr;
+               BOOL ret = True;
+               SEC_DESC_BUF buf;
+
+               /* send open domain (on user sid) */
+               ret = samr_open_user( &pol_dom, 0x02011b, rids[0], &pol_usr);
+               res1 = ret ? samr_query_sec_obj(&pol_usr, 0x04, &buf) : False;
+               ret = ret ? samr_close (&pol_usr) : False;
+
+               if (buf.sec != NULL)
+               {
+                       display_sec_desc(out_hnd, ACTION_HEADER   , buf.sec);
+                       display_sec_desc(out_hnd, ACTION_ENUMERATE, buf.sec);
+                       display_sec_desc(out_hnd, ACTION_FOOTER   , buf.sec);
+               }
+
+               free_sec_desc_buf(&buf);
+       }
+       else
+       {
+               res1 = False;
+       }
+
+       res = res ? samr_close( &pol_dom) : False;
+       res = res ? samr_close( &sam_pol) : False;
+
+       if (res1)
+       {
+               DEBUG(5,("cmd_sam_query_sec_obj: succeeded\n"));
+       }
+       else
+       {
+               DEBUG(5,("cmd_sam_query_sec_obj: failed\n"));
+       }
+       if (rids != NULL)
+       {
+               free(rids);
+       }
+       if (types != NULL)
+       {
+               free(types);
+       }
+}
+
 /****************************************************************************
 experimental SAM user query.
 ****************************************************************************/
index b29a27fefaad6069084c1ffd969eb6d409984cea..1916bdcb88d37596dd5a3752ba1445c114d8421c 100644 (file)
@@ -145,6 +145,10 @@ void display_sec_ace(FILE *out_hnd, enum action_type action, SEC_ACE *const ace)
  ****************************************************************************/
 void display_sec_acl(FILE *out_hnd, enum action_type action, SEC_ACL *const sec_acl)
 {
+       if (sec_acl == NULL)
+       {
+               return;
+       }
        switch (action)
        {
                case ACTION_HEADER:
index 8a5d2e7756a4d346b2952c378a0638e69c79f021..4a2887655f1ecfbdcf66f375a8cfd3629a9df7c7 100644 (file)
@@ -420,6 +420,12 @@ struct command_set commands[] =
                "NT SAM Password Change",
                {COMPL_NONE, COMPL_NONE}
        },
+       {
+               "samquerysec",
+               cmd_sam_query_sec_obj,
+               "<username>",
+               {COMPL_SAMUSR, COMPL_NONE}
+       },
        {
                "samuserset2",
                cmd_sam_set_userinfo2,
index 5748b66bc6a54296b547a738c9943d0409246ea5..d6abb6225fa0584194357ebbf2d4f482d0d830b6 100644 (file)
@@ -150,7 +150,7 @@ static BOOL get_sampwd_entries(SAM_USER_INFO_21 *pw_buf,
 
        endsmbpwent(vp);
 
-       return (*num_entries) > 0;
+       return (*total_entries) > 0;
 }
 
 /*******************************************************************
@@ -263,7 +263,7 @@ uint32 _samr_get_usrdom_pwinfo(const POLICY_HND *user_pol,
 /*******************************************************************
  samr_reply_query_sec_obj
  ********************************************************************/
-uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SAM_SID_STUFF *sid_stuff)
+uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SEC_DESC_BUF *buf)
 {
        DOM_SID usr_sid;
 
@@ -275,6 +275,7 @@ uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SAM_SID_STUFF *sid_stuff)
 
        SMB_ASSERT_ARRAY(usr_sid.sub_auths, usr_sid.num_auths+1);
 
+#if 0
        /* maybe need another 1 or 2 (S-1-5-0x20-0x220 and S-1-5-20-0x224) */
        /* these two are DOMAIN_ADMIN and DOMAIN_ACCT_OP group RIDs */
        make_dom_sid3(&sid_stuff->sid[0], 0x035b, 0x0002, &global_sid_S_1_1);
@@ -285,6 +286,7 @@ uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SAM_SID_STUFF *sid_stuff)
                                0x00000014, 0x0002, 0x0070,
                                2);
 
+#endif
        DEBUG(5,("samr_query_sec_obj: %d\n", __LINE__));
 
        return NT_STATUS_NOPROBLEMO;
@@ -793,7 +795,7 @@ uint32 _samr_query_dispinfo(  const POLICY_HND *domain_pol, uint16 level,
        DOMAIN_GRP *sam_grps = NULL;
        uint16 acb_mask = ACB_NORMAL;
        int num_sam_entries = 0;
-       int total_entries;
+       int total_entries = 0;
 
        DEBUG(5,("samr_reply_query_dispinfo: %d\n", __LINE__));
 
@@ -827,6 +829,7 @@ uint32 _samr_query_dispinfo(  const POLICY_HND *domain_pol, uint16 level,
                        unbecome_root(True);
                        if (!ret)
                        {
+                               DEBUG(5,("get_sampwd_entries: failed\n"));
                                return NT_STATUS_ACCESS_DENIED;
                        }
                        break;
@@ -918,7 +921,6 @@ uint32 _samr_query_dispinfo(  const POLICY_HND *domain_pol, uint16 level,
                {
                        ctr->sam.info = NULL;
                        safe_free(sam_grps);
-                       safe_free(grps);
                        return NT_STATUS_INVALID_INFO_CLASS;
                }
        }
@@ -926,7 +928,6 @@ uint32 _samr_query_dispinfo(  const POLICY_HND *domain_pol, uint16 level,
        DEBUG(5,("samr_reply_query_dispinfo: %d\n", __LINE__));
 
        safe_free(sam_grps);
-       safe_free(grps);
 
        if ((*num_entries) < num_sam_entries)
        {
index 72aeadecb417a92ba4a2cd884c9ee804f43e7b8d..85d26f505f5be7c003c094d36b868a1b910e19c4 100644 (file)
@@ -23,6 +23,7 @@
 
 
 #include "includes.h"
+#include "rpc_parse.h"
 #include "nterr.h"
 #include "sids.h"
 
@@ -226,7 +227,7 @@ uint32 _samr_get_usrdom_pwinfo(const POLICY_HND *user_pol,
 /*******************************************************************
  samr_reply_query_sec_obj
  ********************************************************************/
-uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SAM_SID_STUFF *sid_stuff)
+uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SEC_DESC_BUF *buf)
 {
        uint32 rid;
        DOM_SID usr_sid;
@@ -241,6 +242,7 @@ uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SAM_SID_STUFF *sid_stuff)
        sid_copy(&usr_sid, &global_sam_sid);
        sid_append_rid(&usr_sid, rid);
 
+#if 0
        /* maybe need another 1 or 2 (S-1-5-0x20-0x220 and S-1-5-20-0x224) */
        /* these two are DOMAIN_ADMIN and DOMAIN_ACCT_OP group RIDs */
        make_dom_sid3(&sid_stuff->sid[0], 0x035b, 0x0002, &global_sid_S_1_1);
@@ -251,6 +253,7 @@ uint32 _samr_query_sec_obj(const POLICY_HND *user_pol, SAM_SID_STUFF *sid_stuff)
                                0x00000014, 0x0002, 0x0070,
                                2);
 
+#endif
        DEBUG(5,("samr_query_sec_obj: %d\n", __LINE__));
 
        return NT_STATUS_NOPROBLEMO;
@@ -686,14 +689,35 @@ static void create_user_info_21(SAM_USER_INFO_21 *usr,
        init_nt_time(&usr->logon_time);
        init_nt_time(&usr->logoff_time);
        init_nt_time(&usr->kickoff_time);
-       init_nt_time(&usr->pass_can_change_time);
+       init_nt_time(&usr->pass_must_change_time);
        unix_to_nt_time(&usr->pass_last_set_time, t);
-       unix_to_nt_time(&usr->pass_must_change_time, t);
+       unix_to_nt_time(&usr->pass_can_change_time, t);
 
        usr->acb_info = acb_info | ACB_DISABLED | ACB_PWNOTREQ;
        usr->user_rid = user_rid;
        usr->group_rid = group_rid;
 
+       make_uni_hdr(&(usr->hdr_full_name   ), 0);
+       make_uni_hdr(&(usr->hdr_home_dir    ), 1);
+       make_uni_hdr(&(usr->hdr_dir_drive   ), 0);
+       make_uni_hdr(&(usr->hdr_logon_script), 0);
+       make_uni_hdr(&(usr->hdr_profile_path), 1);
+       make_uni_hdr(&(usr->hdr_acct_desc   ), 0);
+       make_uni_hdr(&(usr->hdr_workstations), 0);
+       make_uni_hdr(&(usr->hdr_unknown_str ), 0);
+       make_uni_hdr(&(usr->hdr_munged_dial ), 0);
+
+       make_unistr2(&(usr->uni_user_name   ), "", 0);
+       make_unistr2(&(usr->uni_full_name   ), "", 0);
+       make_unistr2(&(usr->uni_home_dir    ), "", 1);
+       make_unistr2(&(usr->uni_dir_drive   ), "", 0);
+       make_unistr2(&(usr->uni_logon_script), "", 0);
+       make_unistr2(&(usr->uni_profile_path), "", 1);
+       make_unistr2(&(usr->uni_acct_desc   ), "", 0 );
+       make_unistr2(&(usr->uni_workstations), "", 0);
+       make_unistr2(&(usr->uni_unknown_str ), "", 0 );
+       make_unistr2(&(usr->uni_munged_dial ), "", 0 );
+
        copy_unistr2(&usr->uni_user_name, uni_user_name);
        make_uni_hdr(&usr->hdr_user_name, uni_user_name->uni_str_len);