mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
r3515: Fix RemoteActivation correctly this time (-:
Thanks to tridge for some help on this one!
This commit is contained in:
parent
8076db7a1f
commit
1104667190
@ -239,6 +239,7 @@ sub type_align($)
|
|||||||
return 4, if ($type eq "DATA_BLOB");
|
return 4, if ($type eq "DATA_BLOB");
|
||||||
return 4, if ($type eq "int32");
|
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
|
# it must be an external type - all we can do is guess
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
@ -182,6 +182,7 @@ extern int errno;
|
|||||||
#include "librpc/gen_ndr/ndr_misc.h"
|
#include "librpc/gen_ndr/ndr_misc.h"
|
||||||
#include "librpc/gen_ndr/ndr_dcerpc.h"
|
#include "librpc/gen_ndr/ndr_dcerpc.h"
|
||||||
#include "librpc/rpc/dcerpc.h"
|
#include "librpc/rpc/dcerpc.h"
|
||||||
|
#include "librpc/gen_ndr/ndr_dcom.h"
|
||||||
#include "lib/dcom/common/dcom.h"
|
#include "lib/dcom/common/dcom.h"
|
||||||
#include "smb_interfaces.h"
|
#include "smb_interfaces.h"
|
||||||
#include "smbd/server.h"
|
#include "smbd/server.h"
|
||||||
|
@ -28,7 +28,7 @@ struct IUnknown_QueryInterface;
|
|||||||
struct dcom_interface
|
struct dcom_interface
|
||||||
{
|
{
|
||||||
struct dcerpc_pipe *pipe;
|
struct dcerpc_pipe *pipe;
|
||||||
struct GUID ipid; /* Appears in object field */
|
struct OBJREF object;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _DCOM_H */
|
#endif /* _DCOM_H */
|
||||||
|
@ -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)
|
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;
|
struct RemoteActivation r;
|
||||||
|
int i;
|
||||||
struct dcerpc_pipe *p;
|
struct dcerpc_pipe *p;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
uint16 protseq[] = DCOM_NEGOTIATED_PROTOCOLS;
|
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.protseq = protseq;
|
||||||
r.in.Interfaces = num_ifaces;
|
r.in.Interfaces = num_ifaces;
|
||||||
r.in.pIIDs = iid;
|
r.in.pIIDs = iid;
|
||||||
|
r.out.ifaces = talloc_array_p(mem_ctx, struct pMInterfacePointer, num_ifaces);
|
||||||
|
|
||||||
status = dcerpc_RemoteActivation(p, mem_ctx, &r);
|
status = dcerpc_RemoteActivation(p, mem_ctx, &r);
|
||||||
if(NT_STATUS_IS_ERR(status)) {
|
if(NT_STATUS_IS_ERR(status)) {
|
||||||
DEBUG(1, ("Error while running RemoteActivation %s\n", nt_errstr(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.hr)) { return r.out.hr; }
|
||||||
if(!W_ERROR_IS_OK(r.out.results[0])) { return r.out.results[0]; }
|
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;
|
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 RemoteActivation r;
|
||||||
struct dcerpc_pipe *p;
|
struct dcerpc_pipe *p;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
struct pMInterfacePointer pm;
|
||||||
uint16 protseq[] = DCOM_NEGOTIATED_PROTOCOLS;
|
uint16 protseq[] = DCOM_NEGOTIATED_PROTOCOLS;
|
||||||
|
|
||||||
status = dcom_connect(&p, server, domain, user, pass);
|
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.Interfaces = 1;
|
||||||
r.in.pIIDs = iid;
|
r.in.pIIDs = iid;
|
||||||
r.in.Mode = MODE_GET_CLASS_OBJECT;
|
r.in.Mode = MODE_GET_CLASS_OBJECT;
|
||||||
|
r.out.ifaces = ±
|
||||||
|
|
||||||
status = dcerpc_RemoteActivation(p, mem_ctx, &r);
|
status = dcerpc_RemoteActivation(p, mem_ctx, &r);
|
||||||
if(NT_STATUS_IS_ERR(status)) {
|
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.hr)) { return r.out.hr; }
|
||||||
if(!W_ERROR_IS_OK(r.out.results[0])) { return r.out.results[0]; }
|
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;
|
return WERR_OK;
|
||||||
}
|
}
|
||||||
|
@ -262,8 +262,7 @@ interface ObjectRpcBaseTypes
|
|||||||
typedef [public] struct
|
typedef [public] struct
|
||||||
{
|
{
|
||||||
uint32 size;
|
uint32 size;
|
||||||
uint32 sizex;
|
[subcontext(4),align(4)] OBJREF obj;
|
||||||
[subcontext(4),align(1)] OBJREF obj;
|
|
||||||
} MInterfacePointer;
|
} MInterfacePointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
[
|
[
|
||||||
uuid("4d9f4ab8-7d1c-11cf-861e-0020af6e7c57"),
|
uuid("4d9f4ab8-7d1c-11cf-861e-0020af6e7c57"),
|
||||||
pointer_default(unique),
|
pointer_default(unique),
|
||||||
|
endpoint("ncalrpc:", "ncacn_ip_tcp:[135]"),
|
||||||
depends(dcom)
|
depends(dcom)
|
||||||
]
|
]
|
||||||
interface IRemoteActivation
|
interface IRemoteActivation
|
||||||
@ -22,7 +23,11 @@ interface IRemoteActivation
|
|||||||
RPC_C_IMP_LEVEL_IMPERSONATE = 3,
|
RPC_C_IMP_LEVEL_IMPERSONATE = 3,
|
||||||
RPC_C_IMP_LEVEL_DELEGATE = 4
|
RPC_C_IMP_LEVEL_DELEGATE = 4
|
||||||
} imp_levels;
|
} imp_levels;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
MInterfacePointer *p;
|
||||||
|
} pMInterfacePointer;
|
||||||
|
|
||||||
const uint32 MODE_GET_CLASS_OBJECT = 0xffffffff;
|
const uint32 MODE_GET_CLASS_OBJECT = 0xffffffff;
|
||||||
WERROR RemoteActivation (
|
WERROR RemoteActivation (
|
||||||
[in] ORPCTHIS this,
|
[in] ORPCTHIS this,
|
||||||
@ -32,7 +37,7 @@ interface IRemoteActivation
|
|||||||
[in, unique] MInterfacePointer *pObjectStorage,
|
[in, unique] MInterfacePointer *pObjectStorage,
|
||||||
[in] uint32 ClientImpLevel,
|
[in] uint32 ClientImpLevel,
|
||||||
[in] uint32 Mode,
|
[in] uint32 Mode,
|
||||||
[in] uint32 Interfaces,
|
[in,range(1,32768)] uint32 Interfaces,
|
||||||
[in, unique,size_is(Interfaces)] GUID *pIIDs,
|
[in, unique,size_is(Interfaces)] GUID *pIIDs,
|
||||||
[in] uint16 num_protseqs,
|
[in] uint16 num_protseqs,
|
||||||
[in, size_is(num_protseqs)] uint16 protseq[],
|
[in, size_is(num_protseqs)] uint16 protseq[],
|
||||||
@ -42,7 +47,7 @@ interface IRemoteActivation
|
|||||||
[out] uint32 AuthnHint,
|
[out] uint32 AuthnHint,
|
||||||
[out] COMVERSION ServerVersion,
|
[out] COMVERSION ServerVersion,
|
||||||
[out] WERROR hr,
|
[out] WERROR hr,
|
||||||
[out,size_is(Interfaces)] MInterfacePointer ifaces[],
|
[out,size_is(Interfaces),ref] pMInterfacePointer *ifaces,
|
||||||
[out,size_is(Interfaces)] WERROR results[]
|
[out,size_is(Interfaces)] WERROR results[]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,9 @@
|
|||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
#include "system/network.h"
|
#include "system/network.h"
|
||||||
#include "librpc/gen_ndr/ndr_epmapper.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"
|
#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;
|
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) {
|
switch(binding->transport) {
|
||||||
case NCACN_IP_TCP: binding->endpoint = talloc_asprintf(mem_ctx, "%d", EPMAPPER_PORT); return NT_STATUS_OK;
|
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;
|
case NCALRPC: binding->endpoint = EPMAPPER_IDENTIFIER; return NT_STATUS_OK;
|
||||||
|
Loading…
Reference in New Issue
Block a user