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