1/**
2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the mingw-w64 runtime package.
4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5 */
6#ifndef __RPCASYNC_H__
7#define __RPCASYNC_H__
8
9#include <_mingw_unicode.h>
10#ifdef __RPC_WIN64__
11#include <pshpack8.h>
12#endif
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#define RPC_ASYNC_VERSION_1_0 sizeof(RPC_ASYNC_STATE)
19
20  typedef enum _RPC_NOTIFICATION_TYPES {
21    RpcNotificationTypeNone,RpcNotificationTypeEvent,RpcNotificationTypeApc,RpcNotificationTypeIoc,RpcNotificationTypeHwnd,
22    RpcNotificationTypeCallback
23  } RPC_NOTIFICATION_TYPES;
24
25  typedef enum _RPC_ASYNC_EVENT {
26    RpcCallComplete,RpcSendComplete,RpcReceiveComplete
27  } RPC_ASYNC_EVENT;
28
29  struct _RPC_ASYNC_STATE;
30
31  typedef void RPC_ENTRY RPCNOTIFICATION_ROUTINE(struct _RPC_ASYNC_STATE *pAsync,void *Context,RPC_ASYNC_EVENT Event);
32  typedef RPCNOTIFICATION_ROUTINE *PFN_RPCNOTIFICATION_ROUTINE;
33
34  typedef struct _RPC_ASYNC_STATE {
35    unsigned int Size;
36    unsigned __LONG32 Signature;
37    __LONG32 Lock;
38    unsigned __LONG32 Flags;
39    void *StubInfo;
40    void *UserInfo;
41    void *RuntimeInfo;
42    RPC_ASYNC_EVENT Event;
43    RPC_NOTIFICATION_TYPES NotificationType;
44    union {
45      struct {
46	PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
47	HANDLE hThread;
48      } APC;
49      struct {
50	HANDLE hIOPort;
51	DWORD dwNumberOfBytesTransferred;
52	DWORD_PTR dwCompletionKey;
53	LPOVERLAPPED lpOverlapped;
54      } IOC;
55      struct {
56	HWND hWnd;
57	UINT Msg;
58      } HWND;
59      HANDLE hEvent;
60      PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
61    } u;
62    LONG_PTR Reserved[4];
63  } RPC_ASYNC_STATE,*PRPC_ASYNC_STATE;
64
65#define RPC_C_NOTIFY_ON_SEND_COMPLETE 0x1
66#define RPC_C_INFINITE_TIMEOUT INFINITE
67
68#define RpcAsyncGetCallHandle(pAsync) (((PRPC_ASYNC_STATE) pAsync)->RuntimeInfo)
69
70  RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncInitializeHandle(PRPC_ASYNC_STATE pAsync,unsigned int Size);
71  RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncRegisterInfo(PRPC_ASYNC_STATE pAsync);
72  RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncGetCallStatus(PRPC_ASYNC_STATE pAsync);
73  RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncCompleteCall(PRPC_ASYNC_STATE pAsync,void *Reply);
74  RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncAbortCall(PRPC_ASYNC_STATE pAsync,unsigned __LONG32 ExceptionCode);
75  RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncCancelCall(PRPC_ASYNC_STATE pAsync,WINBOOL fAbort);
76  RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncCleanupThread(DWORD dwTimeout);
77
78  typedef enum tagExtendedErrorParamTypes {
79    eeptAnsiString = 1,eeptUnicodeString,eeptLongVal,eeptShortVal,eeptPointerVal,eeptNone,eeptBinary
80  } ExtendedErrorParamTypes;
81
82#define MaxNumberOfEEInfoParams 4
83#define RPC_EEINFO_VERSION 1
84
85  typedef struct tagBinaryParam {
86    void *Buffer;
87    short Size;
88  } BinaryParam;
89
90  typedef struct tagRPC_EE_INFO_PARAM {
91    ExtendedErrorParamTypes ParameterType;
92    union {
93      LPSTR AnsiString;
94      LPWSTR UnicodeString;
95      __LONG32 LVal;
96      short SVal;
97      ULONGLONG PVal;
98      BinaryParam BVal;
99    } u;
100  } RPC_EE_INFO_PARAM;
101
102#define EEInfoPreviousRecordsMissing 1
103#define EEInfoNextRecordsMissing 2
104#define EEInfoUseFileTime 4
105
106#define EEInfoGCCOM 11
107#define EEInfoGCFRS 12
108
109  typedef struct tagRPC_EXTENDED_ERROR_INFO {
110    ULONG Version;
111    LPWSTR ComputerName;
112    ULONG ProcessID;
113    union {
114      SYSTEMTIME SystemTime;
115      FILETIME FileTime;
116    } u;
117    ULONG GeneratingComponent;
118    ULONG Status;
119    USHORT DetectionLocation;
120    USHORT Flags;
121    int NumberOfParameters;
122    RPC_EE_INFO_PARAM Parameters[MaxNumberOfEEInfoParams];
123  } RPC_EXTENDED_ERROR_INFO;
124
125  typedef struct tagRPC_ERROR_ENUM_HANDLE {
126    ULONG Signature;
127    void *CurrentPos;
128    void *Head;
129  } RPC_ERROR_ENUM_HANDLE;
130
131  RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorStartEnumeration(RPC_ERROR_ENUM_HANDLE *EnumHandle);
132  RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorGetNextRecord(RPC_ERROR_ENUM_HANDLE *EnumHandle,WINBOOL CopyStrings,RPC_EXTENDED_ERROR_INFO *ErrorInfo);
133  RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorEndEnumeration(RPC_ERROR_ENUM_HANDLE *EnumHandle);
134  RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorResetEnumeration(RPC_ERROR_ENUM_HANDLE *EnumHandle);
135  RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorGetNumberOfRecords(RPC_ERROR_ENUM_HANDLE *EnumHandle,int *Records);
136  RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorSaveErrorInfo(RPC_ERROR_ENUM_HANDLE *EnumHandle,PVOID *ErrorBlob,size_t *BlobSize);
137  RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorLoadErrorInfo(PVOID ErrorBlob,size_t BlobSize,RPC_ERROR_ENUM_HANDLE *EnumHandle);
138  RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorAddRecord(RPC_EXTENDED_ERROR_INFO *ErrorInfo);
139  RPCRTAPI void RPC_ENTRY RpcErrorClearInformation(void);
140  RPCRTAPI RPC_STATUS RPC_ENTRY RpcGetAuthorizationContextForClient(RPC_BINDING_HANDLE ClientBinding,WINBOOL ImpersonateOnReturn,PVOID Reserved1,PLARGE_INTEGER pExpirationTime,LUID Reserved2,DWORD Reserved3,PVOID Reserved4,PVOID *pAuthzClientContext);
141  RPCRTAPI RPC_STATUS RPC_ENTRY RpcFreeAuthorizationContext(PVOID *pAuthzClientContext);
142  RPCRTAPI RPC_STATUS RPC_ENTRY RpcSsContextLockExclusive(RPC_BINDING_HANDLE ServerBindingHandle,PVOID UserContext);
143  RPCRTAPI RPC_STATUS RPC_ENTRY RpcSsContextLockShared(RPC_BINDING_HANDLE ServerBindingHandle,PVOID UserContext);
144
145#define RPC_CALL_ATTRIBUTES_VERSION (1)
146#define RPC_QUERY_SERVER_PRINCIPAL_NAME (2)
147#define RPC_QUERY_CLIENT_PRINCIPAL_NAME (4)
148
149  typedef struct tagRPC_CALL_ATTRIBUTES_V1_W {
150    unsigned int Version;
151    unsigned __LONG32 Flags;
152    unsigned __LONG32 ServerPrincipalNameBufferLength;
153    unsigned short *ServerPrincipalName;
154    unsigned __LONG32 ClientPrincipalNameBufferLength;
155    unsigned short *ClientPrincipalName;
156    unsigned __LONG32 AuthenticationLevel;
157    unsigned __LONG32 AuthenticationService;
158    WINBOOL NullSession;
159  } RPC_CALL_ATTRIBUTES_V1_W;
160
161  typedef struct tagRPC_CALL_ATTRIBUTES_V1_A {
162    unsigned int Version;
163    unsigned __LONG32 Flags;
164    unsigned __LONG32 ServerPrincipalNameBufferLength;
165    unsigned char *ServerPrincipalName;
166    unsigned __LONG32 ClientPrincipalNameBufferLength;
167    unsigned char *ClientPrincipalName;
168    unsigned __LONG32 AuthenticationLevel;
169    unsigned __LONG32 AuthenticationService;
170    WINBOOL NullSession;
171  } RPC_CALL_ATTRIBUTES_V1_A;
172
173#define RPC_CALL_ATTRIBUTES_V1 __MINGW_NAME_UAW(RPC_CALL_ATTRIBUTES_V1)
174#define RpcServerInqCallAttributes __MINGW_NAME_AW(RpcServerInqCallAttributes)
175
176  RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerInqCallAttributesW(RPC_BINDING_HANDLE ClientBinding,void *RpcCallAttributes);
177  RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerInqCallAttributesA(RPC_BINDING_HANDLE ClientBinding,void *RpcCallAttributes);
178
179  typedef RPC_CALL_ATTRIBUTES_V1 RPC_CALL_ATTRIBUTES;
180
181  RPC_STATUS RPC_ENTRY I_RpcAsyncSetHandle(PRPC_MESSAGE Message,PRPC_ASYNC_STATE pAsync);
182  RPC_STATUS RPC_ENTRY I_RpcAsyncAbortCall(PRPC_ASYNC_STATE pAsync,unsigned __LONG32 ExceptionCode);
183  int RPC_ENTRY I_RpcExceptionFilter(unsigned __LONG32 ExceptionCode);
184
185typedef union _RPC_ASYNC_NOTIFICATION_INFO {
186  struct {
187    PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
188    HANDLE                      hThread;
189  } APC;
190  struct {
191    HANDLE       hIOPort;
192    DWORD        dwNumberOfBytesTransferred;
193    DWORD_PTR    dwCompletionKey;
194    LPOVERLAPPED lpOverlapped;
195  } IOC;
196  struct {
197    HWND hWnd;
198    UINT Msg;
199  } HWND;
200  HANDLE                      hEvent;
201  PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
202} RPC_ASYNC_NOTIFICATION_INFO, *PRPC_ASYNC_NOTIFICATION_INFO;
203
204RPC_STATUS RPC_ENTRY RpcBindingBind(
205  PRPC_ASYNC_STATE pAsync,
206  RPC_BINDING_HANDLE Binding,
207  RPC_IF_HANDLE IfSpec
208);
209
210RPC_STATUS RPC_ENTRY RpcBindingUnbind(
211  RPC_BINDING_HANDLE Binding
212);
213
214typedef enum _RpcCallType {
215  rctInvalid,
216  rctNormal,
217  rctTraining,
218  rctGuaranteed
219} RpcCallType;
220
221typedef enum _RpcLocalAddressFormat {
222  rlafInvalid,
223  rlafIPv4,
224  rlafIPv6
225} RpcLocalAddressFormat;
226
227typedef enum _RPC_NOTIFICATIONS {
228  RpcNotificationCallNone           = 0,
229  RpcNotificationClientDisconnect   = 1,
230  RpcNotificationCallCancel         = 2
231} RPC_NOTIFICATIONS;
232
233typedef enum _RpcCallClientLocality {
234  rcclInvalid,
235  rcclLocal,
236  rcclRemote,
237  rcclClientUnknownLocality
238} RpcCallClientLocality;
239
240RPC_STATUS RPC_ENTRY RpcServerSubscribeForNotification(
241  RPC_BINDING_HANDLE Binding,
242  DWORD Notification,
243  RPC_NOTIFICATION_TYPES NotificationType,
244  RPC_ASYNC_NOTIFICATION_INFO *NotificationInfo
245);
246
247RPC_STATUS RPC_ENTRY RpcServerUnsubscribeForNotification(
248  RPC_BINDING_HANDLE Binding,
249  RPC_NOTIFICATIONS Notification,
250  unsigned __LONG32 *NotificationsQueued
251);
252
253#if (_WIN32_WINNT >= 0x0600)
254
255typedef struct tagRPC_CALL_LOCAL_ADDRESS_V1_A {
256  unsigned int          Version;
257  void                  *Buffer;
258  unsigned __LONG32     BufferSize;
259  RpcLocalAddressFormat AddressFormat;
260} RPC_CALL_LOCAL_ADDRESS_V1_A, RPC_CALL_LOCAL_ADDRESS_A;
261
262typedef struct tagRPC_CALL_LOCAL_ADDRESS_V1_W {
263  unsigned int          Version;
264  void                  *Buffer;
265  unsigned __LONG32     BufferSize;
266  RpcLocalAddressFormat AddressFormat;
267} RPC_CALL_LOCAL_ADDRESS_V1_W, RPC_CALL_LOCAL_ADDRESS_W;
268
269#define RPC_CALL_LOCAL_ADDRESS_V1 __MINGW_NAME_AW(RPC_CALL_LOCAL_ADDRESS_V1_)
270#define RPC_CALL_LOCAL_ADDRESS __MINGW_NAME_AW(RPC_CALL_LOCAL_ADDRESS_)
271
272typedef struct tagRPC_CALL_ATTRIBUTES_V2A {
273  unsigned int           Version;
274  unsigned __LONG32      Flags;
275  unsigned __LONG32      ServerPrincipalNameBufferLength;
276  unsigned short         *ServerPrincipalName;
277  unsigned __LONG32      ClientPrincipalNameBufferLength;
278  unsigned short         *ClientPrincipalName;
279  unsigned __LONG32      AuthenticationLevel;
280  unsigned __LONG32      AuthenticationService;
281  WINBOOL                NullSession;
282  WINBOOL                KernelMode;
283  unsigned __LONG32      ProtocolSequence;
284  RpcCallClientLocality  IsClientLocal;
285  HANDLE                 ClientPID;
286  unsigned __LONG32      CallStatus;
287  RpcCallType            CallType;
288  RPC_CALL_LOCAL_ADDRESS_A *CallLocalAddress;
289  unsigned short         OpNum;
290  UUID                   InterfaceUuid;
291} RPC_CALL_ATTRIBUTES_V2_A, RPC_CALL_ATTRIBUTES_A;
292
293typedef struct tagRPC_CALL_ATTRIBUTES_V2W {
294  unsigned int           Version;
295  unsigned __LONG32      Flags;
296  unsigned __LONG32      ServerPrincipalNameBufferLength;
297  unsigned short         *ServerPrincipalName;
298  unsigned __LONG32      ClientPrincipalNameBufferLength;
299  unsigned short         *ClientPrincipalName;
300  unsigned __LONG32      AuthenticationLevel;
301  unsigned __LONG32      AuthenticationService;
302  WINBOOL                NullSession;
303  WINBOOL                KernelMode;
304  unsigned __LONG32      ProtocolSequence;
305  RpcCallClientLocality  IsClientLocal;
306  HANDLE                 ClientPID;
307  unsigned __LONG32      CallStatus;
308  RpcCallType            CallType;
309  RPC_CALL_LOCAL_ADDRESS_W *CallLocalAddress;
310  unsigned short         OpNum;
311  UUID                   InterfaceUuid;
312} RPC_CALL_ATTRIBUTES_V2_W, RPC_CALL_ATTRIBUTES_W;
313
314#define RPC_CALL_ATTRIBUTES_V2 __MINGW_NAME_AW(RPC_CALL_ATTRIBUTES_V2_)
315
316RPC_STATUS RPC_ENTRY RpcDiagnoseError(
317  RPC_BINDING_HANDLE BindingHandle,
318  RPC_IF_HANDLE IfSpec,
319  RPC_STATUS RpcStatus,
320  RPC_ERROR_ENUM_HANDLE *EnumHandle,
321  ULONG Options,
322  HWND ParentWindow
323);
324#endif /*(_WIN32_WINNT >= 0x0600)*/
325
326#ifdef __cplusplus
327}
328#endif
329
330#ifdef __RPC_WIN64__
331#include <poppack.h>
332#endif
333#endif
334