From 695677f4bb078291c683931d5017f339811abf90 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 4 Nov 2004 01:09:43 +0000 Subject: r3515: Fix RemoteActivation correctly this time (-: Thanks to tridge for some help on this one! (This used to be commit 1104667190aa144e2c7d79ece9a55502b98d0351) --- source4/build/pidl/util.pm | 1 + source4/include/includes.h | 1 + source4/lib/dcom/common/dcom.h | 2 +- source4/lib/dcom/common/main.c | 19 +++++++++++++++---- source4/librpc/idl/dcom.idl | 3 +-- source4/librpc/idl/remact.idl | 11 ++++++++--- source4/librpc/rpc/dcerpc_util.c | 8 +++++++- 7 files changed, 34 insertions(+), 11 deletions(-) diff --git a/source4/build/pidl/util.pm b/source4/build/pidl/util.pm index bddce57740..03541ae95d 100644 --- a/source4/build/pidl/util.pm +++ b/source4/build/pidl/util.pm @@ -239,6 +239,7 @@ sub type_align($) return 4, if ($type eq "DATA_BLOB"); return 4, if ($type eq "int32"); + print STDERR "Had to guess align width for type $type\n"; # it must be an external type - all we can do is guess return 4; } diff --git a/source4/include/includes.h b/source4/include/includes.h index ee14b37220..9d2aacd3b2 100644 --- a/source4/include/includes.h +++ b/source4/include/includes.h @@ -182,6 +182,7 @@ extern int errno; #include "librpc/gen_ndr/ndr_misc.h" #include "librpc/gen_ndr/ndr_dcerpc.h" #include "librpc/rpc/dcerpc.h" +#include "librpc/gen_ndr/ndr_dcom.h" #include "lib/dcom/common/dcom.h" #include "smb_interfaces.h" #include "smbd/server.h" diff --git a/source4/lib/dcom/common/dcom.h b/source4/lib/dcom/common/dcom.h index 091200d4c1..d97364a125 100644 --- a/source4/lib/dcom/common/dcom.h +++ b/source4/lib/dcom/common/dcom.h @@ -28,7 +28,7 @@ struct IUnknown_QueryInterface; struct dcom_interface { struct dcerpc_pipe *pipe; - struct GUID ipid; /* Appears in object field */ + struct OBJREF object; }; #endif /* _DCOM_H */ diff --git a/source4/lib/dcom/common/main.c b/source4/lib/dcom/common/main.c index 3c95caebe0..5bc8e5c6d4 100644 --- a/source4/lib/dcom/common/main.c +++ b/source4/lib/dcom/common/main.c @@ -90,6 +90,7 @@ NTSTATUS dcerpc_IUnknown_QueryInterface(struct dcerpc_pipe *p, struct GUID *o, T WERROR dcom_create_object(TALLOC_CTX *mem_ctx, struct GUID *clsid, const char *server, int num_ifaces, struct GUID *iid, struct dcom_interface **ip, const char *domain, const char *user, const char *pass) { struct RemoteActivation r; + int i; struct dcerpc_pipe *p; NTSTATUS status; uint16 protseq[] = DCOM_NEGOTIATED_PROTOCOLS; @@ -110,7 +111,8 @@ WERROR dcom_create_object(TALLOC_CTX *mem_ctx, struct GUID *clsid, const char *s r.in.protseq = protseq; r.in.Interfaces = num_ifaces; r.in.pIIDs = iid; - + r.out.ifaces = talloc_array_p(mem_ctx, struct pMInterfacePointer, num_ifaces); + status = dcerpc_RemoteActivation(p, mem_ctx, &r); if(NT_STATUS_IS_ERR(status)) { DEBUG(1, ("Error while running RemoteActivation %s\n", nt_errstr(status))); @@ -121,15 +123,21 @@ WERROR dcom_create_object(TALLOC_CTX *mem_ctx, struct GUID *clsid, const char *s if(!W_ERROR_IS_OK(r.out.hr)) { return r.out.hr; } if(!W_ERROR_IS_OK(r.out.results[0])) { return r.out.results[0]; } - /* FIXME: Fill ip */ + *ip = talloc_array_p(mem_ctx, struct dcom_interface, num_ifaces); + for (i = 0; i < num_ifaces; i++) { + (*ip)[i].object = r.out.ifaces[i].p->obj; + (*ip)[i].pipe = NULL; /* FIXME */ + } + return WERR_OK; } -WERROR dcom_get_class_object(TALLOC_CTX *mem_ctx, struct GUID *clsid, const char *server, struct GUID *iid, struct dcom_interface **ip, const char *domain, const char *user, const char *pass) +WERROR dcom_get_class_object(TALLOC_CTX *mem_ctx, struct GUID *clsid, const char *server, struct GUID *iid, struct dcom_interface *ip, const char *domain, const char *user, const char *pass) { struct RemoteActivation r; struct dcerpc_pipe *p; NTSTATUS status; + struct pMInterfacePointer pm; uint16 protseq[] = DCOM_NEGOTIATED_PROTOCOLS; status = dcom_connect(&p, server, domain, user, pass); @@ -149,6 +157,7 @@ WERROR dcom_get_class_object(TALLOC_CTX *mem_ctx, struct GUID *clsid, const char r.in.Interfaces = 1; r.in.pIIDs = iid; r.in.Mode = MODE_GET_CLASS_OBJECT; + r.out.ifaces = ± status = dcerpc_RemoteActivation(p, mem_ctx, &r); if(NT_STATUS_IS_ERR(status)) { @@ -160,6 +169,8 @@ WERROR dcom_get_class_object(TALLOC_CTX *mem_ctx, struct GUID *clsid, const char if(!W_ERROR_IS_OK(r.out.hr)) { return r.out.hr; } if(!W_ERROR_IS_OK(r.out.results[0])) { return r.out.results[0]; } - /* FIXME: Fill ip */ + ip->pipe = NULL; /* FIXME */ + ip->object = pm.p->obj; + return WERR_OK; } diff --git a/source4/librpc/idl/dcom.idl b/source4/librpc/idl/dcom.idl index 448ed827f9..9d37e5bc44 100644 --- a/source4/librpc/idl/dcom.idl +++ b/source4/librpc/idl/dcom.idl @@ -262,8 +262,7 @@ interface ObjectRpcBaseTypes typedef [public] struct { uint32 size; - uint32 sizex; - [subcontext(4),align(1)] OBJREF obj; + [subcontext(4),align(4)] OBJREF obj; } MInterfacePointer; } diff --git a/source4/librpc/idl/remact.idl b/source4/librpc/idl/remact.idl index 1d54148f5e..8a77240a19 100644 --- a/source4/librpc/idl/remact.idl +++ b/source4/librpc/idl/remact.idl @@ -10,6 +10,7 @@ [ uuid("4d9f4ab8-7d1c-11cf-861e-0020af6e7c57"), pointer_default(unique), + endpoint("ncalrpc:", "ncacn_ip_tcp:[135]"), depends(dcom) ] interface IRemoteActivation @@ -22,7 +23,11 @@ interface IRemoteActivation RPC_C_IMP_LEVEL_IMPERSONATE = 3, RPC_C_IMP_LEVEL_DELEGATE = 4 } imp_levels; - + + typedef struct { + MInterfacePointer *p; + } pMInterfacePointer; + const uint32 MODE_GET_CLASS_OBJECT = 0xffffffff; WERROR RemoteActivation ( [in] ORPCTHIS this, @@ -32,7 +37,7 @@ interface IRemoteActivation [in, unique] MInterfacePointer *pObjectStorage, [in] uint32 ClientImpLevel, [in] uint32 Mode, - [in] uint32 Interfaces, + [in,range(1,32768)] uint32 Interfaces, [in, unique,size_is(Interfaces)] GUID *pIIDs, [in] uint16 num_protseqs, [in, size_is(num_protseqs)] uint16 protseq[], @@ -42,7 +47,7 @@ interface IRemoteActivation [out] uint32 AuthnHint, [out] COMVERSION ServerVersion, [out] WERROR hr, - [out,size_is(Interfaces)] MInterfacePointer ifaces[], + [out,size_is(Interfaces),ref] pMInterfacePointer *ifaces, [out,size_is(Interfaces)] WERROR results[] ); } diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c index 7b49e4f8d7..8eb058d7b3 100644 --- a/source4/librpc/rpc/dcerpc_util.c +++ b/source4/librpc/rpc/dcerpc_util.c @@ -24,6 +24,9 @@ #include "includes.h" #include "system/network.h" #include "librpc/gen_ndr/ndr_epmapper.h" +#include "librpc/gen_ndr/ndr_remact.h" +#include "librpc/gen_ndr/ndr_oxidresolver.h" +#include "librpc/gen_ndr/ndr_mgmt.h" #include "librpc/gen_ndr/tables.h" /* @@ -659,7 +662,10 @@ NTSTATUS dcerpc_epm_map_binding(TALLOC_CTX *mem_ctx, struct dcerpc_binding *bind struct dcerpc_binding epmapper_binding; - if (!strcmp(uuid, DCERPC_EPMAPPER_UUID)) { + if (!strcmp(uuid, DCERPC_EPMAPPER_UUID) || + !strcmp(uuid, DCERPC_MGMT_UUID) || + !strcmp(uuid, DCERPC_IREMOTEACTIVATION_UUID) || + !strcmp(uuid, DCERPC_IOXIDRESOLVER_UUID)) { switch(binding->transport) { case NCACN_IP_TCP: binding->endpoint = talloc_asprintf(mem_ctx, "%d", EPMAPPER_PORT); return NT_STATUS_OK; case NCALRPC: binding->endpoint = EPMAPPER_IDENTIFIER; return NT_STATUS_OK; -- cgit