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 * 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 * FC_BIND_GENERIC = 31 - Implicit handle with custom binding routines 36 * (MIDL_STUB_DESC::IMPLICIT_HANDLE_INFO::pGenericBindingInfo) 37 * FC_BIND_PRIMITIVE = 32 - Implicit handle using handle_t created by 38 * calling application 39 * FC_AUTO_HANDLE = 33 - Automatic handle 40 * 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 ClientMustSize is specified) of the sizing pass */ 101 unsigned short constant_client_buffer_size; 102 103 /* the pre-computed server buffer size so that interpreter can skip all 104 * or some (if the flag ServerMustSize is specified) of the sizing pass */ 105 unsigned short constant_server_buffer_size; 106 107 INTERPRETER_OPT_FLAGS Oi2Flags; 108 109 /* number of params */ 110 unsigned char number_of_params; 111 } NDR_PROC_PARTIAL_OIF_HEADER; 112 113 typedef struct _NDR_PARAM_OI_BASETYPE 114 { 115 /* parameter direction. One of: 116 * FC_IN_PARAM_BASETYPE = 0x4e - an in param 117 * FC_RETURN_PARAM_BASETYPE = 0x53 - a return param 118 */ 119 unsigned char param_direction; 120 121 /* One of: FC_BYTE,FC_CHAR,FC_SMALL,FC_USMALL,FC_WCHAR,FC_SHORT,FC_USHORT, 122 * FC_LONG,FC_ULONG,FC_FLOAT,FC_HYPER,FC_DOUBLE,FC_ENUM16,FC_ENUM32, 123 * FC_ERROR_STATUS_T,FC_INT3264,FC_UINT3264 */ 124 unsigned char type_format_char; 125 } NDR_PARAM_OI_BASETYPE; 126 127 typedef struct _NDR_PARAM_OI_OTHER 128 { 129 /* One of: 130 * FC_IN_PARAM = 0x4d - An in param 131 * FC_IN_OUT_PARAM = 0x50 - An in/out param 132 * FC_OUT_PARAM = 0x51 - An out param 133 * FC_RETURN_PARAM = 0x52 - A return value 134 * FC_IN_PARAM_NO_FREE_INST = 0x4f - A param for which no freeing is done 135 */ 136 unsigned char param_direction; 137 138 /* Size of param on stack in NUMBERS OF INTS */ 139 unsigned char stack_size; 140 141 /* offset in the type format string table */ 142 unsigned short type_offset; 143 } NDR_PARAM_OI_OTHER; 144 145 typedef struct 146 { 147 PARAM_ATTRIBUTES attr; 148 /* the offset on the calling stack where the parameter is located */ 149 unsigned short stack_offset; 150 union 151 { 152 /* see NDR_PARAM_OI_BASETYPE::type_format_char */ 153 unsigned char type_format_char; 154 /* offset into the provided type format string where the type for this 155 * parameter starts */ 156 unsigned short type_offset; 157 } u; 158 } NDR_PARAM_OIF; 159 160 /* explicit handle description for FC_BIND_PRIMITIVE type */ 161 typedef struct _NDR_EHD_PRIMITIVE 162 { 163 /* FC_BIND_PRIMITIVE */ 164 unsigned char handle_type; 165 166 /* is the handle passed in via a pointer? */ 167 unsigned char flag; 168 169 /* offset from the beginning of the stack to the handle in bytes */ 170 unsigned short offset; 171 } NDR_EHD_PRIMITIVE; 172 173 /* explicit handle description for FC_BIND_GENERIC type */ 174 typedef struct _NDR_EHD_GENERIC 175 { 176 /* FC_BIND_GENERIC */ 177 unsigned char handle_type; 178 179 /* upper 4bits is a flag indicating whether the handle is passed in 180 * via a pointer. lower 4bits is the size of the user defined generic 181 * handle type. the size must be less than or equal to the machine 182 * register size */ 183 unsigned char flag_and_size; 184 185 /* offset from the beginning of the stack to the handle in bytes */ 186 unsigned short offset; 187 188 /* the index into the aGenericBindingRoutinesPairs field of MIDL_STUB_DESC 189 * giving the bind and unbind routines for the handle */ 190 unsigned char binding_routine_pair_index; 191 192 /* FC_PAD */ 193 unsigned char unused; 194 } NDR_EHD_GENERIC; 195 196 /* explicit handle description for FC_BIND_CONTEXT type */ 197 typedef struct _NDR_EHD_CONTEXT 198 { 199 /* FC_BIND_CONTEXT */ 200 unsigned char handle_type; 201 202 /* Any of the following flags: 203 * NDR_CONTEXT_HANDLE_CANNOT_BE_NULL = 0x01 204 * NDR_CONTEXT_HANDLE_SERIALIZE = 0x02 205 * NDR_CONTEXT_HANDLE_NO_SERIALIZE = 0x04 206 * NDR_STRICT_CONTEXT_HANDLE = 0x08 207 * HANDLE_PARAM_IS_RETURN = 0x10 208 * HANDLE_PARAM_IS_OUT = 0x20 209 * HANDLE_PARAM_IS_IN = 0x40 210 * HANDLE_PARAM_IS_VIA_PTR = 0x80 211 */ 212 unsigned char flags; 213 214 /* offset from the beginning of the stack to the handle in bytes */ 215 unsigned short offset; 216 217 /* zero-based index on rundown routine in apfnNdrRundownRoutines field 218 * of MIDL_STUB_DESC */ 219 unsigned char context_rundown_routine_index; 220 221 /* varies depending on NDR version used. 222 * V1: zero-based index into parameters 223 * V2: zero-based index into handles that are parameters */ 224 unsigned char param_num; 225 } NDR_EHD_CONTEXT; 226 227 #include "poppack.h" 228 229 struct async_call_data 230 { 231 MIDL_STUB_MESSAGE *pStubMsg; 232 const NDR_PROC_HEADER *pProcHeader; 233 PFORMAT_STRING pHandleFormat; 234 PFORMAT_STRING pParamFormat; 235 RPC_BINDING_HANDLE hBinding; 236 /* size of stack */ 237 unsigned short stack_size; 238 /* number of parameters. optional for client to give it to us */ 239 unsigned int number_of_params; 240 /* location to put retval into */ 241 LONG_PTR *retval_ptr; 242 /* correlation cache */ 243 ULONG_PTR NdrCorrCache[256]; 244 }; 245 246 enum stubless_phase 247 { 248 STUBLESS_UNMARSHAL, 249 STUBLESS_INITOUT, 250 STUBLESS_CALLSERVER, 251 STUBLESS_CALCSIZE, 252 STUBLESS_GETBUFFER, 253 STUBLESS_MARSHAL, 254 STUBLESS_MUSTFREE, 255 STUBLESS_FREE 256 }; 257 258 LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, 259 void **stack_top, void **fpu_stack ) DECLSPEC_HIDDEN; 260 LONG_PTR CDECL ndr_async_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, 261 void **stack_top ) DECLSPEC_HIDDEN; 262 void client_do_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, enum stubless_phase phase, 263 void **fpu_args, unsigned short number_of_params, unsigned char *pRetVal ) DECLSPEC_HIDDEN; 264 PFORMAT_STRING convert_old_args( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, 265 unsigned int stack_size, BOOL object_proc, 266 void *buffer, unsigned int size, unsigned int *count ) DECLSPEC_HIDDEN; 267 RPC_STATUS NdrpCompleteAsyncClientCall(RPC_ASYNC_STATE *pAsync, void *Reply) DECLSPEC_HIDDEN; 268 RPC_STATUS NdrpCompleteAsyncServerCall(RPC_ASYNC_STATE *pAsync, void *Reply) DECLSPEC_HIDDEN; 269