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 15 extern "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 185 typedef 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 204 RPC_STATUS RPC_ENTRY RpcBindingBind( 205 PRPC_ASYNC_STATE pAsync, 206 RPC_BINDING_HANDLE Binding, 207 RPC_IF_HANDLE IfSpec 208 ); 209 210 RPC_STATUS RPC_ENTRY RpcBindingUnbind( 211 RPC_BINDING_HANDLE Binding 212 ); 213 214 typedef enum _RpcCallType { 215 rctInvalid, 216 rctNormal, 217 rctTraining, 218 rctGuaranteed 219 } RpcCallType; 220 221 typedef enum _RpcLocalAddressFormat { 222 rlafInvalid, 223 rlafIPv4, 224 rlafIPv6 225 } RpcLocalAddressFormat; 226 227 typedef enum _RPC_NOTIFICATIONS { 228 RpcNotificationCallNone = 0, 229 RpcNotificationClientDisconnect = 1, 230 RpcNotificationCallCancel = 2 231 } RPC_NOTIFICATIONS; 232 233 typedef enum _RpcCallClientLocality { 234 rcclInvalid, 235 rcclLocal, 236 rcclRemote, 237 rcclClientUnknownLocality 238 } RpcCallClientLocality; 239 240 RPC_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 247 RPC_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 255 typedef 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 262 typedef 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 272 typedef 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 293 typedef 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 316 RPC_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