|
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
rpcasync.h
Abstract:
This module contains the RPC runtime APIs needed to use [async] RPC features.
--*/
#ifndef __RPCASYNC_H__
#define __RPCASYNC_H__
#if _MSC_VER > 1000
#pragma once
#endif
#if defined(__RPC_WIN64__)
#include <pshpack8.h>
#endif
#ifdef __cplusplus
extern "C" { #endif
#define RPC_ASYNC_VERSION_1_0 sizeof(RPC_ASYNC_STATE)
typedef enum _RPC_NOTIFICATION_TYPES { RpcNotificationTypeNone, RpcNotificationTypeEvent, RpcNotificationTypeApc, RpcNotificationTypeIoc, RpcNotificationTypeHwnd, RpcNotificationTypeCallback } RPC_NOTIFICATION_TYPES;
typedef enum _RPC_ASYNC_EVENT { RpcCallComplete, RpcSendComplete, RpcReceiveComplete } RPC_ASYNC_EVENT;
struct _RPC_ASYNC_STATE;
typedef void RPC_ENTRY RPCNOTIFICATION_ROUTINE ( struct _RPC_ASYNC_STATE *pAsync, void *Context, RPC_ASYNC_EVENT Event); typedef RPCNOTIFICATION_ROUTINE *PFN_RPCNOTIFICATION_ROUTINE;
typedef struct _RPC_ASYNC_STATE { unsigned int Size; // size of this structure
unsigned long Signature; long Lock; unsigned long Flags; void *StubInfo; void *UserInfo; void *RuntimeInfo; RPC_ASYNC_EVENT Event;
RPC_NOTIFICATION_TYPES NotificationType; union { //
// Notification by APC
//
struct { PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine; HANDLE hThread; } APC;
//
// Notification by IO completion port
//
struct { HANDLE hIOPort; DWORD dwNumberOfBytesTransferred; DWORD_PTR dwCompletionKey; LPOVERLAPPED lpOverlapped; } IOC;
//
// Notification by window message
//
struct { HWND hWnd; UINT Msg; } HWND;
//
// Notification by event
//
HANDLE hEvent;
//
// Notification by callback function
//
// This option is available only to OLE
//
PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine; } u;
LONG_PTR Reserved[4]; } RPC_ASYNC_STATE, *PRPC_ASYNC_STATE;
// Possible values for Flags
#define RPC_C_NOTIFY_ON_SEND_COMPLETE 0x1
#define RPC_C_INFINITE_TIMEOUT INFINITE
#define RpcAsyncGetCallHandle(pAsync) (((PRPC_ASYNC_STATE) pAsync)->RuntimeInfo)
RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncInitializeHandle ( PRPC_ASYNC_STATE pAsync, unsigned int Size );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncRegisterInfo ( PRPC_ASYNC_STATE pAsync ) ;
RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncGetCallStatus ( PRPC_ASYNC_STATE pAsync ) ;
RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncCompleteCall ( PRPC_ASYNC_STATE pAsync, void *Reply ) ;
RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncAbortCall ( PRPC_ASYNC_STATE pAsync, unsigned long ExceptionCode ) ;
RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncCancelCall ( IN PRPC_ASYNC_STATE pAsync, IN BOOL fAbort ) ;
RPCRTAPI RPC_STATUS RPC_ENTRY RpcAsyncCleanupThread ( IN DWORD dwTimeout );
typedef enum tagExtendedErrorParamTypes { eeptAnsiString = 1, eeptUnicodeString, eeptLongVal, eeptShortVal, eeptPointerVal, eeptNone, eeptBinary } ExtendedErrorParamTypes;
#define MaxNumberOfEEInfoParams 4
#define RPC_EEINFO_VERSION 1
typedef struct tagBinaryParam { void *Buffer; short Size; } BinaryParam;
typedef struct tagRPC_EE_INFO_PARAM { ExtendedErrorParamTypes ParameterType; union { LPSTR AnsiString; LPWSTR UnicodeString; long LVal; short SVal; ULONGLONG PVal; BinaryParam BVal; } u; } RPC_EE_INFO_PARAM;
#define EEInfoPreviousRecordsMissing 1
#define EEInfoNextRecordsMissing 2
#define EEInfoUseFileTime 4
#define EEInfoGCCOM 11
#define EEInfoGCFRS 12
typedef struct tagRPC_EXTENDED_ERROR_INFO { ULONG Version; LPWSTR ComputerName; ULONG ProcessID; union { SYSTEMTIME SystemTime; FILETIME FileTime; } u; ULONG GeneratingComponent; ULONG Status; USHORT DetectionLocation; USHORT Flags; int NumberOfParameters; RPC_EE_INFO_PARAM Parameters[MaxNumberOfEEInfoParams]; } RPC_EXTENDED_ERROR_INFO;
typedef struct tagRPC_ERROR_ENUM_HANDLE { ULONG Signature; void *CurrentPos; void *Head; } RPC_ERROR_ENUM_HANDLE;
RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorStartEnumeration ( IN OUT RPC_ERROR_ENUM_HANDLE *EnumHandle );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorGetNextRecord ( IN RPC_ERROR_ENUM_HANDLE *EnumHandle, IN BOOL CopyStrings, OUT RPC_EXTENDED_ERROR_INFO *ErrorInfo );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorEndEnumeration ( IN OUT RPC_ERROR_ENUM_HANDLE *EnumHandle );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorResetEnumeration ( IN OUT RPC_ERROR_ENUM_HANDLE *EnumHandle );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorGetNumberOfRecords ( IN RPC_ERROR_ENUM_HANDLE *EnumHandle, OUT int *Records );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorSaveErrorInfo ( IN RPC_ERROR_ENUM_HANDLE *EnumHandle, OUT PVOID *ErrorBlob, OUT size_t *BlobSize );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorLoadErrorInfo ( IN PVOID ErrorBlob, IN size_t BlobSize, OUT RPC_ERROR_ENUM_HANDLE *EnumHandle );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcErrorAddRecord ( IN RPC_EXTENDED_ERROR_INFO *ErrorInfo );
RPCRTAPI void RPC_ENTRY RpcErrorClearInformation ( void );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcGetAuthorizationContextForClient ( IN RPC_BINDING_HANDLE ClientBinding OPTIONAL, IN BOOL ImpersonateOnReturn, IN PVOID Reserved1, IN PLARGE_INTEGER pExpirationTime OPTIONAL, IN LUID Reserved2, IN DWORD Reserved3, IN PVOID Reserved4, OUT PVOID *pAuthzClientContext );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcFreeAuthorizationContext ( IN OUT PVOID *pAuthzClientContext );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcSsContextLockExclusive ( IN RPC_BINDING_HANDLE ServerBindingHandle, IN PVOID UserContext );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcSsContextLockShared ( IN RPC_BINDING_HANDLE ServerBindingHandle, IN PVOID UserContext );
#define RPC_CALL_ATTRIBUTES_VERSION (1)
#define RPC_QUERY_SERVER_PRINCIPAL_NAME (2)
#define RPC_QUERY_CLIENT_PRINCIPAL_NAME (4)
typedef struct tagRPC_CALL_ATTRIBUTES_V1_W { unsigned int Version; unsigned long Flags; unsigned long ServerPrincipalNameBufferLength; unsigned short *ServerPrincipalName; unsigned long ClientPrincipalNameBufferLength; unsigned short *ClientPrincipalName; unsigned long AuthenticationLevel; unsigned long AuthenticationService; BOOL NullSession; } RPC_CALL_ATTRIBUTES_V1_W;
typedef struct tagRPC_CALL_ATTRIBUTES_V1_A { unsigned int Version; unsigned long Flags; unsigned long ServerPrincipalNameBufferLength; unsigned char *ServerPrincipalName; unsigned long ClientPrincipalNameBufferLength; unsigned char *ClientPrincipalName; unsigned long AuthenticationLevel; unsigned long AuthenticationService; BOOL NullSession; } RPC_CALL_ATTRIBUTES_V1_A;
RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerInqCallAttributesW ( IN RPC_BINDING_HANDLE ClientBinding, OPTIONAL IN OUT void *RpcCallAttributes );
RPCRTAPI RPC_STATUS RPC_ENTRY RpcServerInqCallAttributesA ( IN RPC_BINDING_HANDLE ClientBinding, OPTIONAL IN OUT void *RpcCallAttributes );
#ifdef UNICODE
# define RPC_CALL_ATTRIBUTES_V1 RPC_CALL_ATTRIBUTES_V1_W
# define RpcServerInqCallAttributes RpcServerInqCallAttributesW
#else
# define RPC_CALL_ATTRIBUTES_V1 RPC_CALL_ATTRIBUTES_V1_A
# define RpcServerInqCallAttributes RpcServerInqCallAttributesA
#endif // !UNICODE
typedef RPC_CALL_ATTRIBUTES_V1 RPC_CALL_ATTRIBUTES;
//
// Internal APIs
//
RPC_STATUS RPC_ENTRY I_RpcAsyncSetHandle ( IN PRPC_MESSAGE Message, IN PRPC_ASYNC_STATE pAsync );
RPC_STATUS RPC_ENTRY I_RpcAsyncAbortCall ( IN PRPC_ASYNC_STATE pAsync, IN unsigned long ExceptionCode ) ;
int RPC_ENTRY I_RpcExceptionFilter ( unsigned long ExceptionCode );
#ifdef __cplusplus
} #endif
#if defined(__RPC_WIN64__)
#include <poppack.h>
#endif
#endif /* __RPCASYNC_H__ */
|