return if (util::has_property($fn, "local"));
+ my $objargdef = "";
+ my $objarg = ", NULL";
+ if (util::has_property($fn, "object")) {
+ $objargdef = ", struct GUID *object";
+ $objarg = ", object";
+ }
+
$res .=
"
-struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
+struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *p$objargdef, TALLOC_CTX *mem_ctx, struct $name *r)
{
if (p->flags & DCERPC_DEBUG_PRINT_IN) {
NDR_PRINT_IN_DEBUG($name, r);
}
- return dcerpc_ndr_request_send(p, DCERPC_$uname, mem_ctx,
+ return dcerpc_ndr_request_send(p$objarg, DCERPC_$uname, mem_ctx,
(ndr_push_flags_fn_t) ndr_push_$name,
(ndr_pull_flags_fn_t) ndr_pull_$name,
r, sizeof(*r));
";
+ $objarg = "" unless (util::has_property($fn, "object"));
$res .=
"
-NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
+NTSTATUS dcerpc_$name(struct dcerpc_pipe *p$objargdef, TALLOC_CTX *mem_ctx, struct $name *r)
{
- struct rpc_request *req = dcerpc_$name\_send(p, mem_ctx, r);
+ struct rpc_request *req = dcerpc_$name\_send(p$objarg, mem_ctx, r);
NTSTATUS status;
if (req == NULL) return NT_STATUS_NO_MEMORY;
my $name = $fn->{NAME};
return if (util::has_property($fn, "call_as") );
+
+ my $objarg = "";
+ if (util::has_property($fn, "object")) {
+ $objarg = ", struct GUID *";
+ }
$res .= "void ndr_print_$name(struct ndr_print *, const char *, int, struct $name *);\n";
- $res .= "struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *, TALLOC_CTX *, struct $name *);\n";
- $res .= "NTSTATUS dcerpc_$name(struct dcerpc_pipe *, TALLOC_CTX *, struct $name *);\n";
+ $res .= "struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *$objarg, TALLOC_CTX *, struct $name *);\n";
+ $res .= "NTSTATUS dcerpc_$name(struct dcerpc_pipe *$objarg, TALLOC_CTX *, struct $name *);\n";
$res .= "\n";
}
if (defined($x->{PROPERTIES}->{object})) {
foreach my $e (@{$x->{DATA}}) {
if($e->{TYPE} eq "FUNCTION") {
+ $e->{PROPERTIES}->{object} = 1;
unshift(@{$e->{DATA}},
{ 'NAME' => 'ORPCthis',
'POINTERS' => 0,
if (defined($x->{PROPERTIES}->{object})) {
foreach my $e (@{$x->{DATA}}) {
if($e->{TYPE} eq "FUNCTION") {
+ $e->{PROPERTIES}->{object} = 1;
unshift(@{$e->{DATA}},
{ 'NAME' => 'ORPCthis',
'POINTERS' => 0,
for my $e (@{$s->{ELEMENTS}}) {
my $a = 1;
- if (!util::need_wire_pointer($e)
+ if (util::has_property($e, "align"))
+ {
+ $a = $e->{PROPERTIES}->{align};
+ } elsif (!util::need_wire_pointer($e)
&& defined $structs{$e->{TYPE}}) {
if ($structs{$e->{TYPE}}->{DATA}->{TYPE} eq "STRUCT") {
$a = struct_alignment($structs{$e->{TYPE}}->{DATA});
pidl $static . "NTSTATUS ndr_push_$fn->{NAME}(struct ndr_push *ndr, int flags, struct $fn->{NAME} *r)\n{\n";
pidl "\n\tif (!(flags & NDR_IN)) goto ndr_out;\n\n";
+
+ if (util::has_property($fn, "object")) {
+ # FIXME: Set COM version and possibly causality ID
+ }
+
foreach my $e (@{$fn->{DATA}}) {
if (util::has_property($e, "in")) {
ParseFunctionElementPush($e, "in");
pidl "\nndr_out:\n";
pidl "\tif (!(flags & NDR_OUT)) goto done;\n\n";
+
foreach my $e (@{$fn->{DATA}}) {
if (util::has_property($e, "out")) {
ParseFunctionElementPush($e, "out");
pidl "\nndr_out:\n";
pidl "\tif (!(flags & NDR_OUT)) goto done;\n\n";
+
foreach my $e (@{$fn->{DATA}}) {
if (util::has_property($e, "out")) {
ParseFunctionElementPull($e, "out");
#include "librpc/gen_ndr/ndr_misc.h"
#include "librpc/gen_ndr/ndr_dcerpc.h"
#include "librpc/rpc/dcerpc.h"
+#include "lib/dcom/common/dcom.h"
#include "smb_interfaces.h"
#include "smbd/server.h"
#include "smbd/service.h"
--- /dev/null
+/*
+ Unix SMB/CIFS implementation.
+ DCOM standard objects
+ Copyright (C) Jelmer Vernooij 2004.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef _DCOM_H /* _DCOM_H */
+#define _DCOM_H
+
+struct dcom_interface
+{
+ struct dcerpc_pipe *pipe;
+ struct GUID ipid; /* Appears in object field */
+};
+
+#endif /* _DCOM_H */
return WERR_NOT_SUPPORTED;
}
-static WERROR dcom_get_class_object (struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct GUID clsid)
+static WERROR dcom_create_instance (struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct GUID clsid)
+{
+ return WERR_NOT_SUPPORTED;
+}
+
+static uint32 IUnknown_AddRef(void)
+{
+ /* FIXME: Tell local server we're adding a reference to this interface on this object. Local server can then call RemAddRef() if necessary */
+ return 0;
+}
+
+static uint32 IUnknown_Release(void)
+{
+ /* FIXME: Tell local server we're releasing a reference to this interface on this object. Local server can then call RemRelease() if necessary */
+ return 0;
+}
+
+static WERROR IUnknown_QueryInterface(struct GUID *riid, void **data)
+{
+ /* FIXME: Ask local server for interface pointer. Local server can then
+ * call RemQueryInterface if necessary */
+ return WERR_NOT_SUPPORTED;
+}
+
+WERROR dcom_create_object(TALLOC_CTX *mem_ctx, struct GUID *clsid, const char *server, int num_ifaces, struct GUID *iid, struct dcom_interface **ip)
+{
+ return WERR_NOT_SUPPORTED;
+}
+
+WERROR dcom_get_class_object(TALLOC_CTX *mem_ctx, struct GUID *clsid, const char *server, struct GUID *iid, struct dcom_interface **ip)
{
struct RemoteActivation r;
+ struct dcerpc_pipe *p = NULL; /* FIXME */
NTSTATUS status;
struct GUID iids[2];
uint16 protseq[3] = { EPM_PROTOCOL_TCP, EPM_PROTOCOL_NCALRPC, EPM_PROTOCOL_UUID };
r.in.this.version.MajorVersion = 5;
r.in.this.version.MinorVersion = 1;
uuid_generate_random(&r.in.this.cid);
- r.in.Clsid = clsid;
+ r.in.Clsid = *clsid;
r.in.ClientImpLevel = RPC_C_IMP_LEVEL_IDENTIFY;
r.in.num_protseqs = 3;
r.in.protseq = protseq;
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]; }
- return WERR_OK;
-}
-static WERROR dcom_create_instance (struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct GUID clsid)
-{
- return WERR_NOT_SUPPORTED;
-}
-
-static uint32 IUnknown_AddRef(void)
-{
- /* FIXME: Tell local server we're adding a reference to this interface on this object. Local server can then call RemAddRef() if necessary */
- return 0;
-}
-
-static uint32 IUnknown_Release(void)
-{
- /* FIXME: Tell local server we're releasing a reference to this interface on this object. Local server can then call RemRelease() if necessary */
- return 0;
-}
-
-static WERROR IUnknown_QueryInterface(struct GUID *riid, void **data)
-{
- /* FIXME: Ask local server for interface pointer. Local server can then
- * call RemQueryInterface if necessary */
return WERR_NOT_SUPPORTED;
}
[case(DCERPC_PKT_BIND_NAK)] dcerpc_bind_nak bind_nak;
} dcerpc_payload;
+ typedef struct {
+ } dcerpc_empty;
+
+ typedef [nodiscriminant] union {
+ [default] dcerpc_empty empty;
+ [case(DCERPC_PFC_FLAG_ORPC)] GUID object;
+ } dcerpc_object;
/* pfc_flags values */
const uint8 DCERPC_PFC_FLAG_FIRST = 0x01;
uint16 frag_length; /* Total length of fragment */
uint16 auth_length; /* authenticator length */
uint32 call_id; /* Call identifier */
-
+ [switch_is(pfc_flags & DCERPC_PFC_FLAG_ORPC)] dcerpc_object object;
[switch_is(ptype)] dcerpc_payload u;
} dcerpc_packet;
}
]
interface IStream : IUnknown
{
- WERROR Read([in] uint32 num_requested,
+ WERROR IStream_Read([in] uint32 num_requested,
[out,size_is(*num_read)] uint8 *data,
[out] uint32 *num_read);
- WERROR Write([in,size_is(num_requested)] uint8 *data,
+ WERROR IStream_Write([in,size_is(num_requested)] uint8 *data,
[in] uint32 num_requested,
[out] uint32 *num_written);
}
perform the send size of a async dcerpc request
*/
struct rpc_request *dcerpc_request_send(struct dcerpc_pipe *p,
+ struct GUID *object,
uint16_t opnum,
TALLOC_CTX *mem_ctx,
DATA_BLOB *stub_data)
pkt.u.request.alloc_hint = remaining;
pkt.u.request.context_id = 0;
pkt.u.request.opnum = opnum;
+ if (object) {
+ pkt.object.object = *object;
+ pkt.pfc_flags |= DCERPC_PFC_FLAG_ORPC;
+ /* FIXME: pfc_cflags is reset below! */
+ }
DLIST_ADD(p->pending, req);
perform a full request/response pair on a dcerpc pipe
*/
NTSTATUS dcerpc_request(struct dcerpc_pipe *p,
+ struct GUID *object,
uint16_t opnum,
TALLOC_CTX *mem_ctx,
DATA_BLOB *stub_data_in,
{
struct rpc_request *req;
- req = dcerpc_request_send(p, opnum, mem_ctx, stub_data_in);
+ req = dcerpc_request_send(p, object, opnum, mem_ctx, stub_data_in);
if (req == NULL) {
return NT_STATUS_NO_MEMORY;
}
call dcerpc_ndr_request_recv() to receive the answer
*/
struct rpc_request *dcerpc_ndr_request_send(struct dcerpc_pipe *p,
+ struct GUID *object,
uint32_t opnum,
TALLOC_CTX *mem_ctx,
NTSTATUS (*ndr_push)(struct ndr_push *, int, void *),
dump_data(10, request.data, request.length);
/* make the actual dcerpc request */
- req = dcerpc_request_send(p, opnum, mem_ctx, &request);
+ req = dcerpc_request_send(p, object, opnum, mem_ctx, &request);
if (req != NULL) {
req->ndr.ndr_push = ndr_push;
standard format
*/
NTSTATUS dcerpc_ndr_request(struct dcerpc_pipe *p,
+ struct GUID *object,
uint32_t opnum,
TALLOC_CTX *mem_ctx,
NTSTATUS (*ndr_push)(struct ndr_push *, int, void *),
{
struct rpc_request *req;
- req = dcerpc_ndr_request_send(p, opnum, mem_ctx, ndr_push, ndr_pull, struct_ptr, struct_size);
+ req = dcerpc_ndr_request_send(p, object, opnum, mem_ctx, ndr_push, ndr_pull, struct_ptr, struct_size);
if (req == NULL) {
return NT_STATUS_NO_MEMORY;
}
--- /dev/null
+/*
+ Unix SMB/CIFS implementation.
+ DCOM standard objects
+ Copyright (C) Jelmer Vernooij 2004.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef _DCOM_H /* _DCOM_H */
+#define _DCOM_H
+
+struct dcom_class
+{
+ const char *name;
+ struct GUID CLSID;
+
+ /* List of IID's implemented */
+ uint32 cIIDs;
+ struct GUID *IID;
+
+ /* Pointers to functions this class implements */
+};
+
+struct dcom_object
+{
+ struct dcom_class *class;
+ struct GUID oid;
+ HYPER_T OXID;
+ struct dcom_interface_pointer *interfaces;
+ void *private_data;
+};
+
+struct dcom_interface_pointer
+{
+ struct dcom_object *object;
+ struct GUID ipid;
+};
+
+#endif /* _DCOM_H */
/*
ResolveOxid
*/
-static WERROR ResolveOxid(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ResolveOxid *r)
+static WERROR ResolveOxid(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ResolveOxid *r)
{
return WERR_NOT_SUPPORTED;
}
/*
SimplePing
*/
-static WERROR SimplePing(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct SimplePing *r)
+static WERROR SimplePing(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct SimplePing *r)
{
return WERR_NOT_SUPPORTED;
}
/*
ComplexPing
*/
-static WERROR ComplexPing(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ComplexPing *r)
+static WERROR ComplexPing(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ComplexPing *r)
{
/* struct PingSet *ps; */
/*
ServerAlive
*/
-static WERROR ServerAlive(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ServerAlive *r)
+static WERROR ServerAlive(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ServerAlive *r)
{
return WERR_OK;
}
/*
ResolveOxid2
*/
-static WERROR ResolveOxid2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ResolveOxid2 *r)
+static WERROR ResolveOxid2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ResolveOxid2 *r)
{
return WERR_NOT_SUPPORTED;
}
/*
ServerAlive2
*/
-static WERROR ServerAlive2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct ServerAlive2 *r)
+static WERROR ServerAlive2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ServerAlive2 *r)
{
return WERR_NOT_SUPPORTED;
}
#include "rpc_server/dcerpc_server.h"
#include "rpc_server/common/common.h"
#include "librpc/gen_ndr/ndr_remact.h"
+#include "rpc_server/dcom/dcom.h"
+
+static void register_dcom_class(void *_c)
+{
+ struct dcom_class *class = _c;
+ /* FIXME */
+}
+
+struct dcom_object *dcom_object_by_oid(struct GUID *oid)
+{
+ /* FIXME */
+ return NULL;
+}
+
+struct dcom_class *dcom_class_by_clsid(struct GUID *clsid)
+{
+ /* FIXME */
+ return NULL;
+}
+
+struct dcom_interface_pointer *dcom_interface_pointer_by_ipid(struct GUID *ipid)
+{
+ /* FIXME */
+ return NULL;
+}
/*
RemoteActivation
*/
-static WERROR RemoteActivation(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct RemoteActivation *r)
+static WERROR RemoteActivation(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct RemoteActivation *r)
{
/* FIXME: CoGetClassObject() */
/* FIXME: IClassFactory::CreateInstance() */
- /* FIXME: IClassFactory::ReleaseInstance() */
+ /* FIXME: IClassFactory::Release() */
return WERR_NOT_SUPPORTED;
}
ndr_print_function_debug(ndr_print_fn, name, NDR_IN | NDR_SET_VALUES, r);
}
- status = dcerpc_ndr_request(private->c_pipe, opnum, mem_ctx,
+ status = dcerpc_ndr_request(private->c_pipe, NULL, opnum, mem_ctx,
(ndr_push_flags_fn_t) ndr_push_fn,
(ndr_pull_flags_fn_t) ndr_pull_fn,
r, struct_size);
SMB_SUBSYSTEM_MK(TORTURE_RAW,torture/config.mk)
+SMB_SUBSYSTEM_MK(TORTURE_DCOM,torture/config.mk)
+
SMB_SUBSYSTEM_MK(TORTURE_RPC,torture/config.mk)
SMB_SUBSYSTEM_MK(TORTURE_RAP,torture/config.mk)
# End SUBSYSTEM TORTURE_RAW
#################################
+#################################
+# Start SUBSYSTEM TORTURE_DCOM
+[SUBSYSTEM::TORTURE_DCOM]
+ADD_OBJ_FILES = \
+ torture/dcom/simple.o
+REQUIRED_SUBSYSTEMS = \
+ LIBDCOM
+# End SUBSYSTEM TORTURE_DCOM
+#################################
+
#################################
# Start SUBSYSTEM TORTURE_RPC
[SUBSYSTEM::TORTURE_RPC]
TORTURE_BASIC \
TORTURE_RAW \
TORTURE_RPC \
+ TORTURE_DCOM \
TORTURE_RAP \
TORTURE_AUTH \
TORTURE_LOCAL \
--- /dev/null
+/*
+ Unix SMB/CIFS implementation.
+ run the "simple" example DCOM program
+
+ Copyright (C) Jelmer Vernooij 2004
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "librpc/gen_ndr/ndr_dcom.h"
+#include "librpc/gen_ndr/ndr_oxidresolver.h"
+
+#define CLSID_SIMPLE "5e9ddec7-5767-11cf-beab-00aa006c3606"
+#define DEFAULT_TRANS 4096
+
+BOOL torture_dcom_simple(void)
+{
+ NTSTATUS status;
+ struct dcerpc_pipe *p;
+ TALLOC_CTX *mem_ctx;
+ BOOL ret = True;
+ struct GUID IID[2];
+ struct GUID clsid;
+ WERROR error;
+ char pv[DEFAULT_TRANS];
+ struct dcom_interface *interfaces;
+ struct IStream_Read r_read;
+ struct IStream_Write r_write;
+
+ mem_ctx = talloc_init("torture_dcom_simple");
+
+ GUID_from_string(DCERPC_ISTREAM_UUID, &IID[0]);
+ GUID_from_string(DCERPC_IUNKNOWN_UUID, &IID[1]);
+ GUID_from_string(CLSID_SIMPLE, &clsid);
+ error = dcom_create_object(mem_ctx, &clsid, "192.168.4.28", 2, IID, &interfaces);
+
+ if (!W_ERROR_IS_OK(error)) {
+ printf("dcom_create_object failed - %s\n", win_errstr(error));
+ return False;
+ }
+
+ ZERO_STRUCT(r_read);
+ status = dcerpc_IStream_Read(interfaces[0].pipe, &interfaces[0].ipid, mem_ctx, &r_read);
+ if (NT_STATUS_IS_ERR(error)) {
+ printf("IStream::Read() failed - %s\n", win_errstr(error));
+ return False;
+ }
+
+
+ status = dcerpc_IStream_Write(interfaces[0].pipe, &interfaces[0].ipid, mem_ctx, &r_write);
+ if (NT_STATUS_IS_ERR(error)) {
+ printf("IStream::Write() failed - %s\n", win_errstr(error));
+ return False;
+ }
+
+ /*FIXME: dcerpc_IUnknown_Release();*/
+
+ talloc_destroy(mem_ctx);
+
+ torture_rpc_close(p);
+ return ret;
+}
memcpy(stub_in.data, base_in->data, insert_ofs);
memcpy(stub_in.data+insert_ofs+n, base_in->data+insert_ofs, base_in->length-insert_ofs);
- status = dcerpc_request(p, opnum, mem_ctx, &stub_in, &stub_out);
+ status = dcerpc_request(p, NULL, opnum, mem_ctx, &stub_in, &stub_out);
if (!NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
print_depth(depth);
/* work out which elements are pointers */
for (ofs=min_ofs;ofs<=max_ofs-4;ofs+=4) {
SIVAL(stub_in.data, ofs, 1);
- status = dcerpc_request(p, opnum, mem_ctx, &stub_in, &stub_out);
+ status = dcerpc_request(p, NULL, opnum, mem_ctx, &stub_in, &stub_out);
if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
print_depth(depth);
data_blob_clear(&stub_in);
- status = dcerpc_request(p, opnum, mem_ctx, &stub_in, &stub_out);
+ status = dcerpc_request(p, NULL, opnum, mem_ctx, &stub_in, &stub_out);
if (NT_STATUS_IS_OK(status)) {
printf("opnum %d min_input %d - output %d\n",
fill_blob_handle(&stub_in, mem_ctx, &handle);
- status = dcerpc_request(p, opnum, mem_ctx, &stub_in, &stub_out);
+ status = dcerpc_request(p, NULL, opnum, mem_ctx, &stub_in, &stub_out);
if (NT_STATUS_IS_OK(status)) {
printf("opnum %d min_input %d - output %d (with handle)\n",
printf("\nScanning pipe '%s'\n", iface->name);
for (i=0;i<5000;i++) {
- status = dcerpc_request(p, i, p, &stub_in, &stub_out);
+ status = dcerpc_request(p, NULL, i, p, &stub_in, &stub_out);
if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT) &&
p->last_fault_code == DCERPC_FAULT_OP_RNG_ERROR) break;
}
return True;
}
-BOOL test_CloseEventLog(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+static BOOL test_CloseEventLog(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct policy_handle *handle)
{
NTSTATUS status;
return 0;
}
+ GUID_from_string(DCERPC_ICLASSFACTORY_UUID, &iids[0]);
r.in.Mode = MODE_GET_CLASS_OBJECT;
status = dcerpc_RemoteActivation(p, mem_ctx, &r);
memset(stub_in.data, 0xFF, stub_in.length);
for (i=0;i<200;i++) {
- status = dcerpc_request(p, i, mem_ctx, &stub_in, &stub_out);
+ status = dcerpc_request(p, NULL, i, mem_ctx, &stub_in, &stub_out);
if (!NT_STATUS_IS_OK(status) &&
p->last_fault_code == DCERPC_FAULT_OP_RNG_ERROR) {
break;
{"RPC-MULTIBIND", torture_multi_bind, 0},
{"RPC-DRSUAPI", torture_rpc_drsuapi, 0},
+ /* Distributed COM testers */
+ {"DCOM-SIMPLE", torture_dcom_simple, 0},
+
/* local (no server) testers */
{"LOCAL-NTLMSSP", torture_ntlmssp_self_check, 0},
{"LOCAL-ICONV", torture_local_iconv, 0},