ReactOS  0.4.14-dev-98-gb0d4763
ndr_stubless.h File Reference
#include "ndrtypes.h"
#include "pshpack1.h"
#include "poppack.h"
Include dependency graph for ndr_stubless.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _NDR_PROC_HEADER
 
struct  _NDR_PROC_HEADER_RPC
 
struct  _NDR_PROC_PARTIAL_OIF_HEADER
 
struct  _NDR_PARAM_OI_BASETYPE
 
struct  _NDR_PARAM_OI_OTHER
 
struct  NDR_PARAM_OIF
 
struct  _NDR_EHD_PRIMITIVE
 
struct  _NDR_EHD_GENERIC
 
struct  _NDR_EHD_CONTEXT
 

Typedefs

typedef struct _NDR_PROC_HEADER NDR_PROC_HEADER
 
typedef struct _NDR_PROC_HEADER_RPC NDR_PROC_HEADER_RPC
 
typedef struct _NDR_PROC_PARTIAL_OIF_HEADER NDR_PROC_PARTIAL_OIF_HEADER
 
typedef struct _NDR_PARAM_OI_BASETYPE NDR_PARAM_OI_BASETYPE
 
typedef struct _NDR_PARAM_OI_OTHER NDR_PARAM_OI_OTHER
 
typedef struct _NDR_EHD_PRIMITIVE NDR_EHD_PRIMITIVE
 
typedef struct _NDR_EHD_GENERIC NDR_EHD_GENERIC
 
typedef struct _NDR_EHD_CONTEXT NDR_EHD_CONTEXT
 

Enumerations

enum  stubless_phase {
  STUBLESS_UNMARSHAL, STUBLESS_INITOUT, STUBLESS_CALLSERVER, STUBLESS_CALCSIZE,
  STUBLESS_GETBUFFER, STUBLESS_MARSHAL, STUBLESS_MUSTFREE, STUBLESS_FREE
}
 

Functions

LONG_PTR CDECL ndr_client_call (PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, void **stack_top, void **fpu_stack) DECLSPEC_HIDDEN
 
LONG_PTR CDECL ndr_async_client_call (PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, void **stack_top) DECLSPEC_HIDDEN
 
void client_do_args (PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase, void **fpu_args, unsigned short number_of_params, unsigned char *pRetVal) DECLSPEC_HIDDEN
 
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) DECLSPEC_HIDDEN
 
RPC_STATUS NdrpCompleteAsyncClientCall (RPC_ASYNC_STATE *pAsync, void *Reply) DECLSPEC_HIDDEN
 

Typedef Documentation

◆ NDR_EHD_CONTEXT

◆ NDR_EHD_GENERIC

◆ NDR_EHD_PRIMITIVE

◆ NDR_PARAM_OI_BASETYPE

◆ NDR_PARAM_OI_OTHER

◆ NDR_PROC_HEADER

◆ NDR_PROC_HEADER_RPC

◆ NDR_PROC_PARTIAL_OIF_HEADER

Enumeration Type Documentation

◆ stubless_phase

Enumerator
STUBLESS_UNMARSHAL 
STUBLESS_INITOUT 
STUBLESS_CALLSERVER 
STUBLESS_CALCSIZE 
STUBLESS_GETBUFFER 
STUBLESS_MARSHAL 
STUBLESS_MUSTFREE 
STUBLESS_FREE 

Definition at line 229 of file ndr_stubless.h.

Function Documentation

◆ client_do_args()

void client_do_args ( PMIDL_STUB_MESSAGE  pStubMsg,
PFORMAT_STRING  pFormat,
enum stubless_phase  phase,
void **  fpu_args,
unsigned short  number_of_params,
unsigned char pRetVal 
)

Definition at line 469 of file ndr_stubless.c.

471 {
472  const NDR_PARAM_OIF *params = (const NDR_PARAM_OIF *)pFormat;
473  unsigned int i;
474 
475  for (i = 0; i < number_of_params; i++)
476  {
477  unsigned char *pArg = pStubMsg->StackTop + params[i].stack_offset;
478  PFORMAT_STRING pTypeFormat = (PFORMAT_STRING)&pStubMsg->StubDesc->pFormatTypes[params[i].u.type_offset];
479 
480 #ifdef __x86_64__ /* floats are passed as doubles through varargs functions */
481  float f;
482 
483  if (params[i].attr.IsBasetype &&
484  params[i].u.type_format_char == FC_FLOAT &&
485  !params[i].attr.IsSimpleRef &&
486  !fpu_args)
487  {
488  f = *(double *)pArg;
489  pArg = (unsigned char *)&f;
490  }
491 #endif
492 
493  TRACE("param[%d]: %p type %02x %s\n", i, pArg,
494  params[i].attr.IsBasetype ? params[i].u.type_format_char : *pTypeFormat,
496 
497  switch (phase)
498  {
499  case STUBLESS_INITOUT:
500  if (*(unsigned char **)pArg)
501  {
503  memset( *(unsigned char **)pArg, 0, calc_arg_size( pStubMsg, pTypeFormat ));
504  else if (param_is_out_basetype(params[i].attr))
505  memset( *(unsigned char **)pArg, 0, basetype_arg_size( params[i].u.type_format_char ));
506  }
507  break;
508  case STUBLESS_CALCSIZE:
509  if (params[i].attr.IsSimpleRef && !*(unsigned char **)pArg)
511  if (params[i].attr.IsIn) call_buffer_sizer(pStubMsg, pArg, &params[i]);
512  break;
513  case STUBLESS_MARSHAL:
514  if (params[i].attr.IsIn) call_marshaller(pStubMsg, pArg, &params[i]);
515  break;
516  case STUBLESS_UNMARSHAL:
517  if (params[i].attr.IsOut)
518  {
519  if (params[i].attr.IsReturn && pRetVal) pArg = pRetVal;
520  call_unmarshaller(pStubMsg, &pArg, &params[i], 0);
521  }
522  break;
523  case STUBLESS_FREE:
524  if (!params[i].attr.IsBasetype && params[i].attr.IsOut && !params[i].attr.IsByValue)
525  NdrClearOutParameters( pStubMsg, pTypeFormat, *(unsigned char **)pArg );
526  break;
527  default:
529  }
530  }
531 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
MIDL_STUB_MESSAGE * pStubMsg
#define RPC_X_NULL_REF_POINTER
Definition: winerror.h:1087
static void call_buffer_sizer(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory, const NDR_PARAM_OIF *param)
Definition: ndr_stubless.c:57
static BOOL param_is_out_basetype(PARAM_ATTRIBUTES attr)
Definition: ndr_stubless.c:430
void DECLSPEC_NORETURN WINAPI RpcRaiseException(RPC_STATUS exception)
Definition: rpcrt4_main.c:189
static BOOL param_needs_alloc(PARAM_ATTRIBUTES attr)
Definition: ndr_stubless.c:425
const struct _MIDL_STUB_DESC * StubDesc
Definition: rpcndr.h:230
unsigned int number_of_params
static unsigned char * call_marshaller(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory, const NDR_PARAM_OIF *param)
Definition: ndr_stubless.c:83
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLenum const GLfloat * params
Definition: glext.h:5645
static size_t basetype_arg_size(unsigned char fc)
Definition: ndr_stubless.c:435
static const char * debugstr_PROC_PF(PARAM_ATTRIBUTES param_attributes)
Definition: ndr_stubless.c:236
GLfloat f
Definition: glext.h:7540
#define TRACE(s)
Definition: solgame.cpp:4
if(!(yy_init))
Definition: macro.lex.yy.c:714
const unsigned char * PFORMAT_STRING
Definition: rpcndr.h:176
Definition: cookie.c:170
#define RPC_S_INTERNAL_ERROR
Definition: winerror.h:1074
static unsigned char * call_unmarshaller(PMIDL_STUB_MESSAGE pStubMsg, unsigned char **ppMemory, const NDR_PARAM_OIF *param, unsigned char fMustAlloc)
Definition: ndr_stubless.c:110
unsigned char * StackTop
Definition: rpcndr.h:226
void WINAPI NdrClearOutParameters(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, void *ArgAddr)
#define memset(x, y, z)
Definition: compat.h:39
static DWORD calc_arg_size(MIDL_STUB_MESSAGE *pStubMsg, PFORMAT_STRING pFormat)
Definition: ndr_stubless.c:151

Referenced by ndr_async_client_call(), ndr_client_call(), NdrMesProcEncodeDecode(), and NdrpCompleteAsyncClientCall().

◆ convert_old_args()

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 at line 581 of file ndr_stubless.c.

584 {
586  unsigned int i, stack_offset = object_proc ? sizeof(void *) : 0;
587 
588  for (i = 0; stack_offset < stack_size; i++)
589  {
590  const NDR_PARAM_OI_BASETYPE *param = (const NDR_PARAM_OI_BASETYPE *)pFormat;
591  const NDR_PARAM_OI_OTHER *other = (const NDR_PARAM_OI_OTHER *)pFormat;
592 
593  if (i + 1 > size / sizeof(*args))
594  {
595  FIXME( "%u args not supported\n", i );
597  }
598 
599  args[i].stack_offset = stack_offset;
600  memset( &args[i].attr, 0, sizeof(args[i].attr) );
601 
602  switch (param->param_direction)
603  {
605  args[i].attr.IsIn = 1;
606  args[i].attr.IsBasetype = 1;
607  break;
609  args[i].attr.IsOut = 1;
610  args[i].attr.IsReturn = 1;
611  args[i].attr.IsBasetype = 1;
612  break;
613  case FC_IN_PARAM:
614  args[i].attr.IsIn = 1;
615  args[i].attr.MustFree = 1;
616  break;
618  args[i].attr.IsIn = 1;
619  args[i].attr.IsDontCallFreeInst = 1;
620  break;
621  case FC_IN_OUT_PARAM:
622  args[i].attr.IsIn = 1;
623  args[i].attr.IsOut = 1;
624  args[i].attr.MustFree = 1;
625  break;
626  case FC_OUT_PARAM:
627  args[i].attr.IsOut = 1;
628  break;
629  case FC_RETURN_PARAM:
630  args[i].attr.IsOut = 1;
631  args[i].attr.IsReturn = 1;
632  break;
633  }
634  if (args[i].attr.IsBasetype)
635  {
636  args[i].u.type_format_char = param->type_format_char;
637  stack_offset += type_stack_size( param->type_format_char );
638  pFormat += sizeof(NDR_PARAM_OI_BASETYPE);
639  }
640  else
641  {
642  args[i].u.type_offset = other->type_offset;
643  args[i].attr.IsByValue = is_by_value( &pStubMsg->StubDesc->pFormatTypes[other->type_offset] );
644  stack_offset += other->stack_size * sizeof(void *);
645  pFormat += sizeof(NDR_PARAM_OI_OTHER);
646  }
647  }
648  *count = i;
649  return (PFORMAT_STRING)args;
650 }
MIDL_STUB_MESSAGE * pStubMsg
static BOOL is_by_value(PFORMAT_STRING format)
Definition: ndr_stubless.c:564
GLuint GLuint GLsizei count
Definition: gl.h:1545
int other
Definition: msacm.c:1364
void DECLSPEC_NORETURN WINAPI RpcRaiseException(RPC_STATUS exception)
Definition: rpcrt4_main.c:189
const struct _MIDL_STUB_DESC * StubDesc
Definition: rpcndr.h:230
GLuint buffer
Definition: glext.h:5915
Definition: match.c:390
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define FIXME(fmt,...)
Definition: debug.h:110
GLsizeiptr size
Definition: glext.h:5919
static unsigned stack_offset(compile_ctx_t *ctx)
Definition: compile.c:349
GLfloat param
Definition: glext.h:5796
const unsigned char * PFORMAT_STRING
Definition: rpcndr.h:176
unsigned short stack_size
Definition: cookie.c:170
static unsigned int type_stack_size(unsigned char fc)
Definition: ndr_stubless.c:533
#define RPC_S_INTERNAL_ERROR
Definition: winerror.h:1074
struct _NDR_PARAM_OI_OTHER NDR_PARAM_OI_OTHER
struct _NDR_PARAM_OI_BASETYPE NDR_PARAM_OI_BASETYPE
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66

Referenced by ndr_async_client_call(), ndr_client_call(), NdrMesProcEncodeDecode(), and NdrStubCall2().

◆ ndr_async_client_call()

LONG_PTR CDECL ndr_async_client_call ( PMIDL_STUB_DESC  pStubDesc,
PFORMAT_STRING  pFormat,
void **  stack_top 
)

Definition at line 1576 of file ndr_stubless.c.

1578 {
1579  /* pointer to start of stack where arguments start */
1580  PRPC_MESSAGE pRpcMsg;
1582  RPC_ASYNC_STATE *pAsync;
1584  /* procedure number */
1585  unsigned short procedure_number;
1586  /* cache of Oif_flags from v2 procedure header */
1587  INTERPRETER_OPT_FLAGS Oif_flags = { 0 };
1588  /* cache of extension flags from NDR_PROC_HEADER_EXTS */
1589  INTERPRETER_OPT_FLAGS2 ext_flags = { 0 };
1590  /* header for procedure string */
1591  const NDR_PROC_HEADER * pProcHeader = (const NDR_PROC_HEADER *)&pFormat[0];
1593 
1594  TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat);
1595 
1596  /* Later NDR language versions probably won't be backwards compatible */
1597  if (pStubDesc->Version > 0x50002)
1598  {
1599  FIXME("Incompatible stub description version: 0x%x\n", pStubDesc->Version);
1601  }
1602 
1606 
1608  pRpcMsg = (PRPC_MESSAGE)(pStubMsg + 1);
1609 
1611  {
1612  const NDR_PROC_HEADER_RPC *header_rpc = (const NDR_PROC_HEADER_RPC *)&pFormat[0];
1613  async_call_data->stack_size = header_rpc->stack_size;
1614  procedure_number = header_rpc->proc_num;
1615  pFormat += sizeof(NDR_PROC_HEADER_RPC);
1616  }
1617  else
1618  {
1620  procedure_number = pProcHeader->proc_num;
1621  pFormat += sizeof(NDR_PROC_HEADER);
1622  }
1623  TRACE("stack size: 0x%x\n", async_call_data->stack_size);
1624  TRACE("proc num: %d\n", procedure_number);
1625 
1626  /* create the full pointer translation tables, if requested */
1629 
1631  {
1632  ERR("objects not supported\n");
1635  }
1636 
1637  NdrClientInitializeNew(pRpcMsg, pStubMsg, pStubDesc, procedure_number);
1638 
1639  TRACE("Oi_flags = 0x%02x\n", pProcHeader->Oi_flags);
1640  TRACE("MIDL stub version = 0x%x\n", pStubDesc->MIDLVersion);
1641 
1642  /* needed for conformance of top-level objects */
1645 
1646  pAsync = *(RPC_ASYNC_STATE **)pStubMsg->StackTop;
1647  pAsync->StubInfo = async_call_data;
1648  async_call_data->pHandleFormat = pFormat;
1649 
1651  if (!pFormat) goto done;
1652 
1653  if (is_oicf_stubdesc(pStubDesc))
1654  {
1655  const NDR_PROC_PARTIAL_OIF_HEADER *pOIFHeader =
1656  (const NDR_PROC_PARTIAL_OIF_HEADER *)pFormat;
1657 
1658  Oif_flags = pOIFHeader->Oi2Flags;
1660 
1661  pFormat += sizeof(NDR_PROC_PARTIAL_OIF_HEADER);
1662 
1663  TRACE("Oif_flags = %s\n", debugstr_INTERPRETER_OPT_FLAGS(Oif_flags) );
1664 
1665  if (Oif_flags.HasExtensions)
1666  {
1667  const NDR_PROC_HEADER_EXTS *pExtensions =
1668  (const NDR_PROC_HEADER_EXTS *)pFormat;
1669  ext_flags = pExtensions->Flags2;
1670  pFormat += pExtensions->Size;
1671  }
1672  }
1673  else
1674  {
1675  pFormat = convert_old_args( pStubMsg, pFormat, async_call_data->stack_size,
1679  }
1680 
1681  async_call_data->pParamFormat = pFormat;
1682 
1683  pStubMsg->BufferLength = 0;
1684 
1685  /* store the RPC flags away */
1687  pRpcMsg->RpcFlags = ((const NDR_PROC_HEADER_RPC *)pProcHeader)->rpc_flags;
1688 
1689  /* use alternate memory allocation routines */
1692 
1693  if (Oif_flags.HasPipes)
1694  {
1695  FIXME("pipes not supported yet\n");
1696  RpcRaiseException(RPC_X_WRONG_STUB_VERSION); /* FIXME: remove when implemented */
1697  /* init pipes package */
1698  /* NdrPipesInitialize(...) */
1699  }
1700  if (ext_flags.HasNewCorrDesc)
1701  {
1702  /* initialize extra correlation package */
1704  if (ext_flags.Unused & 0x2) /* has range on conformance */
1706  }
1707 
1708  /* order of phases:
1709  * 1. CALCSIZE - calculate the buffer size
1710  * 2. GETBUFFER - allocate the buffer
1711  * 3. MARSHAL - marshal [in] params into the buffer
1712  * 4. SENDRECEIVE - send buffer
1713  * Then in NdrpCompleteAsyncClientCall:
1714  * 1. SENDRECEIVE - receive buffer
1715  * 2. UNMARSHAL - unmarshal [out] params from buffer
1716  */
1717 
1718  /* 1. CALCSIZE */
1719  TRACE( "CALCSIZE\n" );
1721 
1722  /* 2. GETBUFFER */
1723  TRACE( "GETBUFFER\n" );
1724  if (Oif_flags.HasPipes)
1725  /* NdrGetPipeBuffer(...) */
1726  FIXME("pipes not supported yet\n");
1727  else
1728  {
1730 #if 0
1732 #else
1733  FIXME("using auto handle - call NdrNsGetBuffer when it gets implemented\n");
1734 #endif
1735  else
1737  }
1738  pRpcMsg->RpcFlags |= RPC_BUFFER_ASYNC;
1739  status = I_RpcAsyncSetHandle(pRpcMsg, pAsync);
1740  if (status != RPC_S_OK)
1742 
1743  /* 3. MARSHAL */
1744  TRACE( "MARSHAL\n" );
1746 
1747  /* 4. SENDRECEIVE */
1748  TRACE( "SEND\n" );
1749  pRpcMsg->RpcFlags |= RPC_BUFFER_ASYNC;
1750  /* send the [in] params only */
1751  if (Oif_flags.HasPipes)
1752  /* NdrPipesSend(...) */
1753  FIXME("pipes not supported yet\n");
1754  else
1755  {
1757 #if 0
1758  NdrNsSend(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle);
1759 #else
1760  FIXME("using auto handle - call NdrNsSend when it gets implemented\n");
1761 #endif
1762  else
1763  {
1764  pStubMsg->RpcMsg->BufferLength = pStubMsg->Buffer - (unsigned char *)pStubMsg->RpcMsg->Buffer;
1766  if (status != RPC_S_OK)
1768  }
1769  }
1770 
1771 done:
1772  TRACE("returning 0\n");
1773  return 0;
1774 }
unsigned short stack_size
Definition: ndr_stubless.h:93
void client_do_args(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase, void **fpu_args, unsigned short number_of_params, unsigned char *pRetVal)
Definition: ndr_stubless.c:469
#define RPC_X_NO_MEMORY
Definition: rpcnterr.h:35
ULONG_PTR NdrCorrCache[256]
RPCRTAPI unsigned char *RPC_ENTRY NdrNsGetBuffer(PMIDL_STUB_MESSAGE pStubMsg, ULONG BufferLength, RPC_BINDING_HANDLE Handle)
MIDL_STUB_MESSAGE * pStubMsg
void WINAPI I_RpcFree(void *Object)
Definition: rpcrt4_main.c:725
INTERPRETER_OPT_FLAGS2 Flags2
Definition: ndrtypes.h:99
void DECLSPEC_NORETURN WINAPI RpcRaiseException(RPC_STATUS exception)
Definition: rpcrt4_main.c:189
unsigned char * Buffer
Definition: rpcndr.h:203
struct _FULL_PTR_XLAT_TABLES * FullPtrXlatTables
Definition: rpcndr.h:231
unsigned char Unused
Definition: ndrtypes.h:89
PRPC_MESSAGE RpcMsg
Definition: rpcndr.h:202
#define Oi_RPCSS_ALLOC_USED
Definition: ndrtypes.h:291
unsigned int number_of_params
RPC_BINDING_HANDLE hBinding
unsigned int BufferLength
Definition: rpcdcep.h:41
long RPC_STATUS
Definition: rpc.h:52
void * Buffer
Definition: rpcdcep.h:40
void * StubInfo
Definition: rpcasync.h:150
struct _RPC_MESSAGE * PRPC_MESSAGE
#define FIXME(fmt,...)
Definition: debug.h:110
INTERPRETER_OPT_FLAGS Oi2Flags
Definition: ndr_stubless.h:107
union _MIDL_STUB_DESC::@3090 IMPLICIT_HANDLE_INFO
unsigned short proc_num
Definition: ndr_stubless.h:67
smooth NULL
Definition: ftsmooth.c:416
unsigned short proc_num
Definition: ndr_stubless.h:92
void WINAPI NdrCorrelationInitialize(PMIDL_STUB_MESSAGE pStubMsg, void *pMemory, ULONG CacheSize, ULONG Flags)
static jsval_t stack_top(script_ctx_t *ctx)
Definition: engine.c:102
#define Oi_FULL_PTR_USED
Definition: ndrtypes.h:290
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:581
#define TRACE(s)
Definition: solgame.cpp:4
unsigned char handle_type
Definition: ndr_stubless.h:43
struct _NDR_PROC_HEADER NDR_PROC_HEADER
unsigned char HasPipes
Definition: ndrtypes.h:64
static PFORMAT_STRING client_get_handle(PMIDL_STUB_MESSAGE pStubMsg, const NDR_PROC_HEADER *pProcHeader, PFORMAT_STRING pFormat, handle_t *phBinding)
Definition: ndr_stubless.c:275
RPC_STATUS WINAPI I_RpcAsyncSetHandle(PRPC_MESSAGE pMsg, PRPC_ASYNC_STATE pAsync)
Definition: rpc_message.c:1949
ULONG RpcFlags
Definition: rpcdcep.h:48
unsigned short stack_size
LONG MIDLVersion
Definition: rpcndr.h:378
struct _NDR_PROC_PARTIAL_OIF_HEADER NDR_PROC_PARTIAL_OIF_HEADER
#define RPC_BUFFER_ASYNC
Definition: rpcdcep.h:70
unsigned char HasNewCorrDesc
Definition: ndrtypes.h:76
#define Oi_HAS_RPCFLAGS
Definition: ndrtypes.h:293
ULONG BufferLength
Definition: rpcndr.h:207
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char Oi_flags
Definition: ndr_stubless.h:64
PFORMAT_STRING pParamFormat
#define ERR(fmt,...)
Definition: debug.h:109
unsigned short stack_size
Definition: ndr_stubless.h:71
static const char * debugstr_INTERPRETER_OPT_FLAGS(INTERPRETER_OPT_FLAGS Oi2Flags)
Definition: ndr_stubless.c:257
PFULL_PTR_XLAT_TABLES WINAPI NdrFullPointerXlatInit(ULONG NumberOfPointers, XLAT_SIDE XlatSide)
handle_t * pAutoHandle
Definition: rpcndr.h:366
struct _NDR_PROC_HEADER_RPC NDR_PROC_HEADER_RPC
unsigned char * StackTop
Definition: rpcndr.h:226
ULONG Version
Definition: rpcndr.h:376
#define Oi_OBJECT_PROC
Definition: ndrtypes.h:292
#define RPC_X_WRONG_STUB_VERSION
Definition: winerror.h:1136
void WINAPI NdrRpcSmSetClientToOsf(PMIDL_STUB_MESSAGE pMessage)
Definition: ndr_stubless.c:228
unsigned char *WINAPI NdrGetBuffer(PMIDL_STUB_MESSAGE stubmsg, ULONG buflen, RPC_BINDING_HANDLE handle)
RPC_STATUS WINAPI I_RpcSend(PRPC_MESSAGE pMsg)
Definition: rpc_message.c:1790
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG x2
Definition: winddi.h:3706
const NDR_PROC_HEADER * pProcHeader
unsigned char CorrDespIncrement
Definition: rpcndr.h:218
#define RPC_X_BAD_STUB_DATA
Definition: winerror.h:1090
void WINAPI NdrClientInitializeNew(PRPC_MESSAGE pRpcMessage, PMIDL_STUB_MESSAGE pStubMsg, PMIDL_STUB_DESC pStubDesc, unsigned int ProcNum)
unsigned char HasExtensions
Definition: ndrtypes.h:68
struct _MIDL_STUB_MESSAGE * PMIDL_STUB_MESSAGE
static SERVICE_STATUS status
Definition: service.c:31
void *WINAPI I_RpcAllocate(unsigned int Size)
Definition: rpcrt4_main.c:717
static BOOL is_oicf_stubdesc(const PMIDL_STUB_DESC pStubDesc)
Definition: ndr_stubless.c:52
#define RPC_S_OK
Definition: rpcnterr.h:22
unsigned char Size
Definition: ndrtypes.h:97
PFORMAT_STRING pHandleFormat
Definition: ps.c:97

Referenced by NdrAsyncClientCall().

◆ ndr_client_call()

LONG_PTR CDECL ndr_client_call ( PMIDL_STUB_DESC  pStubDesc,
PFORMAT_STRING  pFormat,
void **  stack_top,
void **  fpu_stack 
)

Definition at line 652 of file ndr_stubless.c.

654 {
655  /* pointer to start of stack where arguments start */
656  RPC_MESSAGE rpcMsg;
657  MIDL_STUB_MESSAGE stubMsg;
659  /* procedure number */
660  unsigned short procedure_number;
661  /* size of stack */
662  unsigned short stack_size;
663  /* number of parameters. optional for client to give it to us */
664  unsigned int number_of_params;
665  /* cache of Oif_flags from v2 procedure header */
666  INTERPRETER_OPT_FLAGS Oif_flags = { 0 };
667  /* cache of extension flags from NDR_PROC_HEADER_EXTS */
668  INTERPRETER_OPT_FLAGS2 ext_flags = { 0 };
669  /* header for procedure string */
670  const NDR_PROC_HEADER * pProcHeader = (const NDR_PROC_HEADER *)&pFormat[0];
671  /* the value to return to the client from the remote procedure */
672  LONG_PTR RetVal = 0;
673  /* the pointer to the object when in OLE mode */
674  void * This = NULL;
676  /* correlation cache */
677  ULONG_PTR NdrCorrCache[256];
678 
679  TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat);
680 
681  TRACE("NDR Version: 0x%x\n", pStubDesc->Version);
682 
684  {
685  const NDR_PROC_HEADER_RPC *header_rpc = (const NDR_PROC_HEADER_RPC *)&pFormat[0];
686  stack_size = header_rpc->stack_size;
687  procedure_number = header_rpc->proc_num;
688  pFormat += sizeof(NDR_PROC_HEADER_RPC);
689  }
690  else
691  {
693  procedure_number = pProcHeader->proc_num;
694  pFormat += sizeof(NDR_PROC_HEADER);
695  }
696  TRACE("stack size: 0x%x\n", stack_size);
697  TRACE("proc num: %d\n", procedure_number);
698 
699  /* create the full pointer translation tables, if requested */
702 
704  {
705  /* object is always the first argument */
706  This = stack_top[0];
707  NdrProxyInitialize(This, &rpcMsg, &stubMsg, pStubDesc, procedure_number);
708  }
709  else
710  NdrClientInitializeNew(&rpcMsg, &stubMsg, pStubDesc, procedure_number);
711 
712  TRACE("Oi_flags = 0x%02x\n", pProcHeader->Oi_flags);
713  TRACE("MIDL stub version = 0x%x\n", pStubDesc->MIDLVersion);
714 
715  stubMsg.StackTop = (unsigned char *)stack_top;
716  pHandleFormat = pFormat;
717 
718  /* we only need a handle if this isn't an object method */
720  {
721  pFormat = client_get_handle(&stubMsg, pProcHeader, pHandleFormat, &hBinding);
722  if (!pFormat) goto done;
723  }
724 
725  if (is_oicf_stubdesc(pStubDesc)) /* -Oicf format */
726  {
727  const NDR_PROC_PARTIAL_OIF_HEADER *pOIFHeader =
728  (const NDR_PROC_PARTIAL_OIF_HEADER *)pFormat;
729 
730  Oif_flags = pOIFHeader->Oi2Flags;
731  number_of_params = pOIFHeader->number_of_params;
732 
733  pFormat += sizeof(NDR_PROC_PARTIAL_OIF_HEADER);
734 
735  TRACE("Oif_flags = %s\n", debugstr_INTERPRETER_OPT_FLAGS(Oif_flags) );
736 
737  if (Oif_flags.HasExtensions)
738  {
739  const NDR_PROC_HEADER_EXTS *pExtensions = (const NDR_PROC_HEADER_EXTS *)pFormat;
740  ext_flags = pExtensions->Flags2;
741  pFormat += pExtensions->Size;
742 #ifdef __x86_64__
743  if (pExtensions->Size > sizeof(*pExtensions) && fpu_stack)
744  {
745  int i;
746  unsigned short fpu_mask = *(unsigned short *)(pExtensions + 1);
747  for (i = 0; i < 4; i++, fpu_mask >>= 2)
748  switch (fpu_mask & 3)
749  {
750  case 1: *(float *)&stack_top[i] = *(float *)&fpu_stack[i]; break;
751  case 2: *(double *)&stack_top[i] = *(double *)&fpu_stack[i]; break;
752  }
753  }
754 #endif
755  }
756  }
757  else
758  {
759  pFormat = convert_old_args( &stubMsg, pFormat, stack_size,
761  /* reuse the correlation cache, it's not needed for v1 format */
763  }
764 
765  stubMsg.BufferLength = 0;
766 
767  /* store the RPC flags away */
769  rpcMsg.RpcFlags = ((const NDR_PROC_HEADER_RPC *)pProcHeader)->rpc_flags;
770 
771  /* use alternate memory allocation routines */
773  NdrRpcSmSetClientToOsf(&stubMsg);
774 
775  if (Oif_flags.HasPipes)
776  {
777  FIXME("pipes not supported yet\n");
778  RpcRaiseException(RPC_X_WRONG_STUB_VERSION); /* FIXME: remove when implemented */
779  /* init pipes package */
780  /* NdrPipesInitialize(...) */
781  }
782  if (ext_flags.HasNewCorrDesc)
783  {
784  /* initialize extra correlation package */
785  NdrCorrelationInitialize(&stubMsg, NdrCorrCache, sizeof(NdrCorrCache), 0);
786  if (ext_flags.Unused & 0x2) /* has range on conformance */
787  stubMsg.CorrDespIncrement = 12;
788  }
789 
790  /* order of phases:
791  * 1. INITOUT - zero [out] parameters (proxies only)
792  * 2. CALCSIZE - calculate the buffer size
793  * 3. GETBUFFER - allocate the buffer
794  * 4. MARSHAL - marshal [in] params into the buffer
795  * 5. SENDRECEIVE - send/receive buffer
796  * 6. UNMARSHAL - unmarshal [out] params from buffer
797  * 7. FREE - clear [out] parameters (for proxies, and only on error)
798  */
801  {
802  /* 1. INITOUT */
804  {
805  TRACE( "INITOUT\n" );
806  client_do_args(&stubMsg, pFormat, STUBLESS_INITOUT, fpu_stack,
807  number_of_params, (unsigned char *)&RetVal);
808  }
809 
810  __TRY
811  {
812  /* 2. CALCSIZE */
813  TRACE( "CALCSIZE\n" );
814  client_do_args(&stubMsg, pFormat, STUBLESS_CALCSIZE, fpu_stack,
815  number_of_params, (unsigned char *)&RetVal);
816 
817  /* 3. GETBUFFER */
818  TRACE( "GETBUFFER\n" );
820  {
821  /* allocate the buffer */
822  NdrProxyGetBuffer(This, &stubMsg);
823  }
824  else
825  {
826  /* allocate the buffer */
827  if (Oif_flags.HasPipes)
828  /* NdrGetPipeBuffer(...) */
829  FIXME("pipes not supported yet\n");
830  else
831  {
833 #if 0
834  NdrNsGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding);
835 #else
836  FIXME("using auto handle - call NdrNsGetBuffer when it gets implemented\n");
837 #endif
838  else
839  NdrGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding);
840  }
841  }
842 
843  /* 4. MARSHAL */
844  TRACE( "MARSHAL\n" );
845  client_do_args(&stubMsg, pFormat, STUBLESS_MARSHAL, fpu_stack,
846  number_of_params, (unsigned char *)&RetVal);
847 
848  /* 5. SENDRECEIVE */
849  TRACE( "SENDRECEIVE\n" );
851  {
852  /* send the [in] params and receive the [out] and [retval]
853  * params */
854  NdrProxySendReceive(This, &stubMsg);
855  }
856  else
857  {
858  /* send the [in] params and receive the [out] and [retval]
859  * params */
860  if (Oif_flags.HasPipes)
861  /* NdrPipesSendReceive(...) */
862  FIXME("pipes not supported yet\n");
863  else
864  {
866 #if 0
867  NdrNsSendReceive(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle);
868 #else
869  FIXME("using auto handle - call NdrNsSendReceive when it gets implemented\n");
870 #endif
871  else
872  NdrSendReceive(&stubMsg, stubMsg.Buffer);
873  }
874  }
875 
876  /* convert strings, floating point values and endianness into our
877  * preferred format */
878  if ((rpcMsg.DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)
879  NdrConvert(&stubMsg, pFormat);
880 
881  /* 6. UNMARSHAL */
882  TRACE( "UNMARSHAL\n" );
883  client_do_args(&stubMsg, pFormat, STUBLESS_UNMARSHAL, fpu_stack,
884  number_of_params, (unsigned char *)&RetVal);
885  }
887  {
889  {
890  /* 7. FREE */
891  TRACE( "FREE\n" );
892  client_do_args(&stubMsg, pFormat, STUBLESS_FREE, fpu_stack,
893  number_of_params, (unsigned char *)&RetVal);
895  }
896  else
897  {
898  const COMM_FAULT_OFFSETS *comm_fault_offsets = &pStubDesc->CommFaultOffsets[procedure_number];
899  ULONG *comm_status;
900  ULONG *fault_status;
901 
902  TRACE("comm_fault_offsets = {0x%hx, 0x%hx}\n", comm_fault_offsets->CommOffset, comm_fault_offsets->FaultOffset);
903 
904  if (comm_fault_offsets->CommOffset == -1)
905  comm_status = (ULONG *)&RetVal;
906  else if (comm_fault_offsets->CommOffset >= 0)
907  comm_status = *(ULONG **)ARG_FROM_OFFSET(stubMsg.StackTop, comm_fault_offsets->CommOffset);
908  else
909  comm_status = NULL;
910 
911  if (comm_fault_offsets->FaultOffset == -1)
912  fault_status = (ULONG *)&RetVal;
913  else if (comm_fault_offsets->FaultOffset >= 0)
914  fault_status = *(ULONG **)ARG_FROM_OFFSET(stubMsg.StackTop, comm_fault_offsets->FaultOffset);
915  else
916  fault_status = NULL;
917 
918  NdrMapCommAndFaultStatus(&stubMsg, comm_status, fault_status,
919  GetExceptionCode());
920  }
921  }
922  __ENDTRY
923  }
924  else
925  {
926  /* 2. CALCSIZE */
927  TRACE( "CALCSIZE\n" );
928  client_do_args(&stubMsg, pFormat, STUBLESS_CALCSIZE, fpu_stack,
929  number_of_params, (unsigned char *)&RetVal);
930 
931  /* 3. GETBUFFER */
932  TRACE( "GETBUFFER\n" );
933  if (Oif_flags.HasPipes)
934  /* NdrGetPipeBuffer(...) */
935  FIXME("pipes not supported yet\n");
936  else
937  {
939 #if 0
940  NdrNsGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding);
941 #else
942  FIXME("using auto handle - call NdrNsGetBuffer when it gets implemented\n");
943 #endif
944  else
945  NdrGetBuffer(&stubMsg, stubMsg.BufferLength, hBinding);
946  }
947 
948  /* 4. MARSHAL */
949  TRACE( "MARSHAL\n" );
950  client_do_args(&stubMsg, pFormat, STUBLESS_MARSHAL, fpu_stack,
951  number_of_params, (unsigned char *)&RetVal);
952 
953  /* 5. SENDRECEIVE */
954  TRACE( "SENDRECEIVE\n" );
955  if (Oif_flags.HasPipes)
956  /* NdrPipesSendReceive(...) */
957  FIXME("pipes not supported yet\n");
958  else
959  {
961 #if 0
962  NdrNsSendReceive(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle);
963 #else
964  FIXME("using auto handle - call NdrNsSendReceive when it gets implemented\n");
965 #endif
966  else
967  NdrSendReceive(&stubMsg, stubMsg.Buffer);
968  }
969 
970  /* convert strings, floating point values and endianness into our
971  * preferred format */
972  if ((rpcMsg.DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)
973  NdrConvert(&stubMsg, pFormat);
974 
975  /* 6. UNMARSHAL */
976  TRACE( "UNMARSHAL\n" );
977  client_do_args(&stubMsg, pFormat, STUBLESS_UNMARSHAL, fpu_stack,
978  number_of_params, (unsigned char *)&RetVal);
979  }
980 
981  if (ext_flags.HasNewCorrDesc)
982  {
983  /* free extra correlation package */
984  NdrCorrelationFree(&stubMsg);
985  }
986 
987  if (Oif_flags.HasPipes)
988  {
989  /* NdrPipesDone(...) */
990  }
991 
992  /* free the full pointer translation tables */
995 
996  /* free marshalling buffer */
998  NdrProxyFreeBuffer(This, &stubMsg);
999  else
1000  {
1001  NdrFreeBuffer(&stubMsg);
1003  }
1004 
1005 done:
1006  TRACE("RetVal = 0x%lx\n", RetVal);
1007  return RetVal;
1008 }
unsigned short stack_size
Definition: ndr_stubless.h:93
void client_do_args(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase, void **fpu_args, unsigned short number_of_params, unsigned char *pRetVal)
Definition: ndr_stubless.c:469
ULONG_PTR NdrCorrCache[256]
RPCRTAPI unsigned char *RPC_ENTRY NdrNsGetBuffer(PMIDL_STUB_MESSAGE pStubMsg, ULONG BufferLength, RPC_BINDING_HANDLE Handle)
handle_t hBinding
Definition: ctx_c.c:54
void WINAPI NdrFullPointerXlatFree(PFULL_PTR_XLAT_TABLES pXlatTables)
INTERPRETER_OPT_FLAGS2 Flags2
Definition: ndrtypes.h:99
void WINAPI NdrProxyFreeBuffer(void *This, PMIDL_STUB_MESSAGE pStubMsg)
Definition: cproxy.c:531
void WINAPI NdrProxySendReceive(void *This, PMIDL_STUB_MESSAGE pStubMsg)
Definition: cproxy.c:497
void DECLSPEC_NORETURN WINAPI RpcRaiseException(RPC_STATUS exception)
Definition: rpcrt4_main.c:189
unsigned char * Buffer
Definition: rpcndr.h:203
struct _FULL_PTR_XLAT_TABLES * FullPtrXlatTables
Definition: rpcndr.h:231
unsigned char Unused
Definition: ndrtypes.h:89
void WINAPI NdrConvert(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat)
#define Oi_RPCSS_ALLOC_USED
Definition: ndrtypes.h:291
unsigned int number_of_params
void WINAPI NdrProxyGetBuffer(void *This, PMIDL_STUB_MESSAGE pStubMsg)
Definition: cproxy.c:469
uint32_t ULONG_PTR
Definition: typedefs.h:63
static void client_free_handle(PMIDL_STUB_MESSAGE pStubMsg, const NDR_PROC_HEADER *pProcHeader, PFORMAT_STRING pFormat, handle_t hBinding)
Definition: ndr_stubless.c:374
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define FIXME(fmt,...)
Definition: debug.h:110
INTERPRETER_OPT_FLAGS Oi2Flags
Definition: ndr_stubless.h:107
union _MIDL_STUB_DESC::@3090 IMPLICIT_HANDLE_INFO
unsigned short proc_num
Definition: ndr_stubless.h:67
HRESULT WINAPI NdrProxyErrorHandler(DWORD dwExceptionCode)
Definition: cproxy.c:547
smooth NULL
Definition: ftsmooth.c:416
unsigned short proc_num
Definition: ndr_stubless.h:92
void WINAPI NdrCorrelationInitialize(PMIDL_STUB_MESSAGE pStubMsg, void *pMemory, ULONG CacheSize, ULONG Flags)
static jsval_t stack_top(script_ctx_t *ctx)
Definition: engine.c:102
#define __TRY
Definition: compat.h:70
#define Oi_FULL_PTR_USED
Definition: ndrtypes.h:290
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:581
#define GetExceptionCode()
Definition: exception.h:65
#define TRACE(s)
Definition: solgame.cpp:4
unsigned char handle_type
Definition: ndr_stubless.h:43
struct _NDR_PROC_HEADER NDR_PROC_HEADER
unsigned char HasPipes
Definition: ndrtypes.h:64
static PFORMAT_STRING client_get_handle(PMIDL_STUB_MESSAGE pStubMsg, const NDR_PROC_HEADER *pProcHeader, PFORMAT_STRING pFormat, handle_t *phBinding)
Definition: ndr_stubless.c:275
const unsigned char * PFORMAT_STRING
Definition: rpcndr.h:176
ULONG RpcFlags
Definition: rpcdcep.h:48
unsigned short stack_size
LONG MIDLVersion
Definition: rpcndr.h:378
struct _NDR_PROC_PARTIAL_OIF_HEADER NDR_PROC_PARTIAL_OIF_HEADER
unsigned char HasNewCorrDesc
Definition: ndrtypes.h:76
#define Oi_HAS_RPCFLAGS
Definition: ndrtypes.h:293
ULONG BufferLength
Definition: rpcndr.h:207
const COMM_FAULT_OFFSETS * CommFaultOffsets
Definition: rpcndr.h:379
#define __ENDTRY
Definition: compat.h:72
unsigned char Oi_flags
Definition: ndr_stubless.h:64
unsigned short stack_size
Definition: ndr_stubless.h:71
static const char * debugstr_INTERPRETER_OPT_FLAGS(INTERPRETER_OPT_FLAGS Oi2Flags)
Definition: ndr_stubless.c:257
#define NDR_LOCAL_DATA_REPRESENTATION
Definition: rpcndr.h:107
PFULL_PTR_XLAT_TABLES WINAPI NdrFullPointerXlatInit(ULONG NumberOfPointers, XLAT_SIDE XlatSide)
handle_t * pAutoHandle
Definition: rpcndr.h:366
RPCRTAPI unsigned char *RPC_ENTRY NdrNsSendReceive(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pBufferEnd, RPC_BINDING_HANDLE *pAutoHandle)
struct _NDR_PROC_HEADER_RPC NDR_PROC_HEADER_RPC
void WINAPI NdrFreeBuffer(PMIDL_STUB_MESSAGE pStubMsg)
unsigned char * StackTop
Definition: rpcndr.h:226
ULONG Version
Definition: rpcndr.h:376
#define Oi_OBJECT_PROC
Definition: ndrtypes.h:292
#define RPC_X_WRONG_STUB_VERSION
Definition: winerror.h:1136
void WINAPI NdrRpcSmSetClientToOsf(PMIDL_STUB_MESSAGE pMessage)
Definition: ndr_stubless.c:228
unsigned char *WINAPI NdrGetBuffer(PMIDL_STUB_MESSAGE stubmsg, ULONG buflen, RPC_BINDING_HANDLE handle)
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
void WINAPI NdrCorrelationFree(PMIDL_STUB_MESSAGE pStubMsg)
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG x2
Definition: winddi.h:3706
unsigned char *WINAPI NdrSendReceive(PMIDL_STUB_MESSAGE stubmsg, unsigned char *buffer)
const NDR_PROC_HEADER * pProcHeader
unsigned char CorrDespIncrement
Definition: rpcndr.h:218
#define Oi_HAS_COMM_OR_FAULT
Definition: ndrtypes.h:295
void WINAPI NdrClientInitializeNew(PRPC_MESSAGE pRpcMessage, PMIDL_STUB_MESSAGE pStubMsg, PMIDL_STUB_DESC pStubDesc, unsigned int ProcNum)
unsigned int ULONG
Definition: retypes.h:1
void WINAPI NdrProxyInitialize(void *This, PRPC_MESSAGE pRpcMsg, PMIDL_STUB_MESSAGE pStubMsg, PMIDL_STUB_DESC pStubDescriptor, unsigned int ProcNum)
Definition: cproxy.c:451
unsigned char HasExtensions
Definition: ndrtypes.h:68
RPC_STATUS RPC_ENTRY NdrMapCommAndFaultStatus(PMIDL_STUB_MESSAGE pStubMsg, ULONG *pCommStatus, ULONG *pFaultStatus, RPC_STATUS Status)
ULONG DataRepresentation
Definition: rpcdcep.h:39
#define ARG_FROM_OFFSET(args, offset)
Definition: ndr_stubless.c:273
static BOOL is_oicf_stubdesc(const PMIDL_STUB_DESC pStubDesc)
Definition: ndr_stubless.c:52
unsigned char Size
Definition: ndrtypes.h:97
#define __EXCEPT_ALL
Definition: exception.h:60
PFORMAT_STRING pHandleFormat

Referenced by NdrClientCall2().

◆ NdrpCompleteAsyncClientCall()

RPC_STATUS NdrpCompleteAsyncClientCall ( RPC_ASYNC_STATE pAsync,
void Reply 
)

Definition at line 1776 of file ndr_stubless.c.

1777 {
1778  /* pointer to start of stack where arguments start */
1781  /* header for procedure string */
1782  const NDR_PROC_HEADER * pProcHeader;
1784 
1785  if (!pAsync->StubInfo)
1787 
1788  async_call_data = pAsync->StubInfo;
1791 
1792  /* order of phases:
1793  * 1. CALCSIZE - calculate the buffer size
1794  * 2. GETBUFFER - allocate the buffer
1795  * 3. MARSHAL - marshal [in] params into the buffer
1796  * 4. SENDRECEIVE - send buffer
1797  * Then in NdrpCompleteAsyncClientCall:
1798  * 1. SENDRECEIVE - receive buffer
1799  * 2. UNMARSHAL - unmarshal [out] params from buffer
1800  */
1801 
1802  /* 1. SENDRECEIVE */
1803  TRACE( "RECEIVE\n" );
1805  /* receive the [out] params */
1807 #if 0
1808  NdrNsReceive(&stubMsg, stubMsg.Buffer, pStubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle);
1809 #else
1810  FIXME("using auto handle - call NdrNsReceive when it gets implemented\n");
1811 #endif
1812  else
1813  {
1815  if (status != RPC_S_OK)
1816  goto cleanup;
1821  }
1822 
1823  /* convert strings, floating point values and endianness into our
1824  * preferred format */
1825 #if 0
1827  NdrConvert(pStubMsg, pFormat);
1828 #endif
1829 
1830  /* 2. UNMARSHAL */
1831  TRACE( "UNMARSHAL\n" );
1834 
1835 cleanup:
1837  {
1838  /* free extra correlation package */
1840  }
1841 
1842  /* free the full pointer translation tables */
1845 
1846  /* free marshalling buffer */
1849 
1852 
1853  TRACE("-- 0x%x\n", status);
1854  return status;
1855 }
void client_do_args(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase, void **fpu_args, unsigned short number_of_params, unsigned char *pRetVal)
Definition: ndr_stubless.c:469
MIDL_STUB_MESSAGE * pStubMsg
void WINAPI I_RpcFree(void *Object)
Definition: rpcrt4_main.c:725
void WINAPI NdrFullPointerXlatFree(PFULL_PTR_XLAT_TABLES pXlatTables)
unsigned char * Buffer
Definition: rpcndr.h:203
struct _FULL_PTR_XLAT_TABLES * FullPtrXlatTables
Definition: rpcndr.h:231
PRPC_MESSAGE RpcMsg
Definition: rpcndr.h:202
void WINAPI NdrConvert(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat)
unsigned int number_of_params
RPC_BINDING_HANDLE hBinding
unsigned int BufferLength
Definition: rpcdcep.h:41
static void client_free_handle(PMIDL_STUB_MESSAGE pStubMsg, const NDR_PROC_HEADER *pProcHeader, PFORMAT_STRING pFormat, handle_t hBinding)
Definition: ndr_stubless.c:374
long RPC_STATUS
Definition: rpc.h:52
void * Buffer
Definition: rpcdcep.h:40
void * StubInfo
Definition: rpcasync.h:150
#define FIXME(fmt,...)
Definition: debug.h:110
smooth NULL
Definition: ftsmooth.c:416
unsigned int fHasNewCorrDesc
Definition: rpcndr.h:239
#define Oi_FULL_PTR_USED
Definition: ndrtypes.h:290
#define TRACE(s)
Definition: solgame.cpp:4
unsigned char handle_type
Definition: ndr_stubless.h:43
ULONG RpcFlags
Definition: rpcdcep.h:48
#define RPC_BUFFER_ASYNC
Definition: rpcdcep.h:70
unsigned char * BufferStart
Definition: rpcndr.h:204
ULONG BufferLength
Definition: rpcndr.h:207
unsigned char * BufferEnd
Definition: rpcndr.h:205
unsigned char Oi_flags
Definition: ndr_stubless.h:64
PFORMAT_STRING pParamFormat
#define NDR_LOCAL_DATA_REPRESENTATION
Definition: rpcndr.h:107
void WINAPI NdrFreeBuffer(PMIDL_STUB_MESSAGE pStubMsg)
unsigned char * StackTop
Definition: rpcndr.h:226
void WINAPI NdrCorrelationFree(PMIDL_STUB_MESSAGE pStubMsg)
const NDR_PROC_HEADER * pProcHeader
char * cleanup(char *str)
Definition: wpickclick.c:99
ULONG DataRepresentation
Definition: rpcdcep.h:39
static SERVICE_STATUS status
Definition: service.c:31
#define RPC_S_INVALID_ASYNC_HANDLE
Definition: winerror.h:1156
#define RPC_S_OK
Definition: rpcnterr.h:22
RPC_STATUS WINAPI I_RpcReceive(PRPC_MESSAGE pMsg)
Definition: rpc_message.c:1857
PFORMAT_STRING pHandleFormat
Definition: ps.c:97

Referenced by RpcAsyncCompleteCall().