for (i = 0; i < t->num_floors; i++) {
const char *data;
- struct GUID if_uuid;
- uint16_t if_version;
+ struct dcerpc_syntax_id syntax;
GtkTreeIter iter;
gtk_tree_store_append(store_eps, &iter, &toweriter);
- dcerpc_floor_get_lhs_data(&t->floors[i], &if_uuid, &if_version);
+ dcerpc_floor_get_lhs_data(&t->floors[i], &syntax);
if (t->floors[i].lhs.protocol == EPM_PROTOCOL_UUID) {
- data = GUID_string(mem_ctx, &if_uuid);
+ data = GUID_string(mem_ctx, &syntax.uuid);
} else {
data = dcerpc_floor_get_rhs_data(mem_ctx, &t->floors[i]);
}
irpc->callnum = callnum;
irpc->fn = fn;
irpc->private = private;
- irpc->uuid = irpc->table->uuid;
+ irpc->uuid = irpc->table->syntax_id.uuid;
return NT_STATUS_OK;
}
for (i=msg_ctx->irpc; i; i=i->next) {
if (GUID_equal(&i->uuid, &m->header.uuid) &&
- i->table->if_version == m->header.if_version &&
+ i->table->syntax_id.if_version == m->header.if_version &&
i->callnum == m->header.callnum) {
break;
}
talloc_set_destructor(irpc, irpc_destructor);
/* setup the header */
- header.uuid = table->uuid;
+ header.uuid = table->syntax_id.uuid;
- header.if_version = table->if_version;
+ header.if_version = table->syntax_id.if_version;
header.callid = irpc->callid;
header.callnum = callnum;
header.flags = 0;
struct dcerpc_syntax_id *syntax,
struct dcerpc_syntax_id *transfer_syntax)
{
- syntax->uuid = table->uuid;
- syntax->if_version = table->if_version;
+ syntax->uuid = table->syntax_id.uuid;
+ syntax->if_version = table->syntax_id.if_version;
*transfer_syntax = ndr_transfer_syntax;
struct dcerpc_interface_table {
const char *name;
- struct GUID uuid;
- uint32_t if_version;
+ struct dcerpc_syntax_id syntax_id;
const char *helpstring;
uint32_t num_calls;
const struct dcerpc_interface_call *calls;
/* this describes a binding to a particular transport/pipe */
struct dcerpc_binding {
enum dcerpc_transport_t transport;
- struct GUID object;
- uint16_t object_version;
+ struct dcerpc_syntax_id object;
const char *host;
const char *endpoint;
const char **options;
const char *epm_floor_string(TALLOC_CTX *mem_ctx, struct epm_floor *epm_floor)
{
- struct GUID uuid;
- uint16_t if_version;
+ struct dcerpc_syntax_id syntax;
NTSTATUS status;
switch(epm_floor->lhs.protocol) {
case EPM_PROTOCOL_UUID:
- status = dcerpc_floor_get_lhs_data(epm_floor, &uuid, &if_version);
+ status = dcerpc_floor_get_lhs_data(epm_floor, &syntax);
if (NT_STATUS_IS_OK(status)) {
/* lhs is used: UUID */
char *uuidstr;
- if (GUID_equal(&uuid, &ndr_transfer_syntax.uuid)) {
+ if (GUID_equal(&syntax.uuid, &ndr_transfer_syntax.uuid)) {
return "NDR";
}
- if (GUID_equal(&uuid, &ndr64_transfer_syntax.uuid)) {
+ if (GUID_equal(&syntax.uuid, &ndr64_transfer_syntax.uuid)) {
return "NDR64";
}
- uuidstr = GUID_string(mem_ctx, &uuid);
+ uuidstr = GUID_string(mem_ctx, &syntax.uuid);
- return talloc_asprintf(mem_ctx, " uuid %s/0x%02x", uuidstr, if_version);
+ return talloc_asprintf(mem_ctx, " uuid %s/0x%02x", uuidstr, syntax.if_version);
} else { /* IPX */
return talloc_asprintf(mem_ctx, "IPX:%s",
data_blob_hex_string(mem_ctx, &epm_floor->rhs.uuid.unknown));
return NULL;
}
- if (!GUID_all_zero(&b->object)) {
+ if (!GUID_all_zero(&b->object.uuid)) {
s = talloc_asprintf(s, "%s@",
- GUID_string(mem_ctx, &b->object));
+ GUID_string(mem_ctx, &b->object.uuid));
}
s = talloc_asprintf_append(s, "%s:", t_name);
if (p && PTR_DIFF(p, s) == 36) { /* 36 is the length of a UUID */
NTSTATUS status;
- status = GUID_from_string(s, &b->object);
+ status = GUID_from_string(s, &b->object.uuid);
if (NT_STATUS_IS_ERR(status)) {
DEBUG(0, ("Failed parsing UUID\n"));
ZERO_STRUCT(b->object);
}
- b->object_version = 0;
+ b->object.if_version = 0;
p = strchr(s, ':');
if (!p) {
return NT_STATUS_OK;
}
-NTSTATUS dcerpc_floor_get_lhs_data(struct epm_floor *epm_floor, struct GUID *uuid, uint16_t *if_version)
+NTSTATUS dcerpc_floor_get_lhs_data(struct epm_floor *epm_floor, struct dcerpc_syntax_id *syntax)
{
TALLOC_CTX *mem_ctx = talloc_init("floor_get_lhs_data");
struct ndr_pull *ndr = ndr_pull_init_blob(&epm_floor->lhs.lhs_data, mem_ctx);
ndr->flags |= LIBNDR_FLAG_NOALIGN;
- status = ndr_pull_GUID(ndr, NDR_SCALARS | NDR_BUFFERS, uuid);
+ status = ndr_pull_GUID(ndr, NDR_SCALARS | NDR_BUFFERS, &syntax->uuid);
if (NT_STATUS_IS_ERR(status)) {
talloc_free(mem_ctx);
return status;
}
- status = ndr_pull_uint16(ndr, NDR_SCALARS, if_version);
+ status = ndr_pull_uint16(ndr, NDR_SCALARS, &syntax->if_version);
talloc_free(mem_ctx);
return status;
}
-static DATA_BLOB dcerpc_floor_pack_lhs_data(TALLOC_CTX *mem_ctx, const struct GUID *uuid, uint32_t if_version)
+static DATA_BLOB dcerpc_floor_pack_lhs_data(TALLOC_CTX *mem_ctx, const struct dcerpc_syntax_id *syntax)
{
struct ndr_push *ndr = ndr_push_init_ctx(mem_ctx);
ndr->flags |= LIBNDR_FLAG_NOALIGN;
- ndr_push_GUID(ndr, NDR_SCALARS | NDR_BUFFERS, uuid);
- ndr_push_uint16(ndr, NDR_SCALARS, if_version);
+ ndr_push_GUID(ndr, NDR_SCALARS | NDR_BUFFERS, &syntax->uuid);
+ ndr_push_uint16(ndr, NDR_SCALARS, syntax->if_version);
return ndr_push_blob(ndr);
}
}
/* Set object uuid */
- status = dcerpc_floor_get_lhs_data(&tower->floors[0], &binding->object, &binding->object_version);
+ status = dcerpc_floor_get_lhs_data(&tower->floors[0], &binding->object);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(1, ("Error pulling object uuid and version: %s", nt_errstr(status)));
/* Floor 0 */
tower->floors[0].lhs.protocol = EPM_PROTOCOL_UUID;
- tower->floors[0].lhs.lhs_data = dcerpc_floor_pack_lhs_data(mem_ctx, &binding->object, binding->object_version);
+ tower->floors[0].lhs.lhs_data = dcerpc_floor_pack_lhs_data(mem_ctx, &binding->object);
tower->floors[0].rhs.uuid.unknown = data_blob_talloc_zero(mem_ctx, 2);
tower->floors[1].lhs.protocol = EPM_PROTOCOL_UUID;
tower->floors[1].lhs.lhs_data = dcerpc_floor_pack_lhs_data(mem_ctx,
- &ndr_transfer_syntax.uuid,
- ndr_transfer_syntax.if_version);
+ &ndr_transfer_syntax);
tower->floors[1].rhs.uuid.unknown = data_blob_talloc_zero(mem_ctx, 2);
if (!composite_is_ok(c)) return;
/* prepare requested binding parameters */
- s->binding->object = s->table->uuid;
- s->binding->object_version = s->table->if_version;
+ s->binding->object = s->table->syntax_id;
c->status = dcerpc_binding_build_tower(s->pipe, s->binding, &s->twr.tower);
if (!composite_is_ok(c)) return;
struct pipe_auth_state);
status = composite_wait(c);
if (!NT_STATUS_IS_OK(status)) {
- char *uuid_str = GUID_string(s->pipe, &s->table->uuid);
+ char *uuid_str = GUID_string(s->pipe, &s->table->syntax_id.uuid);
DEBUG(0, ("Failed to bind to uuid %s - %s\n", uuid_str, nt_errstr(status)));
talloc_free(uuid_str);
}
p2->context_id = ++p->conn->next_context_id;
- p2->syntax.uuid = table->uuid;
- p2->syntax.if_version = table->if_version;
+ p2->syntax = table->syntax_id;
p2->transfer_syntax = ndr_transfer_syntax;
struct dcerpc_interface_list *l;
for (l = dcerpc_pipes; l; l = l->next) {
- if (GUID_equal(&interface->uuid, &l->table->uuid)) {
+ if (GUID_equal(&interface->syntax_id.uuid, &l->table->syntax_id.uuid)) {
DEBUG(0, ("Attempt to register interface %s which has the "
"same UUID as already registered interface %s\n",
interface->name, l->table->name));
{
const struct dcerpc_interface_list *l;
for (l=librpc_dcerpc_pipes();l;l=l->next) {
- if (GUID_equal(&l->table->uuid, uuid) &&
- l->table->if_version == if_version) {
+ if (GUID_equal(&l->table->syntax_id.uuid, uuid) &&
+ l->table->syntax_id.if_version == if_version) {
return l->table->name;
}
}
{
const struct dcerpc_interface_list *l;
for (l=librpc_dcerpc_pipes();l;l=l->next){
- if (GUID_equal(&l->table->uuid, uuid) &&
- l->table->if_version == if_version) {
+ if (GUID_equal(&l->table->syntax_id.uuid, uuid) &&
+ l->table->syntax_id.if_version == if_version) {
return l->table->num_calls;
}
}
{
const struct dcerpc_interface_list *l;
for (l=librpc_dcerpc_pipes();l;l=l->next) {
- if (GUID_equal(&l->table->uuid, uuid)) {
+ if (GUID_equal(&l->table->syntax_id.uuid, uuid)) {
return l->table;
}
}
pidl "\nconst struct dcerpc_interface_table dcerpc_table_$interface->{NAME} = {";
pidl "\t.name\t\t= \"$interface->{NAME}\",";
- pidl "\t.uuid\t\t= ". print_uuid($interface->{UUID}) .",";
- pidl "\t.if_version\t= DCERPC_$uname\_VERSION,";
+ pidl "\t.syntax_id\t= {";
+ pidl "\t\t" . print_uuid($interface->{UUID}) .",";
+ pidl "\t\tDCERPC_$uname\_VERSION";
+ pidl "\t},";
pidl "\t.helpstring\t= DCERPC_$uname\_HELPSTRING,";
pidl "\t.num_calls\t= $count,";
pidl "\t.calls\t\t= $interface->{NAME}\_calls,";
static const struct dcesrv_interface $name\_interface = {
.name = \"$name\",
- .uuid = ".print_uuid($uuid).",
- .if_version = $if_version,
+ .syntax_id = {".print_uuid($uuid).",$if_version},
.bind = $name\__op_bind,
.unbind = $name\__op_unbind,
.ndr_pull = $name\__op_ndr_pull,
static BOOL $name\__op_interface_by_uuid(struct dcesrv_interface *iface, const struct GUID *uuid, uint32_t if_version)
{
- if ($name\_interface.if_version == if_version &&
- GUID_equal(\&$name\_interface.uuid, uuid)) {
+ if ($name\_interface.syntax_id.if_version == if_version &&
+ GUID_equal(\&$name\_interface.syntax_id.uuid, uuid)) {
memcpy(iface,&$name\_interface, sizeof(*iface));
return True;
}
static BOOL interface_match(const struct dcesrv_interface *if1,
const struct dcesrv_interface *if2)
{
- return (if1->if_version == if2->if_version &&
- GUID_equal(&if1->uuid, &if2->uuid));
+ return (if1->syntax_id.if_version == if2->syntax_id.if_version &&
+ GUID_equal(&if1->syntax_id.uuid, &if2->syntax_id.uuid));
}
/*
static BOOL interface_match_by_uuid(const struct dcesrv_interface *iface,
const struct GUID *uuid, uint32_t if_version)
{
- return (iface->if_version == if_version && GUID_equal(&iface->uuid, uuid));
+ return (iface->syntax_id.if_version == if_version &&
+ GUID_equal(&iface->syntax_id.uuid, uuid));
}
/*
struct dcesrv_interface {
const char *name;
- struct GUID uuid;
- uint32_t if_version;
+ struct dcerpc_syntax_id syntax_id;
/* this function is called when the client binds to this interface */
NTSTATUS (*bind)(struct dcesrv_call_state *, const struct dcesrv_interface *);
(*eps)[total].name = iface->iface.name;
description = d->ep_description;
- description->object = iface->iface.uuid;
- description->object_version = iface->iface.if_version;
+ description->object = iface->iface.syntax_id;
status = dcerpc_binding_build_tower(mem_ctx, description, &(*eps)[total].ep);
if (NT_STATUS_IS_ERR(status)) {
struct dcesrv_ep_iface *eps;
struct epm_floor *floors;
enum dcerpc_transport_t transport;
- struct GUID ndr_uuid;
- uint16_t ndr_version;
+ struct dcerpc_syntax_id ndr_syntax;
count = build_ep_list(mem_ctx, dce_call->conn->dce_ctx->endpoint_list, &eps);
floors = r->in.map_tower->tower.floors;
- dcerpc_floor_get_lhs_data(&r->in.map_tower->tower.floors[1], &ndr_uuid, &ndr_version);
+ dcerpc_floor_get_lhs_data(&r->in.map_tower->tower.floors[1], &ndr_syntax);
if (floors[1].lhs.protocol != EPM_PROTOCOL_UUID ||
- !GUID_equal(&ndr_uuid, &ndr_transfer_syntax.uuid) ||
- ndr_version != ndr_transfer_syntax.if_version) {
+ !GUID_equal(&ndr_syntax.uuid, &ndr_transfer_syntax.uuid) ||
+ ndr_syntax.if_version != ndr_transfer_syntax.if_version) {
goto failed;
}
pass = lp_parm_string(-1, "dcerpc_remote", "password");
domain = lp_parm_string(-1, "dceprc_remote", "domain");
- table = idl_iface_by_uuid(&iface->uuid); /* FIXME: What about if_version ? */
+ table = idl_iface_by_uuid(&iface->syntax_id.uuid); /* FIXME: What about if_version ? */
if (!table) {
dce_call->fault_code = DCERPC_FAULT_UNK_IF;
return NT_STATUS_NET_WRITE_FAULT;
static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct dcerpc_interface_table *if_tabl)
{
iface->name = if_tabl->name;
- iface->uuid = if_tabl->uuid;
- iface->if_version = if_tabl->if_version;
+ iface->syntax_id = if_tabl->syntax_id;
iface->bind = remote_op_bind;
iface->unbind = remote_op_unbind;
const struct dcerpc_interface_list *l;
for (l=librpc_dcerpc_pipes();l;l=l->next) {
- if (l->table->if_version == if_version &&
- GUID_equal(&l->table->uuid, uuid)==0) {
+ if (l->table->syntax_id.if_version == if_version &&
+ GUID_equal(&l->table->syntax_id.uuid, uuid)==0) {
return remote_fill_interface(iface, l->table);
}
}
com_init_ctx(&ctx, NULL);
dcom_client_init(ctx, cmdline_credentials);
- IID[0] = dcerpc_table_IStream.uuid;
- IID[1] = dcerpc_table_IUnknown.uuid;
+ IID[0] = dcerpc_table_IStream.syntax_id.uuid;
+ IID[1] = dcerpc_table_IUnknown.syntax_id.uuid;
GUID_from_string(CLSID_SIMPLE, &clsid);
if (host) {
}
tmptbl = dcerpc_table_dssetup;
- tmptbl.if_version += 100;
+ tmptbl.syntax_id.if_version += 100;
printf("Opening bad secondary connection\n");
status = dcerpc_secondary_context(p, &p2, &tmptbl);
if (NT_STATUS_IS_OK(status)) {
if (NT_STATUS_IS_OK(status)) {
printf("(incorrectly) allowed re-bind to uuid %s - %s\n",
- GUID_string(mem_ctx, &dcerpc_table_lsarpc.uuid), nt_errstr(status));
+ GUID_string(mem_ctx, &dcerpc_table_lsarpc.syntax_id.uuid), nt_errstr(status));
ret = False;
} else {
printf("\n");
struct GUID uuid;
struct policy_handle handle;
int i;
- struct GUID if_uuid;
- uint16_t if_version;
+ struct dcerpc_syntax_id syntax;
ZERO_STRUCT(uuid);
ZERO_STRUCT(handle);
r.out.entry_handle = &handle;
r.in.max_towers = 100;
- dcerpc_floor_get_lhs_data(&twr->tower.floors[0], &if_uuid, &if_version);
+ dcerpc_floor_get_lhs_data(&twr->tower.floors[0], &syntax);
printf("epm_Map results for '%s':\n",
- idl_pipe_name(&if_uuid, if_version));
+ idl_pipe_name(&syntax.uuid, syntax.if_version));
twr->tower.floors[2].lhs.protocol = EPM_PROTOCOL_NCACN;
twr->tower.floors[2].lhs.lhs_data = data_blob(NULL, 0);
struct epm_InqObject r;
r.in.epm_object = talloc(mem_ctx, struct GUID);
- *r.in.epm_object = dcerpc_table_epmapper.uuid;
+ *r.in.epm_object = dcerpc_table_epmapper.syntax_id.uuid;
status = dcerpc_epm_InqObject(p, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
status = dcerpc_epm_map_binding(loop_ctx, b, l->table, NULL);
if (!NT_STATUS_IS_OK(status)) {
printf("Failed to map port for uuid %s\n",
- GUID_string(loop_ctx, &l->table->uuid));
+ GUID_string(loop_ctx, &l->table->syntax_id.uuid));
talloc_free(loop_ctx);
continue;
}
r.in.num_protseqs = 3;
r.in.protseq = protseq;
r.in.Interfaces = 1;
- iids[0] = dcerpc_table_IUnknown.uuid;
+ iids[0] = dcerpc_table_IUnknown.syntax_id.uuid;
r.in.pIIDs = iids;
status = dcerpc_RemoteActivation(p, mem_ctx, &r);
printf("Failed to connect to remote server: %s %s\n", binding, nt_errstr(status));
}
- return status;
+ return status;
}
/* open a rpc connection to a specific transport */
/* FIXME: This should be fixed when torture_rpc_connection
* takes a dcerpc_syntax_id */
tbl.name = iface->name;
- tbl.uuid = id->uuid;
- tbl.if_version = id->if_version;
+ tbl.syntax_id = *id;
status = torture_rpc_connection(mem_ctx, &p, iface);
if (!NT_STATUS_IS_OK(status)) {
status = dcerpc_epm_map_binding(mem_ctx, b, l->table, NULL);
if (!NT_STATUS_IS_OK(status)) {
printf("Failed to map port for uuid %s\n",
- GUID_string(loop_ctx, &l->table->uuid));
+ GUID_string(loop_ctx, &l->table->syntax_id.uuid));
talloc_free(loop_ctx);
continue;
}