20#ifndef CHANNELS_RDPEAR_NDR_H_
21#define CHANNELS_RDPEAR_NDR_H_
23#include <winpr/stream.h>
24#include <freerdp/api.h>
26#define NDR_PTR_NULL (0UL)
28#define NDR_SIMPLE_TYPE_DECL(LOWER, UPPER) \
29 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_##LOWER(NdrContext* context, wStream* s, \
31 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_##LOWER##_(NdrContext* context, wStream* s, \
32 const void* hints, void* v); \
33 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_##LOWER(NdrContext* context, wStream* s, \
35 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_##LOWER##_( \
36 NdrContext* context, wStream* s, const void* hints, const void* v); \
38 extern const NdrMessageDescr ndr_##LOWER##_descr_s; \
39 WINPR_ATTR_NODISCARD FREERDP_LOCAL NdrMessageType ndr_##LOWER##_descr(void)
41#define NDR_ARRAY_OF_TYPE_DECL(TYPE, UPPERTYPE) \
42 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_##TYPE##Array( \
43 NdrContext* context, wStream* s, const void* hints, void* v); \
44 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_##TYPE##Array( \
45 NdrContext* context, wStream* s, const void* hints, const void* v); \
47 void ndr_destroy_##TYPE##Array(NdrContext* context, const void* hints, void* obj); \
49 extern const NdrMessageDescr ndr_##TYPE##Array_descr_s; \
50 WINPR_ATTR_NODISCARD FREERDP_LOCAL NdrMessageType ndr_##TYPE##Array_descr(void); \
52 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_##TYPE##VaryingArray( \
53 NdrContext* context, wStream* s, const void* hints, void* v); \
54 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_##TYPE##VaryingArray( \
55 NdrContext* context, wStream* s, const void* hints, const void* v); \
56 extern const NdrMessageDescr ndr_##TYPE##VaryingArray_descr_s; \
57 NdrMessageType ndr_##TYPE##VaryingArray_descr(void)
64 typedef struct NdrContext_s NdrContext;
66 typedef UINT32 ndr_refid;
68 typedef BOOL (*NDR_READER_FN)(NdrContext* context,
wStream* s,
const void* hints,
void* target);
69 typedef BOOL (*NDR_WRITER_FN)(NdrContext* context,
wStream* s,
const void* hints,
71 typedef void (*NDR_DESTROY_FN)(NdrContext* context,
const void* hints,
void* obj);
72 typedef void (*NDR_DUMP_FN)(wLog* logger, UINT32 lvl,
size_t indentLevel,
const void* obj);
79 NDR_ARITY_VARYING_ARRAYOF,
87 WINPR_ATTR_NODISCARD NDR_READER_FN readFn;
88 WINPR_ATTR_NODISCARD NDR_WRITER_FN writeFn;
89 NDR_DESTROY_FN destroyFn;
108 NdrPointerType pointerType;
131 FREERDP_LOCAL
void ndr_context_free(NdrContext* context);
133 static inline void ndr_context_destroy(NdrContext** pcontext)
135 WINPR_ASSERT(pcontext);
136 ndr_context_free(*pcontext);
140 WINPR_ATTR_MALLOC(ndr_context_free, 1)
142 FREERDP_LOCAL NdrContext* ndr_context_new(BOOL bigEndianDrep, BYTE version);
144 FREERDP_LOCAL
void ndr_context_reset(NdrContext* context);
146 WINPR_ATTR_MALLOC(ndr_context_free, 1)
148 FREERDP_LOCAL NdrContext* ndr_context_copy(const NdrContext* src);
150 WINPR_ATTR_MALLOC(ndr_context_free, 1)
152 FREERDP_LOCAL NdrContext* ndr_read_header(
wStream* s);
154 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_header(NdrContext* context,
wStream* s);
156 NDR_SIMPLE_TYPE_DECL(uint8, UINT8);
157 NDR_SIMPLE_TYPE_DECL(uint16, UINT16);
158 NDR_SIMPLE_TYPE_DECL(uint32, UINT32);
159 NDR_SIMPLE_TYPE_DECL(uint64, UINT64);
161 NDR_ARRAY_OF_TYPE_DECL(uint8, BYTE);
162 NDR_ARRAY_OF_TYPE_DECL(uint16, UINT16);
164 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_skip_bytes(NdrContext* context,
wStream* s,
167 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_align(NdrContext* context,
wStream* s,
170 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_align(NdrContext* context,
wStream* s,
173 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_data(NdrContext* context,
wStream* s,
174 const
void* data,
size_t sz);
176 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_pickle(NdrContext* context,
wStream* s);
178 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_pickle(NdrContext* context,
wStream* s);
180 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_constructed(NdrContext* context,
wStream* s,
183 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_constructed(NdrContext* context,
wStream* s,
186 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_start_constructed(NdrContext* context,
wStream* s);
188 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_end_constructed(NdrContext* context,
wStream* s);
190 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_wchar(NdrContext* context,
wStream* s,
200 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_uconformant_varying_array(
204 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_uconformant_varying_array(
214 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_uconformant_array(NdrContext* context,
220 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_write_uconformant_array(NdrContext* context,
225 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_struct_read_fromDescr(NdrContext* context,
229 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_struct_write_fromDescr(NdrContext* context,
234 void ndr_struct_dump_fromDescr(wLog* logger, UINT32 lvl,
size_t identLevel,
237 void ndr_struct_destroy(NdrContext* context,
const NdrStructDescr* descr,
void* pptr);
239 WINPR_ATTR_NODISCARD FREERDP_LOCAL ndr_refid ndr_pointer_refid(
const void* ptr);
241 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_refpointer(NdrContext* context,
wStream* s,
244 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_context_allocatePtr(NdrContext* context,
249 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_read_pointedMessageEx(NdrContext* context,
252 void* hints,
void** target);
254 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_push_deferreds(NdrContext* context,
258 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_treat_deferred_read(NdrContext* context,
261 WINPR_ATTR_NODISCARD FREERDP_LOCAL BOOL ndr_treat_deferred_write(NdrContext* context,
hints for a conformant array
descriptor of a field in a structure
hints for a varying conformant array