1 /* 2 * NDR -Oi,-Oif,-Oicf Interpreter 3 * 4 * Copyright 2007 Robert Shearman (for CodeWeavers) 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 */ 20 21 #pragma once 22 23 #include <ndrtypes.h> 24 25 /* there can't be any alignment with the structures in this file */ 26 #include <pshpack1.h> 27 28 typedef struct _NDR_PROC_HEADER 29 { 30 /* type of handle to use: 31 * RPC_FC_BIND_EXPLICIT = 0 - Explicit handle. 32 * Handle is passed as a parameter to the function. 33 * Indicates that explicit handle information follows the header, 34 * which actually describes the handle. 35 * RPC_FC_BIND_GENERIC = 31 - Implicit handle with custom binding routines 36 * (MIDL_STUB_DESC::IMPLICIT_HANDLE_INFO::pGenericBindingInfo) 37 * RPC_FC_BIND_PRIMITIVE = 32 - Implicit handle using handle_t created by 38 * calling application 39 * RPC_FC_AUTO_HANDLE = 33 - Automatic handle 40 * RPC_FC_CALLBACK_HANDLE = 34 - Implicit handle used for a callback: current handle 41 * from last remote call 42 */ 43 unsigned char handle_type; 44 45 /* procedure flags: 46 * Oi_FULL_PTR_USED = 0x01 - A full pointer can have the value NULL and can 47 * change during the call from NULL to non-NULL and supports aliasing 48 * and cycles. Indicates that the NdrFullPointerXlatInit function 49 * should be called. 50 * Oi_RPCSS_ALLOC_USED = 0x02 - Use RpcSS allocate/free routines instead of 51 * normal allocate/free routines 52 * Oi_OBJECT_PROC = 0x04 - Indicates a procedure that is part of an OLE 53 * interface, rather than a DCE RPC interface. 54 * Oi_HAS_RPCFLAGS = 0x08 - Indicates that the rpc_flags element is 55 * present in the header. 56 * Oi_HAS_COMM_OR_FAULT = 0x20 - If Oi_OBJECT_PROC not present only then 57 * indicates that the procedure has the comm_status or fault_status 58 * MIDL attribute. 59 * Oi_OBJ_USE_V2_INTERPRETER = 0x20 - If Oi_OBJECT_PROC present only 60 * then indicates that the format string is in -Oif or -Oicf format 61 * Oi_USE_NEW_INIT_ROUTINES = 0x40 - Use NdrXInitializeNew instead of 62 * NdrXInitialize? 63 */ 64 unsigned char Oi_flags; 65 66 /* the zero-based index of the procedure */ 67 unsigned short proc_num; 68 69 /* total size of all parameters on the stack, including any "this" 70 * pointer and/or return value */ 71 unsigned short stack_size; 72 } NDR_PROC_HEADER; 73 74 /* same as above struct except additional element rpc_flags */ 75 typedef struct _NDR_PROC_HEADER_RPC 76 { 77 unsigned char handle_type; 78 unsigned char Oi_flags; 79 80 /* 81 * RPCF_Idempotent = 0x0001 - [idempotent] MIDL attribute 82 * RPCF_Broadcast = 0x0002 - [broadcast] MIDL attribute 83 * RPCF_Maybe = 0x0004 - [maybe] MIDL attribute 84 * Reserved = 0x0008 - 0x0080 85 * RPCF_Message = 0x0100 - [message] MIDL attribute 86 * Reserved = 0x0200 - 0x1000 87 * RPCF_InputSynchronous = 0x2000 - unknown 88 * RPCF_Asynchronous = 0x4000 - [async] MIDL attribute 89 * Reserved = 0x8000 90 */ 91 unsigned int rpc_flags; 92 unsigned short proc_num; 93 unsigned short stack_size; 94 95 } NDR_PROC_HEADER_RPC; 96 97 typedef struct _NDR_PROC_PARTIAL_OIF_HEADER 98 { 99 /* the pre-computed client buffer size so that interpreter can skip all 100 * or some (if the flag RPC_FC_PROC_OI2F_CLTMUSTSIZE is specified) of the 101 * sizing pass */ 102 unsigned short constant_client_buffer_size; 103 104 /* the pre-computed server buffer size so that interpreter can skip all 105 * or some (if the flag RPC_FC_PROC_OI2F_SRVMUSTSIZE is specified) of the 106 * sizing pass */ 107 unsigned short constant_server_buffer_size; 108 109 INTERPRETER_OPT_FLAGS Oi2Flags; 110 111 /* number of params */ 112 unsigned char number_of_params; 113 } NDR_PROC_PARTIAL_OIF_HEADER; 114 115 typedef struct _NDR_PARAM_OI_BASETYPE 116 { 117 /* parameter direction. One of: 118 * FC_IN_PARAM_BASETYPE = 0x4e - an in param 119 * FC_RETURN_PARAM_BASETYPE = 0x53 - a return param 120 */ 121 unsigned char param_direction; 122 123 /* One of: FC_BYTE,FC_CHAR,FC_SMALL,FC_USMALL,FC_WCHAR,FC_SHORT,FC_USHORT, 124 * FC_LONG,FC_ULONG,FC_FLOAT,FC_HYPER,FC_DOUBLE,FC_ENUM16,FC_ENUM32, 125 * FC_ERROR_STATUS_T,FC_INT3264,FC_UINT3264 */ 126 unsigned char type_format_char; 127 } NDR_PARAM_OI_BASETYPE; 128 129 typedef struct _NDR_PARAM_OI_OTHER 130 { 131 /* One of: 132 * FC_IN_PARAM = 0x4d - An in param 133 * FC_IN_OUT_PARAM = 0x50 - An in/out param 134 * FC_OUT_PARAM = 0x51 - An out param 135 * FC_RETURN_PARAM = 0x52 - A return value 136 * FC_IN_PARAM_NO_FREE_INST = 0x4f - A param for which no freeing is done 137 */ 138 unsigned char param_direction; 139 140 /* Size of param on stack in NUMBERS OF INTS */ 141 unsigned char stack_size; 142 143 /* offset in the type format string table */ 144 unsigned short type_offset; 145 } NDR_PARAM_OI_OTHER; 146 147 typedef struct 148 { 149 PARAM_ATTRIBUTES attr; 150 /* the offset on the calling stack where the parameter is located */ 151 unsigned short stack_offset; 152 union 153 { 154 /* see NDR_PARAM_OI_BASETYPE::type_format_char */ 155 unsigned char type_format_char; 156 /* offset into the provided type format string where the type for this 157 * parameter starts */ 158 unsigned short type_offset; 159 } u; 160 } NDR_PARAM_OIF; 161 162 /* explicit handle description for FC_BIND_PRIMITIVE type */ 163 typedef struct _NDR_EHD_PRIMITIVE 164 { 165 /* FC_BIND_PRIMITIVE */ 166 unsigned char handle_type; 167 168 /* is the handle passed in via a pointer? */ 169 unsigned char flag; 170 171 /* offset from the beginning of the stack to the handle in bytes */ 172 unsigned short offset; 173 } NDR_EHD_PRIMITIVE; 174 175 /* explicit handle description for FC_BIND_GENERIC type */ 176 typedef struct _NDR_EHD_GENERIC 177 { 178 /* FC_BIND_GENERIC */ 179 unsigned char handle_type; 180 181 /* upper 4bits is a flag indicating whether the handle is passed in 182 * via a pointer. lower 4bits is the size of the user defined generic 183 * handle type. the size must be less than or equal to the machine 184 * register size */ 185 unsigned char flag_and_size; 186 187 /* offset from the beginning of the stack to the handle in bytes */ 188 unsigned short offset; 189 190 /* the index into the aGenericBindingRoutinesPairs field of MIDL_STUB_DESC 191 * giving the bind and unbind routines for the handle */ 192 unsigned char binding_routine_pair_index; 193 194 /* FC_PAD */ 195 unsigned char unused; 196 } NDR_EHD_GENERIC; 197 198 /* explicit handle description for FC_BIND_CONTEXT type */ 199 typedef struct _NDR_EHD_CONTEXT 200 { 201 /* FC_BIND_CONTEXT */ 202 unsigned char handle_type; 203 204 /* Any of the following flags: 205 * NDR_CONTEXT_HANDLE_CANNOT_BE_NULL = 0x01 206 * NDR_CONTEXT_HANDLE_SERIALIZE = 0x02 207 * NDR_CONTEXT_HANDLE_NO_SERIALIZE = 0x04 208 * NDR_STRICT_CONTEXT_HANDLE = 0x08 209 * HANDLE_PARAM_IS_OUT = 0x20 210 * HANDLE_PARAM_IS_RETURN = 0x21 211 * HANDLE_PARAM_IS_IN = 0x40 212 * HANDLE_PARAM_IS_VIA_PTR = 0x80 213 */ 214 unsigned char flags; 215 216 /* offset from the beginning of the stack to the handle in bytes */ 217 unsigned short offset; 218 219 /* zero-based index on rundown routine in apfnNdrRundownRoutines field 220 * of MIDL_STUB_DESC */ 221 unsigned char context_rundown_routine_index; 222 223 /* varies depending on NDR version used. 224 * V1: zero-based index into parameters 225 * V2: zero-based index into handles that are parameters */ 226 unsigned char param_num; 227 } NDR_EHD_CONTEXT; 228 229 #include <poppack.h> 230 231 enum stubless_phase 232 { 233 STUBLESS_UNMARSHAL, 234 STUBLESS_INITOUT, 235 STUBLESS_CALLSERVER, 236 STUBLESS_CALCSIZE, 237 STUBLESS_GETBUFFER, 238 STUBLESS_MARSHAL, 239 STUBLESS_MUSTFREE, 240 STUBLESS_FREE 241 }; 242 243 LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, 244 void **stack_top, void **fpu_stack ) DECLSPEC_HIDDEN; 245 LONG_PTR CDECL ndr_async_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, 246 void **stack_top ) DECLSPEC_HIDDEN; 247 void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase, 248 void **fpu_args, unsigned short number_of_params, unsigned char *pRetVal ) DECLSPEC_HIDDEN; 249 PFORMAT_STRING convert_old_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, 250 unsigned int stack_size, BOOL object_proc, 251 void *buffer, unsigned int size, unsigned int *count ) DECLSPEC_HIDDEN; 252 RPC_STATUS NdrpCompleteAsyncClientCall(RPC_ASYNC_STATE *pAsync, void *Reply) DECLSPEC_HIDDEN; 253