r3515: Fix RemoteActivation correctly this time (-:
authorJelmer Vernooij <jelmer@samba.org>
Thu, 4 Nov 2004 01:09:43 +0000 (01:09 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:05:27 +0000 (13:05 -0500)
Thanks to tridge for some help on this one!

source/build/pidl/util.pm
source/include/includes.h
source/lib/dcom/common/dcom.h
source/lib/dcom/common/main.c
source/librpc/idl/dcom.idl
source/librpc/idl/remact.idl
source/librpc/rpc/dcerpc_util.c

index bddce577404df069f3be56ec47764729da74f026..03541ae95dd13515809e60476b3d3f407a37cb08 100644 (file)
@@ -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;
 }
index ee14b372203305b11a8f950ce237b5471720734b..9d2aacd3b27b9a75bfd6d668f7780a6969440455 100644 (file)
@@ -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"
index 091200d4c1044fcc0a7131a23663ef899d107f4e..d97364a125982f126bb1b01fdb9b69595963ab75 100644 (file)
@@ -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 */
index 3c95caebe006a6b1d13e0ce0a57ee4fc5cea54bf..5bc8e5c6d4e45698ffb03e03ffd7968a13f78756 100644 (file)
@@ -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 = &pm;
 
        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;
 }
index 448ed827f977debeeb2306ba5c4a62246df9704f..9d37e5bc4454b42b598647dd665cf2191659e5ff 100644 (file)
@@ -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;
 }
 
index 1d54148f5ebb9711933698e946ceb15516cbd90e..8a77240a19db3d672f80125e0d168127019b28dc 100644 (file)
@@ -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[]
                        );
 }
index 7b49e4f8d7d33bea84df815c2b180704604381dc..8eb058d7b392fcbffba188b90639235f3da3d601 100644 (file)
@@ -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;