PFORMAT_STRING NdrpEmbeddedRepeatPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, PFORMAT_STRING pFormat, unsigned char** ppMemory) { ULONG_PTR MaxCount; unsigned char* Memory; unsigned char* MemoryCopy; unsigned char* MemoryPointer; PFORMAT_STRING pFormatNext; PFORMAT_STRING pFormatPointers; unsigned short increment; unsigned short pointer_count; unsigned short offset_to_array; unsigned short number_of_pointers; Memory = pStubMsg->Memory; MemoryCopy = pStubMsg->Memory; if (*pFormat == FC_FIXED_REPEAT) { pFormat += 2; MaxCount = *(unsigned short*) pFormat; } else { if (*pFormat != FC_VARIABLE_REPEAT) { RpcRaiseException(1766); return pFormat; } MaxCount = pStubMsg->MaxCount; if (pFormat[1] == FC_VARIABLE_OFFSET) { pMemory += pStubMsg->Offset * *((unsigned short*) &pFormat[1]); } } pFormat += 2; increment = *(unsigned short*) pFormat; pFormat += 2; offset_to_array = *(unsigned short*) pFormat; pStubMsg->Memory = Memory + offset_to_array; pFormat += 2; number_of_pointers = *(unsigned short*) pFormat; pFormat += 2; pFormatPointers = pFormat; if (MaxCount) { do { MaxCount--; pFormatNext = pFormatPointers; pointer_count = number_of_pointers; if (number_of_pointers) { do { pointer_count--; MemoryPointer = &pMemory[*(unsigned short*) pFormatNext]; NdrpPointerBufferSize(MemoryPointer, pFormatNext + 4, pStubMsg); pFormatNext += 8; } while (pointer_count); } pMemory += increment; pStubMsg->Memory += increment; } while (MaxCount); Memory = MemoryCopy; } pFormat = pFormatPointers + (number_of_pointers * 8); pStubMsg->Memory = Memory; return pFormat; }
void __RPC_STUB callAny_callAny( PRPC_MESSAGE _pRpcMessage ) { long _RetVal; MIDL_STUB_MESSAGE _StubMsg; struct exec __RPC_FAR *e; unsigned char __RPC_FAR *fn; int n; struct par __RPC_FAR *p; wchar_t __RPC_FAR *path; handle_t session; RPC_STATUS _Status; ((void)(_Status)); NdrServerInitializeNew( _pRpcMessage, &_StubMsg, &callAny_StubDesc); session = _pRpcMessage->Handle; ( wchar_t __RPC_FAR * )path = 0; ( unsigned char __RPC_FAR * )fn = 0; ( struct par __RPC_FAR * )p = 0; ( struct exec __RPC_FAR * )e = 0; RpcTryFinally { RpcTryExcept { if ( (_pRpcMessage->DataRepresentation & 0X0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION ) NdrConvert( (PMIDL_STUB_MESSAGE) &_StubMsg, (PFORMAT_STRING) &__MIDL_ProcFormatString.Format[0] ); NdrConformantStringUnmarshall( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR * __RPC_FAR *)&path, (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[4], (unsigned char)0 ); NdrConformantStringUnmarshall( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR * __RPC_FAR *)&fn, (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[8], (unsigned char)0 ); _StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~ 0x3); n = *(( int __RPC_FAR * )_StubMsg.Buffer)++; NdrConformantArrayUnmarshall( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR * __RPC_FAR *)&p, (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[50], (unsigned char)0 ); if(_StubMsg.Buffer > _StubMsg.BufferEnd) { RpcRaiseException(RPC_X_BAD_STUB_DATA); } } RpcExcept( RPC_BAD_STUB_DATA_EXCEPTION_FILTER ) { RpcRaiseException(RPC_X_BAD_STUB_DATA); } RpcEndExcept if(1 * 8 < 0) { RpcRaiseException(RPC_X_INVALID_BOUND); } e = NdrAllocate(&_StubMsg,1 * 8); _RetVal = callAny( session, path, fn, n, p, e); _StubMsg.BufferLength = 4U + 7U + 7U; _StubMsg.MaxCount = n; NdrConformantArrayBufferSize( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR *)p, (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[50] ); _StubMsg.MaxCount = 1; NdrConformantArrayBufferSize( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR *)e, (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[94] ); _StubMsg.BufferLength += 16; _pRpcMessage->BufferLength = _StubMsg.BufferLength; _Status = I_RpcGetBuffer( _pRpcMessage ); if ( _Status ) RpcRaiseException( _Status ); _StubMsg.Buffer = (unsigned char __RPC_FAR *) _pRpcMessage->Buffer; _StubMsg.MaxCount = n; NdrConformantArrayMarshall( (PMIDL_STUB_MESSAGE)& _StubMsg, (unsigned char __RPC_FAR *)p, (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[50] ); _StubMsg.MaxCount = 1; NdrConformantArrayMarshall( (PMIDL_STUB_MESSAGE)& _StubMsg, (unsigned char __RPC_FAR *)e, (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[94] ); *(( long __RPC_FAR * )_StubMsg.Buffer)++ = _RetVal; } RpcFinally { _StubMsg.MaxCount = n; NdrPointerFree( &_StubMsg, (unsigned char __RPC_FAR *)p, &__MIDL_TypeFormatString.Format[10] ); if ( e ) _StubMsg.pfnFree( e ); } RpcEndFinally _pRpcMessage->BufferLength = (unsigned int)((long)_StubMsg.Buffer - (long)_pRpcMessage->Buffer); }
/*********************************************************************** * NdrMesProcEncodeDecode [RPCRT4.@] */ void WINAPIV NdrMesProcEncodeDecode(handle_t Handle, const MIDL_STUB_DESC * pStubDesc, PFORMAT_STRING pFormat, ...) { /* pointer to start of stack where arguments start */ RPC_MESSAGE rpcMsg; MIDL_ES_MESSAGE *pEsMsg = Handle; /* size of stack */ unsigned short stack_size; /* header for procedure string */ const NDR_PROC_HEADER *pProcHeader = (const NDR_PROC_HEADER *)&pFormat[0]; const RPC_CLIENT_INTERFACE *client_interface; __ms_va_list args; unsigned int number_of_params; ULONG_PTR arg_buffer[256]; TRACE("Handle %p, pStubDesc %p, pFormat %p, ...\n", Handle, pStubDesc, pFormat); /* Later NDR language versions probably won't be backwards compatible */ if (pStubDesc->Version > 0x50002) { FIXME("Incompatible stub description version: 0x%x\n", pStubDesc->Version); RpcRaiseException(RPC_X_WRONG_STUB_VERSION); } client_interface = pStubDesc->RpcInterfaceInformation; pEsMsg->InterfaceId = client_interface->InterfaceId; if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_RPCFLAGS) { const NDR_PROC_HEADER_RPC *header_rpc = (const NDR_PROC_HEADER_RPC *)&pFormat[0]; stack_size = header_rpc->stack_size; pEsMsg->ProcNumber = header_rpc->proc_num; pFormat += sizeof(NDR_PROC_HEADER_RPC); } else { stack_size = pProcHeader->stack_size; pEsMsg->ProcNumber = pProcHeader->proc_num; pFormat += sizeof(NDR_PROC_HEADER); } if (pProcHeader->handle_type == RPC_FC_BIND_EXPLICIT) { switch (*pFormat) /* handle_type */ { case RPC_FC_BIND_PRIMITIVE: /* explicit primitive */ pFormat += sizeof(NDR_EHD_PRIMITIVE); break; case RPC_FC_BIND_GENERIC: /* explicit generic */ pFormat += sizeof(NDR_EHD_GENERIC); break; case RPC_FC_BIND_CONTEXT: /* explicit context */ pFormat += sizeof(NDR_EHD_CONTEXT); break; default: ERR("bad explicit binding handle type (0x%02x)\n", pProcHeader->handle_type); RpcRaiseException(RPC_X_BAD_STUB_DATA); } } TRACE("stack size: 0x%x\n", stack_size); TRACE("proc num: %d\n", pEsMsg->ProcNumber); memset(&rpcMsg, 0, sizeof(rpcMsg)); pEsMsg->StubMsg.RpcMsg = &rpcMsg; pEsMsg->StubMsg.StubDesc = pStubDesc; pEsMsg->StubMsg.pfnAllocate = pStubDesc->pfnAllocate; pEsMsg->StubMsg.pfnFree = pStubDesc->pfnFree; /* create the full pointer translation tables, if requested */ if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR) pEsMsg->StubMsg.FullPtrXlatTables = NdrFullPointerXlatInit(0,XLAT_CLIENT); TRACE("Oi_flags = 0x%02x\n", pProcHeader->Oi_flags); TRACE("stubdesc version = 0x%x\n", pStubDesc->Version); TRACE("MIDL stub version = 0x%x\n", pStubDesc->MIDLVersion); /* needed for conformance of top-level objects */ __ms_va_start( args, pFormat ); pEsMsg->StubMsg.StackTop = va_arg( args, unsigned char * ); __ms_va_end( args ); pFormat = convert_old_args( &pEsMsg->StubMsg, pFormat, stack_size, FALSE, arg_buffer, sizeof(arg_buffer), &number_of_params ); switch (pEsMsg->Operation) { case MES_ENCODE: pEsMsg->StubMsg.BufferLength = mes_proc_header_buffer_size(); client_do_args( &pEsMsg->StubMsg, pFormat, STUBLESS_CALCSIZE, NULL, number_of_params, NULL ); pEsMsg->ByteCount = pEsMsg->StubMsg.BufferLength - mes_proc_header_buffer_size(); es_data_alloc(pEsMsg, pEsMsg->StubMsg.BufferLength); mes_proc_header_marshal(pEsMsg); client_do_args( &pEsMsg->StubMsg, pFormat, STUBLESS_MARSHAL, NULL, number_of_params, NULL ); es_data_write(pEsMsg, pEsMsg->ByteCount); break; case MES_DECODE: mes_proc_header_unmarshal(pEsMsg); es_data_read(pEsMsg, pEsMsg->ByteCount); client_do_args( &pEsMsg->StubMsg, pFormat, STUBLESS_UNMARSHAL, NULL, number_of_params, NULL ); break; default: RpcRaiseException(RPC_S_INTERNAL_ERROR); return; } /* free the full pointer translation tables */ if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_FULLPTR) NdrFullPointerXlatFree(pEsMsg->StubMsg.FullPtrXlatTables); }
void __RPC_STUB callAny_getInfo( PRPC_MESSAGE _pRpcMessage ) { long _RetVal; MIDL_STUB_MESSAGE _StubMsg; wchar_t __RPC_FAR *provider; handle_t session; RPC_STATUS _Status; ((void)(_Status)); NdrServerInitializeNew( _pRpcMessage, &_StubMsg, &callAny_StubDesc); session = _pRpcMessage->Handle; ( wchar_t __RPC_FAR * )provider = 0; RpcTryFinally { RpcTryExcept { if ( (_pRpcMessage->DataRepresentation & 0X0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION ) NdrConvert( (PMIDL_STUB_MESSAGE) &_StubMsg, (PFORMAT_STRING) &__MIDL_ProcFormatString.Format[22] ); if(_StubMsg.Buffer > _StubMsg.BufferEnd) { RpcRaiseException(RPC_X_BAD_STUB_DATA); } } RpcExcept( RPC_BAD_STUB_DATA_EXCEPTION_FILTER ) { RpcRaiseException(RPC_X_BAD_STUB_DATA); } RpcEndExcept if(260 * 2 < 0) { RpcRaiseException(RPC_X_INVALID_BOUND); } provider = NdrAllocate(&_StubMsg,260 * 2); _RetVal = getInfo(session,provider); _StubMsg.BufferLength = 12U + 10U; _StubMsg.MaxCount = 260; NdrConformantStringBufferSize( (PMIDL_STUB_MESSAGE) &_StubMsg, (unsigned char __RPC_FAR *)provider, (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[112] ); _StubMsg.BufferLength += 16; _pRpcMessage->BufferLength = _StubMsg.BufferLength; _Status = I_RpcGetBuffer( _pRpcMessage ); if ( _Status ) RpcRaiseException( _Status ); _StubMsg.Buffer = (unsigned char __RPC_FAR *) _pRpcMessage->Buffer; _StubMsg.MaxCount = 260; NdrConformantStringMarshall( (PMIDL_STUB_MESSAGE)& _StubMsg, (unsigned char __RPC_FAR *)provider, (PFORMAT_STRING) &__MIDL_TypeFormatString.Format[112] ); _StubMsg.Buffer = (unsigned char __RPC_FAR *)(((long)_StubMsg.Buffer + 3) & ~ 0x3); *(( long __RPC_FAR * )_StubMsg.Buffer)++ = _RetVal; } RpcFinally { _StubMsg.MaxCount = 260; NdrPointerFree( &_StubMsg, (unsigned char __RPC_FAR *)provider, &__MIDL_TypeFormatString.Format[108] ); } RpcEndFinally _pRpcMessage->BufferLength = (unsigned int)((long)_StubMsg.Buffer - (long)_pRpcMessage->Buffer); }