adding srvsvc pipe.
authorLuke Leighton <lkcl@samba.org>
Tue, 8 Dec 1998 00:25:04 +0000 (00:25 +0000)
committerLuke Leighton <lkcl@samba.org>
Tue, 8 Dec 1998 00:25:04 +0000 (00:25 +0000)
15 files changed:
source/Makefile.in
source/include/ntdomain.h
source/include/proto.h
source/include/rpc_samr.h
source/include/rpc_svcctl.h [new file with mode: 0644]
source/include/smb.h
source/rpc_client/cli_lsarpc.c
source/rpc_parse/parse_rpc.c
source/rpc_parse/parse_samr.c
source/rpc_parse/parse_svc.c [new file with mode: 0644]
source/rpc_server/srv_pipe.c
source/rpc_server/srv_samr.c
source/rpc_server/srv_svcctl.c [new file with mode: 0644]
source/rpcclient/cmd_lsarpc.c
source/smbd/nttrans.c

index d353ed9ea50352047264509f6029fd3eb89b16b1..837e7fcf8ac99081823bc2bbb7dd506cfeb2d2d7 100644 (file)
@@ -126,6 +126,7 @@ RPC_SERVER_OBJ = \
                rpc_server/srv_reg.o \
                rpc_server/srv_samr.o \
                rpc_server/srv_srvsvc.o \
+               rpc_server/srv_svcctl.o \
                rpc_server/srv_pipe.o \
                rpc_server/srv_lookup.o \
                rpc_server/srv_wkssvc.o
@@ -134,7 +135,8 @@ RPC_PARSE_OBJ = rpc_parse/parse_lsa.o rpc_parse/parse_misc.o \
                 rpc_parse/parse_net.o rpc_parse/parse_prs.o \
                 rpc_parse/parse_reg.o rpc_parse/parse_rpc.o \
                 rpc_parse/parse_samr.o rpc_parse/parse_srv.o \
-                rpc_parse/parse_wks.o rpc_parse/parse_sec.o
+                rpc_parse/parse_wks.o rpc_parse/parse_sec.o \
+               rpc_parse/parse_svc.o
 
 RPC_CLIENT_OBJ = \
                rpc_client/cli_login.o    \
index d03b1e0a3ea21e0e6fa619bbce3ae573db47e751..75b9ae86298f620c6e4ac9f20404ec82fa308a04 100644 (file)
@@ -40,6 +40,7 @@
 #include "rpc_reg.h"
 #include "rpc_samr.h"
 #include "rpc_srvsvc.h"
+#include "rpc_svcctl.h"
 #include "rpc_wkssvc.h"
 
 /* 
index 7f170aaad589f70b032e5430f8dbcb848bf0affc..f237c08999b416713d6a455332332dcf501ef793 100644 (file)
@@ -47,6 +47,10 @@ BOOL make_alias_line(char *p, int max_len,
 
 struct aliasdb_ops *file_initialise_alias_db(void);
 
+/*The following definitions come from  groupdb/aliasldap.c  */
+
+struct aliasdb_ops *ldap_initialise_alias_db(void);
+
 /*The following definitions come from  groupdb/aliasunix.c  */
 
 BOOL get_unixalias_members(struct group *grp,
@@ -78,6 +82,10 @@ BOOL make_builtin_line(char *p, int max_len,
                                LOCAL_GRP *blt,
                                LOCAL_GRP_MEMBER **mem, int *num_mem);
 
+/*The following definitions come from  groupdb/builtinldap.c  */
+
+struct aliasdb_ops *ldap_initialise_builtin_db(void);
+
 /*The following definitions come from  groupdb/builtinunix.c  */
 
 BOOL get_unixbuiltin_members(struct group *grp,
@@ -114,6 +122,10 @@ BOOL make_group_line(char *p, int max_len,
 
 struct groupdb_ops *file_initialise_group_db(void);
 
+/*The following definitions come from  groupdb/groupldap.c  */
+
+struct groupdb_ops *ldap_initialise_group_db(void);
+
 /*The following definitions come from  groupdb/groupunix.c  */
 
 BOOL get_unixgroup_members(struct group *grp,
@@ -1174,9 +1186,8 @@ char *lp_driverfile(void);
 char *lp_panic_action(void);
 char *lp_ldap_server(void);
 char *lp_ldap_suffix(void);
-char *lp_ldap_filter(void);
-char *lp_ldap_root(void);
-char *lp_ldap_rootpasswd(void);
+char *lp_ldap_bind_as(void);
+char *lp_ldap_passwd_file(void);
 int lp_ssl_version(void);
 char *lp_ssl_hosts(void);
 char *lp_ssl_hosts_resign(void);
@@ -1361,7 +1372,14 @@ BOOL pm_process( char *FileName,
 
 /*The following definitions come from  passdb/ldap.c  */
 
-struct passdb_ops *ldap_initialise_password_db(void);
+BOOL ldap_open_connection(BOOL modify);
+void ldap_close_connection();
+BOOL ldap_search_for(char *filter);
+BOOL ldap_search_by_name(const char *user);
+BOOL ldap_search_by_uid(int uid);
+BOOL ldap_get_attribute(char *attribute, char *value);
+struct smb_passwd *ldap_getpw();
+struct smb_passdb_ops *ldap_initialise_password_db(void);
 
 /*The following definitions come from  passdb/nispass.c  */
 
@@ -1417,6 +1435,10 @@ struct smb_passwd *getsmbgrpuid(uid_t unix_uid,
                uint32 **grps, int *num_grps,
                uint32 **alss, int *num_alss);
 
+/*The following definitions come from  passdb/passgrpldap.c  */
+
+struct passgrp_ops *ldap_initialise_password_grp(void);
+
 /*The following definitions come from  passdb/sampass.c  */
 
 void *startsamfilepwent(BOOL update);
@@ -1443,6 +1465,12 @@ struct smb_passwd *pwdb_sam_to_smb(struct sam_passwd *user);
 struct sam_passwd *pwdb_smb_to_sam(struct smb_passwd *user);
 struct sam_passwd *pwdb_sam_map_names(struct sam_passwd *sam);
 
+/*The following definitions come from  passdb/sampassldap.c  */
+
+BOOL ldap_search_by_rid(uint32 rid);
+BOOL ldap_search_by_ntname(const char *ntname);
+struct sam_passdb_ops *ldap_initialise_sam_password_db(void);
+
 /*The following definitions come from  passdb/smbpass.c  */
 
 struct smb_passdb_ops *file_initialise_password_db(void);
@@ -2105,6 +2133,10 @@ void samr_io_q_unknown_3(char *desc,  SAMR_Q_UNKNOWN_3 *q_u, prs_struct *ps, int
 void make_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO *q_u,
                                POLICY_HND *domain_pol, uint16 switch_value);
 void samr_io_q_query_dom_info(char *desc,  SAMR_Q_QUERY_DOMAIN_INFO *q_u, prs_struct *ps, int depth);
+void make_unk_info6(SAM_UNK_INFO_6 *u_6);
+void sam_io_unk_info6(char *desc, SAM_UNK_INFO_6 *u_6, prs_struct *ps, int depth);
+void make_unk_info7(SAM_UNK_INFO_7 *u_7);
+void sam_io_unk_info7(char *desc, SAM_UNK_INFO_7 *u_7, prs_struct *ps, int depth);
 void make_unk_info2(SAM_UNK_INFO_2 *u_2, char *domain, char *server);
 void sam_io_unk_info2(char *desc, SAM_UNK_INFO_2 *u_2, prs_struct *ps, int depth);
 void make_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO *r_u, 
@@ -2448,6 +2480,18 @@ void make_time_of_day_info(TIME_OF_DAY_INFO *tod, uint32 elapsedt, uint32 msecs,
                           uint32 month, uint32 year, uint32 weekday);
 void 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  */
+
+void make_svc_q_open_policy(SVC_Q_OPEN_POLICY *q_u,
+                               char *server, uint16 unknown)  ;
+void svc_io_q_open_policy(char *desc, SVC_Q_OPEN_POLICY *q_u, prs_struct *ps, int depth);
+void make_svc_r_open_policy(SVC_R_OPEN_POLICY *r_u, POLICY_HND *hnd,
+                               uint32 status)  ;
+void svc_io_r_open_policy(char *desc,  SVC_R_OPEN_POLICY *r_u, prs_struct *ps, int depth);
+void make_svc_q_close(SVC_Q_CLOSE *q_c, POLICY_HND *hnd);
+void svc_io_q_close(char *desc,  SVC_Q_CLOSE *q_u, prs_struct *ps, int depth);
+void svc_io_r_close(char *desc,  SVC_R_CLOSE *r_u, prs_struct *ps, int depth);
+
 /*The following definitions come from  rpc_parse/parse_wks.c  */
 
 void make_wks_q_query_info(WKS_Q_QUERY_INFO *q_u,
@@ -2538,6 +2582,10 @@ BOOL api_samr_rpc(pipes_struct *p, prs_struct *data);
 
 BOOL api_srvsvc_rpc(pipes_struct *p, prs_struct *data);
 
+/*The following definitions come from  rpc_server/srv_svcctl.c  */
+
+BOOL api_svcctl_rpc(pipes_struct *p, prs_struct *data);
+
 /*The following definitions come from  rpc_server/srv_wkssvc.c  */
 
 BOOL api_wkssvc_rpc(pipes_struct *p, prs_struct *data);
index bfa0218fd3574544a8f3d7baa9fe879c859e2c43..07ae0301d431d72a377aa3421396abe733b12d83 100644 (file)
@@ -373,7 +373,22 @@ typedef struct q_samr_query_domain_info
 
 } SAMR_Q_QUERY_DOMAIN_INFO;
 
-typedef struct sam_unkown_info_2_info
+typedef struct sam_unknown_info_6_info
+{
+       uint32 unknown_0; /* 0x0000 0000 */
+
+       uint32 ptr_0;     /* pointer to unknown structure */
+       uint8  padding[12]; /* 12 bytes zeros */
+
+} SAM_UNK_INFO_6;
+
+typedef struct sam_unknown_info_7_info
+{
+       uint16 unknown_0; /* 0x0003 */
+
+} SAM_UNK_INFO_7;
+
+typedef struct sam_unknown_info_2_info
 {
        uint32 unknown_0; /* 0x0000 0000 */
        uint32 unknown_1; /* 0x8000 0000 */
@@ -410,6 +425,8 @@ typedef struct sam_unknown_ctr_info
        union
        {
                SAM_UNK_INFO_2 inf2;
+               SAM_UNK_INFO_6 inf6;
+               SAM_UNK_INFO_7 inf7;
 
        } info;
 
diff --git a/source/include/rpc_svcctl.h b/source/include/rpc_svcctl.h
new file mode 100644 (file)
index 0000000..0a98496
--- /dev/null
@@ -0,0 +1,71 @@
+/* 
+   Unix SMB/Netbios implementation.
+   Version 1.9.
+   SMB parameters and setup
+   Copyright (C) Andrew Tridgell 1992-1997
+   Copyright (C) Luke Kenneth Casson Leighton 1996-1997
+   Copyright (C) Paul Ashton 1997
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef _RPC_SVCCTL_H /* _RPC_SVCCTL_H */
+#define _RPC_SVCCTL_H 
+
+
+/* svcctl pipe */
+#define SVC_OPEN_POLICY    0x0f
+#define SVC_CLOSE          0x00
+
+
+/* SVC_Q_OPEN_POLICY */
+typedef struct q_svc_open_pol_info
+{
+       uint32 ptr_srv_name;         /* pointer (to server name?) */
+       UNISTR2 uni_srv_name;        /* unicode server name starting with '\\' */
+
+       uint32 unknown;            /* unknown */
+
+} SVC_Q_OPEN_POLICY;
+
+/* SVC_R_OPEN_POLICY */
+typedef struct r_svc_open_pol_info
+{
+       POLICY_HND pol;
+       uint32 status;             /* return status */
+
+} SVC_R_OPEN_POLICY;
+
+
+/* SVC_Q_CLOSE */
+typedef struct q_svc_close_info
+{
+       POLICY_HND pol;
+
+} SVC_Q_CLOSE;
+
+
+
+/* SVC_R_CLOSE */
+typedef struct r_svc_close_info
+{
+       POLICY_HND pol;
+       uint32 status;             /* return status */
+
+} SVC_R_CLOSE;
+
+
+#endif /* _RPC_SVCCTL_H */
+
index 1ed4ea708909aae15ca9d59822d84353f0958ef9..9c699fc42315dd0fb18062b7295f3d675406860f 100644 (file)
@@ -326,6 +326,7 @@ typedef char fstring[128];
 #define PIPE_WINREG   "\\PIPE\\winreg"
 #define PIPE_WKSSVC   "\\PIPE\\wkssvc"
 #define PIPE_NETLOGON "\\PIPE\\NETLOGON"
+#define PIPE_SVCCTL   "\\PIPE\\SVCCTL"
 #define PIPE_NTLSA    "\\PIPE\\ntlsa"
 #define PIPE_NTSVCS   "\\PIPE\\ntsvcs"
 #define PIPE_LSASS    "\\PIPE\\lsass"
index 81bff830ddfcc4a8ef496074227b60f16b20b47c..0e28174b8b32b7c3d7fc715b43c5e9ce8d817e59 100644 (file)
@@ -199,7 +199,7 @@ BOOL lsa_lookup_names(struct cli_state *cli, uint16 fnum,
                                        sid_copy(sid, &ref.ref_dom[dom_idx].ref_dom.sid);
                                        if (dom_rid != 0xffffffff)
                                        {
-                                       sid_append_rid(sid, dom_rid);
+                                               sid_append_rid(sid, dom_rid);
                                        }
                                }
                                else
index 5059ca222bfdfc493a04ba28a31973f466bbde0e..9ce83bea831404df0ba7adcb0897accf7e90e9b7 100644 (file)
@@ -42,6 +42,16 @@ interface/version dce/rpc pipe identification
        }, 0x02                       \
 }                                 \
 
+#define SYNT_SVCCTL_V2          \
+{                                 \
+       {                             \
+               0x81, 0xbb, 0x7a, 0x36,   \
+               0x44, 0x98, 0xf1, 0x35,   \
+               0xad, 0x32, 0x98, 0xf0,   \
+               0x38, 0x00, 0x10, 0x03    \
+       }, 0x02                       \
+}                                 \
+
 #define SYNT_NETLOGON_V2          \
 {                                 \
        {                             \
@@ -129,6 +139,7 @@ struct pipe_id_info pipe_names [] =
        { PIPE_SAMR    , SYNT_SAMR_V1    , PIPE_LSASS    , TRANS_SYNT_V2 },
        { PIPE_NETLOGON, SYNT_NETLOGON_V1, PIPE_LSASS    , TRANS_SYNT_V2 },
        { PIPE_SRVSVC  , SYNT_SRVSVC_V3  , PIPE_NTSVCS   , TRANS_SYNT_V2 },
+       { PIPE_SVCCTL  , SYNT_SVCCTL_V2  , PIPE_NTSVCS   , TRANS_SYNT_V2 },
        { PIPE_WKSSVC  , SYNT_WKSSVC_V1  , PIPE_NTSVCS   , TRANS_SYNT_V2 },
        { PIPE_WINREG  , SYNT_WINREG_V1  , PIPE_WINREG   , TRANS_SYNT_V2 },
        { NULL         , SYNT_NONE_V0    , NULL          , SYNT_NONE_V0  }
index 52bcb4ff77d3e353f5d05fa40db87e16d118a4a1..f4c17902541c2be00f4df69c36c519a084e000e2 100644 (file)
@@ -258,6 +258,61 @@ void samr_io_q_query_dom_info(char *desc,  SAMR_Q_QUERY_DOMAIN_INFO *q_u, prs_st
        prs_align(ps);
 }
 
+/*******************************************************************
+makes a structure.
+********************************************************************/
+void make_unk_info6(SAM_UNK_INFO_6 *u_6)
+{
+       if (u_6 == NULL) return;
+
+       u_6->unknown_0 = 0x00000000;
+       u_6->ptr_0 = 1;
+       memset(u_6->padding, 0, sizeof(u_6->padding)); /* 12 bytes zeros */
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+void sam_io_unk_info6(char *desc, SAM_UNK_INFO_6 *u_6, prs_struct *ps, int depth)
+{
+       if (u_6 == NULL) return;
+
+       prs_debug(ps, depth, desc, "sam_io_unk_info6");
+       depth++;
+
+       prs_uint32("unknown_0", ps, depth, &u_6->unknown_0); /* 0x0000 0000 */
+       prs_uint32("ptr_0", ps, depth, &u_6->ptr_0);     /* pointer to unknown structure */
+       prs_uint8s(False, "padding", ps, depth, u_6->padding, sizeof(u_6->padding)); /* 12 bytes zeros */
+
+       prs_align(ps);
+
+}
+
+/*******************************************************************
+makes a structure.
+********************************************************************/
+void make_unk_info7(SAM_UNK_INFO_7 *u_7)
+{
+       if (u_7 == NULL) return;
+
+       u_7->unknown_0 = 0x0003;
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+void sam_io_unk_info7(char *desc, SAM_UNK_INFO_7 *u_7, prs_struct *ps, int depth)
+{
+       if (u_7 == NULL) return;
+
+       prs_debug(ps, depth, desc, "sam_io_unk_info7");
+       depth++;
+
+       prs_uint16("unknown_0", ps, depth, &u_7->unknown_0); /* 0x0003 */
+       prs_align(ps);
+
+}
+
 /*******************************************************************
 makes a structure.
 ********************************************************************/
@@ -376,6 +431,16 @@ void samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO *r_u, prs_str
        {
                switch (r_u->switch_value)
                {
+                       case 0x06:
+                       {
+                               sam_io_unk_info6("unk_inf6", &r_u->ctr->info.inf6, ps, depth);
+                               break;
+                       }
+                       case 0x07:
+                       {
+                               sam_io_unk_info7("unk_inf7", &r_u->ctr->info.inf7, ps, depth);
+                               break;
+                       }
                        case 0x02:
                        {
                                sam_io_unk_info2("unk_inf2", &r_u->ctr->info.inf2, ps, depth);
diff --git a/source/rpc_parse/parse_svc.c b/source/rpc_parse/parse_svc.c
new file mode 100644 (file)
index 0000000..288f23f
--- /dev/null
@@ -0,0 +1,136 @@
+
+/* 
+ *  Unix SMB/Netbios implementation.
+ *  Version 1.9.
+ *  RPC Pipe client / server routines
+ *  Copyright (C) Andrew Tridgell              1992-1997,
+ *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
+ *  Copyright (C) Paul Ashton                       1997.
+ *  
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *  
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "includes.h"
+
+extern int DEBUGLEVEL;
+
+/*******************************************************************
+ make_svc_q_open_policy
+ ********************************************************************/
+void make_svc_q_open_policy(SVC_Q_OPEN_POLICY *q_u,
+                               char *server, uint16 unknown)  
+{
+       DEBUG(5,("make_svc_q_open_policy\n"));
+
+       make_buf_unistr2(&(q_u->uni_srv_name), &(q_u->ptr_srv_name), server);
+       q_u->unknown = unknown;
+
+}
+
+/*******************************************************************
+reads or writes a SVC_Q_OPEN_POLICY structure.
+********************************************************************/
+void svc_io_q_open_policy(char *desc, SVC_Q_OPEN_POLICY *q_u, prs_struct *ps, int depth)
+{
+       if (q_u == NULL) return;
+
+       prs_debug(ps, depth, desc, "svc_io_q_open_policy");
+       depth++;
+
+       prs_align(ps);
+
+       prs_uint32("ptr_srv_name", ps, depth, &(q_u->ptr_srv_name));
+       smb_io_unistr2("", &(q_u->uni_srv_name), q_u->ptr_srv_name, ps, depth); 
+       prs_align(ps);
+
+       prs_uint32("unknown", ps, depth, &(q_u->unknown));
+       prs_align(ps);
+}
+
+/*******************************************************************
+ make_svc_r_open_policy
+ ********************************************************************/
+void make_svc_r_open_policy(SVC_R_OPEN_POLICY *r_u, POLICY_HND *hnd,
+                               uint32 status)  
+{
+       DEBUG(5,("make_svc_r_unknown_0: %d\n", __LINE__));
+
+       memcpy(&(r_u->pol), hnd, sizeof(r_u->pol));
+       r_u->status = status;
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+void svc_io_r_open_policy(char *desc,  SVC_R_OPEN_POLICY *r_u, prs_struct *ps, int depth)
+{
+       if (r_u == NULL) return;
+
+       prs_debug(ps, depth, desc, "svc_io_r_open_policy");
+       depth++;
+
+       prs_align(ps);
+
+       smb_io_pol_hnd("", &(r_u->pol), ps, depth);
+
+       prs_uint32("status      ", ps, depth, &(r_u->status));
+}
+
+/*******************************************************************
+makes an SVC_Q_CLOSE structure.
+********************************************************************/
+void make_svc_q_close(SVC_Q_CLOSE *q_c, POLICY_HND *hnd)
+{
+       if (q_c == NULL || hnd == NULL) return;
+
+       DEBUG(5,("make_svc_q_close\n"));
+
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+void svc_io_q_close(char *desc,  SVC_Q_CLOSE *q_u, prs_struct *ps, int depth)
+{
+       if (q_u == NULL) return;
+
+       prs_debug(ps, depth, desc, "svc_io_q_close");
+       depth++;
+
+       prs_align(ps);
+
+       smb_io_pol_hnd("", &(q_u->pol), ps, depth); 
+       prs_align(ps);
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+void svc_io_r_close(char *desc,  SVC_R_CLOSE *r_u, prs_struct *ps, int depth)
+{
+       if (r_u == NULL) return;
+
+       prs_debug(ps, depth, desc, "svc_io_r_close");
+       depth++;
+
+       prs_align(ps);
+
+       smb_io_pol_hnd("", &(r_u->pol), ps, depth); 
+       prs_align(ps);
+
+       prs_uint32("status", ps, depth, &(r_u->status));
+}
+
index 1ad4cb6b9e649e94f69cd02280171dd008d54043..d9483deb86ab5ed461d7d9a29ed8a5516c4f2045 100644 (file)
@@ -347,6 +347,7 @@ static struct api_cmd api_fd_commands[] =
     { "samr",     "lsass",   api_samr_rpc },
     { "srvsvc",   "ntsvcs",  api_srvsvc_rpc },
     { "wkssvc",   "ntsvcs",  api_wkssvc_rpc },
+    { "svcctl",   "ntsvcs",  api_svcctl_rpc },
     { "NETLOGON", "lsass",   api_netlog_rpc },
     { "winreg",   "winreg",  api_reg_rpc },
     { NULL,       NULL,      NULL }
index 82dea29d9a15bd32898974ca7aa6a1979458c197..39a9b7591aadbd87b4f1b134667d16f5cc7719a9 100644 (file)
@@ -518,7 +518,7 @@ static void samr_reply_add_aliasmem(SAMR_Q_ADD_ALIASMEM *q_u,
                        DEBUG(10,("add member on Domain SID\n"));
 
                        become_root(True);
-                       r_e.status = add_alias_member(alias_rid, &q_u->sid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+                       r_e.status = add_alias_member(alias_rid, &q_u->sid.sid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
                        unbecome_root(True);
                }
                else if (sid_equal(&alias_sid, &global_sid_S_1_5_20))
@@ -526,7 +526,7 @@ static void samr_reply_add_aliasmem(SAMR_Q_ADD_ALIASMEM *q_u,
                        DEBUG(10,("add member on BUILTIN SID\n"));
 
                        become_root(True);
-                       r_e.status = add_builtin_member(alias_rid, &q_u->sid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
+                       r_e.status = add_builtin_member(alias_rid, &q_u->sid.sid) ? 0x0 : 0xC0000000 | NT_STATUS_ACCESS_DENIED;
                        unbecome_root(True);
                }
                else
@@ -2234,6 +2234,20 @@ static void samr_reply_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO *q_u,
        {
                switch (q_u->switch_value)
                {
+                       case 0x06:
+                       {
+                               switch_value = 0x6;
+                               make_unk_info6(&ctr.info.inf6);
+
+                               break;
+                       }
+                       case 0x07:
+                       {
+                               switch_value = 0x7;
+                               make_unk_info7(&ctr.info.inf7);
+
+                               break;
+                       }
                        case 0x02:
                        {
                                switch_value = 0x2;
diff --git a/source/rpc_server/srv_svcctl.c b/source/rpc_server/srv_svcctl.c
new file mode 100644 (file)
index 0000000..6ae8a5c
--- /dev/null
@@ -0,0 +1,140 @@
+
+/* 
+ *  Unix SMB/Netbios implementation.
+ *  Version 1.9.
+ *  RPC Pipe client / server routines
+ *  Copyright (C) Andrew Tridgell              1992-1997,
+ *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
+ *  Copyright (C) Paul Ashton                       1997.
+ *  
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *  
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "includes.h"
+#include "nterr.h"
+
+extern int DEBUGLEVEL;
+
+
+/*******************************************************************
+ svc_reply_unknown_1
+ ********************************************************************/
+static void svc_reply_close(SVC_Q_CLOSE *q_r,
+                               prs_struct *rdata)
+{
+       SVC_R_CLOSE r_u;
+
+       /* set up the REG unknown_1 response */
+       bzero(r_u.pol.data, POL_HND_SIZE);
+
+       /* close the policy handle */
+       if (close_lsa_policy_hnd(&(q_r->pol)))
+       {
+               r_u.status = 0;
+       }
+       else
+       {
+               r_u.status = 0xC0000000 | NT_STATUS_OBJECT_NAME_INVALID;
+       }
+
+       DEBUG(5,("svc_unknown_1: %d\n", __LINE__));
+
+       /* store the response in the SMB stream */
+       svc_io_r_close("", &r_u, rdata, 0);
+
+       DEBUG(5,("svc_unknown_1: %d\n", __LINE__));
+}
+
+/*******************************************************************
+ api_svc_close
+ ********************************************************************/
+static void api_svc_close( uint16 vuid, prs_struct *data,
+                                    prs_struct *rdata )
+{
+       SVC_Q_CLOSE q_r;
+       svc_io_q_close("", &q_r, data, 0);
+       svc_reply_close(&q_r, rdata);
+}
+
+
+/*******************************************************************
+ svc_reply_open_policy
+ ********************************************************************/
+static void svc_reply_open_policy(SVC_Q_OPEN_POLICY *q_u,
+                               prs_struct *rdata)
+{
+       uint32 status     = 0;
+       POLICY_HND pol;
+       SVC_R_OPEN_POLICY r_u;
+       fstring name;
+
+       DEBUG(5,("svc_open_policy: %d\n", __LINE__));
+
+       if (status == 0x0 && !open_lsa_policy_hnd(&pol))
+       {
+               status = 0xC000000 | NT_STATUS_TOO_MANY_SECRETS; /* ha ha very droll */
+       }
+
+       fstrcpy(name, unistr2_to_str(&q_u->uni_srv_name));
+
+       if (status == 0x0)
+       {
+               DEBUG(5,("svc_open_policy: %s\n", name));
+               /* lkcl XXXX do a check on the name, here */
+       }
+
+       if (status == 0x0 && !set_lsa_policy_reg_name(&pol, name))
+       {
+               status = 0xC000000 | NT_STATUS_TOO_MANY_SECRETS; /* ha ha very droll */
+       }
+
+       make_svc_r_open_policy(&r_u, &pol, status);
+
+       /* store the response in the SMB stream */
+       svc_io_r_open_policy("", &r_u, rdata, 0);
+
+       DEBUG(5,("svc_open_policy: %d\n", __LINE__));
+}
+
+/*******************************************************************
+ api_svc_open_policy
+ ********************************************************************/
+static void api_svc_open_policy( uint16 vuid, prs_struct *data,
+                                    prs_struct *rdata )
+{
+       SVC_Q_OPEN_POLICY q_u;
+       svc_io_q_open_policy("", &q_u, data, 0);
+       svc_reply_open_policy(&q_u, rdata);
+}
+
+/*******************************************************************
+ array of \PIPE\svcctl operations
+ ********************************************************************/
+static struct api_struct api_svc_cmds[] =
+{
+       { "SVC_CLOSE"        , SVC_CLOSE        , api_svc_close        },
+       { "SVC_OPEN_POLICY"  , SVC_OPEN_POLICY  , api_svc_open_policy  },
+       { NULL,                0                , NULL                 }
+};
+
+/*******************************************************************
+ receives a svcctl pipe and responds.
+ ********************************************************************/
+BOOL api_svcctl_rpc(pipes_struct *p, prs_struct *data)
+{
+       return api_rpcTNP(p, "api_svc_rpc", api_svc_cmds, data);
+}
+
index cfde7529010c6ed58af36a7f63712871a613eb96..96f952a789ae1f920598667c55f6f31a8c812a9f 100644 (file)
@@ -131,7 +131,7 @@ void cmd_lsa_lookup_names(struct client_info *info)
        int i;
        fstring srv_name;
        int num_names = 0;
-       char *names[10];
+       const char *names[10];
        DOM_SID *sids;
        int num_sids = 0;
 #if 0
@@ -207,7 +207,7 @@ void cmd_lsa_lookup_names(struct client_info *info)
        {
                if (names[i] != NULL)
                {
-                       free(names[i]);
+                       free(((char **)names)[i]);
                }
        }
 }
index 60620c98544f87b37af660b210813ba93dd2e25d..52a100539745b46c463c25728d4ebb2d5b783120 100644 (file)
@@ -37,6 +37,7 @@ static void remove_pending_change_notify_requests_by_mid(int mid);
 static char *known_nt_pipes[] = {
   "\\LANMAN",
   "\\srvsvc",
+  "\\svcctl",
   "\\samr",
   "\\wkssvc",
   "\\NETLOGON",