ReactOS 0.4.16-dev-1946-g52006dd
ndr_es.c File Reference
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "rpc.h"
#include "midles.h"
#include "ndrtypes.h"
#include "ndr_misc.h"
#include "ndr_stubless.h"
#include "wine/debug.h"
Include dependency graph for ndr_es.c:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (ole)
 
static void init_MIDL_ES_MESSAGE (MIDL_ES_MESSAGE *pEsMsg)
 
RPC_STATUS WINAPI MesEncodeIncrementalHandleCreate (void *UserState, MIDL_ES_ALLOC AllocFn, MIDL_ES_WRITE WriteFn, handle_t *pHandle)
 
RPC_STATUS WINAPI MesDecodeIncrementalHandleCreate (void *UserState, MIDL_ES_READ ReadFn, handle_t *pHandle)
 
RPC_STATUS WINAPI MesIncrementalHandleReset (handle_t Handle, void *UserState, MIDL_ES_ALLOC AllocFn, MIDL_ES_WRITE WriteFn, MIDL_ES_READ ReadFn, MIDL_ES_CODE Operation)
 
RPC_STATUS WINAPI MesBufferHandleReset (handle_t Handle, ULONG HandleStyle, MIDL_ES_CODE Operation, char **Buffer, ULONG BufferSize, ULONG *EncodedSize)
 
RPC_STATUS WINAPI MesHandleFree (handle_t Handle)
 
static RPC_STATUS validate_mes_buffer_pointer (const char *Buffer)
 
RPC_STATUS RPC_ENTRY MesEncodeFixedBufferHandleCreate (char *Buffer, ULONG BufferSize, ULONG *pEncodedSize, handle_t *pHandle)
 
RPC_STATUS RPC_ENTRY MesEncodeDynBufferHandleCreate (char **Buffer, ULONG *pEncodedSize, handle_t *pHandle)
 
RPC_STATUS RPC_ENTRY MesDecodeBufferHandleCreate (char *Buffer, ULONG BufferSize, handle_t *pHandle)
 
static void es_data_alloc (MIDL_ES_MESSAGE *pEsMsg, ULONG size)
 
static void es_data_read (MIDL_ES_MESSAGE *pEsMsg, ULONG size)
 
static void es_data_write (MIDL_ES_MESSAGE *pEsMsg, ULONG size)
 
static ULONG mes_proc_header_buffer_size (void)
 
static void mes_proc_header_marshal (MIDL_ES_MESSAGE *pEsMsg)
 
static void mes_proc_header_unmarshal (MIDL_ES_MESSAGE *pEsMsg)
 
void WINAPIV NdrMesProcEncodeDecode (handle_t Handle, const MIDL_STUB_DESC *pStubDesc, PFORMAT_STRING pFormat,...)
 
void RPC_ENTRY NdrMesTypeDecode2 (handle_t Handle, const MIDL_TYPE_PICKLING_INFO *pPicklingInfo, const MIDL_STUB_DESC *pStubDesc, PFORMAT_STRING pFormatString, void *pObject)
 
void RPC_ENTRY NdrMesTypeEncode2 (handle_t Handle, const MIDL_TYPE_PICKLING_INFO *pPicklingInfo, const MIDL_STUB_DESC *pStubDesc, PFORMAT_STRING pFormatString, const void *pObject)
 
void RPC_ENTRY NdrMesTypeFree2 (handle_t Handle, const MIDL_TYPE_PICKLING_INFO *pPicklingInfo, const MIDL_STUB_DESC *pStubDesc, PFORMAT_STRING pFormatString, void *pObject)
 

Function Documentation

◆ es_data_alloc()

static void es_data_alloc ( MIDL_ES_MESSAGE pEsMsg,
ULONG  size 
)
static

Definition at line 276 of file ndr_es.c.

277{
278 if (pEsMsg->HandleStyle == MES_INCREMENTAL_HANDLE)
279 {
280 unsigned int tmpsize = size;
281 TRACE("%ld with incremental handle\n", size);
282 pEsMsg->Alloc(pEsMsg->UserState, (char **)&pEsMsg->StubMsg.Buffer, &tmpsize);
283 if (tmpsize < size)
284 {
285 ERR("not enough bytes allocated - requested %ld, got %d\n", size, tmpsize);
287 }
288 }
289 else if (pEsMsg->HandleStyle == MES_FIXED_BUFFER_HANDLE)
290 {
291 TRACE("%ld with fixed buffer handle\n", size);
292 pEsMsg->StubMsg.Buffer = pEsMsg->Buffer;
293 }
294 pEsMsg->StubMsg.RpcMsg->Buffer = pEsMsg->StubMsg.BufferStart = pEsMsg->StubMsg.Buffer;
295}
#define ERR(fmt,...)
Definition: precomp.h:57
GLsizeiptr size
Definition: glext.h:5919
@ MES_FIXED_BUFFER_HANDLE
Definition: midles.h:40
@ MES_INCREMENTAL_HANDLE
Definition: midles.h:39
#define RPC_S_OUT_OF_MEMORY
Definition: rpcnterr.h:24
void DECLSPEC_NORETURN WINAPI RpcRaiseException(RPC_STATUS exception)
Definition: rpcrt4_main.c:213
#define TRACE(s)
Definition: solgame.cpp:4
MIDL_STUB_MESSAGE StubMsg
Definition: midles.h:50
void * UserState
Definition: midles.h:52
ULONG HandleStyle
Definition: midles.h:54
unsigned char * Buffer
Definition: midles.h:60
MIDL_ES_ALLOC Alloc
Definition: midles.h:57
unsigned char * Buffer
Definition: rpcndr.h:186
PRPC_MESSAGE RpcMsg
Definition: rpcndr.h:185
unsigned char * BufferStart
Definition: rpcndr.h:187
void * Buffer
Definition: rpcdcep.h:40

Referenced by NdrMesProcEncodeDecode().

◆ es_data_read()

static void es_data_read ( MIDL_ES_MESSAGE pEsMsg,
ULONG  size 
)
static

Definition at line 297 of file ndr_es.c.

298{
299 if (pEsMsg->HandleStyle == MES_INCREMENTAL_HANDLE)
300 {
301 unsigned int tmpsize = size;
302 TRACE("%ld from incremental handle\n", size);
303 pEsMsg->Read(pEsMsg->UserState, (char **)&pEsMsg->StubMsg.Buffer, &tmpsize);
304 if (tmpsize < size)
305 {
306 ERR("not enough bytes read - requested %ld, got %d\n", size, tmpsize);
308 }
309 }
310 else
311 {
312 TRACE("%ld from fixed or dynamic buffer handle\n", size);
313 /* FIXME: validate BufferSize? */
314 pEsMsg->StubMsg.Buffer = pEsMsg->Buffer;
315 pEsMsg->Buffer += size;
316 pEsMsg->BufferSize -= size;
317 }
318 pEsMsg->StubMsg.BufferLength = size;
319 pEsMsg->StubMsg.RpcMsg->Buffer = pEsMsg->StubMsg.BufferStart = pEsMsg->StubMsg.Buffer;
320 pEsMsg->StubMsg.BufferEnd = pEsMsg->StubMsg.Buffer + size;
321}
ULONG BufferSize
Definition: midles.h:61
MIDL_ES_READ Read
Definition: midles.h:59
ULONG BufferLength
Definition: rpcndr.h:190
unsigned char * BufferEnd
Definition: rpcndr.h:188

Referenced by mes_proc_header_unmarshal(), and NdrMesProcEncodeDecode().

◆ es_data_write()

static void es_data_write ( MIDL_ES_MESSAGE pEsMsg,
ULONG  size 
)
static

Definition at line 323 of file ndr_es.c.

324{
325 if (pEsMsg->HandleStyle == MES_INCREMENTAL_HANDLE)
326 {
327 TRACE("%ld to incremental handle\n", size);
328 pEsMsg->Write(pEsMsg->UserState, (char *)pEsMsg->StubMsg.BufferStart, size);
329 }
330 else
331 {
332 TRACE("%ld to dynamic or fixed buffer handle\n", size);
333 *pEsMsg->pEncodedSize += size;
334 }
335}
MIDL_ES_WRITE Write
Definition: midles.h:58
ULONG * pEncodedSize
Definition: midles.h:63

Referenced by NdrMesProcEncodeDecode().

◆ init_MIDL_ES_MESSAGE()

static void init_MIDL_ES_MESSAGE ( MIDL_ES_MESSAGE pEsMsg)
inlinestatic

Definition at line 39 of file ndr_es.c.

40{
41 memset(pEsMsg, 0, sizeof(*pEsMsg));
42 /* even if we are unmarshalling, as we don't want pointers to be pointed
43 * to buffer memory */
44 pEsMsg->StubMsg.IsClient = TRUE;
45 pEsMsg->MesVersion = 1;
46}
#define TRUE
Definition: types.h:120
#define memset(x, y, z)
Definition: compat.h:39
ULONG MesVersion
Definition: midles.h:53
unsigned char IsClient
Definition: rpcndr.h:193

Referenced by MesBufferHandleReset(), MesDecodeBufferHandleCreate(), MesDecodeIncrementalHandleCreate(), MesEncodeDynBufferHandleCreate(), MesEncodeFixedBufferHandleCreate(), MesEncodeIncrementalHandleCreate(), and MesIncrementalHandleReset().

◆ mes_proc_header_buffer_size()

static ULONG mes_proc_header_buffer_size ( void  )
inlinestatic

Definition at line 337 of file ndr_es.c.

338{
339 return 4 + 2*sizeof(RPC_SYNTAX_IDENTIFIER) + 12;
340}
struct _RPC_SYNTAX_IDENTIFIER RPC_SYNTAX_IDENTIFIER

Referenced by mes_proc_header_unmarshal(), and NdrMesProcEncodeDecode().

◆ mes_proc_header_marshal()

static void mes_proc_header_marshal ( MIDL_ES_MESSAGE pEsMsg)
static

Definition at line 342 of file ndr_es.c.

343{
344 const RPC_CLIENT_INTERFACE *client_interface = pEsMsg->StubMsg.StubDesc->RpcInterfaceInformation;
345 *(WORD *)pEsMsg->StubMsg.Buffer = 0x0101;
346 pEsMsg->StubMsg.Buffer += 2;
347 *(WORD *)pEsMsg->StubMsg.Buffer = 0xcccc;
348 pEsMsg->StubMsg.Buffer += 2;
349 memcpy(pEsMsg->StubMsg.Buffer, &client_interface->TransferSyntax, sizeof(RPC_SYNTAX_IDENTIFIER));
350 pEsMsg->StubMsg.Buffer += sizeof(RPC_SYNTAX_IDENTIFIER);
351 memcpy(pEsMsg->StubMsg.Buffer, &pEsMsg->InterfaceId, sizeof(RPC_SYNTAX_IDENTIFIER));
352 pEsMsg->StubMsg.Buffer += sizeof(RPC_SYNTAX_IDENTIFIER);
353 *(DWORD *)pEsMsg->StubMsg.Buffer = pEsMsg->ProcNumber;
354 pEsMsg->StubMsg.Buffer += 4;
355 *(DWORD *)pEsMsg->StubMsg.Buffer = 0x00000001;
356 pEsMsg->StubMsg.Buffer += 4;
357 *(DWORD *)pEsMsg->StubMsg.Buffer = pEsMsg->ByteCount;
358 pEsMsg->StubMsg.Buffer += 4;
359}
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
ULONG ProcNumber
Definition: midles.h:65
ULONG ByteCount
Definition: midles.h:68
RPC_SYNTAX_IDENTIFIER InterfaceId
Definition: midles.h:64
const struct _MIDL_STUB_DESC * StubDesc
Definition: rpcndr.h:213
RPC_SYNTAX_IDENTIFIER TransferSyntax
Definition: rpcdcep.h:118

Referenced by NdrMesProcEncodeDecode().

◆ mes_proc_header_unmarshal()

static void mes_proc_header_unmarshal ( MIDL_ES_MESSAGE pEsMsg)
static

Definition at line 361 of file ndr_es.c.

362{
363 const RPC_CLIENT_INTERFACE *client_interface = pEsMsg->StubMsg.StubDesc->RpcInterfaceInformation;
364
366
367 if (*(WORD *)pEsMsg->StubMsg.Buffer != 0x0101)
368 {
369 FIXME("unknown value at Buffer[0] 0x%04x\n", *(WORD *)pEsMsg->StubMsg.Buffer);
371 }
372 pEsMsg->StubMsg.Buffer += 2;
373 if (*(WORD *)pEsMsg->StubMsg.Buffer != 0xcccc)
374 FIXME("unknown value at Buffer[2] 0x%04x\n", *(WORD *)pEsMsg->StubMsg.Buffer);
375 pEsMsg->StubMsg.Buffer += 2;
376 if (memcmp(pEsMsg->StubMsg.Buffer, &client_interface->TransferSyntax, sizeof(RPC_SYNTAX_IDENTIFIER)))
377 {
378 const RPC_SYNTAX_IDENTIFIER *AlienTransferSyntax = (const RPC_SYNTAX_IDENTIFIER *)pEsMsg->StubMsg.Buffer;
379 ERR("bad transfer syntax %s {%d.%d}\n", debugstr_guid(&AlienTransferSyntax->SyntaxGUID),
380 AlienTransferSyntax->SyntaxVersion.MajorVersion,
381 AlienTransferSyntax->SyntaxVersion.MinorVersion);
383 }
384 pEsMsg->StubMsg.Buffer += sizeof(RPC_SYNTAX_IDENTIFIER);
385 memcpy(&pEsMsg->InterfaceId, pEsMsg->StubMsg.Buffer, sizeof(RPC_SYNTAX_IDENTIFIER));
386 pEsMsg->StubMsg.Buffer += sizeof(RPC_SYNTAX_IDENTIFIER);
387 pEsMsg->ProcNumber = *(DWORD *)pEsMsg->StubMsg.Buffer;
388 pEsMsg->StubMsg.Buffer += 4;
389 if (*(DWORD *)pEsMsg->StubMsg.Buffer != 0x00000001)
390 FIXME("unknown value 0x%08lx, expected 0x00000001\n", *(DWORD *)pEsMsg->StubMsg.Buffer);
391 pEsMsg->StubMsg.Buffer += 4;
392 pEsMsg->ByteCount = *(DWORD *)pEsMsg->StubMsg.Buffer;
393 pEsMsg->StubMsg.Buffer += 4;
394 if (pEsMsg->ByteCount + mes_proc_header_buffer_size() < pEsMsg->ByteCount)
396}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define FIXME(fmt,...)
Definition: precomp.h:53
#define debugstr_guid
Definition: kernel32.h:35
if(dx< 0)
Definition: linetemp.h:194
static ULONG mes_proc_header_buffer_size(void)
Definition: ndr_es.c:337
static void es_data_read(MIDL_ES_MESSAGE *pEsMsg, ULONG size)
Definition: ndr_es.c:297
RPC_VERSION SyntaxVersion
Definition: rpcdcep.h:33
unsigned short MajorVersion
Definition: rpcdcep.h:27
unsigned short MinorVersion
Definition: rpcdcep.h:28
#define RPC_X_WRONG_ES_VERSION
Definition: winerror.h:1492
#define RPC_S_UNSUPPORTED_TRANS_SYN
Definition: winerror.h:1397
#define RPC_S_INVALID_BOUND
Definition: winerror.h:1400

Referenced by NdrMesProcEncodeDecode().

◆ MesBufferHandleReset()

RPC_STATUS WINAPI MesBufferHandleReset ( handle_t  Handle,
ULONG  HandleStyle,
MIDL_ES_CODE  Operation,
char **  Buffer,
ULONG  BufferSize,
ULONG EncodedSize 
)

Definition at line 129 of file ndr_es.c.

131{
133
134 TRACE("(%p, %lu, %d, %p, %lu, %p)\n", Handle, HandleStyle, Operation, Buffer,
135 BufferSize, EncodedSize);
136
137 if (!Handle || !Buffer || !EncodedSize)
138 return RPC_S_INVALID_ARG;
139
141 return RPC_S_INVALID_ARG;
142
143 if (HandleStyle != MES_FIXED_BUFFER_HANDLE && HandleStyle != MES_DYNAMIC_BUFFER_HANDLE)
144 return RPC_S_INVALID_ARG;
145
146 init_MIDL_ES_MESSAGE(pEsMsg);
147
148 pEsMsg->Operation = Operation;
149 pEsMsg->HandleStyle = HandleStyle;
150 if (HandleStyle == MES_FIXED_BUFFER_HANDLE)
151 pEsMsg->Buffer = (unsigned char*)*Buffer;
152 else
153 pEsMsg->pDynBuffer = (unsigned char**)Buffer;
154 pEsMsg->BufferSize = BufferSize;
155 pEsMsg->pEncodedSize = EncodedSize;
156
157 return RPC_S_OK;
158}
Definition: bufpool.h:45
#define BufferSize
Definition: mmc.h:75
FP_OP Operation
Definition: fpcontrol.c:150
ULONG Handle
Definition: gdb_input.c:15
@ MES_ENCODE
Definition: midles.h:32
@ MES_ENCODE_NDR64
Definition: midles.h:34
@ MES_DECODE
Definition: midles.h:33
@ MES_DYNAMIC_BUFFER_HANDLE
Definition: midles.h:41
static void init_MIDL_ES_MESSAGE(MIDL_ES_MESSAGE *pEsMsg)
Definition: ndr_es.c:39
#define RPC_S_INVALID_ARG
Definition: rpcnterr.h:23
#define RPC_S_OK
Definition: rpcnterr.h:22
unsigned char ** pDynBuffer
Definition: midles.h:62
MIDL_ES_CODE Operation
Definition: midles.h:51
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254

Referenced by test_MesEncodeFixedBufferHandleCreate().

◆ MesDecodeBufferHandleCreate()

RPC_STATUS RPC_ENTRY MesDecodeBufferHandleCreate ( char Buffer,
ULONG  BufferSize,
handle_t pHandle 
)

Definition at line 249 of file ndr_es.c.

251{
252 MIDL_ES_MESSAGE *pEsMsg;
254
255 TRACE("(%p, %ld, %p)\n", Buffer, BufferSize, pHandle);
256
258 return status;
259
260 pEsMsg = malloc(sizeof(*pEsMsg));
261 if (!pEsMsg)
262 return RPC_S_OUT_OF_MEMORY;
263
264 init_MIDL_ES_MESSAGE(pEsMsg);
265
266 pEsMsg->Operation = MES_DECODE;
268 pEsMsg->Buffer = (unsigned char *)Buffer;
269 pEsMsg->BufferSize = BufferSize;
270
271 *pHandle = (handle_t)pEsMsg;
272
273 return RPC_S_OK;
274}
#define malloc
Definition: debug_ros.c:4
static RPC_STATUS validate_mes_buffer_pointer(const char *Buffer)
Definition: ndr_es.c:170
RPC_BINDING_HANDLE handle_t
Definition: rpcdce.h:51
long RPC_STATUS
Definition: rpc.h:48
Definition: ps.c:97

◆ MesDecodeIncrementalHandleCreate()

RPC_STATUS WINAPI MesDecodeIncrementalHandleCreate ( void UserState,
MIDL_ES_READ  ReadFn,
handle_t pHandle 
)

Definition at line 79 of file ndr_es.c.

81{
82 MIDL_ES_MESSAGE *pEsMsg;
83
84 TRACE("(%p, %p, %p)\n", UserState, ReadFn, pHandle);
85
86 pEsMsg = malloc(sizeof(*pEsMsg));
87 if (!pEsMsg)
89
91
92 pEsMsg->Operation = MES_DECODE;
93 pEsMsg->UserState = UserState;
95 pEsMsg->Read = ReadFn;
96
97 *pHandle = (handle_t)pEsMsg;
98
99 return RPC_S_OK;
100}
@ UserState
Definition: netlogon.idl:719

◆ MesEncodeDynBufferHandleCreate()

RPC_STATUS RPC_ENTRY MesEncodeDynBufferHandleCreate ( char **  Buffer,
ULONG pEncodedSize,
handle_t pHandle 
)

Definition at line 220 of file ndr_es.c.

222{
223 MIDL_ES_MESSAGE *pEsMsg;
224
225 TRACE("(%p, %p, %p)\n", Buffer, pEncodedSize, pHandle);
226
227 if (!pEncodedSize)
228 return RPC_S_INVALID_ARG;
229
230 pEsMsg = malloc(sizeof(*pEsMsg));
231 if (!pEsMsg)
232 return RPC_S_OUT_OF_MEMORY;
233
234 init_MIDL_ES_MESSAGE(pEsMsg);
235
236 pEsMsg->Operation = MES_ENCODE;
238 pEsMsg->pDynBuffer = (unsigned char **)Buffer;
239 pEsMsg->pEncodedSize = pEncodedSize;
240
241 *pHandle = (handle_t)pEsMsg;
242
243 return RPC_S_OK;
244}

◆ MesEncodeFixedBufferHandleCreate()

RPC_STATUS RPC_ENTRY MesEncodeFixedBufferHandleCreate ( char Buffer,
ULONG  BufferSize,
ULONG pEncodedSize,
handle_t pHandle 
)

Definition at line 184 of file ndr_es.c.

186{
187 MIDL_ES_MESSAGE *pEsMsg;
189
190 TRACE("(%p, %ld, %p, %p)\n", Buffer, BufferSize, pEncodedSize, pHandle);
191
193 return status;
194
195 if (!pEncodedSize)
196 return RPC_S_INVALID_ARG;
197
198 /* FIXME: check BufferSize too */
199
200 pEsMsg = malloc(sizeof(*pEsMsg));
201 if (!pEsMsg)
202 return RPC_S_OUT_OF_MEMORY;
203
204 init_MIDL_ES_MESSAGE(pEsMsg);
205
206 pEsMsg->Operation = MES_ENCODE;
208 pEsMsg->Buffer = (unsigned char *)Buffer;
209 pEsMsg->BufferSize = BufferSize;
210 pEsMsg->pEncodedSize = pEncodedSize;
211
212 *pHandle = (handle_t)pEsMsg;
213
214 return RPC_S_OK;
215}

Referenced by test_MesEncodeFixedBufferHandleCreate().

◆ MesEncodeIncrementalHandleCreate()

RPC_STATUS WINAPI MesEncodeIncrementalHandleCreate ( void UserState,
MIDL_ES_ALLOC  AllocFn,
MIDL_ES_WRITE  WriteFn,
handle_t pHandle 
)

Definition at line 51 of file ndr_es.c.

54{
55 MIDL_ES_MESSAGE *pEsMsg;
56
57 TRACE("(%p, %p, %p, %p)\n", UserState, AllocFn, WriteFn, pHandle);
58
59 pEsMsg = malloc(sizeof(*pEsMsg));
60 if (!pEsMsg)
62
64
65 pEsMsg->Operation = MES_ENCODE;
66 pEsMsg->UserState = UserState;
68 pEsMsg->Alloc = AllocFn;
69 pEsMsg->Write = WriteFn;
70
71 *pHandle = (handle_t)pEsMsg;
72
73 return RPC_S_OK;
74}

◆ MesHandleFree()

RPC_STATUS WINAPI MesHandleFree ( handle_t  Handle)

Definition at line 163 of file ndr_es.c.

164{
165 TRACE("(%p)\n", Handle);
166 free(Handle);
167 return RPC_S_OK;
168}
#define free
Definition: debug_ros.c:5

Referenced by test_MesEncodeFixedBufferHandleCreate().

◆ MesIncrementalHandleReset()

RPC_STATUS WINAPI MesIncrementalHandleReset ( handle_t  Handle,
void UserState,
MIDL_ES_ALLOC  AllocFn,
MIDL_ES_WRITE  WriteFn,
MIDL_ES_READ  ReadFn,
MIDL_ES_CODE  Operation 
)

Definition at line 105 of file ndr_es.c.

108{
109 MIDL_ES_MESSAGE *pEsMsg = Handle;
110
111 TRACE("(%p, %p, %p, %p, %p, %d)\n", Handle, UserState, AllocFn,
112 WriteFn, ReadFn, Operation);
113
114 init_MIDL_ES_MESSAGE(pEsMsg);
115
116 pEsMsg->Operation = Operation;
117 pEsMsg->UserState = UserState;
119 pEsMsg->Alloc = AllocFn;
120 pEsMsg->Write = WriteFn;
121 pEsMsg->Read = ReadFn;
122
123 return RPC_S_OK;
124}

◆ NdrMesProcEncodeDecode()

void WINAPIV NdrMesProcEncodeDecode ( handle_t  Handle,
const MIDL_STUB_DESC pStubDesc,
PFORMAT_STRING  pFormat,
  ... 
)

Definition at line 401 of file ndr_es.c.

402{
403 /* pointer to start of stack where arguments start */
404 RPC_MESSAGE rpcMsg;
405 MIDL_ES_MESSAGE *pEsMsg = Handle;
406 /* size of stack */
407 unsigned short stack_size;
408 /* header for procedure string */
409 const NDR_PROC_HEADER *pProcHeader = (const NDR_PROC_HEADER *)&pFormat[0];
410 const RPC_CLIENT_INTERFACE *client_interface;
412 unsigned int number_of_params;
413 ULONG_PTR arg_buffer[256];
414
415 TRACE("Handle %p, pStubDesc %p, pFormat %p, ...\n", Handle, pStubDesc, pFormat);
416
417 /* Later NDR language versions probably won't be backwards compatible */
418 if (pStubDesc->Version > 0x50002)
419 {
420 FIXME("Incompatible stub description version: 0x%lx\n", pStubDesc->Version);
422 }
423
424 client_interface = pStubDesc->RpcInterfaceInformation;
425 pEsMsg->InterfaceId = client_interface->InterfaceId;
426
427 if (pProcHeader->Oi_flags & Oi_HAS_RPCFLAGS)
428 {
429 const NDR_PROC_HEADER_RPC *header_rpc = (const NDR_PROC_HEADER_RPC *)&pFormat[0];
430 stack_size = header_rpc->stack_size;
431 pEsMsg->ProcNumber = header_rpc->proc_num;
432 pFormat += sizeof(NDR_PROC_HEADER_RPC);
433 }
434 else
435 {
436 stack_size = pProcHeader->stack_size;
437 pEsMsg->ProcNumber = pProcHeader->proc_num;
438 pFormat += sizeof(NDR_PROC_HEADER);
439 }
440
441 if (pProcHeader->handle_type == 0)
442 {
443 switch (*pFormat) /* handle_type */
444 {
445 case FC_BIND_PRIMITIVE: /* explicit primitive */
446 pFormat += sizeof(NDR_EHD_PRIMITIVE);
447 break;
448 case FC_BIND_GENERIC: /* explicit generic */
449 pFormat += sizeof(NDR_EHD_GENERIC);
450 break;
451 case FC_BIND_CONTEXT: /* explicit context */
452 pFormat += sizeof(NDR_EHD_CONTEXT);
453 break;
454 default:
455 ERR("bad explicit binding handle type (0x%02x)\n", pProcHeader->handle_type);
457 }
458 }
459
460 TRACE("stack size: 0x%x\n", stack_size);
461 TRACE("proc num: %ld\n", pEsMsg->ProcNumber);
462
463 memset(&rpcMsg, 0, sizeof(rpcMsg));
464 pEsMsg->StubMsg.RpcMsg = &rpcMsg;
465 pEsMsg->StubMsg.StubDesc = pStubDesc;
466 pEsMsg->StubMsg.pfnAllocate = pStubDesc->pfnAllocate;
467 pEsMsg->StubMsg.pfnFree = pStubDesc->pfnFree;
468
469 /* create the full pointer translation tables, if requested */
470 if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
472
473 TRACE("Oi_flags = 0x%02x\n", pProcHeader->Oi_flags);
474 TRACE("stubdesc version = 0x%lx\n", pStubDesc->Version);
475 TRACE("MIDL stub version = 0x%lx\n", pStubDesc->MIDLVersion);
476
477 /* needed for conformance of top-level objects */
478 va_start( args, pFormat );
479 pEsMsg->StubMsg.StackTop = va_arg( args, unsigned char * );
480 va_end( args );
481
482 pFormat = convert_old_args( &pEsMsg->StubMsg, pFormat, stack_size, FALSE,
483 arg_buffer, sizeof(arg_buffer), &number_of_params );
484
485 switch (pEsMsg->Operation)
486 {
487 case MES_ENCODE:
489
490 client_do_args( &pEsMsg->StubMsg, pFormat, STUBLESS_CALCSIZE, FALSE, number_of_params, NULL );
491
493 es_data_alloc(pEsMsg, pEsMsg->StubMsg.BufferLength);
494
496
497 client_do_args( &pEsMsg->StubMsg, pFormat, STUBLESS_MARSHAL, FALSE, number_of_params, NULL );
498
499 es_data_write(pEsMsg, pEsMsg->ByteCount);
500 break;
501 case MES_DECODE:
503
504 es_data_read(pEsMsg, pEsMsg->ByteCount);
505
506 client_do_args( &pEsMsg->StubMsg, pFormat, STUBLESS_UNMARSHAL, FALSE, number_of_params, NULL );
507 break;
508 default:
510 return;
511 }
512 /* free the full pointer translation tables */
513 if (pProcHeader->Oi_flags & Oi_FULL_PTR_USED)
515}
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define va_arg(ap, T)
Definition: acmsvcex.h:89
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
static void es_data_write(MIDL_ES_MESSAGE *pEsMsg, ULONG size)
Definition: ndr_es.c:323
static void mes_proc_header_unmarshal(MIDL_ES_MESSAGE *pEsMsg)
Definition: ndr_es.c:361
static void mes_proc_header_marshal(MIDL_ES_MESSAGE *pEsMsg)
Definition: ndr_es.c:342
static void es_data_alloc(MIDL_ES_MESSAGE *pEsMsg, ULONG size)
Definition: ndr_es.c:276
void WINAPI NdrFullPointerXlatFree(PFULL_PTR_XLAT_TABLES pXlatTables)
PFULL_PTR_XLAT_TABLES WINAPI NdrFullPointerXlatInit(ULONG NumberOfPointers, XLAT_SIDE XlatSide)
void client_do_args(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase, BOOLEAN fpu_args, unsigned short number_of_params, unsigned char *pRetVal)
Definition: ndr_stubless.c:484
PFORMAT_STRING convert_old_args(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, unsigned int stack_size, BOOL object_proc, void *buffer, unsigned int size, unsigned int *count)
Definition: ndr_stubless.c:596
struct _NDR_PROC_HEADER_RPC NDR_PROC_HEADER_RPC
struct _NDR_EHD_CONTEXT NDR_EHD_CONTEXT
struct _NDR_EHD_PRIMITIVE NDR_EHD_PRIMITIVE
struct _NDR_PROC_HEADER NDR_PROC_HEADER
@ STUBLESS_MARSHAL
Definition: ndr_stubless.h:253
@ STUBLESS_CALCSIZE
Definition: ndr_stubless.h:251
@ STUBLESS_UNMARSHAL
Definition: ndr_stubless.h:248
struct _NDR_EHD_GENERIC NDR_EHD_GENERIC
#define Oi_FULL_PTR_USED
Definition: ndrtypes.h:290
@ FC_BIND_PRIMITIVE
Definition: ndrtypes.h:194
@ FC_BIND_GENERIC
Definition: ndrtypes.h:193
@ FC_BIND_CONTEXT
Definition: ndrtypes.h:191
#define Oi_HAS_RPCFLAGS
Definition: ndrtypes.h:293
@ XLAT_CLIENT
Definition: rpcndr.h:500
#define args
Definition: format.c:66
void * RpcInterfaceInformation
Definition: rpcndr.h:378
ULONG Version
Definition: rpcndr.h:392
LONG MIDLVersion
Definition: rpcndr.h:394
unsigned char * StackTop
Definition: rpcndr.h:209
struct _FULL_PTR_XLAT_TABLES * FullPtrXlatTables
Definition: rpcndr.h:214
unsigned short stack_size
Definition: ndr_stubless.h:93
unsigned short proc_num
Definition: ndr_stubless.h:92
unsigned char Oi_flags
Definition: ndr_stubless.h:64
unsigned char handle_type
Definition: ndr_stubless.h:43
unsigned short stack_size
Definition: ndr_stubless.h:71
unsigned short proc_num
Definition: ndr_stubless.h:67
RPC_SYNTAX_IDENTIFIER InterfaceId
Definition: rpcdcep.h:117
Definition: match.c:390
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define RPC_X_BAD_STUB_DATA
Definition: winerror.h:1447
#define RPC_X_WRONG_STUB_VERSION
Definition: winerror.h:1493
#define RPC_S_INTERNAL_ERROR
Definition: winerror.h:1431

◆ NdrMesTypeDecode2()

void RPC_ENTRY NdrMesTypeDecode2 ( handle_t  Handle,
const MIDL_TYPE_PICKLING_INFO pPicklingInfo,
const MIDL_STUB_DESC pStubDesc,
PFORMAT_STRING  pFormatString,
void pObject 
)

Definition at line 517 of file ndr_es.c.

519{
520 FIXME("(%p, %p, %p, %p, %p)\n", Handle, pPicklingInfo, pStubDesc, pFormatString, pObject);
521}
FxObject * pObject

◆ NdrMesTypeEncode2()

void RPC_ENTRY NdrMesTypeEncode2 ( handle_t  Handle,
const MIDL_TYPE_PICKLING_INFO pPicklingInfo,
const MIDL_STUB_DESC pStubDesc,
PFORMAT_STRING  pFormatString,
const void pObject 
)

Definition at line 523 of file ndr_es.c.

525{
526 FIXME("(%p, %p, %p, %p, %p)\n", Handle, pPicklingInfo, pStubDesc, pFormatString, pObject);
527}

◆ NdrMesTypeFree2()

void RPC_ENTRY NdrMesTypeFree2 ( handle_t  Handle,
const MIDL_TYPE_PICKLING_INFO pPicklingInfo,
const MIDL_STUB_DESC pStubDesc,
PFORMAT_STRING  pFormatString,
void pObject 
)

Definition at line 529 of file ndr_es.c.

531{
532 FIXME("(%p, %p, %p, %p, %p)\n", Handle, pPicklingInfo, pStubDesc, pFormatString, pObject);
533}

◆ validate_mes_buffer_pointer()

static RPC_STATUS validate_mes_buffer_pointer ( const char Buffer)
static

Definition at line 170 of file ndr_es.c.

171{
172 if (!Buffer)
173 return RPC_S_INVALID_ARG;
174
175 if (((ULONG_PTR)Buffer & 7) != 0)
177
178 return RPC_S_OK;
179}
#define RPC_X_INVALID_BUFFER
Definition: rpcnterr.h:40

Referenced by MesDecodeBufferHandleCreate(), and MesEncodeFixedBufferHandleCreate().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( ole  )