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