/** * WinPR: Windows Portable Runtime * Network Data Representation (NDR) * * Copyright 2012 Marc-Andre Moreau * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef WINPR_RPC_NDR_H #define WINPR_RPC_NDR_H #include #include #ifndef _WIN32 #define __RPC_WIN32__ 1 #define TARGET_IS_NT50_OR_LATER 1 typedef union _CLIENT_CALL_RETURN { void* Pointer; LONG_PTR Simple; } CLIENT_CALL_RETURN; typedef struct _RPC_VERSION { unsigned short MajorVersion; unsigned short MinorVersion; } RPC_VERSION; typedef struct _RPC_SYNTAX_IDENTIFIER { GUID SyntaxGUID; RPC_VERSION SyntaxVersion; } RPC_SYNTAX_IDENTIFIER, PRPC_SYNTAX_IDENTIFIER; #define RPC_MGR_EPV void typedef struct _RPC_MESSAGE { RPC_BINDING_HANDLE Handle; ULONG DataRepresentation; void* Buffer; unsigned int BufferLength; unsigned int ProcNum; PRPC_SYNTAX_IDENTIFIER TransferSyntax; void* RpcInterfaceInformation; void* ReservedForRuntime; RPC_MGR_EPV* ManagerEpv; void* ImportContext; ULONG RpcFlags; } RPC_MESSAGE, *PRPC_MESSAGE; typedef void (*RPC_DISPATCH_FUNCTION)(PRPC_MESSAGE Message); typedef struct { unsigned int DispatchTableCount; RPC_DISPATCH_FUNCTION* DispatchTable; LONG_PTR Reserved; } RPC_DISPATCH_TABLE, *PRPC_DISPATCH_TABLE; typedef struct _RPC_PROTSEQ_ENDPOINT { unsigned char* RpcProtocolSequence; unsigned char* Endpoint; } RPC_PROTSEQ_ENDPOINT, * PRPC_PROTSEQ_ENDPOINT; typedef struct _RPC_SERVER_INTERFACE { unsigned int Length; RPC_SYNTAX_IDENTIFIER InterfaceId; RPC_SYNTAX_IDENTIFIER TransferSyntax; PRPC_DISPATCH_TABLE DispatchTable; unsigned int RpcProtseqEndpointCount; PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint; RPC_MGR_EPV* DefaultManagerEpv; void const* InterpreterInfo; unsigned int Flags; } RPC_SERVER_INTERFACE, *PRPC_SERVER_INTERFACE; typedef struct _RPC_CLIENT_INTERFACE { unsigned int Length; RPC_SYNTAX_IDENTIFIER InterfaceId; RPC_SYNTAX_IDENTIFIER TransferSyntax; PRPC_DISPATCH_TABLE DispatchTable; unsigned int RpcProtseqEndpointCount; PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint; ULONG_PTR Reserved; void const* InterpreterInfo; unsigned int Flags; } RPC_CLIENT_INTERFACE, *PRPC_CLIENT_INTERFACE; typedef void* (*GENERIC_BINDING_ROUTINE)(void*); typedef void (*GENERIC_UNBIND_ROUTINE)(void*, unsigned char*); typedef struct _GENERIC_BINDING_ROUTINE_PAIR { GENERIC_BINDING_ROUTINE pfnBind; GENERIC_UNBIND_ROUTINE pfnUnbind; } GENERIC_BINDING_ROUTINE_PAIR, *PGENERIC_BINDING_ROUTINE_PAIR; typedef struct __GENERIC_BINDING_INFO { void* pObj; unsigned int Size; GENERIC_BINDING_ROUTINE pfnBind; GENERIC_UNBIND_ROUTINE pfnUnbind; } GENERIC_BINDING_INFO, *PGENERIC_BINDING_INFO; typedef void (*NDR_RUNDOWN)(void* context); typedef void (*NDR_NOTIFY_ROUTINE)(void); typedef const unsigned char* PFORMAT_STRING; typedef struct _MIDL_STUB_DESC MIDL_STUB_DESC; typedef MIDL_STUB_DESC* PMIDL_STUB_DESC; typedef struct _MIDL_STUB_MESSAGE { PRPC_MESSAGE RpcMsg; unsigned char* Buffer; unsigned char* BufferStart; unsigned char* BufferEnd; unsigned char* BufferMark; ULONG BufferLength; ULONG MemorySize; unsigned char* Memory; int IsClient; int ReuseBuffer; struct NDR_ALLOC_ALL_NODES_CONTEXT* pAllocAllNodesContext; struct NDR_POINTER_QUEUE_STATE* pPointerQueueState; int IgnoreEmbeddedPointers; unsigned char* PointerBufferMark; unsigned char fBufferValid; unsigned char uFlags; unsigned short Unused2; ULONG_PTR MaxCount; ULONG Offset; ULONG ActualCount; void *(*pfnAllocate)(size_t); void (*pfnFree)(void*); unsigned char* StackTop; unsigned char* pPresentedType; unsigned char* pTransmitType; handle_t SavedHandle; const struct _MIDL_STUB_DESC* StubDesc; struct _FULL_PTR_XLAT_TABLES* FullPtrXlatTables; ULONG FullPtrRefId; ULONG PointerLength; int fInDontFree : 1; int fDontCallFreeInst : 1; int fInOnlyParam : 1; int fHasReturn : 1; int fHasExtensions : 1; int fHasNewCorrDesc : 1; int fUnused : 10; int fUnused2 : 16; ULONG dwDestContext; void* pvDestContext; //NDR_SCONTEXT* SavedContextHandles; long ParamNumber; struct IRpcChannelBuffer* pRpcChannelBuffer; //PARRAY_INFO pArrayInfo; ULONG* SizePtrCountArray; ULONG* SizePtrOffsetArray; ULONG* SizePtrLengthArray; void* pArgQueue; ULONG dwStubPhase; void* LowStackMark; //PNDR_ASYNC_MESSAGE pAsyncMsg; //PNDR_CORRELATION_INFO pCorrInfo; unsigned char* pCorrMemory; void* pMemoryList; //CS_STUB_INFO* pCSInfo; unsigned char* ConformanceMark; unsigned char* VarianceMark; void* BackingStoreLowMark; INT_PTR Unused; struct _NDR_PROC_CONTEXT* pContext; INT_PTR Reserved51_1; INT_PTR Reserved51_2; INT_PTR Reserved51_3; INT_PTR Reserved51_4; INT_PTR Reserved51_5; } MIDL_STUB_MESSAGE, *PMIDL_STUB_MESSAGE; typedef void (*EXPR_EVAL)(struct _MIDL_STUB_MESSAGE*); typedef void (*XMIT_HELPER_ROUTINE)(PMIDL_STUB_MESSAGE); typedef struct _XMIT_ROUTINE_QUINTUPLE { XMIT_HELPER_ROUTINE pfnTranslateToXmit; XMIT_HELPER_ROUTINE pfnTranslateFromXmit; XMIT_HELPER_ROUTINE pfnFreeXmit; XMIT_HELPER_ROUTINE pfnFreeInst; } XMIT_ROUTINE_QUINTUPLE, *PXMIT_ROUTINE_QUINTUPLE; typedef ULONG (*USER_MARSHAL_SIZING_ROUTINE)(ULONG*, ULONG, void*); typedef unsigned char* (*USER_MARSHAL_MARSHALLING_ROUTINE)(ULONG*, unsigned char*, void*); typedef unsigned char* (*USER_MARSHAL_UNMARSHALLING_ROUTINE)(ULONG*, unsigned char*, void*); typedef void (*USER_MARSHAL_FREEING_ROUTINE)(ULONG*, void*); typedef struct _USER_MARSHAL_ROUTINE_QUADRUPLE { USER_MARSHAL_SIZING_ROUTINE pfnBufferSize; USER_MARSHAL_MARSHALLING_ROUTINE pfnMarshall; USER_MARSHAL_UNMARSHALLING_ROUTINE pfnUnmarshall; USER_MARSHAL_FREEING_ROUTINE pfnFree; } USER_MARSHAL_ROUTINE_QUADRUPLE; typedef struct _MALLOC_FREE_STRUCT { void* (*pfnAllocate)(size_t); void (*pfnFree)(void*); } MALLOC_FREE_STRUCT; typedef struct _COMM_FAULT_OFFSETS { short CommOffset; short FaultOffset; } COMM_FAULT_OFFSETS; typedef void* NDR_CS_ROUTINES; typedef void* NDR_EXPR_DESC; struct _MIDL_STUB_DESC { void* RpcInterfaceInformation; void* (*pfnAllocate)(size_t); void (*pfnFree)(void*); union { handle_t* pAutoHandle; handle_t* pPrimitiveHandle; PGENERIC_BINDING_INFO pGenericBindingInfo; } IMPLICIT_HANDLE_INFO; const NDR_RUNDOWN* apfnNdrRundownRoutines; const GENERIC_BINDING_ROUTINE_PAIR* aGenericBindingRoutinePairs; const EXPR_EVAL* apfnExprEval; const XMIT_ROUTINE_QUINTUPLE* aXmitQuintuple; const unsigned char* pFormatTypes; int fCheckBounds; ULONG Version; MALLOC_FREE_STRUCT* pMallocFreeStruct; long MIDLVersion; const COMM_FAULT_OFFSETS* CommFaultOffsets; const USER_MARSHAL_ROUTINE_QUADRUPLE* aUserMarshalQuadruple; const NDR_NOTIFY_ROUTINE* NotifyRoutineTable; ULONG_PTR mFlags; const NDR_CS_ROUTINES* CsRoutineTables; void* ProxyServerInfo; const NDR_EXPR_DESC* pExprInfo; }; typedef struct { unsigned char FullPtrUsed : 1; unsigned char RpcSsAllocUsed : 1; unsigned char ObjectProc : 1; unsigned char HasRpcFlags : 1; unsigned char IgnoreObjectException : 1; unsigned char HasCommOrFault : 1; unsigned char UseNewInitRoutines : 1; unsigned char Unused : 1; } INTERPRETER_FLAGS, *PINTERPRETER_FLAGS; typedef struct { unsigned short MustSize : 1; unsigned short MustFree : 1; unsigned short IsPipe : 1; unsigned short IsIn : 1; unsigned short IsOut : 1; unsigned short IsReturn : 1; unsigned short IsBasetype : 1; unsigned short IsByValue : 1; unsigned short IsSimpleRef : 1; unsigned short IsDontCallFreeInst : 1; unsigned short SaveForAsyncFinish : 1; unsigned short Unused : 2; unsigned short ServerAllocSize : 3; } PARAM_ATTRIBUTES, *PPARAM_ATTRIBUTES; typedef struct { unsigned char ServerMustSize : 1; unsigned char ClientMustSize : 1; unsigned char HasReturn : 1; unsigned char HasPipes : 1; unsigned char Unused : 1; unsigned char HasAsyncUuid : 1; unsigned char HasExtensions : 1; unsigned char HasAsyncHandle : 1; } INTERPRETER_OPT_FLAGS, *PINTERPRETER_OPT_FLAGS; typedef struct { unsigned char HasNewCorrDesc : 1; unsigned char ClientCorrCheck : 1; unsigned char ServerCorrCheck : 1; unsigned char HasNotify : 1; unsigned char HasNotify2 : 1; unsigned char Unused : 3; } INTERPRETER_OPT_FLAGS2, *PINTERPRETER_OPT_FLAGS2; typedef struct _NDR_CORRELATION_FLAGS { unsigned char Early : 1; unsigned char Split : 1; unsigned char IsIidIs : 1; unsigned char DontCheck : 1; unsigned char Unused : 4; } NDR_CORRELATION_FLAGS; #define FC_ALLOCATE_ALL_NODES 0x01 #define FC_DONT_FREE 0x02 #define FC_ALLOCED_ON_STACK 0x03 #define FC_SIMPLE_POINTER 0x04 #define FC_POINTER_DEREF 0x05 #define HANDLE_PARAM_IS_VIA_PTR 0x80 #define HANDLE_PARAM_IS_IN 0x40 #define HANDLE_PARAM_IS_OUT 0x20 #define HANDLE_PARAM_IS_RETURN 0x21 #define NDR_STRICT_CONTEXT_HANDLE 0x08 #define NDR_CONTEXT_HANDLE_NO_SERIALIZE 0x04 #define NDR_CONTEXT_HANDLE_SERIALIZE 0x02 #define NDR_CONTEXT_HANDLE_CANNOT_BE_NULL 0x01 typedef struct { PARAM_ATTRIBUTES Attributes; unsigned short StackOffset; union { unsigned char FormatChar; unsigned short Offset; } Type; } NDR_PARAM; typedef struct { unsigned char Size; INTERPRETER_OPT_FLAGS2 Flags2; unsigned short ClientCorrHint; unsigned short ServerCorrHint; unsigned short NotifyIndex; } NDR_PROC_HEADER_EXTS; typedef struct _NDR_PROC_HEADER { unsigned char HandleType; INTERPRETER_FLAGS OldOiFlags; unsigned short RpcFlagsLow; unsigned short RpcFlagsHi; unsigned short ProcNum; unsigned short StackSize; } NDR_PROC_HEADER, *PNDR_PROC_HEADER; typedef struct _NDR_OI2_PROC_HEADER { unsigned short ClientBufferSize; unsigned short ServerBufferSize; INTERPRETER_OPT_FLAGS Oi2Flags; unsigned char NumberParams; } NDR_OI2_PROC_HEADER, *PNDR_OI2_PROC_HEADER; typedef enum _NDR_PHASE { NDR_PHASE_SIZE, NDR_PHASE_MARSHALL, NDR_PHASE_UNMARSHALL, NDR_PHASE_FREE } NDR_PHASE; #define FC_NORMAL_CONFORMANCE 0x00 #define FC_POINTER_CONFORMANCE 0x10 #define FC_TOP_LEVEL_CONFORMANCE 0x20 #define FC_CONSTANT_CONFORMANCE 0x40 #define FC_TOP_LEVEL_MULTID_CONFORMANCE 0x80 /* Type Format Strings: http://msdn.microsoft.com/en-us/library/windows/desktop/aa379093/ */ #define FC_ZERO 0x00 #define FC_BYTE 0x01 #define FC_CHAR 0x02 #define FC_SMALL 0x03 #define FC_USMALL 0x04 #define FC_WCHAR 0x05 #define FC_SHORT 0x06 #define FC_USHORT 0x07 #define FC_LONG 0x08 #define FC_ULONG 0x09 #define FC_FLOAT 0x0A #define FC_HYPER 0x0B #define FC_DOUBLE 0x0C #define FC_ENUM16 0x0D #define FC_ENUM32 0x0E #define FC_IGNORE 0x0F #define FC_ERROR_STATUS_T 0x10 #define FC_RP 0x11 #define FC_UP 0x12 #define FC_OP 0x13 #define FC_FP 0x14 #define FC_STRUCT 0x15 #define FC_PSTRUCT 0x16 #define FC_CSTRUCT 0x17 #define FC_CPSTRUCT 0x18 #define FC_CVSTRUCT 0x19 #define FC_BOGUS_STRUCT 0x1A #define FC_CARRAY 0x1B #define FC_CVARRAY 0x1C #define FC_SMFARRAY 0x1D #define FC_LGFARRAY 0x1E #define FC_SMVARRAY 0x1F #define FC_LGVARRAY 0x20 #define FC_BOGUS_ARRAY 0x21 #define FC_C_CSTRING 0x22 #define FC_C_BSTRING 0x23 #define FC_C_SSTRING 0x24 #define FC_C_WSTRING 0x25 #define FC_CSTRING 0x26 #define FC_BSTRING 0x27 #define FC_SSTRING 0x28 #define FC_WSTRING 0x29 #define FC_ENCAPSULATED_UNION 0x2A #define FC_NON_ENCAPSULATED_UNION 0x2B #define FC_BYTE_COUNT_POINTER 0x2C #define FC_TRANSMIT_AS 0x2D #define FC_REPRESENT_AS 0x2E #define FC_IP 0x2F #define FC_BIND_CONTEXT 0x30 #define FC_BIND_GENERIC 0x31 #define FC_BIND_PRIMITIVE 0x32 #define FC_AUTO_HANDLE 0x33 #define FC_CALLBACK_HANDLE 0x34 #define FC_UNUSED1 0x35 #define FC_POINTER 0x36 #define FC_ALIGNM2 0x37 #define FC_ALIGNM4 0x38 #define FC_ALIGNM8 0x39 #define FC_UNUSED2 0x3A #define FC_UNUSED3 0x3B #define FC_UNUSED4 0x3C #define FC_STRUCTPAD1 0x3D #define FC_STRUCTPAD2 0x3E #define FC_STRUCTPAD3 0x3F #define FC_STRUCTPAD4 0x40 #define FC_STRUCTPAD5 0x41 #define FC_STRUCTPAD6 0x42 #define FC_STRUCTPAD7 0x43 #define FC_STRING_SIZED 0x44 #define FC_UNUSED5 0x45 #define FC_NO_REPEAT 0x46 #define FC_FIXED_REPEAT 0x47 #define FC_VARIABLE_REPEAT 0x48 #define FC_FIXED_OFFSET 0x49 #define FC_VARIABLE_OFFSET 0x4A #define FC_PP 0x4B #define FC_EMBEDDED_COMPLEX 0x4C #define FC_IN_PARAM 0x4D #define FC_IN_PARAM_BASETYPE 0x4E #define FC_IN_PARAM_NO_FREE_INST 0x4F #define FC_IN_OUT_PARAM 0x50 #define FC_OUT_PARAM 0x51 #define FC_RETURN_PARAM 0x52 #define FC_RETURN_PARAM_BASETYPE 0x53 #define FC_DEREFERENCE 0x54 #define FC_DIV_2 0x55 #define FC_MULT_2 0x56 #define FC_ADD_1 0x57 #define FC_SUB_1 0x58 #define FC_CALLBACK 0x59 #define FC_CONSTANT_IID 0x5A #define FC_END 0x5B #define FC_PAD 0x5C #define FC_SPLIT_DEREFERENCE 0x74 #define FC_SPLIT_DIV_2 0x75 #define FC_SPLIT_MULT_2 0x76 #define FC_SPLIT_ADD_1 0x77 #define FC_SPLIT_SUB_1 0x78 #define FC_SPLIT_CALLBACK 0x79 #define FC_HARD_STRUCT 0xB1 #define FC_TRANSMIT_AS_PTR 0xB2 #define FC_REPRESENT_AS_PTR 0xB3 #define FC_USER_MARSHAL 0xB4 #define FC_PIPE 0xB5 #define FC_BLKHOLE 0xB6 #define FC_RANGE 0xB7 #define FC_INT3264 0xB8 #define FC_UINT3264 0xB9 #define FC_END_OF_UNIVERSE 0xBA #define NdrFcShort(s) (byte)(s & 0xFF), (byte)(s >> 8) #define NdrFcLong(s) (byte)(s & 0xFF), (byte)((s & 0x0000FF00) >> 8), \ (byte)((s & 0x00FF0000) >> 16), (byte)(s >> 24) typedef void (*NDR_TYPE_SIZE_ROUTINE)(PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, PFORMAT_STRING pFormat); typedef void (*NDR_TYPE_MARSHALL_ROUTINE)(PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, unsigned char FormatChar); typedef void (*NDR_TYPE_UNMARSHALL_ROUTINE)(PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, unsigned char FormatChar); typedef void (*NDR_TYPE_FREE_ROUTINE)(PMIDL_STUB_MESSAGE pStubMsg, unsigned char* pMemory, PFORMAT_STRING pFormat); #ifdef __cplusplus extern "C" { #endif WINPR_API CLIENT_CALL_RETURN NdrClientCall2(PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ...); #ifdef __cplusplus } #endif #endif #endif /* WINPR_RPC_NDR_H */