static WINE_EXCEPTION_FILTER(rpc_filter) { packet_state* state; PRPC_MESSAGE msg; state = TlsGetValue(worker_tls); msg = state->msg; if (msg->Buffer != state->buf) I_RpcFreeBuffer(msg); msg->RpcFlags |= WINE_RPCFLAG_EXCEPTION; msg->BufferLength = sizeof(DWORD); I_RpcGetBuffer(msg); *(DWORD*)msg->Buffer = GetExceptionCode(); return EXCEPTION_EXECUTE_HANDLER; }
/*********************************************************************** * NdrGetBuffer [RPCRT4.@] */ unsigned char *WINAPI NdrGetBuffer(PMIDL_STUB_MESSAGE stubmsg, ULONG buflen, RPC_BINDING_HANDLE handle) { RPC_STATUS status; TRACE("(stubmsg == ^%p, buflen == %u, handle == %p)\n", stubmsg, buflen, handle); stubmsg->RpcMsg->Handle = handle; stubmsg->RpcMsg->BufferLength = buflen; status = I_RpcGetBuffer(stubmsg->RpcMsg); if (status != RPC_S_OK) RpcRaiseException(status); stubmsg->Buffer = stubmsg->RpcMsg->Buffer; stubmsg->fBufferValid = TRUE; stubmsg->BufferLength = stubmsg->RpcMsg->BufferLength; return stubmsg->Buffer; }
static HRESULT WINAPI RemUnkStub_Invoke(LPRPCSTUBBUFFER iface, PRPCOLEMESSAGE pMsg, LPRPCCHANNELBUFFER pChannel) { RemUnkStub *This = (RemUnkStub *)iface; ULONG iMethod = pMsg->iMethod; LPBYTE buf = pMsg->Buffer; HRESULT hr = RPC_E_INVALIDMETHOD; TRACE("(%p)->Invoke(%p,%p) method %ld\n", This, pMsg, pChannel, iMethod); switch (iMethod) { case 3: /* RemQueryInterface */ { IPID ipid; ULONG cRefs; USHORT cIids; IID *iids; REMQIRESULT *pQIResults = NULL; /* in */ memcpy(&ipid, buf, sizeof(ipid)); buf += sizeof(ipid); memcpy(&cRefs, buf, sizeof(cRefs)); buf += sizeof(cRefs); memcpy(&cIids, buf, sizeof(cIids)); buf += sizeof(cIids); iids = (IID *)buf; hr = IRemUnknown_RemQueryInterface(This->iface, &ipid, cRefs, cIids, iids, &pQIResults); /* out */ pMsg->cbBuffer = cIids * sizeof(REMQIRESULT) + sizeof(HRESULT); I_RpcGetBuffer((RPC_MESSAGE *)pMsg); buf = pMsg->Buffer; *(HRESULT *)buf = hr; buf += sizeof(HRESULT); if (hr) return hr; /* FIXME: pQIResults is a unique pointer so pQIResults can be NULL! */ memcpy(buf, pQIResults, cIids * sizeof(REMQIRESULT)); break; } case 4: /* RemAddRef */ { USHORT cIids; REMINTERFACEREF *ir; HRESULT *pResults; /* in */ memcpy(&cIids, buf, sizeof(USHORT)); buf += sizeof(USHORT); ir = (REMINTERFACEREF*)buf; pResults = CoTaskMemAlloc(cIids * sizeof(HRESULT)); if (!pResults) return E_OUTOFMEMORY; hr = IRemUnknown_RemAddRef(This->iface, cIids, ir, pResults); /* out */ pMsg->cbBuffer = cIids * sizeof(HRESULT); I_RpcGetBuffer((RPC_MESSAGE *)pMsg); if (!hr) { buf = pMsg->Buffer; memcpy(buf, pResults, cIids * sizeof(HRESULT)); } CoTaskMemFree(pResults); break; } case 5: /* RemRelease */ { USHORT cIids; REMINTERFACEREF *ir; /* in */ memcpy(&cIids, buf, sizeof(USHORT)); buf += sizeof(USHORT); ir = (REMINTERFACEREF*)buf; hr = IRemUnknown_RemRelease(This->iface, cIids, ir); /* out */ pMsg->cbBuffer = 0; break; } } return hr; }
static HRESULT WINAPI CFStub_Invoke( LPRPCSTUBBUFFER iface,RPCOLEMESSAGE* msg,IRpcChannelBuffer* chanbuf ) { CFStub *This = (CFStub *)iface; HRESULT hres; if (msg->iMethod == 3) { /* CreateInstance */ IID iid; IClassFactory *classfac; IUnknown *ppv; IStream *pStm; STATSTG ststg; ULARGE_INTEGER newpos; LARGE_INTEGER seekto; ULONG res; if (msg->cbBuffer < sizeof(IID)) { FIXME("Not enough bytes in buffer (%ld)?\n",msg->cbBuffer); return E_FAIL; } memcpy(&iid,msg->Buffer,sizeof(iid)); TRACE("->CreateInstance(%s)\n",debugstr_guid(&iid)); hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,(LPVOID*)&classfac); if (hres) { FIXME("Ole server does not provide an IClassFactory?\n"); return hres; } hres = IClassFactory_CreateInstance(classfac,NULL,&iid,(LPVOID*)&ppv); IClassFactory_Release(classfac); if (hres) { msg->cbBuffer = 0; FIXME("Failed to create an instance of %s\n",debugstr_guid(&iid)); return hres; } hres = CreateStreamOnHGlobal(0,TRUE,&pStm); if (hres) { FIXME("Failed to create stream on hglobal\n"); return hres; } hres = CoMarshalInterface(pStm,&iid,ppv,0,NULL,0); IUnknown_Release((IUnknown*)ppv); if (hres) { FIXME("CoMarshalInterface failed, %lx!\n",hres); msg->cbBuffer = 0; return hres; } hres = IStream_Stat(pStm,&ststg,0); if (hres) { FIXME("Stat failed.\n"); return hres; } msg->cbBuffer = ststg.cbSize.u.LowPart; I_RpcGetBuffer((RPC_MESSAGE *)msg); if (hres) return hres; seekto.u.LowPart = 0;seekto.u.HighPart = 0; hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos); if (hres) { FIXME("IStream_Seek failed, %lx\n",hres); return hres; } hres = IStream_Read(pStm,msg->Buffer,msg->cbBuffer,&res); if (hres) { FIXME("Stream Read failed, %lx\n",hres); return hres; } IStream_Release(pStm); return S_OK; } FIXME("(%p,%p), stub!\n",msg,chanbuf); FIXME("iMethod is %ld\n",msg->iMethod); FIXME("cbBuffer is %ld\n",msg->cbBuffer); return E_FAIL; }
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); }
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); }