⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ndr_stubless.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 5 页
字号:
    /* 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 + -