OSDN Git Service

Implement [#2072], [#2088], [#2089], [#2090], [#2091], [#2092] and [#2093].
[mingw/mingw-org-wsl.git] / include / rpcasync.h
1 /**
2  * @file rpcasync.h
3  * @copy 2012 MinGW.org project
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  * 
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  * 
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24 #ifndef _RPCASYNC_H
25 #define _RPCASYNC_H
26 #pragma GCC system_header
27 #include <_mingw.h>
28 #include <sdkddkver.h>
29
30 #if defined(__RPC_WIN64__)
31 __PSHPACK8
32 #endif
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38 #include <windef.h>
39
40 #define ___RPC_ENTRY__ RPCRTAPI RPC_STATUS RPC_ENTRY
41 #define RPC_ASYNC_VERSION_1_0 sizeof(RPC_ASYNC_STATE)
42
43 typedef enum _RPC_NOTIFICATION_TYPES {
44   RpcNotificationTypeNone,
45   RpcNotificationTypeEvent,
46   RpcNotificationTypeApc,
47   RpcNotificationTypeIoc,
48   RpcNotificationTypeHwnd,
49   RpcNotificationTypeCallback
50 } RPC_NOTIFICATION_TYPES;
51
52 typedef enum _RPC_ASYNC_EVENT {
53    RpcCallComplete
54   ,RpcSendComplete
55   ,RpcReceiveComplete
56   ,RpcClientDisconnect
57 #if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
58   ,RpcClientCancel
59 #endif
60 } RPC_ASYNC_EVENT;
61
62 #define RPC_CALL_ATTRIBUTES_VERSION 1
63 #define RPC_QUERY_SERVER_PRINCIPAL_NAME 2
64 #define RPC_QUERY_CLIENT_PRINCIPAL_NAME 4
65
66 struct _RPC_ASYNC_STATE;
67
68 typedef void RPC_ENTRY RPCNOTIFICATION_ROUTINE (
69   struct _RPC_ASYNC_STATE *pAsync,
70   void *Context,
71   RPC_ASYNC_EVENT Event
72 );
73 typedef RPCNOTIFICATION_ROUTINE *PFN_RPCNOTIFICATION_ROUTINE;
74
75 typedef union _RPC_ASYNC_NOTIFICATION_INFO {
76   struct {
77     PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
78     HANDLE hThread;
79   } APC;
80
81 #if !defined(RPC_NO_WINDOWS_H) || defined (_WINBASE_H)
82   struct {
83     HANDLE hIOPort;
84     DWORD dwNumberOfBytesTransferred;
85     DWORD_PTR dwCompletionKey;
86     LPOVERLAPPED lpOverlapped;
87   } IOC;
88 #endif
89
90 #if !defined(RPC_NO_WINDOWS_H)
91   struct {
92     HWND hWnd;
93     UINT Msg;
94   } HWND;
95 #endif
96
97   HANDLE hEvent;
98
99   PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
100 } RPC_ASYNC_NOTIFICATION_INFO, *PRPC_ASYNC_NOTIFICATION_INFO;
101
102 typedef struct _RPC_ASYNC_STATE {
103   unsigned int   Size;
104   unsigned long  Signature;
105   long           Lock;
106   unsigned long  Flags;
107   void          *StubInfo;
108   void          *UserInfo;
109   void          *RuntimeInfo;
110 } RPC_ASYNC_STATE, *PRPC_ASYNC_STATE;
111
112 #define RPC_C_NOTIFY_ON_SEND_COMPLETE 0x1
113 #define RPC_C_INFINITE_TIMEOUT INFINITE
114 #define RpcAsyncGetCallHandle(pAsync) (((PRPC_ASYNC_STATE) pAsync)->RuntimeInfo)
115
116 ___RPC_ENTRY__ RpcAsyncInitializeHandle(PRPC_ASYNC_STATE, unsigned int);
117 ___RPC_ENTRY__ RpcAsyncGetCallStatus(PRPC_ASYNC_STATE);
118 ___RPC_ENTRY__ RpcAsyncCompleteCall(PRPC_ASYNC_STATE, void *);
119 ___RPC_ENTRY__ RpcAsyncAbortCall(PRPC_ASYNC_STATE, unsigned long);
120 ___RPC_ENTRY__ RpcAsyncCancelCall(PRPC_ASYNC_STATE, BOOL);
121
122 #if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
123
124 #if !defined(RPC_NO_WINDOWS_H) || defined(_WINBASE_H)
125 typedef enum tagExtendedErrorParamTypes {
126   eeptAnsiString = 1,
127   eeptUnicodeString,
128   eeptLongVal,
129   eeptShortVal,
130   eeptPointerVal,
131   eeptNone,
132   eeptBinary
133 } ExtendedErrorParamTypes;
134
135 #define MaxNumberOfEEInfoParams 4
136 #define RPC_EEINFO_VERSION 1
137
138 typedef struct tagBinaryParam {
139   void *Buffer;
140   short Size;
141 } BinaryParam;
142
143 typedef struct tagRPC_EE_INFO_PARAM {
144   ExtendedErrorParamTypes;
145   union {
146     LPSTR AnsiString;
147     LPWSTR UnicodeString;
148     long LVal;
149     short SVal;
150     ULONGLONG PVal;
151     BinaryParam BVal;
152   } u;
153 } RPC_EE_INFO_PARAM;
154
155 #define EEInfoPreviousRecordsMission  1
156 #define EEInfoNextRecordsMissing      2
157 #define EEInfoUseFileTime             4
158 #define EEInfoGCCOM                  11
159
160 typedef struct tagRPC_EXTENDED_ERROR_INFO {
161   ULONG Version;
162   LPWSTR ComputerName;
163   ULONG ProcessID;
164   union {
165     SYSTEMTIME SystemTime;
166     FILETIME FileTime;
167   } u;
168   ULONG GeneratingComponent;
169   ULONG Status;
170   USHORT DetectionLocation;
171   USHORT Flags;
172   int NumberOfParameters;
173   RPC_EE_INFO_PARAM Parameters[MaxNumberOfEEInfoParams];
174 } RPC_EXTENDED_ERROR_INFO;
175
176 typedef struct tagRPC_ERROR_ENUM_HANDLE {
177   ULONG Signature;
178   void *CurrentPos;
179   void *Head;
180 } RPC_ERROR_ENUM_HANDLE;
181
182 ___RPC_ENTRY__ RpcErrorStartEnumeration(RPC_ERROR_ENUM_HANDLE *);
183 ___RPC_ENTRY__ RpcErrorGetNextRecord(RPC_ERROR_ENUM_HANDLE *, BOOL, RPC_EXTENDED_ERROR_INFO *);
184 ___RPC_ENTRY__ RpcErrorEndEnumeration(RPC_ERROR_ENUM_HANDLE *);
185 ___RPC_ENTRY__ RpcErrorResetEnumeration(RPC_ERROR_ENUM_HANDLE *);
186 ___RPC_ENTRY__ RpcErrorGetNumberOfRecords(RPC_ERROR_ENUM_HANDLE *, int *);
187 ___RPC_ENTRY__ RpcErrorSaveErrorInfo(RPC_ERROR_ENUM_HANDLE *, PVOID *, size_t *);
188 ___RPC_ENTRY__ RpcErrorLoadErrorInfo(PVOID, size_t, RPC_ERROR_ENUM_HANDLE *);
189 ___RPC_ENTRY__ RpcErrorAddRecord(RPC_EXTENDED_ERROR_INFO *);
190 ___RPC_ENTRY__ RpcErrorClearInformation(void);
191
192 #endif /* !defined(RPC_NO_WINDOWS_H) || defined(_WINBASE_H) */
193
194 ___RPC_ENTRY__ RpcAsyncCleanupThread(DWORD);
195 ___RPC_ENTRY__ RpcGetAuthorizationContextForClient(RPC_BINDING_HANDLE, PVOID, PLARGE_INTEGER, LUID, DWORD, PVOID, PVOID);
196 ___RPC_ENTRY__ RpcFreeAuthorizationContext(PVOID *);
197 ___RPC_ENTRY__ RpcSsContextLockExclusive(RPC_BINDING_HANDLE, PVOID);
198 ___RPC_ENTRY__ RpcSsContextLockShared(RPC_BINDING_HANDLE, PVOID);
199
200 typedef struct tagRPC_CALL_ATTRIBUTES_V1_W {
201   unsigned int Version;
202   unsigned long Flags;
203   unsigned long ServerPrincipalNameBufferLength;
204   unsigned short *ServerPrincipalName;
205   unsigned long ClientPrincipalNameBufferLength;
206   unsigned short *ClientPrincipalName;
207   unsigned long AuthenticationLevel;
208   unsigned long AuthenticationService;
209   BOOL NullSession;
210 } RPC_CALL_ATTRIBUTES_V1_W;
211
212 typedef struct tagRPC_CALL_ATTRIBUTES_V1_A {
213   unsigned int Version;
214   unsigned long Flags;
215   unsigned long ServerPrincipalNameBufferLength;
216   unsigned char *ServerPrincipalName;
217   unsigned long ClientPrincipalNameBufferLength;
218   unsigned char *ClientPrincipalName;
219   unsigned long AuthenticationLevel;
220   unsigned long AuthenticationService;
221   BOOL NullSession;
222 } RPC_CALL_ATTRIBUTES_V1_A;
223
224 ___RPC_ENTRY__ RpcServerInqCallAttributesW(RPC_BINDING_HANDLE, void *);
225 ___RPC_ENTRY__ RpcServerInqCallAttributesA(RPC_BINDING_HANDLE, void *);
226 #define RPC_CALL_ATTRIBUTES_V1 __AW(RPC_CALL_ATTRIBUTES_V1_)
227 #define RpcServerInqCallAttributes __AW(RpcServerInqCallAttributes)
228
229 #if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA)
230 typedef RPC_CALL_ATTRIBUTES_V1 RPC_CALL_ATTRIBUTES;
231 #endif
232
233 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WINXP) */
234
235 #if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
236
237 #define RPC_CALL_STATUS_CANCELLED    0x01
238 #define RPC_CALL_STATUS_DISCONNECTED 0x02
239
240 typedef enum tagRpcCallType {
241   rctInvalid = 0,
242   rctNormal,
243   rctTraining,
244   rctGuaranteed
245 } RpcCallType;
246
247 typedef enum tagRpcCallClientLocality {
248   rcclInvalid = 0,
249   rcclLocal,
250   rcclRemote,
251   rcclClientUnknownLocality
252 } RpcCallClientLocality;
253
254 typedef enum tagRpcLocalAddressFormat {
255   rlafInvalid = 0,
256   rlafIPv4,
257   rlafIPv6
258 } RpcLocalAddressFormat;
259
260 typedef struct _RPC_CALL_LOCAL_ADDRESS_V1 {
261   unsigned int Version;
262   void *Buffer;
263   unsigned long BufferSize;
264   RpcLocalAddressFormat AddressFormat;
265 } RPC_CALL_LOCAL_ADDRESS_V1, *PRPC_CALL_LOCAL_ADDRESS_V1;
266
267 typedef struct tagRPC_CALL_ATTRIBUTES_V2_W {
268   unsigned int Version;
269   unsigned long Flags;
270   unsigned long ServerPrincipalNameBufferLength;
271   unsigned short *ServerPrincipalName;
272   unsigned long ClientPrincipalNameBufferLength;
273   unsigned short *ClientPrincipalName;
274   unsigned long AuthenticationLevel;
275   unsigned long AuthenticationService;
276   BOOL NullSession;
277   BOOL KernelModeCaller;
278   unsigned long ProtocolSequence;
279   RpcCallClientLocality IsClientLocal;
280   HANDLE ClientPID; 
281   unsigned long CallStatus;
282   RpcCallType CallType;
283   RPC_CALL_LOCAL_ADDRESS_V1 *CallLocalAddress;
284   unsigned short OpNum;
285   UUID InterfaceUuid;        
286 } RPC_CALL_ATTRIBUTES_V2_W;
287     
288 typedef struct tagRPC_CALL_ATTRIBUTES_V2_A {
289   unsigned int Version;
290   unsigned long Flags;
291   unsigned long ServerPrincipalNameBufferLength;
292   unsigned char *ServerPrincipalName;
293   unsigned long ClientPrincipalNameBufferLength;
294   unsigned char *ClientPrincipalName;
295   unsigned long AuthenticationLevel;
296   unsigned long AuthenticationService;
297   BOOL NullSession;
298   BOOL KernelModeCaller;
299   unsigned long ProtocolSequence;
300   unsigned long IsClientLocal;
301   HANDLE ClientPID; 
302   unsigned long CallStatus;
303   RpcCallType CallType;
304   RPC_CALL_LOCAL_ADDRESS_V1 *CallLocalAddress;
305   unsigned short OpNum;
306   UUID InterfaceUuid;    
307 } RPC_CALL_ATTRIBUTES_V2_A;
308
309 #define RPC_CALL_ATTRIBUTES_V2 __AW(RPC_CALL_ATTRIBUTES_V2_)
310
311 #define RPC_CALL_ATTRIBUTES_VERSION 2
312 #define RPC_QUERY_SERVER_PRINCIPAL_NAME 0x02
313 #define RPC_QUERY_CLIENT_PRINCIPAL_NAME 0x04
314 #define RPC_QUERY_CALL_LOCAL_ADDRESS    0x08
315 #define RPC_QUERY_CLIENT_PID            0x10
316 #define RPC_QUERY_IS_CLIENT_LOCAL       0x20
317 #define RPC_QUERY_NO_AUTH_REQUIRED      0x40
318
319 typedef RPC_CALL_ATTRIBUTES_V2 RPC_CALL_ATTRIBUTES;
320
321 typedef enum _RPC_NOTIFICATIONS {
322   RpcNotificationCallNone = 0,
323   RpcNotificationClientDisconnect = 1,
324   RpcNotificationCallCancel = 2
325 } RPC_NOTIFICATIONS;
326
327 #define RpcNotificationCallStatusChange    RpcNotificationClientDisconnect
328
329 ___RPC_ENTRY__ RpcServerSubscribeForNotification(RPC_BINDING_HANDLE, RPC_NOTIFICATIONS, RPC_NOTIFICATION_TYPES, RPC_ASYNC_NOTIFICATION_INFO *);
330 ___RPC_ENTRY__ RpcServerUnsubscribeForNotification(RPC_BINDING_HANDLE, RPC_NOTIFICATIONS, unsigned long *);
331 ___RPC_ENTRY__ RpcBindingBind(PRPC_ASYNC_STATE, RPC_BINDING_HANDLE, RPC_IF_HANDLE);
332 ___RPC_ENTRY__ RpcBindingUnbind(RPC_BINDING_HANDLE);
333
334 #if !defined(RPC_NO_WINDOWS_H) || defined(_WINBASE_H)
335 #define RPC_DE_USE_CURRENT_EEINFO 1
336 ___RPC_ENTRY__ RpcDiagnoseError(RPC_BINDING_HANDLE, RPC_IF_HANDLE, RPC_STATUS, RPC_ERROR_ENUM_HANDLE *, ULONG, HWND);
337 #endif /* !defined(RPC_NO_WINDOWS_H) || defined(_WINBASE_H) */
338
339 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_VISTA) */
340
341 #if (_WIN32_WINNT >= _WIN32_WINNT_WS03)
342 #define EEInfoGCFRS                  12
343 #endif /* (_WIN32_WINNT >= _WIN32_WINNT_WS03) */
344
345 #undef ___RPC_ENTRY__
346
347 #ifdef __cplusplus
348 extern }
349 #endif
350
351 #if defined(__RPC_WIN64__)
352 __POPPACK8
353 #endif
354
355 #endif /* !_RPCASYNC_H */