Home | History | Annotate | Download | only in include
      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