static enum ndr_err_code ndr_push_echo_EchoData(struct ndr_push *ndr, int flags, const struct echo_EchoData *r) { if (flags & NDR_IN) { NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.len)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.len)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->in.in_data, r->in.len)); } if (flags & NDR_OUT) { NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.len)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->out.out_data, r->in.len)); } return NDR_ERR_SUCCESS; }
_PUBLIC_ enum ndr_err_code ndr_push_GUID(struct ndr_push *ndr, int ndr_flags, const struct GUID *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->time_low)); NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->time_mid)); NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->time_hi_and_version)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->clock_seq, 2)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->node, 6)); } if (ndr_flags & NDR_BUFFERS) { } return NDR_ERR_SUCCESS; }
NTSTATUS ndr_push_GUID(struct ndr_push *ndr, int ndr_flags, const struct GUID *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->time_low)); NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->time_mid)); NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->time_hi_and_version)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->clock_seq, 2)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->node, 6)); } if (ndr_flags & NDR_BUFFERS) { } return NT_STATUS_OK; }
_PUBLIC_ enum ndr_err_code ndr_push_PERF_COUNTER_BLOCK(struct ndr_push *ndr, int ndr_flags, const struct PERF_COUNTER_BLOCK *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->ByteLength)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->data, r->ByteLength)); NDR_CHECK(ndr_push_trailer_align(ndr, 4)); } if (ndr_flags & NDR_BUFFERS) { } return NDR_ERR_SUCCESS; }
_PUBLIC_ enum ndr_err_code ndr_push_dom_sid(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *r) { uint32_t cntr_sub_auths_0; if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, r->sid_rev_num)); NDR_CHECK(ndr_push_int8(ndr, NDR_SCALARS, r->num_auths)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->id_auth, 6)); for (cntr_sub_auths_0 = 0; cntr_sub_auths_0 < r->num_auths; cntr_sub_auths_0++) { NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sub_auths[cntr_sub_auths_0])); } } return NDR_ERR_SUCCESS; }
_PUBLIC_ enum ndr_err_code ndr_push_security_descriptor_hash(struct ndr_push *ndr, int ndr_flags, const struct security_descriptor_hash *r) { if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_unique_ptr(ndr, r->sd)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->hash, 16)); } if (ndr_flags & NDR_BUFFERS) { if (r->sd) { NDR_CHECK(ndr_push_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->sd)); } } return NDR_ERR_SUCCESS; }
/* We have manual push/pull because we didn't manage to do the alignment * purely in PIDL as the padding is sized so that the whole access_check_v3 * struct size is a multiple of 16 (as specified in 2.2.2.4 of ms-bkrp.pdf) */ _PUBLIC_ enum ndr_err_code ndr_push_bkrp_access_check_v3(struct ndr_push *ndr, int ndr_flags, const struct bkrp_access_check_v3 *r) { if (ndr_flags & NDR_SCALARS) { size_t ofs; size_t pad; NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0x00000001)); NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->nonce_len)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->nonce, r->nonce_len)); NDR_CHECK(ndr_push_dom_sid(ndr, NDR_SCALARS, &r->sid)); /* We articially increment the offset of 64 bytes (size of hash * comming after the pad) so that ndr_align can determine easily * the correct pad size to make the whole struct 16 bytes aligned */ ofs = ndr->offset + 64; pad = ndr_align_size(ofs, 16); NDR_CHECK(ndr_push_zero(ndr, pad)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->hash, 64)); NDR_CHECK(ndr_push_trailer_align(ndr, 4)); } if (ndr_flags & NDR_BUFFERS) { } return NDR_ERR_SUCCESS; }
NTSTATUS ndr_push_dom_sid(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *r) { uint32_t cntr_sub_auths_0; if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, r->sid_rev_num)); NDR_CHECK(ndr_push_int8(ndr, NDR_SCALARS, r->num_auths)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->id_auth, 6)); for (cntr_sub_auths_0 = 0; cntr_sub_auths_0 < r->num_auths; cntr_sub_auths_0++) { NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sub_auths[cntr_sub_auths_0])); } } if (ndr_flags & NDR_BUFFERS) { } return NT_STATUS_OK; }
_PUBLIC_ enum ndr_err_code ndr_push_dom_sid(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *r) { uint32_t cntr_sub_auths_0; if (ndr_flags & NDR_SCALARS) { NDR_CHECK(ndr_push_align(ndr, 4)); NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, r->sid_rev_num)); NDR_CHECK(ndr_push_int8(ndr, NDR_SCALARS, r->num_auths)); NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->id_auth, 6)); if (r->num_auths < 0 || r->num_auths > ARRAY_SIZE(r->sub_auths)) { return ndr_push_error(ndr, NDR_ERR_RANGE, "value out of range"); } for (cntr_sub_auths_0 = 0; cntr_sub_auths_0 < r->num_auths; cntr_sub_auths_0++) { NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sub_auths[cntr_sub_auths_0])); } } return NDR_ERR_SUCCESS; }
/* push a ipv6address */ _PUBLIC_ enum ndr_err_code ndr_push_ipv6address(struct ndr_push *ndr, int ndr_flags, const char *address) { #ifdef AF_INET6 uint8_t addr[IPV6_BYTES]; int ret; if (!is_ipaddress(address)) { return ndr_push_error(ndr, NDR_ERR_IPV6ADDRESS, "Invalid IPv6 address: '%s'", address); } ret = inet_pton(AF_INET6, address, addr); if (ret <= 0) { return NDR_ERR_IPV6ADDRESS; } NDR_CHECK(ndr_push_array_uint8(ndr, ndr_flags, addr, IPV6_BYTES)); return NDR_ERR_SUCCESS; #else return NDR_ERR_IPV6ADDRESS; #endif }
/** \details Build an EntryID for message from folder and message source ID */ _PUBLIC_ enum MAPISTATUS EntryIDFromSourceIDForMessage(TALLOC_CTX *mem_ctx, mapi_object_t *obj_store, mapi_object_t *obj_folder, mapi_object_t *obj_message, struct SBinary_short *entryID) { enum MAPISTATUS retval; struct ndr_push *ndr; mapi_object_store_t *store; const struct SBinary_short *FolderSourceKey; const struct SBinary_short *MessageSourceKey; struct SPropTagArray *SPropTagArray; struct SPropValue *lpPropsf; struct SPropValue *lpPropsm; uint32_t count; /* Sanity checks */ OPENCHANGE_RETVAL_IF(!obj_store, MAPI_E_INVALID_PARAMETER, NULL); OPENCHANGE_RETVAL_IF(!obj_folder, MAPI_E_INVALID_PARAMETER, NULL); OPENCHANGE_RETVAL_IF(!obj_message, MAPI_E_INVALID_PARAMETER, NULL); OPENCHANGE_RETVAL_IF(!entryID, MAPI_E_INVALID_PARAMETER, NULL); store = (mapi_object_store_t *)obj_store->private_data; /* Step 1. Retrieve folder Source Key */ SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PidTagSourceKey); retval = GetProps(obj_folder, 0, SPropTagArray, &lpPropsf, &count); MAPIFreeBuffer(SPropTagArray); if (retval != MAPI_E_SUCCESS) return MAPI_E_NOT_FOUND; FolderSourceKey = (const struct SBinary_short *)get_SPropValue(lpPropsf, PidTagSourceKey); if (FolderSourceKey == NULL) return MAPI_E_NOT_FOUND; /* Step 2. Retrieve message Source Key */ SPropTagArray = set_SPropTagArray(mem_ctx, 0x1, PidTagSourceKey); retval = GetProps(obj_message, 0, SPropTagArray, &lpPropsm, &count); MAPIFreeBuffer(SPropTagArray); if (retval != MAPI_E_SUCCESS) return MAPI_E_NOT_FOUND; MessageSourceKey = (const struct SBinary_short *)get_SPropValue(lpPropsm, PidTagSourceKey); if (MessageSourceKey == NULL) return MAPI_E_NOT_FOUND; /* Step 3. Fill PidTagEntryID */ /* PidTagEntryId size for message is 70 bytes */ /* Flags (4 bytes) + store guid (16 bytes) + object type (2 * bytes) + Folder SourceKey (22 bytes) + Pad (2 bytes) + * Message Source (22 bytes) + Pad (2 bytes) == 70 bytes */ ndr = ndr_push_init_ctx(NULL); ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN); ndr->offset = 0; ndr_push_uint32(ndr, NDR_SCALARS, 0x0); if (store->store_type == PublicFolder) { const uint8_t ProviderUID[16] = { 0x1A, 0x44, 0x73, 0x90, 0xAA, 0x66, 0x11, 0xCD, 0x9B, 0xC8, 0x00, 0xAA, 0x00, 0x2F, 0xC4, 0x5A }; ndr_push_array_uint8(ndr, NDR_SCALARS, ProviderUID, 16); ndr_push_uint16(ndr, NDR_SCALARS, 0x0009); } else { ndr_push_GUID(ndr, NDR_SCALARS, &store->guid); ndr_push_uint16(ndr, NDR_SCALARS, 0x0007); } ndr_push_array_uint8(ndr, NDR_SCALARS, FolderSourceKey->lpb, FolderSourceKey->cb); ndr_push_uint16(ndr, NDR_SCALARS, 0x0); ndr_push_array_uint8(ndr, NDR_SCALARS, MessageSourceKey->lpb, MessageSourceKey->cb); ndr_push_uint16(ndr, NDR_SCALARS, 0x0); entryID->cb = ndr->offset; entryID->lpb = talloc_steal(mem_ctx, ndr->data); talloc_free(ndr); return MAPI_E_SUCCESS; }