mirror of
https://github.com/reactos/wine.git
synced 2024-11-27 13:40:50 +00:00
c66972dfba
Also use the new size to validate incoming AUTH3 packets to be consistent with native.
244 lines
7.4 KiB
C
244 lines
7.4 KiB
C
/*
|
|
* RPC definitions
|
|
*
|
|
* Copyright 2001-2002 Ove Kåven, TransGaming Technologies
|
|
* Copyright 2004 Filip Navara
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#ifndef __WINE_RPC_DEFS_H
|
|
#define __WINE_RPC_DEFS_H
|
|
|
|
#include "pshpack1.h"
|
|
typedef struct
|
|
{
|
|
unsigned char rpc_ver; /* RPC major version (5) */
|
|
unsigned char rpc_ver_minor; /* RPC minor version (0) */
|
|
unsigned char ptype; /* Packet type (PKT_*) */
|
|
unsigned char flags;
|
|
unsigned char drep[4]; /* Data representation */
|
|
unsigned short frag_len; /* Data size in bytes including header and tail. */
|
|
unsigned short auth_len; /* Authentication length */
|
|
unsigned int call_id; /* Call identifier. */
|
|
} RpcPktCommonHdr;
|
|
|
|
typedef struct
|
|
{
|
|
RpcPktCommonHdr common;
|
|
unsigned int alloc_hint; /* Data size in bytes excluding header and tail. */
|
|
unsigned short context_id; /* Presentation context identifier */
|
|
unsigned short opnum;
|
|
} RpcPktRequestHdr;
|
|
|
|
typedef struct
|
|
{
|
|
RpcPktCommonHdr common;
|
|
unsigned int alloc_hint; /* Data size in bytes excluding header and tail. */
|
|
unsigned short context_id; /* Presentation context identifier */
|
|
unsigned char cancel_count;
|
|
unsigned char reserved;
|
|
} RpcPktResponseHdr;
|
|
|
|
typedef struct
|
|
{
|
|
RpcPktCommonHdr common;
|
|
unsigned int alloc_hint; /* Data size in bytes excluding header and tail. */
|
|
unsigned short context_id; /* Presentation context identifier */
|
|
unsigned char cancel_count; /* Received cancel count */
|
|
unsigned char reserved; /* Force alignment! */
|
|
unsigned int status; /* Runtime fault code (RPC_STATUS) */
|
|
unsigned int reserved2;
|
|
} RpcPktFaultHdr;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned short context_id; /* Presentation context identifier */
|
|
unsigned char num_syntaxes; /* Number of syntaxes */
|
|
unsigned char reserved; /* For alignment */
|
|
RPC_SYNTAX_IDENTIFIER abstract_syntax;
|
|
RPC_SYNTAX_IDENTIFIER transfer_syntaxes[ANYSIZE_ARRAY]; /* size_is(num_syntaxes) */
|
|
} RpcContextElement;
|
|
|
|
typedef struct
|
|
{
|
|
RpcPktCommonHdr common;
|
|
unsigned short max_tsize; /* Maximum transmission fragment size */
|
|
unsigned short max_rsize; /* Maximum receive fragment size */
|
|
unsigned int assoc_gid; /* Associated group id */
|
|
unsigned char num_elements; /* Number of elements */
|
|
unsigned char padding[3]; /* Force alignment! */
|
|
/*
|
|
* Following this header are these fields:
|
|
* RpcContextElement context_elements[num_elements]
|
|
*/
|
|
} RpcPktBindHdr;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned short length; /* Length of the string including null terminator */
|
|
char string[ANYSIZE_ARRAY]; /* String data in single byte, null terminated form */
|
|
} RpcAddressString;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned short result;
|
|
unsigned short reason;
|
|
RPC_SYNTAX_IDENTIFIER transfer_syntax;
|
|
} RpcResult;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned char num_results; /* Number of results */
|
|
unsigned char reserved[3]; /* Force alignment! */
|
|
RpcResult results[ANYSIZE_ARRAY]; /* size_is(num_results) */
|
|
} RpcResultList;
|
|
|
|
typedef struct
|
|
{
|
|
RpcPktCommonHdr common;
|
|
unsigned short max_tsize; /* Maximum transmission fragment size */
|
|
unsigned short max_rsize; /* Maximum receive fragment size */
|
|
unsigned int assoc_gid; /* Associated group id */
|
|
/*
|
|
* Following this header are these fields:
|
|
* RpcAddressString server_address;
|
|
* [0 - 3 bytes of padding so that results is 4-byte aligned]
|
|
* RpcResultList results;
|
|
*/
|
|
} RpcPktBindAckHdr;
|
|
|
|
typedef struct
|
|
{
|
|
RpcPktCommonHdr common;
|
|
unsigned short reject_reason;
|
|
unsigned char protocols_count;
|
|
struct {
|
|
unsigned char rpc_ver;
|
|
unsigned char rpc_ver_minor;
|
|
} protocols[ANYSIZE_ARRAY];
|
|
} RpcPktBindNAckHdr;
|
|
|
|
/* undocumented packet sent during RPC over HTTP */
|
|
typedef struct
|
|
{
|
|
RpcPktCommonHdr common;
|
|
unsigned short flags;
|
|
unsigned short num_data_items;
|
|
} RpcPktHttpHdr;
|
|
|
|
/* AUTH3 packet */
|
|
typedef struct
|
|
{
|
|
RpcPktCommonHdr common;
|
|
unsigned int pad; /* ignored */
|
|
} RpcPktAuth3Hdr;
|
|
|
|
/* Union representing all possible packet headers */
|
|
typedef union
|
|
{
|
|
RpcPktCommonHdr common;
|
|
RpcPktRequestHdr request;
|
|
RpcPktResponseHdr response;
|
|
RpcPktFaultHdr fault;
|
|
RpcPktBindHdr bind;
|
|
RpcPktBindAckHdr bind_ack;
|
|
RpcPktBindNAckHdr bind_nack;
|
|
RpcPktHttpHdr http;
|
|
RpcPktAuth3Hdr auth3;
|
|
} RpcPktHdr;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned char auth_type; /* authentication scheme in use */
|
|
unsigned char auth_level; /* RPC_C_AUTHN_LEVEL* */
|
|
unsigned char auth_pad_length; /* length of padding to restore n % 4 alignment */
|
|
unsigned char auth_reserved; /* reserved, must be zero */
|
|
unsigned int auth_context_id; /* unique value for the authenticated connection */
|
|
} RpcAuthVerifier;
|
|
#include "poppack.h"
|
|
|
|
#define RPC_AUTH_VERIFIER_LEN(common_hdr) \
|
|
((common_hdr)->auth_len ? (common_hdr)->auth_len + sizeof(RpcAuthVerifier) : 0)
|
|
|
|
#define RPC_VER_MAJOR 5
|
|
#define RPC_VER_MINOR 0
|
|
|
|
#define RPC_FLG_FIRST 1
|
|
#define RPC_FLG_LAST 2
|
|
#define RPC_FLG_OBJECT_UUID 0x80
|
|
|
|
#define RPC_MIN_PACKET_SIZE 0x1000
|
|
#define RPC_MAX_PACKET_SIZE 0x16D0
|
|
|
|
enum rpc_packet_type
|
|
{
|
|
PKT_REQUEST = 0,
|
|
PKT_PING = 1,
|
|
PKT_RESPONSE = 2,
|
|
PKT_FAULT = 3,
|
|
PKT_WORKING = 4,
|
|
PKT_NOCALL = 5,
|
|
PKT_REJECT = 6,
|
|
PKT_ACK = 7,
|
|
PKT_CL_CANCEL = 8,
|
|
PKT_FACK = 9,
|
|
PKT_CANCEL_ACK = 10,
|
|
PKT_BIND = 11,
|
|
PKT_BIND_ACK = 12,
|
|
PKT_BIND_NACK = 13,
|
|
PKT_ALTER_CONTEXT = 14,
|
|
PKT_ALTER_CONTEXT_RESP = 15,
|
|
PKT_AUTH3 = 16,
|
|
PKT_SHUTDOWN = 17,
|
|
PKT_CO_CANCEL = 18,
|
|
PKT_ORPHANED = 19,
|
|
PKT_HTTP = 20,
|
|
};
|
|
|
|
#define RESULT_ACCEPT 0
|
|
#define RESULT_USER_REJECTION 1
|
|
#define RESULT_PROVIDER_REJECTION 2
|
|
|
|
#define REASON_NONE 0
|
|
#define REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED 1
|
|
#define REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED 2
|
|
#define REASON_LOCAL_LIMIT_EXCEEDED 3
|
|
|
|
#define REJECT_REASON_NOT_SPECIFIED 0
|
|
#define REJECT_TEMPORARY_CONGESTION 1
|
|
#define REJECT_LOCAL_LIMIT_EXCEEDED 2
|
|
#define REJECT_CALLED_PADDR_UNKNOWN 3 /* not used */
|
|
#define REJECT_PROTOCOL_VERSION_NOT_SUPPORTED 4
|
|
#define REJECT_DEFAULT_CONTEXT_NOT_SUPPORTED 5 /* not used */
|
|
#define REJECT_USER_DATA_NOT_READABLE 6 /* not used */
|
|
#define REJECT_NO_PSAP_AVAILABLE 7 /* not used */
|
|
#define REJECT_UNKNOWN_AUTHN_SERVICE 8
|
|
#define REJECT_INVALID_CHECKSUM 9
|
|
|
|
#define NCADG_IP_UDP 0x08
|
|
#define NCACN_IP_TCP 0x07
|
|
#define NCADG_IPX 0x0E
|
|
#define NCACN_SPX 0x0C
|
|
#define NCACN_NB_NB 0x12
|
|
#define NCACN_NB_IPX 0x0D
|
|
#define NCACN_DNET_NSP 0x04
|
|
#define NCACN_HTTP 0x1F
|
|
|
|
/* FreeDCE: TWR_C_FLR_PROT_ID_IP */
|
|
#define TWR_IP 0x09
|
|
|
|
#endif /* __WINE_RPC_DEFS_H */
|