https://bugs.winehq.org/show_bug.cgi?id=49162
Bug ID: 49162 Summary: widl generates incorrect marshaller for pointer sized output parameter for 32-bit client and 64-bit server Product: Wine Version: 5.8 Hardware: x86-64 OS: Linux Status: NEW Severity: normal Priority: P2 Component: rpc Assignee: wine-bugs@winehq.org Reporter: dmitry@baikal.ru Distribution: ---
Consider the following .idl:
import "objidl.idl";
cpp_quote("#if 0") typedef ULONG_PTR HDATA; cpp_quote("#endif")
[ uuid(00000000-1111-2222-3333-444444444444), implicit_handle(handle_t rpc_handle), version(1.0) ] interface IServer { DWORD rpc_GetData([out] HDATA *data); }
Makefile snippet:
server_s.c: Makefile server.idl $(WIDL) $(WIDL) -s -h -o $@ server.idl -m64 -I. -I$(WINEINCLUDE)
server_c.c: Makefile server.idl $(WIDL) $(WIDL) -c -h -o $@ server.idl -m32 -I. -I$(WINEINCLUDE)
generated server_s.c snippet: void __RPC_STUB IServer_rpc_GetData( PRPC_MESSAGE _pRpcMessage ) { ... *(HDATA *)__frame->_StubMsg.Buffer = *__frame->data; ... *(DWORD *)__frame->_StubMsg.Buffer = __frame->_RetVal; }
generated server_c.c snippet: DWORD __cdecl rpc_GetData( HDATA *data) { ... *data = *(HDATA *)__frame->_StubMsg.Buffer; ... _RetVal = *(DWORD *)__frame->_StubMsg.Buffer; }
As a result a being marshalled buffer looks like this: [8 bytes HDATA][4 bytes _RetVal] and on the client side _Retval gets value of upper 32-bits of the 64-bit HDATA.