Redesign of the server communication protocol to allow arbitrary sized
[wine] / include / rpcndr.h
1 #ifndef __WINE_RPCNDR_H
2 #define __WINE_RPCNDR_H
3
4 #ifndef __RPCNDR_H_VERSION__
5 /* FIXME: I'm not sure what version though */
6 #define __RPCNDR_H_VERSION__
7 #endif // __RPCNDR_H_VERSION__
8
9 typedef unsigned char byte;
10 typedef __int64 hyper;
11 typedef __uint64 MIDL_uhyper;
12 /* 'boolean' tend to conflict, let's call it _wine_boolean */
13 typedef unsigned char _wine_boolean;
14 /* typedef _wine_boolean boolean; */
15
16 typedef struct
17 {
18   void *pad[2];
19   void *userContext;
20 } *NDR_SCONTEXT;
21
22 #define NDRSContextValue(hContext) (&(hContext)->userContext)
23 #define cbNDRContext 20
24
25 typedef void __RPC_USER (*NDR_RUNDOWN)(void *context);
26 typedef void __RPC_USER (*NDR_NOTIFY_ROUTINE)(void);
27 typedef void __RPC_USER (*NDR_NOTIFY2_ROUTINE)(_wine_boolean flag);
28
29 #define DECLSPEC_UUID(x)
30 #define MIDL_INTERFACE(x)   struct
31
32 struct _MIDL_STUB_MESSAGE;
33 struct _MIDL_STUB_DESC;
34 struct _FULL_PTR_XLAT_TABLES;
35
36 typedef void __RPC_USER (*EXPR_EVAL)(struct _MIDL_STUB_MESSAGE *);
37 typedef const unsigned char *PFORMAT_STRING;
38
39 typedef struct
40 {
41   long Dimension;
42   unsigned long *BufferConformanceMark;
43   unsigned long *BufferVarianceMark;
44   unsigned long *MaxCountArray;
45   unsigned long *OffsetArray;
46   unsigned long *ActualCountArray;
47 } ARRAY_INFO, *PARRAY_INFO;
48
49 typedef struct _NDR_PIPE_DESC *PNDR_PIPE_DESC;
50 typedef struct _NDR_PIPE_MESSAGE *PNDR_PIPE_MESSAGE;
51 typedef struct _NDR_ASYNC_MESSAGE *PNDR_ASYNC_MESSAGE;
52 typedef struct _NDR_CORRELATION_INFO *PNDR_CORRELATION_INFO;
53
54 #include "pshpack4.h"
55 typedef struct _MIDL_STUB_MESSAGE
56 {
57   PRPC_MESSAGE RpcMsg;
58   unsigned char *Buffer;
59   unsigned char *BufferStart;
60   unsigned char *BufferEnd;
61   unsigned char *BufferMark;
62   unsigned long BufferLength;
63   unsigned long MemorySize;
64   unsigned char *Memory;
65   int IsClient;
66   int ReuseBuffer;
67   unsigned char *AllocAllNodesMemory;
68   unsigned char *AllocAllNodesMemoryEnd;
69   int IgnoreEmbeddedPointers;
70   unsigned char *PointerBufferMark;
71   unsigned char fBufferValid;
72   unsigned char uFlags;
73   ULONG_PTR MaxCount;
74   unsigned long Offset;
75   unsigned long ActualCount;
76   void * __RPC_API (*pfnAllocate)(size_t);
77   void __RPC_API (*pfnFree)(void *);
78   unsigned char *StackTop;
79   unsigned char *pPresentedType;
80   unsigned char *pTransmitType;
81   handle_t SavedHandle;
82   const struct _MIDL_STUB_DESC *StubDesc;
83   struct _FULL_PTR_XLAT_TABLES *FullPtrXlatTables;
84   unsigned long FullPtrRefId;
85   unsigned long ulUnused1;
86   int fInDontFree:1;
87   int fDontCallFreeInst:1;
88   int fInOnlyParam:1;
89   int fHasReturn:1;
90   int fHasExtensions:1;
91   int fHasNewCorrDesc:1;
92   int fUnused:10;
93   unsigned long dwDestContext;
94   void *pvDestContext;
95   NDR_SCONTEXT *SavedContextHandles;
96   long ParamNumber;
97   struct IRpcChannelBuffer *pRpcChannelBuffer;
98   PARRAY_INFO pArrayInfo;
99   unsigned long *SizePtrCountArray;
100   unsigned long *SizePtrOffsetArray;
101   unsigned long *SizePtrLengthArray;
102   void *pArgQueue;
103   unsigned long dwStubPhase;
104   PNDR_PIPE_DESC pPipeDesc;
105   PNDR_ASYNC_MESSAGE pAsyncMsg;
106   PNDR_CORRELATION_INFO pCorrInfo;
107   unsigned char *pCorrMemory;
108   void *pMemoryList;
109   ULONG_PTR w2kReserved[5];
110 } MIDL_STUB_MESSAGE, *PMIDL_STUB_MESSAGE;
111 #include "poppack.h"
112
113 typedef struct _GENERIC_BINDING_ROUTINE_PAIR GENERIC_BINDING_ROUTINE_PAIR, *PGENERIC_BINDING_ROUTINE_PAIR;
114
115 typedef struct __GENERIC_BINDING_INFO GENERIC_BINDING_INFO, *PGENERIC_BINDING_INFO;
116
117 typedef struct _XMIT_ROUTINE_QUINTUPLE XMIT_ROUTINE_QUINTUPLE, *PXMIT_ROUTINE_QUINTUPLE;
118
119 typedef struct _USER_MARSHAL_ROUTINE_QUADRUPLE USER_MARSHAL_ROUTINE_QUADRUPLE;
120
121 typedef struct _MALLOC_FREE_STRUCT MALLOC_FREE_STRUCT;
122
123 typedef struct _COMM_FAULT_OFFSETS COMM_FAULT_OFFSETS;
124
125 typedef struct _MIDL_STUB_DESC
126 {
127   void *RpcInterfaceInformation;
128   void * __RPC_API (*pfnAllocate)(size_t);
129   void __RPC_API (*pfnFree)(void *);
130   union {
131     handle_t *pAutoHandle;
132     handle_t *pPrimitiveHandle;
133     PGENERIC_BINDING_INFO pGenericBindingInfo;
134   } IMPLICIT_HANDLE_INFO;
135   const NDR_RUNDOWN *apfnNdrRundownRoutines;
136   const GENERIC_BINDING_ROUTINE_PAIR *aGenericBindingRoutinePairs;
137   const EXPR_EVAL *apfnExprEval;
138   const XMIT_ROUTINE_QUINTUPLE *aXmitQuintuple;
139   const unsigned char *pFormatTypes;
140   int fCheckBounds;
141   unsigned long Version;
142   MALLOC_FREE_STRUCT *pMallocFreeStruct;
143   long MIDLVersion;
144   const COMM_FAULT_OFFSETS *CommFaultOffsets;
145   const USER_MARSHAL_ROUTINE_QUADRUPLE *aUserMarshalQuadruple;
146   const NDR_NOTIFY_ROUTINE *NotifyRoutineTable;
147   ULONG_PTR mFlags;
148   ULONG_PTR Reserved3;
149   ULONG_PTR Reserved4;
150   ULONG_PTR Reserved5;
151 } MIDL_STUB_DESC;
152 typedef const MIDL_STUB_DESC *PMIDL_STUB_DESC;
153
154 typedef struct _MIDL_FORMAT_STRING
155 {
156   short Pad;
157 #if defined(__GNUC__)
158   unsigned char Format[0];
159 #else
160   unsigned char Format[1];
161 #endif
162 } MIDL_FORMAT_STRING;
163
164 typedef void __RPC_API (*STUB_THUNK)( PMIDL_STUB_MESSAGE );
165
166 typedef long __RPC_API (*SERVER_ROUTINE)();
167
168 typedef struct _MIDL_SERVER_INFO_
169 {
170   PMIDL_STUB_DESC pStubDesc;
171   const SERVER_ROUTINE *DispatchTable;
172   PFORMAT_STRING ProcString;
173   const unsigned short *FmtStringOffset;
174   const STUB_THUNK *ThunkTable;
175   PFORMAT_STRING LocalFormatTypes;
176   PFORMAT_STRING LocalProcString;
177   const unsigned short *LocalFmtStringOffset;
178 } MIDL_SERVER_INFO, *PMIDL_SERVER_INFO;
179
180 typedef enum {
181   STUB_UNMARSHAL,
182   STUB_CALL_SERVER,
183   STUB_MARSHAL,
184   STUB_CALL_SERVER_NO_HRESULT
185 } STUB_PHASE;
186
187 typedef enum {
188   PROXY_CALCSIZE,
189   PROXY_GETBUFFER,
190   PROXY_MARSHAL,
191   PROXY_SENDRECEIVE,
192   PROXY_UNMARSHAL
193 } PROXY_PHASE;
194
195 struct IRpcStubBuffer;
196
197 RPCRTAPI void RPC_ENTRY
198   NdrSimpleTypeMarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, unsigned char FormatChar );
199 RPCRTAPI void RPC_ENTRY
200   NdrSimpleTypeUnmarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, unsigned char FormatChar );
201
202 /* while MS declares each prototype separately, I prefer to use macros for this kind of thing instead */
203 #define TYPE_MARSHAL(type) \
204 RPCRTAPI unsigned char* RPC_ENTRY \
205   Ndr##type##Marshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, PFORMAT_STRING pFormat ); \
206 RPCRTAPI unsigned char* RPC_ENTRY \
207   Ndr##type##Unmarshall( PMIDL_STUB_MESSAGE pStubMsg, unsigned char** ppMemory, PFORMAT_STRING pFormat, unsigned char fMustAlloc ); \
208 RPCRTAPI void RPC_ENTRY \
209   Ndr##type##BufferSize( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, PFORMAT_STRING pFormat ); \
210 RPCRTAPI unsigned long RPC_ENTRY \
211   Ndr##type##MemorySize( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat ); \
212 RPCRTAPI void RPC_ENTRY \
213   Ndr##type##Free( PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, PFORMAT_STRING pFormat );
214
215 TYPE_MARSHAL(Pointer)
216 TYPE_MARSHAL(SimpleStruct)
217 TYPE_MARSHAL(ConformantStruct)
218 TYPE_MARSHAL(ConformantVaryingStruct)
219 TYPE_MARSHAL(ComplexStruct)
220 TYPE_MARSHAL(FixedArray)
221 TYPE_MARSHAL(ConformantArray)
222 TYPE_MARSHAL(ConformantVaryingArray)
223 TYPE_MARSHAL(VaryingArray)
224 TYPE_MARSHAL(ComplexArray)
225 TYPE_MARSHAL(EncapsulatedUnion)
226 TYPE_MARSHAL(NonEncapsulatedUnion)
227 TYPE_MARSHAL(ByteCountPointer)
228 TYPE_MARSHAL(XmitOrRepAs)
229 TYPE_MARSHAL(UserMarshal)
230 TYPE_MARSHAL(InterfacePointer)
231
232 #undef TYPE_MARSHAL
233
234 RPCRTAPI void RPC_ENTRY
235   NdrConvert2( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, long NumberParams );
236 RPCRTAPI void RPC_ENTRY
237   NdrConvert( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat );
238
239 RPCRTAPI void* RPC_ENTRY
240   NdrOleAllocate( size_t Size );
241 RPCRTAPI void RPC_ENTRY
242   NdrOleFree( void* NodeToFree );
243
244 #endif /*__WINE_RPCNDR_H */