1 /* 2 * RPC definitions 3 * 4 * Copyright 2001-2002 Ove Kåven, TransGaming Technologies 5 * Copyright 2004 Filip Navara 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 20 */ 21 22 #ifndef __WINE_RPC_DEFS_H 23 #define __WINE_RPC_DEFS_H 24 25 #include "pshpack1.h" 26 typedef struct 27 { 28 unsigned char rpc_ver; /* RPC major version (5) */ 29 unsigned char rpc_ver_minor; /* RPC minor version (0) */ 30 unsigned char ptype; /* Packet type (PKT_*) */ 31 unsigned char flags; 32 unsigned char drep[4]; /* Data representation */ 33 unsigned short frag_len; /* Data size in bytes including header and tail. */ 34 unsigned short auth_len; /* Authentication length */ 35 unsigned int call_id; /* Call identifier. */ 36 } RpcPktCommonHdr; 37 38 typedef struct 39 { 40 RpcPktCommonHdr common; 41 unsigned int alloc_hint; /* Data size in bytes excluding header and tail. */ 42 unsigned short context_id; /* Presentation context identifier */ 43 unsigned short opnum; 44 } RpcPktRequestHdr; 45 46 typedef struct 47 { 48 RpcPktCommonHdr common; 49 unsigned int alloc_hint; /* Data size in bytes excluding header and tail. */ 50 unsigned short context_id; /* Presentation context identifier */ 51 unsigned char cancel_count; 52 unsigned char reserved; 53 } RpcPktResponseHdr; 54 55 typedef struct 56 { 57 RpcPktCommonHdr common; 58 unsigned int alloc_hint; /* Data size in bytes excluding header and tail. */ 59 unsigned short context_id; /* Presentation context identifier */ 60 unsigned char cancel_count; /* Received cancel count */ 61 unsigned char reserved; /* Force alignment! */ 62 unsigned int status; /* Runtime fault code (RPC_STATUS) */ 63 unsigned int reserved2; 64 } RpcPktFaultHdr; 65 66 typedef struct 67 { 68 unsigned short context_id; /* Presentation context identifier */ 69 unsigned char num_syntaxes; /* Number of syntaxes */ 70 unsigned char reserved; /* For alignment */ 71 RPC_SYNTAX_IDENTIFIER abstract_syntax; 72 RPC_SYNTAX_IDENTIFIER transfer_syntaxes[ANYSIZE_ARRAY]; /* size_is(num_syntaxes) */ 73 } RpcContextElement; 74 75 typedef struct 76 { 77 RpcPktCommonHdr common; 78 unsigned short max_tsize; /* Maximum transmission fragment size */ 79 unsigned short max_rsize; /* Maximum receive fragment size */ 80 unsigned int assoc_gid; /* Associated group id */ 81 unsigned char num_elements; /* Number of elements */ 82 unsigned char padding[3]; /* Force alignment! */ 83 /* 84 * Following this header are these fields: 85 * RpcContextElement context_elements[num_elements] 86 */ 87 } RpcPktBindHdr; 88 89 typedef struct 90 { 91 unsigned short length; /* Length of the string including null terminator */ 92 char string[ANYSIZE_ARRAY]; /* String data in single byte, null terminated form */ 93 } RpcAddressString; 94 95 typedef struct 96 { 97 unsigned short result; 98 unsigned short reason; 99 RPC_SYNTAX_IDENTIFIER transfer_syntax; 100 } RpcResult; 101 102 typedef struct 103 { 104 unsigned char num_results; /* Number of results */ 105 unsigned char reserved[3]; /* Force alignment! */ 106 RpcResult results[ANYSIZE_ARRAY]; /* size_is(num_results) */ 107 } RpcResultList; 108 109 typedef struct 110 { 111 RpcPktCommonHdr common; 112 unsigned short max_tsize; /* Maximum transmission fragment size */ 113 unsigned short max_rsize; /* Maximum receive fragment size */ 114 unsigned int assoc_gid; /* Associated group id */ 115 /* 116 * Following this header are these fields: 117 * RpcAddressString server_address; 118 * [0 - 3 bytes of padding so that results is 4-byte aligned] 119 * RpcResultList results; 120 */ 121 } RpcPktBindAckHdr; 122 123 typedef struct 124 { 125 RpcPktCommonHdr common; 126 unsigned short reject_reason; 127 unsigned char protocols_count; 128 struct { 129 unsigned char rpc_ver; 130 unsigned char rpc_ver_minor; 131 } protocols[ANYSIZE_ARRAY]; 132 } RpcPktBindNAckHdr; 133 134 /* undocumented packet sent during RPC over HTTP */ 135 typedef struct 136 { 137 RpcPktCommonHdr common; 138 unsigned short flags; 139 unsigned short num_data_items; 140 } RpcPktHttpHdr; 141 142 /* AUTH3 packet */ 143 typedef struct 144 { 145 RpcPktCommonHdr common; 146 unsigned int pad; /* ignored */ 147 } RpcPktAuth3Hdr; 148 149 /* Union representing all possible packet headers */ 150 typedef union 151 { 152 RpcPktCommonHdr common; 153 RpcPktRequestHdr request; 154 RpcPktResponseHdr response; 155 RpcPktFaultHdr fault; 156 RpcPktBindHdr bind; 157 RpcPktBindAckHdr bind_ack; 158 RpcPktBindNAckHdr bind_nack; 159 RpcPktHttpHdr http; 160 RpcPktAuth3Hdr auth3; 161 } RpcPktHdr; 162 163 typedef struct 164 { 165 unsigned char auth_type; /* authentication scheme in use */ 166 unsigned char auth_level; /* RPC_C_AUTHN_LEVEL* */ 167 unsigned char auth_pad_length; /* length of padding to restore n % 4 alignment */ 168 unsigned char auth_reserved; /* reserved, must be zero */ 169 unsigned int auth_context_id; /* unique value for the authenticated connection */ 170 } RpcAuthVerifier; 171 #include "poppack.h" 172 173 #define RPC_AUTH_VERIFIER_LEN(common_hdr) \ 174 ((common_hdr)->auth_len ? (common_hdr)->auth_len + sizeof(RpcAuthVerifier) : 0) 175 176 #define RPC_VER_MAJOR 5 177 #define RPC_VER_MINOR 0 178 179 #define RPC_FLG_FIRST 1 180 #define RPC_FLG_LAST 2 181 #define RPC_FLG_OBJECT_UUID 0x80 182 183 #define RPC_MIN_PACKET_SIZE 0x1000 184 #define RPC_MAX_PACKET_SIZE 0x16D0 185 186 enum rpc_packet_type 187 { 188 PKT_REQUEST = 0, 189 PKT_PING = 1, 190 PKT_RESPONSE = 2, 191 PKT_FAULT = 3, 192 PKT_WORKING = 4, 193 PKT_NOCALL = 5, 194 PKT_REJECT = 6, 195 PKT_ACK = 7, 196 PKT_CL_CANCEL = 8, 197 PKT_FACK = 9, 198 PKT_CANCEL_ACK = 10, 199 PKT_BIND = 11, 200 PKT_BIND_ACK = 12, 201 PKT_BIND_NACK = 13, 202 PKT_ALTER_CONTEXT = 14, 203 PKT_ALTER_CONTEXT_RESP = 15, 204 PKT_AUTH3 = 16, 205 PKT_SHUTDOWN = 17, 206 PKT_CO_CANCEL = 18, 207 PKT_ORPHANED = 19, 208 PKT_HTTP = 20, 209 }; 210 211 #define RESULT_ACCEPT 0 212 #define RESULT_USER_REJECTION 1 213 #define RESULT_PROVIDER_REJECTION 2 214 215 #define REASON_NONE 0 216 #define REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED 1 217 #define REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED 2 218 #define REASON_LOCAL_LIMIT_EXCEEDED 3 219 220 #define REJECT_REASON_NOT_SPECIFIED 0 221 #define REJECT_TEMPORARY_CONGESTION 1 222 #define REJECT_LOCAL_LIMIT_EXCEEDED 2 223 #define REJECT_CALLED_PADDR_UNKNOWN 3 /* not used */ 224 #define REJECT_PROTOCOL_VERSION_NOT_SUPPORTED 4 225 #define REJECT_DEFAULT_CONTEXT_NOT_SUPPORTED 5 /* not used */ 226 #define REJECT_USER_DATA_NOT_READABLE 6 /* not used */ 227 #define REJECT_NO_PSAP_AVAILABLE 7 /* not used */ 228 #define REJECT_UNKNOWN_AUTHN_SERVICE 8 229 #define REJECT_INVALID_CHECKSUM 9 230 231 #define NCADG_IP_UDP 0x08 232 #define NCACN_IP_TCP 0x07 233 #define NCADG_IPX 0x0E 234 #define NCACN_SPX 0x0C 235 #define NCACN_NB_NB 0x12 236 #define NCACN_NB_IPX 0x0D 237 #define NCACN_DNET_NSP 0x04 238 #define NCACN_HTTP 0x1F 239 240 /* FreeDCE: TWR_C_FLR_PROT_ID_IP */ 241 #define TWR_IP 0x09 242 243 #endif /* __WINE_RPC_DEFS_H */ 244