diff options
Diffstat (limited to 'source4/librpc')
-rw-r--r-- | source4/librpc/idl/dcerpc.idl | 17 | ||||
-rw-r--r-- | source4/librpc/idl/dcom.idl | 20 | ||||
-rw-r--r-- | source4/librpc/ndr/libndr.h | 2 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc.c | 9 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc_util.c | 4 |
5 files changed, 34 insertions, 18 deletions
diff --git a/source4/librpc/idl/dcerpc.idl b/source4/librpc/idl/dcerpc.idl index cd87539589..1b8add3e79 100644 --- a/source4/librpc/idl/dcerpc.idl +++ b/source4/librpc/idl/dcerpc.idl @@ -37,9 +37,18 @@ interface dcerpc const uint8 DCERPC_MAX_SIGN_SIZE = 32; typedef struct { + } dcerpc_empty; + + typedef [nodiscriminant] union { + [default] dcerpc_empty empty; + [case(LIBNDR_FLAG_OBJECT_PRESENT)] GUID object; + } dcerpc_object; + + typedef struct { uint32 alloc_hint; uint16 context_id; uint16 opnum; + [switch_is(ndr->flags & LIBNDR_FLAG_OBJECT_PRESENT)] dcerpc_object object; [flag(NDR_ALIGN8)] DATA_BLOB _pad; [flag(NDR_REMAINING)] DATA_BLOB stub_and_verifier; } dcerpc_request; @@ -170,13 +179,6 @@ interface dcerpc [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; @@ -201,7 +203,6 @@ interface dcerpc 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; } diff --git a/source4/librpc/idl/dcom.idl b/source4/librpc/idl/dcom.idl index 912902a29a..10e63772dd 100644 --- a/source4/librpc/idl/dcom.idl +++ b/source4/librpc/idl/dcom.idl @@ -200,7 +200,7 @@ interface ObjectRpcBaseTypes uint32 cPublicRefs; /* count of references passed */ OXID oxid; /* oxid of server with this oid */ OID oid; /* oid of object with this ipid */ - IPID ipid; /* ipid of Interface */ + IPID ipid; /* ipid of interface pointer to this object */ } STDOBJREF; typedef struct @@ -249,7 +249,7 @@ interface ObjectRpcBaseTypes typedef [public] struct { uint32 size; - [subcontext(4),align(4)] OBJREF obj; + [subcontext(4)] OBJREF obj; } MInterfacePointer; } @@ -501,11 +501,15 @@ uuid(DB7C21F8-FE33-4C11-AEA5-CEB56F076FBB), ] interface IStream : IUnknown { - WERROR IStream_Read([in] uint32 num_requested, - [out,size_is(*num_read)] uint8 *data, - [out] uint32 *num_read); - - WERROR IStream_Write([in,size_is(num_requested)] uint8 *data, + WERROR IStream_Read( + [out, size_is(num_requested), length_is(num_read)] uint8 pv[], + [in] uint32 num_requested, + [in] uint32 *num_readx, + [out] uint32 num_read + ); + + WERROR IStream_Write( + [in,size_is(num_requested)] uint8 *data, [in] uint32 num_requested, - [out] uint32 *num_written); + [out] uint32 num_written); } diff --git a/source4/librpc/ndr/libndr.h b/source4/librpc/ndr/libndr.h index 86312b0906..044b7129f8 100644 --- a/source4/librpc/ndr/libndr.h +++ b/source4/librpc/ndr/libndr.h @@ -124,6 +124,8 @@ struct ndr_print { offset, not base) */ #define LIBNDR_FLAG_RELATIVE_CURRENT (1<<29) +/* set if an object uuid will be present */ +#define LIBNDR_FLAG_OBJECT_PRESENT (1<<30) /* useful macro for debugging */ #define NDR_PRINT_DEBUG(type, p) ndr_print_debug((ndr_print_fn_t)ndr_print_ ##type, #p, p) diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c index dcbbe3ac7d..f4b10f6b52 100644 --- a/source4/librpc/rpc/dcerpc.c +++ b/source4/librpc/rpc/dcerpc.c @@ -321,6 +321,10 @@ static NTSTATUS dcerpc_push_request_sign(struct dcerpc_pipe *p, ndr->flags |= LIBNDR_FLAG_BIGENDIAN; } + if (pkt->pfc_flags & DCERPC_PFC_FLAG_ORPC) { + ndr->flags |= LIBNDR_FLAG_OBJECT_PRESENT; + } + status = ndr_push_dcerpc_packet(ndr, NDR_SCALARS|NDR_BUFFERS, pkt); if (!NT_STATUS_IS_OK(status)) { return status; @@ -883,10 +887,11 @@ struct rpc_request *dcerpc_request_send(struct dcerpc_pipe *p, pkt.u.request.alloc_hint = remaining; pkt.u.request.context_id = 0; pkt.u.request.opnum = opnum; + if (object) { - pkt.object.object = *object; + pkt.u.request.object.object = *object; pkt.pfc_flags |= DCERPC_PFC_FLAG_ORPC; - printf("OBJECT: %s\n", GUID_string(NULL, object)); + chunk_size -= ndr_size_GUID(0,object,0); } DLIST_ADD(p->pending, req); diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c index 69dae46aef..c31cf2791b 100644 --- a/source4/librpc/rpc/dcerpc_util.c +++ b/source4/librpc/rpc/dcerpc_util.c @@ -106,6 +106,10 @@ NTSTATUS dcerpc_push_auth(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, ndr->flags |= LIBNDR_FLAG_BIGENDIAN; } + if (pkt->pfc_flags & DCERPC_PFC_FLAG_ORPC) { + ndr->flags |= LIBNDR_FLAG_OBJECT_PRESENT; + } + if (auth_info) { pkt->auth_length = auth_info->credentials.length; } else { |