/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Copyright (c) 2000 Microsoft Corporation Module Name : ndrtoken.h Abtract : Format character definitions, type flags, and other such stuff. Mainly from rpc\midl\inc\ndrtypes.h Revision History : John Doty johndoty May 2000 (Assembled from other ndr headers) --------------------------------------------------------------------*/ #ifndef __NDRTOKEN_H__ #define __NDRTOKEN_H__ #ifdef __cplusplus extern "C" { #endif // // Format character definitions. // // !!! WARNING WARNING WARNING !!! // // All of the format character values up to FC_PAD can no longer be changed, // in order to preserve NT 3.5 compatability (excluding those marked as // FC_UNUSED*, these were unused format characters in NDR library version 1.1). // Their ordinal number, as well as semantics, must remain. // // When additional format characters are added (at the end), changes must // be made in ndr20 as well as codegen\frmtstr.cxx to handle the new type. // In particular, there is a pFormatCharNames table and a pNdrRoutineNames table // that should be kept in ssync. // // !!! WARNING WARNING WARNING !!! // typedef enum { // // This might catch some errors, probably can be removed after debugging. // FC_ZERO, // // Simple integer and floating point types. // FC_BYTE, // 0x01 FC_CHAR, // 0x02 FC_SMALL, // 0x03 FC_USMALL, // 0x04 FC_WCHAR, // 0x05 FC_SHORT, // 0x06 FC_USHORT, // 0x07 FC_LONG, // 0x08 FC_ULONG, // 0x09 FC_FLOAT, // 0x0a FC_HYPER, // 0x0b FC_DOUBLE, // 0x0c // // Enums. // FC_ENUM16, // 0x0d FC_ENUM32, // 0x0e // // !!!IMPORTANT!!! // All format charaters which appear before this comment must have an // enum value which will fit in 4 bits. // // // Special. // FC_IGNORE, // 0x0f FC_ERROR_STATUS_T, // 0x10 // // Pointer types : // RP - reference pointer // UP - unique pointer // OP - OLE unique pointer // FP - full pointer // FC_RP, // 0x11 FC_UP, // 0x12 FC_OP, // 0x13 FC_FP, // 0x14 // // Structures // // // Structure containing only simple types and fixed arrays. // FC_STRUCT, // 0x15 // // Structure containing only simple types, pointers and fixed arrays. // FC_PSTRUCT, // 0x16 // // Structure containing a conformant array plus all those types // allowed by FC_STRUCT. // FC_CSTRUCT, // 0x17 // // Struct containing a conformant array plus all those types allowed by // FC_PSTRUCT. // FC_CPSTRUCT, // 0x18 // // Struct containing either a conformant varying array or a conformant // string, plus all those types allowed by FC_PSTRUCT. // FC_CVSTRUCT, // 0x19 // // Complex struct - totally bogus! // FC_BOGUS_STRUCT, // 0x1a // // Arrays. // // // Conformant arrray. // FC_CARRAY, // 0x1b // // Conformant varying array. // FC_CVARRAY, // 0x1c // // Fixed array, small and large. // FC_SMFARRAY, // 0x1d FC_LGFARRAY, // 0x1e // // Varying array, small and large. // FC_SMVARRAY, // 0x1f FC_LGVARRAY, // 0x20 // // Complex arrays - totally bogus! // FC_BOGUS_ARRAY, // 0x21 // // Strings : // // The order of these should have been moved around, but it's too late // now. // // CSTRING - character string // BSTRING - byte string (Beta2 compatability only) // SSTRING - structure string // WSTRING - wide charater string // // // Conformant strings. // FC_C_CSTRING, // 0x22 FC_C_BSTRING, // 0x23 FC_C_SSTRING, // 0x24 FC_C_WSTRING, // 0x25 // // Non-conformant strings. // FC_CSTRING, // 0x26 FC_BSTRING, // 0x27 FC_SSTRING, // 0x28 FC_WSTRING, // 0x29 // // Unions // FC_ENCAPSULATED_UNION, // 0x2a FC_NON_ENCAPSULATED_UNION, // 0x2b // // Byte count pointer. // FC_BYTE_COUNT_POINTER, // 0x2c // // transmit_as and represent_as // FC_TRANSMIT_AS, // 0x2d FC_REPRESENT_AS, // 0x2e // // Cairo Interface pointer. // FC_IP, // 0x2f // // Binding handle types // FC_BIND_CONTEXT, // 0x30 FC_BIND_GENERIC, // 0x31 FC_BIND_PRIMITIVE, // 0x32 FC_AUTO_HANDLE, // 0x33 FC_CALLBACK_HANDLE, // 0x34 FC_UNUSED1, // 0x35 // Embedded pointer - used in complex structure layouts only. FC_POINTER, // 0x36 // // Alignment directives, used in structure layouts. // No longer generated with post NT5.0 MIDL. // FC_ALIGNM2, // 0x37 FC_ALIGNM4, // 0x38 FC_ALIGNM8, // 0x39 FC_UNUSED2, // 0x3a FC_UNUSED3, // 0x3b FC_UNUSED4, // 0x3c // // Structure padding directives, used in structure layouts only. // FC_STRUCTPAD1, // 0x3d FC_STRUCTPAD2, // 0x3e FC_STRUCTPAD3, // 0x3f FC_STRUCTPAD4, // 0x40 FC_STRUCTPAD5, // 0x41 FC_STRUCTPAD6, // 0x42 FC_STRUCTPAD7, // 0x43 // // Additional string attribute. // FC_STRING_SIZED, // 0x44 FC_UNUSED5, // 0x45 // // Pointer layout attributes. // FC_NO_REPEAT, // 0x46 FC_FIXED_REPEAT, // 0x47 FC_VARIABLE_REPEAT, // 0x48 FC_FIXED_OFFSET, // 0x49 FC_VARIABLE_OFFSET, // 0x4a // Pointer section delimiter. FC_PP, // 0x4b // Embedded complex type. FC_EMBEDDED_COMPLEX, // 0x4c // Parameter attributes. FC_IN_PARAM, // 0x4d FC_IN_PARAM_BASETYPE, // 0x4e FC_IN_PARAM_NO_FREE_INST, // 0x4d FC_IN_OUT_PARAM, // 0x50 FC_OUT_PARAM, // 0x51 FC_RETURN_PARAM, // 0x52 FC_RETURN_PARAM_BASETYPE, // 0x53 // // Conformance/variance attributes. // FC_DEREFERENCE, // 0x54 FC_DIV_2, // 0x55 FC_MULT_2, // 0x56 FC_ADD_1, // 0x57 FC_SUB_1, // 0x58 FC_CALLBACK, // 0x59 // Iid flag. FC_CONSTANT_IID, // 0x5a FC_END, // 0x5b FC_PAD, // 0x5c FC_EXPR, // 0x5d FC_PARTIAL_IGNORE_PARAM, // 0x5e // // split Conformance/variance attributes. // FC_SPLIT_DEREFERENCE = 0x74, // 0x74 FC_SPLIT_DIV_2, // 0x75 FC_SPLIT_MULT_2, // 0x76 FC_SPLIT_ADD_1, // 0x77 FC_SPLIT_SUB_1, // 0x78 FC_SPLIT_CALLBACK, // 0x79 // // ********************************** // New Post NT 3.5 format characters. // ********************************** // // // Attributes, directives, etc. // // // New types. // // These start at 0xb1 (0x31 + 0x80) so that their routines can simply be // placed sequentially in the various routine tables, while using // a new ROUTINE_INDEX() macro which strips off the most significant bit // of the format character. The value 0x31 is the next value after // FC_BIND_CONTEXT, whose routines were previously the last to appear // in the routine tables. // FC_HARD_STRUCT = 0xb1, // 0xb1 FC_TRANSMIT_AS_PTR, // 0xb2 FC_REPRESENT_AS_PTR, // 0xb3 FC_USER_MARSHAL, // 0xb4 FC_PIPE, // 0xb5 FC_BLKHOLE, // 0xb6 FC_RANGE, // 0xb7 NT 5 beta2 MIDL 3.3.110 FC_INT3264, // 0xb8 NT 5 beta2, MIDL64, 5.1.194+ FC_UINT3264, // 0xb9 NT 5 beta2, MIDL64, 5.1.194+ // // Post NT 5.0 strings // // // Arrays of international characters // FC_CSARRAY, // 0xba FC_CS_TAG, // 0xbb // Replacement for alignment in structure layout. FC_STRUCTPADN, // 0xbc FC_INT128, // 0xbd FC_UINT128, // 0xbe FC_FLOAT80, // 0xbf FC_FLOAT128, // 0xc0 FC_BUFFER_ALIGN, // 0xc1 // // New Ndr64 codes // FC_ENCAP_UNION, // 0xc2 // new arrays types FC_FIX_ARRAY, // 0xc3 FC_CONF_ARRAY, // 0xc4 FC_VAR_ARRAY, // 0xc5 FC_CONFVAR_ARRAY, // 0xc6 FC_FIX_FORCED_BOGUS_ARRAY, // 0xc7 FC_FIX_BOGUS_ARRAY, // 0xc8 FC_FORCED_BOGUS_ARRAY, // 0xc9 FC_CHAR_STRING, // 0xca FC_WCHAR_STRING, // 0xcb FC_STRUCT_STRING, // 0xcc FC_CONF_CHAR_STRING, // 0xcd FC_CONF_WCHAR_STRING, // 0xce FC_CONF_STRUCT_STRING, // 0xcf // new structures types FC_CONF_STRUCT, // 0xd0 FC_CONF_PSTRUCT, // 0xd1 FC_CONFVAR_STRUCT, // 0xd2 FC_CONFVAR_PSTRUCT, // 0xd3 FC_FORCED_BOGUS_STRUCT, // 0xd4 FC_CONF_BOGUS_STRUCT, // 0xd5 FC_FORCED_CONF_BOGUS_STRUCT,// 0xd7 FC_END_OF_UNIVERSE // 0xd8 } FORMAT_CHARACTER; // // Conformance and variance constants // #define FC_NORMAL_CONFORMANCE (unsigned char) 0x00 #define FC_POINTER_CONFORMANCE (unsigned char) 0x10 #define FC_TOP_LEVEL_CONFORMANCE (unsigned char) 0x20 #define FC_CONSTANT_CONFORMANCE (unsigned char) 0x40 #define FC_TOP_LEVEL_MULTID_CONFORMANCE (unsigned char) 0x80 #define FC_NORMAL_VARIANCE FC_NORMAL_CONFORMANCE #define FC_POINTER_VARIANCE FC_POINTER_CONFORMANCE #define FC_TOP_LEVEL_VARIANCE FC_TOP_LEVEL_CONFORMANCE #define FC_CONSTANT_VARIANCE FC_CONSTANT_CONFORMANCE #define FC_TOP_LEVEL_MULTID_VARIANCE FC_TOP_LEVEL_MULTID_CONFORMANCE #define FC_NORMAL_SWITCH_IS FC_NORMAL_CONFORMANCE #define FC_POINTER_SWITCH_IS FC_POINTER_CONFORMANCE #define FC_TOP_LEVEL_SWITCH_IS FC_TOP_LEVEL_CONFORMANCE #define FC_CONSTANT_SWITCH_IS FC_CONSTANT_CONFORMANCE // // Pointer attributes. // #define FC_ALLOCATE_ALL_NODES 0x01 #define FC_DONT_FREE 0x02 #define FC_ALLOCED_ON_STACK 0x04 #define FC_SIMPLE_POINTER 0x08 #define FC_POINTER_DEREF 0x10 #define NDR_DEFAULT_CORR_CACHE_SIZE 400 #if !defined(__RPC_MAC__) // // Interpreter bit flag structures. // // These are the old Oi interpreter proc flags. typedef struct { unsigned char FullPtrUsed : 1; // 0x01 unsigned char RpcSsAllocUsed : 1; // 0x02 unsigned char ObjectProc : 1; // 0x04 unsigned char HasRpcFlags : 1; // 0x08 unsigned char IgnoreObjectException : 1; // 0x10 unsigned char HasCommOrFault : 1; // 0x20 unsigned char UseNewInitRoutines : 1; // 0x40 unsigned char Unused : 1; } INTERPRETER_FLAGS, *PINTERPRETER_FLAGS; // These are the Oi2 parameter flags. typedef struct { unsigned short MustSize : 1; // 0x0001 unsigned short MustFree : 1; // 0x0002 unsigned short IsPipe : 1; // 0x0004 unsigned short IsIn : 1; // 0x0008 unsigned short IsOut : 1; // 0x0010 unsigned short IsReturn : 1; // 0x0020 unsigned short IsBasetype : 1; // 0x0040 unsigned short IsByValue : 1; // 0x0080 unsigned short IsSimpleRef : 1; // 0x0100 unsigned short IsDontCallFreeInst : 1; // 0x0200 unsigned short SaveForAsyncFinish : 1; // 0x0400 unsigned short IsPartialIgnore : 1; // 0x0800 unsigned short IsForceAllocate : 1; // 0x1000 unsigned short ServerAllocSize : 3; // 0xe000 } PARAM_ATTRIBUTES, *PPARAM_ATTRIBUTES; // These are the new Oi2 proc flags. typedef struct { unsigned char ServerMustSize : 1; // 0x01 unsigned char ClientMustSize : 1; // 0x02 unsigned char HasReturn : 1; // 0x04 unsigned char HasPipes : 1; // 0x08 unsigned char Unused : 1; unsigned char HasAsyncUuid : 1; // 0x20 unsigned char HasExtensions : 1; // 0x40 unsigned char HasAsyncHandle : 1; // 0x80 } INTERPRETER_OPT_FLAGS, *PINTERPRETER_OPT_FLAGS; // This is the proc header layout for object procs starting with MIDL 3.3.129, // introduced for the async_uuid() support in dcom but generated for ony object // interface, regardless of the compiler mode and interface being async. // Handle is always autohandle and so there never is explicit handle descriptor. // RpcFlags are always present to make the layout fixed. typedef struct _NDR_DCOM_OI2_PROC_HEADER { unsigned char HandleType; // The old Oi header INTERPRETER_FLAGS OldOiFlags; // unsigned short RpcFlagsLow; // unsigned short RpcFlagsHi; // unsigned short ProcNum; // unsigned short StackSize; // // expl handle descr is never generated // unsigned short ClientBufferSize; // The Oi2 header unsigned short ServerBufferSize; // INTERPRETER_OPT_FLAGS Oi2Flags; // unsigned char NumberParams; // } NDR_DCOM_OI2_PROC_HEADER, *PNDR_DCOM_OI2_PROC_HEADER; // These are extended Oi2 interpreter proc flags. // They have been introduced for NT5 beta2. typedef struct { unsigned char HasNewCorrDesc : 1; // 0x01 unsigned char ClientCorrCheck : 1; // 0x02 unsigned char ServerCorrCheck : 1; // 0x04 unsigned char HasNotify : 1; // 0x08 unsigned char HasNotify2 : 1; // 0x10 unsigned char HasComplexReturn : 1; // 0x20 unsigned char Unused : 2; } INTERPRETER_OPT_FLAGS2, *PINTERPRETER_OPT_FLAGS2; // This is the layout of the proc header extensions introduced for denial of // attacks for NT5 beta2, MIDL version 3.3.129. // The extensions would be announced by the HasExtensions Oi2 flag and would // follow directly after the ParameterCount field of Oi2 header. typedef struct { unsigned char Size; // size as the extension version INTERPRETER_OPT_FLAGS2 Flags2; unsigned short ClientCorrHint; unsigned short ServerCorrHint; unsigned short NotifyIndex; } NDR_PROC_HEADER_EXTS, *PNDR_PROC_HEADER_EXTS; typedef struct { unsigned char Size; // size as the extension version INTERPRETER_OPT_FLAGS2 Flags2; unsigned short ClientCorrHint; unsigned short ServerCorrHint; unsigned short NotifyIndex; unsigned short FloatArgMask; } NDR_PROC_HEADER_EXTS64, *PNDR_PROC_HEADER_EXTS64; // Context handle flags typedef struct { unsigned char CannotBeNull : 1; // 0x01 unsigned char Serialize : 1; // 0x02 unsigned char NoSerialize : 1; // 0x04 unsigned char IsStrict : 1; // 0x08 unsigned char IsReturn : 1; // 0x10 unsigned char IsOut : 1; // 0x20 unsigned char IsIn : 1; // 0x40 unsigned char IsViaPtr : 1; // 0x80 } NDR_CONTEXT_HANDLE_FLAGS, *PNDR_CONTEXT_HANDLE_FLAGS; typedef struct { unsigned char Fc; NDR_CONTEXT_HANDLE_FLAGS Flags; unsigned char RundownRtnIndex; unsigned char ParamOrdinal; // Oicf: ordinal, /Oi param num } NDR_CONTEXT_HANDLE_ARG_DESC, *PNDR_CONTEXT_HANDLE_ARG_DESC; // Type pickling flags typedef struct _MIDL_TYPE_PICKLING_FLAGS { unsigned long Oicf : 1; unsigned long HasNewCorrDesc : 1; unsigned long Unused : 30; } MIDL_TYPE_PICKLING_FLAGS, *PMIDL_TYPE_PICKLING_FLAGS; /* typedef struct { unsigned long HandleType : 3; unsigned long ProcType : 3; unsigned long IsInterpreted : 2; unsigned long IsObject : 1; unsigned long IsAsync : 1; unsigned long IsPickled : 2; unsigned long UsesFullPtrPackage : 1; unsigned long UsesRpcSmPackage : 1; unsigned long UsesPipes : 1; unsigned long HandlesExceptions : 2; unsigned long ServerMustsize : 1; unsigned long ClientMustsize : 1; unsigned long HasReturn : 1; unsigned long ClientCorrelation : 1; unsigned long ServerCorrelation : 1; unsigned long HasNotify : 1; unsigned long HasOtherExtensions : 1; unsigned long Unused : 8; } NDR64_FLAGS; typedef struct { unsigned short MustSize : 1; // 0x0001 unsigned short MustFree : 1; // 0x0002 unsigned short IsPipe : 1; // 0x0004 unsigned short IsIn : 1; // 0x0008 unsigned short IsOut : 1; // 0x0010 unsigned short IsReturn : 1; // 0x0020 unsigned short IsBasetype : 1; // 0x0040 unsigned short IsByValue : 1; // 0x0080 unsigned short IsSimpleRef : 1; // 0x0100 unsigned short IsDontCallFreeInst : 1; // 0x0200 unsigned short SaveForAsyncFinish : 1; // 0x0400 unsigned short Unused : 5; unsigned short UseCache : 1; // new } NDR64_PARAM_ATTRIBUTES, *PNDR64_PARAM_ATTRIBUTES; typedef struct { NDR64_PARAM_ATTRIBUTES ParamAttr; union { unsigned short ParamOffset; struct { unsigned char Type; unsigned char Unused; } SimpleType; }; unsigned long StackOffset; } NDR64_PARAM_DESCRIPTION, *PNDR64_PARAM_DESCRIPTION; */ #else // now Mac defs: bits are flipped on Mac. typedef struct { unsigned char Unused : 3; unsigned char HasNotify2 : 1; // 0x10 unsigned char HasNotify : 1; // 0x08 unsigned char ServerCorrCheck : 1; // 0x04 unsigned char ClientCorrCheck : 1; // 0x02 unsigned char HasNewCorrDec : 1; // 0x01 } INTERPRETER_OPT_FLAGS2, *PINTERPRETER_OPT_FLAGS2; typedef struct { unsigned char Unused : 1; unsigned char UseNewInitRoutines : 1; // 0x40 unsigned char HasCommOrFault : 1; // 0x20 unsigned char IgnoreObjectException : 1; // 0x10 unsigned char HasRpcFlags : 1; // 0x08 unsigned char ObjectProc : 1; // 0x04 unsigned char RpcSsAllocUsed : 1; // 0x02 unsigned char FullPtrUsed : 1; // 0x01 } INTERPRETER_FLAGS, *PINTERPRETER_FLAGS; typedef struct { unsigned char HasAsyncHandle : 1; // 0x80 unsigned char HasExtensions : 1; // 0x40 unsigned char Unused : 2; unsigned char HasPipes : 1; // 0x08 unsigned char HasReturn : 1; // 0x04 unsigned char ClientMustSize : 1; // 0x02 unsigned char ServerMustSize : 1; // 0x01 } INTERPRETER_OPT_FLAGS, *PINTERPRETER_OPT_FLAGS; typedef struct { unsigned short ServerAllocSize : 3; // 0xe000 unsigned short Unused : 2; unsigned short SaveForAsyncFinish : 1; // 0x0400 unsigned short IsDontCallFreeInst : 1; // 0x0200 unsigned short IsSimpleRef : 1; // 0x0100 // unsigned short IsByValue : 1; // 0x0080 unsigned short IsBasetype : 1; // 0x0040 unsigned short IsReturn : 1; // 0x0020 unsigned short IsOut : 1; // 0x0010 unsigned short IsIn : 1; // 0x0008 unsigned short IsPipe : 1; // 0x0004 unsigned short MustFree : 1; // 0x0002 unsigned short MustSize : 1; // 0x0001 } PARAM_ATTRIBUTES, *PPARAM_ATTRIBUTES; #endif #pragma pack(2) typedef struct { PARAM_ATTRIBUTES ParamAttr; unsigned short StackOffset; union { unsigned short TypeOffset; struct { unsigned char Type; unsigned char Unused; } SimpleType; }; } PARAM_DESCRIPTION, *PPARAM_DESCRIPTION; #pragma pack() #ifdef __cplusplus } #endif #endif