srvsvc opnum 0x27 .... aaagh!
Jim McDonough
jmcd at us.ibm.com
Fri Jun 15 15:46:20 GMT 2001
Ok, below is the code I've done so far, which provides a response to the
srvsvc opnum 0x27 (I've called it net_file_query_secdesc). The response
looks to be the right format to me, but not to the WinNT server tools for
Win9x. I still get a "The parameter is incorrect" error. I'd be glad to
provide netmon traces of Win98 querying 2.2 and Win98 querying Win2K for
comparison for anyone who is interested...
Jim
----------------------------
Jim McDonough
Linux Technology Center
IBM Boulder
Notes: Jim McDonough/Boulder/IBM @ IBMUS
VNET: JMCD at IBMUSM54
Internet: jmcd at us.ibm.com
Phone: (303) 924-5822
T/L: 263-5822
diff -urx*CVS* ./include/proto.h /samba/mine/samba-2.2/source/include/proto.h
--- ./include/proto.h Fri Jun 15 09:34:19 2001
+++ /samba/mine/samba-2.2/source/include/proto.h Wed Jun 13 09:09:23 2001
@@ -3554,6 +3554,9 @@
BOOL srv_io_r_net_share_add(char *desc, SRV_R_NET_SHARE_ADD *q_n, prs_struct *ps, int depth);
BOOL srv_io_q_net_share_del(char *desc, SRV_Q_NET_SHARE_DEL *q_n, prs_struct *ps, int depth);
BOOL srv_io_r_net_share_del(char *desc, SRV_R_NET_SHARE_DEL *q_n, prs_struct *ps, int depth);
+BOOL srv_io_q_net_file_query_secdesc (char *desc, SRV_Q_NET_FILE_QUERY_SECDESC *q_n, prs_struct *ps, int depth);
+BOOL srv_io_r_net_file_query_secdesc (char *desc, SRV_R_NET_FILE_QUERY_SECDESC *q_n, prs_struct *ps, int depth);
+
void init_srv_sess_info0_str(SESS_INFO_0_STR *ss0, char *name);
void init_srv_sess_info0(SESS_INFO_0 *ss0, char *name);
void init_srv_sess_info1_str(SESS_INFO_1_STR *ss1, char *name, char *user);
@@ -3843,6 +3846,7 @@
uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u);
uint32 _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u);
uint32 _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u);
+uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, SRV_R_NET_FILE_QUERY_SECDESC *r_u);
/*The following definitions come from rpc_server/srv_util.c */
diff -urx*CVS* ./include/rpc_srvsvc.h /samba/mine/samba-2.2/source/include/rpc_srvsvc.h
--- ./include/rpc_srvsvc.h Tue May 1 13:47:46 2001
+++ /samba/mine/samba-2.2/source/include/rpc_srvsvc.h Fri Jun 8 14:12:14 2001
@@ -40,6 +40,7 @@
#define SRV_NET_REMOTE_TOD 0x1c
#define SRV_NET_NAME_VALIDATE 0x21
#define SRV_NETSHAREENUM 0x24
+#define SRV_NETFILEQUERYSECDESC 0x27
#define MAX_SERVER_DISK_ENTRIES 15
@@ -763,5 +764,27 @@
} SRV_R_NET_REMOTE_TOD;
-
+/* SRV_Q_NET_FILE_QUERY_SECDESC */
+typedef struct q_net_file_query_secdesc
+{
+ uint32 ptr_srv_name;
+ UNISTR2 uni_srv_name;
+ uint32 ptr_qual_name;
+ UNISTR2 uni_qual_name;
+ UNISTR2 uni_file_name;
+ uint32 unknown1;
+ uint32 unknown2;
+ uint32 unknown3;
+} SRV_Q_NET_FILE_QUERY_SECDESC;
+
+/* SRV_R_NET_FILE_QUERY_SECDESC */
+typedef struct r_net_file_query_secdesc
+{
+ uint32 ptr_response;
+ uint32 size_response;
+ uint32 ptr_secdesc;
+ uint32 size_secdesc;
+ SEC_DESC *sec_desc;
+ uint32 status;
+} SRV_R_NET_FILE_QUERY_SECDESC;
#endif /* _RPC_SRVSVC_H */
diff -urx*CVS* ./rpc_parse/parse_srv.c /samba/mine/samba-2.2/source/rpc_parse/parse_srv.c
--- ./rpc_parse/parse_srv.c Tue May 1 13:47:49 2001
+++ /samba/mine/samba-2.2/source/rpc_parse/parse_srv.c Thu Jun 14 13:42:20 2001
@@ -2560,3 +2560,87 @@
return True;
}
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_q_net_file_query_secdesc(char *desc, SRV_Q_NET_FILE_QUERY_SECDESC *q_n, prs_struct *ps, int depth)
+{
+ if (q_n == NULL)
+ return False;
+
+ prs_debug(ps, depth, desc, "srv_io_q_net_file_query_secdesc");
+ depth++;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!prs_uint32("ptr_srv_name", ps, depth, &q_n->ptr_srv_name))
+ return False;
+
+ if(!smb_io_unistr2("", &q_n->uni_srv_name, True, ps, depth))
+ return False;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!prs_uint32("ptr_qual_name", ps, depth, &q_n->ptr_qual_name))
+ return False;
+
+ if(!smb_io_unistr2("", &q_n->uni_qual_name, True, ps, depth))
+ return False;
+ if(!prs_align(ps))
+ return False;
+
+ if(!smb_io_unistr2("", &q_n->uni_file_name, True, ps, depth))
+ return False;
+
+ if(!prs_uint32("unknown1", ps, depth, &q_n->unknown1))
+ return False;
+ if(!prs_uint32("unknown2", ps, depth, &q_n->unknown2))
+ return False;
+ if(!prs_uint32("unknown3", ps, depth, &q_n->unknown3))
+ return False;
+
+ return True;
+}
+
+/*******************************************************************
+ Reads or writes a structure.
+ ********************************************************************/
+
+BOOL srv_io_r_net_file_query_secdesc(char *desc, SRV_R_NET_FILE_QUERY_SECDESC *r_n, prs_struct *ps, int depth)
+{
+ if (r_n == NULL)
+ return False;
+
+ prs_debug(ps, depth, desc, "srv_io_r_net_file_query_secdesc");
+ depth++;
+
+ if(!prs_align(ps))
+ return False;
+
+ if(!prs_uint32("ptr_response", ps, depth, &r_n->ptr_response))
+ return False;
+
+ if(!prs_uint32("size_response", ps, depth, &r_n->size_response))
+ return False;
+
+ if(!prs_uint32("ptr_secdesc", ps, depth, &r_n->ptr_secdesc))
+ return False;
+
+ if(!prs_uint32("size_secdesc", ps, depth, &r_n->size_secdesc))
+ return False;
+
+ if(!sec_io_desc("sec_desc", &r_n->sec_desc, ps, depth))
+ return False;
+
+ if(!prs_align(ps))
+ return False;
+ if(!prs_uint32("status", ps, depth, &r_n->status))
+ return False;
+
+ return True;
+}
+
diff -urx*CVS* ./rpc_server/srv_srvsvc.c /samba/mine/samba-2.2/source/rpc_server/srv_srvsvc.c
--- ./rpc_server/srv_srvsvc.c Tue May 1 13:47:50 2001
+++ /samba/mine/samba-2.2/source/rpc_server/srv_srvsvc.c Thu Jun 14 13:34:40 2001
@@ -405,6 +405,35 @@
}
/*******************************************************************
+ NetFileQuerySecdesc (opnum 0x27)
+*******************************************************************/
+
+static BOOL api_srv_net_file_query_secdesc(pipes_struct *p)
+{
+ SRV_Q_NET_FILE_QUERY_SECDESC q_u;
+ SRV_R_NET_FILE_QUERY_SECDESC r_u;
+ prs_struct *data = &p->in_data.data;
+ prs_struct *rdata = &p->out_data.rdata;
+
+ ZERO_STRUCT(q_u);
+ ZERO_STRUCT(r_u);
+
+ /* Unmarshall the net file get info from Win9x */
+ if(!srv_io_q_net_file_query_secdesc("", &q_u, data, 0)) {
+ DEBUG(0,("api_srv_net_file_query_secdesc: Failed to unmarshall SRV_Q_NET_FILE_QUERY_SECDESC.\n"));
+ return False;
+ }
+
+ r_u.status = _srv_net_file_query_secdesc(p, &q_u, &r_u);
+
+ if(!srv_io_r_net_file_query_secdesc("", &r_u, rdata, 0)) {
+ DEBUG(0,("api_srv_net_file_query_secdesc: Failed to marshall SRV_R_NET_FILE_QUERY_SECDESC.\n"));
+ return False;
+ }
+
+ return True;
+}
+/*******************************************************************
\PIPE\srvsvc commands
********************************************************************/
@@ -423,6 +452,7 @@
{ "SRV_NET_REMOTE_TOD" , SRV_NET_REMOTE_TOD , api_srv_net_remote_tod },
{ "SRV_NET_DISK_ENUM" , SRV_NET_DISK_ENUM , api_srv_net_disk_enum },
{ "SRV_NET_NAME_VALIDATE" , SRV_NET_NAME_VALIDATE , api_srv_net_name_validate},
+ { "SRV_NETFILEQUERYSECDESC",SRV_NETFILEQUERYSECDESC,api_srv_net_file_query_secdesc},
{ NULL , 0 , NULL }
};
diff -urx*CVS* ./rpc_server/srv_srvsvc_nt.c /samba/mine/samba-2.2/source/rpc_server/srv_srvsvc_nt.c
--- ./rpc_server/srv_srvsvc_nt.c Fri Jun 15 09:34:21 2001
+++ /samba/mine/samba-2.2/source/rpc_server/srv_srvsvc_nt.c Thu Jun 14 15:52:50 2001
@@ -1675,3 +1675,41 @@
return r_u->status;
}
+
+uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, SRV_R_NET_FILE_QUERY_SECDESC *r_u)
+{
+ SEC_DESC *psd = NULL;
+ size_t sd_size;
+ fstring filename;
+ fstring qualname;
+ fstring null_pw;
+ files_struct *fsp = NULL;
+ SMB_STRUCT_STAT st;
+ BOOL bad_path;
+ int access_mode;
+ int action;
+ int ecode;
+ connection_struct *conn;
+
+ unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname));
+ *null_pw = '\0';
+ conn = make_connection(qualname, p->conn->user, null_pw, 0, "A:", p->conn->vuid, &ecode);
+ unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename));
+ unix_convert(filename, conn, NULL, &bad_path, &st);
+ fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDONLY), (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode,
&action);
+
+ sd_size = conn->vfs_ops.get_nt_acl(fsp, fsp->fsp_name, &psd);
+
+ r_u->ptr_response = 1;
+ r_u->size_response = sd_size;
+ r_u->ptr_secdesc = 1;
+ r_u->size_secdesc = sd_size;
+ r_u->sec_desc = psd;
+
+ r_u->status=NT_STATUS_NOPROBLEMO;
+ fsp->conn->vfs_ops.close(fsp, fsp->fd);
+ file_free(fsp);
+ close_cnum(conn, p->conn->vuid);
+ return r_u->status;
+}
+
More information about the samba-technical
mailing list