svn commit: samba r5186 - in trunk/source: include rpc_parse rpc_server

jerry at samba.org jerry at samba.org
Thu Feb 3 03:54:30 GMT 2005


Author: jerry
Date: 2005-02-03 03:54:30 +0000 (Thu, 03 Feb 2005)
New Revision: 5186

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=5186

Log:
hard code the reply for the "NETLOGON" service
in _svcctl_get_display_name() in order to get
farther along in the dance with Srvmgr.exe

Add in parsing code for svcctl_open_service()


Modified:
   trunk/source/include/rpc_svcctl.h
   trunk/source/rpc_parse/parse_svcctl.c
   trunk/source/rpc_server/srv_svcctl.c
   trunk/source/rpc_server/srv_svcctl_nt.c


Changeset:
Modified: trunk/source/include/rpc_svcctl.h
===================================================================
--- trunk/source/include/rpc_svcctl.h	2005-02-03 02:35:52 UTC (rev 5185)
+++ trunk/source/include/rpc_svcctl.h	2005-02-03 03:54:30 UTC (rev 5186)
@@ -27,6 +27,7 @@
 
 #define SVCCTL_CLOSE_SERVICE		0x00
 #define SVCCTL_OPEN_SCMANAGER		0x0f
+#define SVCCTL_OPEN_SERVICE		0x10
 #define SVCCTL_START_SERVICE		0x13
 #define SVCCTL_GET_DISPLAY_NAME		0x14
 
@@ -66,6 +67,17 @@
 	NTSTATUS status;
 } SVCCTL_R_GET_DISPLAY_NAME;
 
+typedef struct _svcctl_q_open_service {
+	POLICY_HND handle;
+	UNISTR2 servicename;
+	uint32 access_mask;
+} SVCCTL_Q_OPEN_SERVICE;
 
+typedef struct _svcctl_r_open_service {
+	POLICY_HND handle;
+	NTSTATUS status;
+} SVCCTL_R_OPEN_SERVICE;
+
+
 #endif /* _RPC_SVCCTL_H */
 

Modified: trunk/source/rpc_parse/parse_svcctl.c
===================================================================
--- trunk/source/rpc_parse/parse_svcctl.c	2005-02-03 02:35:52 UTC (rev 5185)
+++ trunk/source/rpc_parse/parse_svcctl.c	2005-02-03 03:54:30 UTC (rev 5186)
@@ -157,6 +157,17 @@
 /*******************************************************************
 ********************************************************************/
 
+BOOL init_svcctl_r_get_display_name( SVCCTL_R_GET_DISPLAY_NAME *r_u, const char *displayname )
+{
+	r_u->display_name_len = strlen(displayname);
+	init_unistr2( &r_u->displayname, displayname, UNI_STR_TERMINATE );
+
+	return True;
+}
+
+/*******************************************************************
+********************************************************************/
+
 BOOL svcctl_io_r_get_display_name(const char *desc, SVCCTL_R_GET_DISPLAY_NAME *r_u, prs_struct *ps, int depth)
 {
 	if (r_u == NULL)
@@ -184,3 +195,57 @@
 	return True;
 }
 
+
+/*******************************************************************
+********************************************************************/
+
+BOOL svcctl_io_q_open_service(const char *desc, SVCCTL_Q_OPEN_SERVICE *q_u, prs_struct *ps, int depth)
+{
+	if (q_u == NULL)
+		return False;
+
+	prs_debug(ps, depth, desc, "svcctl_io_q_open_service");
+	depth++;
+
+	if(!prs_align(ps))
+		return False;
+
+	if(!smb_io_pol_hnd("scm_pol", &q_u->handle, ps, depth))
+		return False;
+
+	if(!smb_io_unistr2("", &q_u->servicename, 1, ps, depth))
+		return False;
+
+	if(!prs_align(ps))
+		return False;
+
+	if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
+		return False;
+	
+	return True;
+}
+
+/*******************************************************************
+********************************************************************/
+
+BOOL svcctl_io_r_open_service(const char *desc, SVCCTL_R_OPEN_SERVICE *r_u, prs_struct *ps, int depth)
+{
+	if (r_u == NULL)
+		return False;
+
+	prs_debug(ps, depth, desc, "svcctl_io_r_open_service");
+	depth++;
+
+	if(!prs_align(ps))
+		return False;
+
+	
+	if(!smb_io_pol_hnd("service_pol", &r_u->handle, ps, depth))
+		return False;
+
+	if(!prs_ntstatus("status", ps, depth, &r_u->status))
+		return False;
+
+	return True;
+}
+

Modified: trunk/source/rpc_server/srv_svcctl.c
===================================================================
--- trunk/source/rpc_server/srv_svcctl.c	2005-02-03 02:35:52 UTC (rev 5185)
+++ trunk/source/rpc_server/srv_svcctl.c	2005-02-03 03:54:30 UTC (rev 5186)
@@ -77,6 +77,30 @@
 /*******************************************************************
  ********************************************************************/
 
+static BOOL api_svcctl_open_service(pipes_struct *p)
+{
+	SVCCTL_Q_OPEN_SERVICE q_u;
+	SVCCTL_R_OPEN_SERVICE r_u;
+	prs_struct *data = &p->in_data.data;
+	prs_struct *rdata = &p->out_data.rdata;
+
+	ZERO_STRUCT(q_u);
+	ZERO_STRUCT(r_u);
+
+	if(!svcctl_io_q_open_service("", &q_u, data, 0))
+		return False;
+
+	r_u.status = _svcctl_open_service(p, &q_u, &r_u);
+
+	if(!svcctl_io_r_open_service("", &r_u, rdata, 0))
+		return False;
+
+	return True;
+}
+
+/*******************************************************************
+ ********************************************************************/
+
 static BOOL api_svcctl_get_display_name(pipes_struct *p)
 {
 	SVCCTL_Q_GET_DISPLAY_NAME q_u;
@@ -107,6 +131,7 @@
 {
       { "SVCCTL_CLOSE_SERVICE"      , SVCCTL_CLOSE_SERVICE       , api_svcctl_close_service },
       { "SVCCTL_OPEN_SCMANAGER"     , SVCCTL_OPEN_SCMANAGER      , api_svcctl_open_scmanager },
+      { "SVCCTL_OPEN_SERVICE"       , SVCCTL_OPEN_SERVICE        , api_svcctl_open_service },
       { "SVCCTL_GET_DISPLAY_NAME"   , SVCCTL_GET_DISPLAY_NAME    , api_svcctl_get_display_name }
 };
 

Modified: trunk/source/rpc_server/srv_svcctl_nt.c
===================================================================
--- trunk/source/rpc_server/srv_svcctl_nt.c	2005-02-03 02:35:52 UTC (rev 5185)
+++ trunk/source/rpc_server/srv_svcctl_nt.c	2005-02-03 03:54:30 UTC (rev 5186)
@@ -27,8 +27,8 @@
 #define DBGC_CLASS DBGC_RPC_SRV
 
 
-/*******************************************************************
- ********************************************************************/
+/********************************************************************
+********************************************************************/
 
 NTSTATUS _svcctl_open_scmanager(pipes_struct *p, SVCCTL_Q_OPEN_SCMANAGER *q_u, SVCCTL_R_OPEN_SCMANAGER *r_u)
 {
@@ -40,6 +40,17 @@
 	return NT_STATUS_OK;
 }
 
+/********************************************************************
+********************************************************************/
+
+NTSTATUS _svcctl_open_service(pipes_struct *p, SVCCTL_Q_OPEN_SERVICE *q_u, SVCCTL_R_OPEN_SERVICE *r_u)
+{
+	return NT_STATUS_ACCESS_DENIED;
+}
+
+/********************************************************************
+********************************************************************/
+
 NTSTATUS _svcctl_close_service(pipes_struct *p, SVCCTL_Q_CLOSE_SERVICE *q_u, SVCCTL_R_CLOSE_SERVICE *r_u)
 {
 	if ( !close_policy_hnd( p, &q_u->handle ) )
@@ -47,7 +58,24 @@
 	
 	return NT_STATUS_OK;
 }
+
+/********************************************************************
+********************************************************************/
+
 NTSTATUS _svcctl_get_display_name(pipes_struct *p, SVCCTL_Q_GET_DISPLAY_NAME *q_u, SVCCTL_R_GET_DISPLAY_NAME *r_u)
 {
-	return NT_STATUS_ACCESS_DENIED;
+	fstring service;
+	fstring displayname;
+
+	rpcstr_pull(service, q_u->servicename.buffer, sizeof(service), q_u->servicename.uni_str_len*2, 0);
+
+	DEBUG(10,("_svcctl_get_display_name: service name [%s]\n", service));
+
+	if ( !strequal( service, "NETLOGON" ) )
+		return NT_STATUS_ACCESS_DENIED;
+
+	fstrcpy( displayname, "Net Logon");
+	init_svcctl_r_get_display_name( r_u, displayname );
+
+	return NT_STATUS_OK;
 }



More information about the samba-cvs mailing list