FreeRDP
Loading...
Searching...
No Matches
ndr.h
1
20#ifndef CHANNELS_RDPEAR_NDR_H_
21#define CHANNELS_RDPEAR_NDR_H_
22
23#include <winpr/stream.h>
24#include <freerdp/api.h>
25
26#define NDR_PTR_NULL (0UL)
27
28#define NDR_SIMPLE_TYPE_DECL(LOWER, UPPER) \
29 BOOL ndr_read_##LOWER(NdrContext* context, wStream* s, UPPER* v); \
30 BOOL ndr_read_##LOWER##_(NdrContext* context, wStream* s, const void* hints, void* v); \
31 BOOL ndr_write_##LOWER(NdrContext* context, wStream* s, UPPER v); \
32 BOOL ndr_write_##LOWER##_(NdrContext* context, wStream* s, const void* hints, const void* v); \
33 extern const NdrMessageDescr ndr_##LOWER##_descr_s; \
34 NdrMessageType ndr_##LOWER##_descr(void)
35
36#define NDR_ARRAY_OF_TYPE_DECL(TYPE, UPPERTYPE) \
37 BOOL ndr_read_##TYPE##Array(NdrContext* context, wStream* s, const void* hints, void* v); \
38 BOOL ndr_write_##TYPE##Array(NdrContext* context, wStream* s, const void* hints, \
39 const void* v); \
40 void ndr_destroy_##TYPE##Array(NdrContext* context, const void* hints, void* obj); \
41 extern const NdrMessageDescr ndr_##TYPE##Array_descr_s; \
42 NdrMessageType ndr_##TYPE##Array_descr(void); \
43 \
44 BOOL ndr_read_##TYPE##VaryingArray(NdrContext* context, wStream* s, const void* hints, \
45 void* v); \
46 BOOL ndr_write_##TYPE##VaryingArray(NdrContext* context, wStream* s, const void* hints, \
47 const void* v); \
48 extern const NdrMessageDescr ndr_##TYPE##VaryingArray_descr_s; \
49 NdrMessageType ndr_##TYPE##VaryingArray_descr(void)
50
51#ifdef __cplusplus
52extern "C"
53{
54#endif
55
56 typedef struct NdrContext_s NdrContext;
57
58 typedef UINT32 ndr_refid;
59
60 typedef BOOL (*NDR_READER_FN)(NdrContext* context, wStream* s, const void* hints, void* target);
61 typedef BOOL (*NDR_WRITER_FN)(NdrContext* context, wStream* s, const void* hints,
62 const void* obj);
63 typedef void (*NDR_DESTROY_FN)(NdrContext* context, const void* hints, void* obj);
64 typedef void (*NDR_DUMP_FN)(wLog* logger, UINT32 lvl, size_t indentLevel, const void* obj);
65
67 typedef enum
68 {
69 NDR_ARITY_SIMPLE,
70 NDR_ARITY_ARRAYOF,
71 NDR_ARITY_VARYING_ARRAYOF,
72 } NdrTypeArity;
73
75 typedef struct
76 {
77 NdrTypeArity arity;
78 size_t itemSize;
79 NDR_READER_FN readFn;
80 NDR_WRITER_FN writeFn;
81 NDR_DESTROY_FN destroyFn;
82 NDR_DUMP_FN dumpFn;
84
85 typedef const NdrMessageDescr* NdrMessageType;
86
88 typedef enum
89 {
90 NDR_NOT_POINTER,
91 NDR_POINTER_NON_NULL,
92 NDR_POINTER
93 } NdrPointerType;
94
96 typedef struct
97 {
98 const char* name;
99 size_t structOffset;
100 NdrPointerType pointerType;
101 ssize_t hintsField;
102 NdrMessageType typeDescr;
104
106 typedef struct
107 {
108 const char* name;
109 size_t nfields;
110 const NdrFieldStruct* fields;
112
114 typedef struct
115 {
116 ndr_refid ptrId;
117 const char* name;
118 void* hints;
119 void* target;
120 NdrMessageType msg;
122
123 void ndr_context_free(NdrContext* context);
124
125 static inline void ndr_context_destroy(NdrContext** pcontext)
126 {
127 WINPR_ASSERT(pcontext);
128 ndr_context_free(*pcontext);
129 *pcontext = NULL;
130 }
131
132 WINPR_ATTR_MALLOC(ndr_context_free, 1)
133 WINPR_ATTR_NODISCARD
134 NdrContext* ndr_context_new(BOOL bigEndianDrep, BYTE version);
135
136 void ndr_context_reset(NdrContext* context);
137
138 WINPR_ATTR_MALLOC(ndr_context_free, 1)
139 WINPR_ATTR_NODISCARD
140 NdrContext* ndr_context_copy(const NdrContext* src);
141
142 WINPR_ATTR_MALLOC(ndr_context_free, 1)
143 WINPR_ATTR_NODISCARD
144 NdrContext* ndr_read_header(wStream* s);
145
146 BOOL ndr_write_header(NdrContext* context, wStream* s);
147
148 NDR_SIMPLE_TYPE_DECL(uint8, UINT8);
149 NDR_SIMPLE_TYPE_DECL(uint16, UINT16);
150 NDR_SIMPLE_TYPE_DECL(uint32, UINT32);
151 NDR_SIMPLE_TYPE_DECL(uint64, UINT64);
152
153 NDR_ARRAY_OF_TYPE_DECL(uint8, BYTE);
154 NDR_ARRAY_OF_TYPE_DECL(uint16, UINT16);
155
156 BOOL ndr_skip_bytes(NdrContext* context, wStream* s, size_t nbytes);
157 BOOL ndr_read_align(NdrContext* context, wStream* s, size_t sz);
158 BOOL ndr_write_align(NdrContext* context, wStream* s, size_t sz);
159 BOOL ndr_write_data(NdrContext* context, wStream* s, const void* data, size_t sz);
160
161 BOOL ndr_read_pickle(NdrContext* context, wStream* s);
162 BOOL ndr_write_pickle(NdrContext* context, wStream* s);
163
164 BOOL ndr_read_constructed(NdrContext* context, wStream* s, wStream* target);
165 BOOL ndr_write_constructed(NdrContext* context, wStream* s, wStream* payload);
166
167 BOOL ndr_start_constructed(NdrContext* context, wStream* s);
168 BOOL ndr_end_constructed(NdrContext* context, wStream* s);
169
170 BOOL ndr_read_wchar(NdrContext* context, wStream* s, WCHAR* ptr);
171
173 typedef struct
174 {
175 UINT32 length;
176 UINT32 maxLength;
178
179 BOOL ndr_read_uconformant_varying_array(NdrContext* context, wStream* s,
180 const NdrVaryingArrayHints* hints,
181 NdrMessageType itemType, void* ptarget);
182 BOOL ndr_write_uconformant_varying_array(NdrContext* context, wStream* s,
183 const NdrVaryingArrayHints* hints,
184 NdrMessageType itemType, const void* src);
185
187 typedef struct
188 {
189 UINT32 count;
191
192 BOOL ndr_read_uconformant_array(NdrContext* context, wStream* s, const NdrArrayHints* hints,
193 NdrMessageType itemType, void* vtarget);
194 BOOL ndr_write_uconformant_array(NdrContext* context, wStream* s, UINT32 len,
195 NdrMessageType itemType, const BYTE* ptr);
196
197 BOOL ndr_struct_read_fromDescr(NdrContext* context, wStream* s, const NdrStructDescr* descr,
198 void* target);
199 BOOL ndr_struct_write_fromDescr(NdrContext* context, wStream* s, const NdrStructDescr* descr,
200 const void* src);
201 void ndr_struct_dump_fromDescr(wLog* logger, UINT32 lvl, size_t identLevel,
202 const NdrStructDescr* descr, const void* obj);
203 void ndr_struct_destroy(NdrContext* context, const NdrStructDescr* descr, void* pptr);
204
205 ndr_refid ndr_pointer_refid(const void* ptr);
206 BOOL ndr_read_refpointer(NdrContext* context, wStream* s, UINT32* refId);
207 BOOL ndr_context_allocatePtr(NdrContext* context, const void* ptr, ndr_refid* prefId,
208 BOOL* pnewPtr);
209
210 BOOL ndr_read_pointedMessageEx(NdrContext* context, wStream* s, ndr_refid ptrId,
211 NdrMessageType descr, void* hints, void** target);
212
213 BOOL ndr_push_deferreds(NdrContext* context, NdrDeferredEntry* deferreds, size_t ndeferred);
214 BOOL ndr_treat_deferred_read(NdrContext* context, wStream* s);
215 BOOL ndr_treat_deferred_write(NdrContext* context, wStream* s);
216
217#ifdef __cplusplus
218}
219#endif
220
221#endif /* CHANNELS_RDPEAR_NDR_H_ */
hints for a conformant array
Definition ndr.h:188
a deferred pointer
Definition ndr.h:115
descriptor of a field in a structure
Definition ndr.h:97
message descriptor
Definition ndr.h:76
structure descriptor
Definition ndr.h:107
hints for a varying conformant array
Definition ndr.h:174