📄 ndr_stubless.c
字号:
/* zero-based index on rundown routine in apfnNdrRundownRoutines field * of MIDL_STUB_DESC */ unsigned char context_rundown_routine_index; /* varies depending on NDR version used. * V1: zero-based index into parameters * V2: zero-based index into handles that are parameters */ unsigned char param_num;} NDR_EHD_CONTEXT;#include "poppack.h"void WINAPI NdrRpcSmSetClientToOsf(PMIDL_STUB_MESSAGE pMessage){#if 0 /* these functions are not defined yet */ pMessage->pfnAllocate = NdrRpcSmClientAllocate; pMessage->pfnFree = NdrRpcSmClientFree;#endif}static void WINAPI dump_RPC_FC_PROC_PF(PARAM_ATTRIBUTES param_attributes){ if (param_attributes.MustSize) TRACE(" MustSize"); if (param_attributes.MustFree) TRACE(" MustFree"); if (param_attributes.IsPipe) TRACE(" IsPipe"); if (param_attributes.IsIn) TRACE(" IsIn"); if (param_attributes.IsOut) TRACE(" IsOut"); if (param_attributes.IsReturn) TRACE(" IsReturn"); if (param_attributes.IsBasetype) TRACE(" IsBasetype"); if (param_attributes.IsByValue) TRACE(" IsByValue"); if (param_attributes.IsSimpleRef) TRACE(" IsSimpleRef"); if (param_attributes.IsDontCallFreeInst) TRACE(" IsDontCallFreeInst"); if (param_attributes.SaveForAsyncFinish) TRACE(" SaveForAsyncFinish"); if (param_attributes.ServerAllocSize) TRACE(" ServerAllocSize = %d", param_attributes.ServerAllocSize * 8);}static void WINAPI dump_INTERPRETER_OPT_FLAGS(INTERPRETER_OPT_FLAGS Oi2Flags){ if (Oi2Flags.ServerMustSize) TRACE(" ServerMustSize"); if (Oi2Flags.ClientMustSize) TRACE(" ClientMustSize"); if (Oi2Flags.HasReturn) TRACE(" HasReturn"); if (Oi2Flags.HasPipes) TRACE(" HasPipes"); if (Oi2Flags.Unused) TRACE(" Unused"); if (Oi2Flags.HasAsyncUuid) TRACE(" HasAsyncUuid"); if (Oi2Flags.HasExtensions) TRACE(" HasExtensions"); if (Oi2Flags.HasAsyncHandle) TRACE(" HasAsyncHandle"); TRACE("\n");}#define ARG_FROM_OFFSET(stubMsg, offset) ((stubMsg).StackTop + (offset))static PFORMAT_STRING client_get_handle( PMIDL_STUB_MESSAGE pStubMsg, const NDR_PROC_HEADER *pProcHeader, PFORMAT_STRING pFormat, handle_t *phBinding){ /* binding */ switch (pProcHeader->handle_type) { /* explicit binding: parse additional section */ case RPC_FC_BIND_EXPLICIT: switch (*pFormat) /* handle_type */ { case RPC_FC_BIND_PRIMITIVE: /* explicit primitive */ { const NDR_EHD_PRIMITIVE *pDesc = (const NDR_EHD_PRIMITIVE *)pFormat; TRACE("Explicit primitive handle @ %d\n", pDesc->offset); if (pDesc->flag) /* pointer to binding */ *phBinding = **(handle_t **)ARG_FROM_OFFSET(*pStubMsg, pDesc->offset); else *phBinding = *(handle_t *)ARG_FROM_OFFSET(*pStubMsg, pDesc->offset); return pFormat + sizeof(NDR_EHD_PRIMITIVE); } case RPC_FC_BIND_GENERIC: /* explicit generic */ { const NDR_EHD_GENERIC *pDesc = (const NDR_EHD_GENERIC *)pFormat; void *pObject = NULL; void *pArg; const GENERIC_BINDING_ROUTINE_PAIR *pGenPair; TRACE("Explicit generic binding handle #%d\n", pDesc->binding_routine_pair_index); if (pDesc->flag_and_size & HANDLE_PARAM_IS_VIA_PTR) pArg = *(void **)ARG_FROM_OFFSET(*pStubMsg, pDesc->offset); else pArg = (void *)ARG_FROM_OFFSET(*pStubMsg, pDesc->offset); memcpy(&pObject, pArg, pDesc->flag_and_size & 0xf); pGenPair = &pStubMsg->StubDesc->aGenericBindingRoutinePairs[pDesc->binding_routine_pair_index]; *phBinding = pGenPair->pfnBind(pObject); return pFormat + sizeof(NDR_EHD_GENERIC); } case RPC_FC_BIND_CONTEXT: /* explicit context */ { const NDR_EHD_CONTEXT *pDesc = (const NDR_EHD_CONTEXT *)pFormat; NDR_CCONTEXT context_handle; TRACE("Explicit bind context\n"); if (pDesc->flags & HANDLE_PARAM_IS_VIA_PTR) { TRACE("\tHANDLE_PARAM_IS_VIA_PTR\n"); context_handle = **(NDR_CCONTEXT **)ARG_FROM_OFFSET(*pStubMsg, pDesc->offset); } else context_handle = *(NDR_CCONTEXT *)ARG_FROM_OFFSET(*pStubMsg, pDesc->offset); if ((pDesc->flags & NDR_CONTEXT_HANDLE_CANNOT_BE_NULL) && !context_handle) { ERR("null context handle isn't allowed\n"); RpcRaiseException(RPC_X_SS_IN_NULL_CONTEXT); return NULL; } *phBinding = NDRCContextBinding(context_handle); /* FIXME: should we store this structure in stubMsg.pContext? */ return pFormat + sizeof(NDR_EHD_CONTEXT); } default: ERR("bad explicit binding handle type (0x%02x)\n", pProcHeader->handle_type); RpcRaiseException(RPC_X_BAD_STUB_DATA); } break; case RPC_FC_BIND_GENERIC: /* implicit generic */ FIXME("RPC_FC_BIND_GENERIC\n"); RpcRaiseException(RPC_X_BAD_STUB_DATA); /* FIXME: remove when implemented */ break; case RPC_FC_BIND_PRIMITIVE: /* implicit primitive */ TRACE("Implicit primitive handle\n"); *phBinding = *pStubMsg->StubDesc->IMPLICIT_HANDLE_INFO.pPrimitiveHandle; break; case RPC_FC_CALLBACK_HANDLE: /* implicit callback */ FIXME("RPC_FC_CALLBACK_HANDLE\n"); break; case RPC_FC_AUTO_HANDLE: /* implicit auto handle */ /* strictly speaking, it isn't necessary to set hBinding here * since it isn't actually used (hence the automatic in its name), * but then why does MIDL generate a valid entry in the * MIDL_STUB_DESC for it? */ TRACE("Implicit auto handle\n"); *phBinding = *pStubMsg->StubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle; break; default: ERR("bad implicit binding handle type (0x%02x)\n", pProcHeader->handle_type); RpcRaiseException(RPC_X_BAD_STUB_DATA); } return pFormat;}static void client_free_handle( PMIDL_STUB_MESSAGE pStubMsg, const NDR_PROC_HEADER *pProcHeader, PFORMAT_STRING pFormat, handle_t hBinding){ /* binding */ switch (pProcHeader->handle_type) { /* explicit binding: parse additional section */ case RPC_FC_BIND_EXPLICIT: switch (*pFormat) /* handle_type */ { case RPC_FC_BIND_GENERIC: /* explicit generic */ { const NDR_EHD_GENERIC *pDesc = (const NDR_EHD_GENERIC *)pFormat; void *pObject = NULL; void *pArg; const GENERIC_BINDING_ROUTINE_PAIR *pGenPair; TRACE("Explicit generic binding handle #%d\n", pDesc->binding_routine_pair_index); if (pDesc->flag_and_size & HANDLE_PARAM_IS_VIA_PTR) pArg = *(void **)ARG_FROM_OFFSET(*pStubMsg, pDesc->offset); else pArg = (void *)ARG_FROM_OFFSET(*pStubMsg, pDesc->offset); memcpy(&pObject, pArg, pDesc->flag_and_size & 0xf); pGenPair = &pStubMsg->StubDesc->aGenericBindingRoutinePairs[pDesc->binding_routine_pair_index]; pGenPair->pfnUnbind(pObject, hBinding); break; } case RPC_FC_BIND_CONTEXT: /* explicit context */ case RPC_FC_BIND_PRIMITIVE: /* explicit primitive */ break; default: ERR("bad explicit binding handle type (0x%02x)\n", pProcHeader->handle_type); RpcRaiseException(RPC_X_BAD_STUB_DATA); } break; case RPC_FC_BIND_GENERIC: /* implicit generic */ FIXME("RPC_FC_BIND_GENERIC\n"); RpcRaiseException(RPC_X_BAD_STUB_DATA); /* FIXME: remove when implemented */ break; case RPC_FC_CALLBACK_HANDLE: /* implicit callback */ case RPC_FC_BIND_PRIMITIVE: /* implicit primitive */ case RPC_FC_AUTO_HANDLE: /* implicit auto handle */ break; default: ERR("bad implicit binding handle type (0x%02x)\n", pProcHeader->handle_type); RpcRaiseException(RPC_X_BAD_STUB_DATA); }}static void client_do_args(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, int phase, unsigned short number_of_params, unsigned char *pRetVal){ /* current format string offset */ int current_offset = 0; /* current stack offset */ unsigned short current_stack_offset = 0; /* counter */ unsigned short i; for (i = 0; i < number_of_params; i++) { const NDR_PARAM_OIF_BASETYPE *pParam = (const NDR_PARAM_OIF_BASETYPE *)&pFormat[current_offset]; unsigned char * pArg; current_stack_offset = pParam->stack_offset; pArg = ARG_FROM_OFFSET(*pStubMsg, current_stack_offset); TRACE("param[%d]: new format\n", i); TRACE("\tparam_attributes:"); dump_RPC_FC_PROC_PF(pParam->param_attributes); TRACE("\n"); TRACE("\tstack_offset: 0x%x\n", current_stack_offset); TRACE("\tmemory addr (before): %p\n", pArg); if (pParam->param_attributes.IsBasetype) { const unsigned char * pTypeFormat = &pParam->type_format_char; if (pParam->param_attributes.IsSimpleRef) pArg = *(unsigned char **)pArg; TRACE("\tbase type: 0x%02x\n", *pTypeFormat); switch (phase) { case PROXY_CALCSIZE: if (pParam->param_attributes.IsIn) call_buffer_sizer(pStubMsg, pArg, pTypeFormat); break; case PROXY_MARSHAL: if (pParam->param_attributes.IsIn) call_marshaller(pStubMsg, pArg, pTypeFormat); break; case PROXY_UNMARSHAL: if (pParam->param_attributes.IsOut) { if (pParam->param_attributes.IsReturn) call_unmarshaller(pStubMsg, &pRetVal, pTypeFormat, 0); else call_unmarshaller(pStubMsg, &pArg, pTypeFormat, 0); TRACE("pRetVal = %p\n", pRetVal); } break; default: RpcRaiseException(RPC_S_INTERNAL_ERROR); } current_offset += sizeof(NDR_PARAM_OIF_BASETYPE); } else { const NDR_PARAM_OIF_OTHER *pParamOther = (const NDR_PARAM_OIF_OTHER *)&pFormat[current_offset]; const unsigned char * pTypeFormat = &(pStubMsg->StubDesc->pFormatTypes[pParamOther->type_offset]); /* if a simple ref pointer then we have to do the * check for the pointer being non-NULL. */ if (pParam->param_attributes.IsSimpleRef) { if (!*(unsigned char **)pArg) RpcRaiseException(RPC_X_NULL_REF_POINTER); } TRACE("\tcomplex type: 0x%02x\n", *pTypeFormat); switch (phase) { case PROXY_CALCSIZE: if (pParam->param_attributes.IsIn) { if (pParam->param_attributes.IsByValue) call_buffer_sizer(pStubMsg, pArg, pTypeFormat); else call_buffer_sizer(pStubMsg, *(unsigned char **)pArg, pTypeFormat); } break; case PROXY_MARSHAL: if (pParam->param_attributes.IsIn) { if (pParam->param_attributes.IsByValue) call_marshaller(pStubMsg, pArg, pTypeFormat); else call_marshaller(pStubMsg, *(unsigned char **)pArg, pTypeFormat); } break; case PROXY_UNMARSHAL: if (pParam->param_attributes.IsOut) { if (pParam->param_attributes.IsReturn) call_unmarshaller(pStubMsg, &pRetVal, pTypeFormat, 0); else if (pParam->param_attributes.IsByValue) call_unmarshaller(pStubMsg, &pArg, pTypeFormat, 0); else call_unmarshaller(pStubMsg, (unsigned char **)pArg, pTypeFormat, 0); } break; default: RpcRaiseException(RPC_S_INTERNAL_ERROR); } current_offset += sizeof(NDR_PARAM_OIF_OTHER); } TRACE("\tmemory addr (after): %p\n", pArg); }}static void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, int phase, unsigned short stack_size, unsigned char *pRetVal, BOOL object_proc){ /* current format string offset */ int current_offset = 0; /* current stack offset */ unsigned short current_stack_offset = 0; /* counter */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -