rpcrt4: Implement RPC over HTTP support.
CodeWeavers did this work for supporting the optional HTTP connection method of Outlook 2003/2007 (must be running with Windows versions set to XP or higher to see this option). This was written before Microsoft publicly released a specification for the RPC over HTTP protocol and so was developed by examining traffic flowing between a Windows client and an IIS server.
This commit is contained in:
parent
834c5b4275
commit
5f6ae94ad0
|
@ -6,7 +6,7 @@ VPATH = @srcdir@
|
|||
MODULE = rpcrt4.dll
|
||||
IMPORTLIB = rpcrt4
|
||||
IMPORTS = uuid advapi32 kernel32 ntdll
|
||||
DELAYIMPORTS = secur32 user32
|
||||
DELAYIMPORTS = wininet secur32 user32
|
||||
|
||||
C_SRCS = \
|
||||
cproxy.c \
|
||||
|
|
|
@ -394,6 +394,7 @@ RPC_STATUS RpcAssoc_GetClientConnection(RpcAssoc *assoc,
|
|||
if (status != RPC_S_OK)
|
||||
return status;
|
||||
|
||||
NewConnection->assoc = assoc;
|
||||
status = RPCRT4_OpenClientConnection(NewConnection);
|
||||
if (status != RPC_S_OK)
|
||||
{
|
||||
|
|
|
@ -34,6 +34,7 @@ typedef struct _RpcAssoc
|
|||
|
||||
/* id of this association group */
|
||||
ULONG assoc_group_id;
|
||||
UUID http_uuid;
|
||||
|
||||
CRITICAL_SECTION cs;
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "rpcndr.h"
|
||||
#include "security.h"
|
||||
#include "wine/list.h"
|
||||
#include "rpc_defs.h"
|
||||
|
||||
|
||||
typedef struct _RpcAuthInfo
|
||||
|
@ -74,6 +75,7 @@ typedef struct _RpcConnection
|
|||
struct list conn_pool_entry;
|
||||
ULONG assoc_group_id; /* association group returned during binding */
|
||||
RPC_ASYNC_STATE *async_state;
|
||||
struct _RpcAssoc *assoc; /* association this connection is part of */
|
||||
|
||||
/* server-only */
|
||||
/* The active interface bound to server. */
|
||||
|
@ -96,6 +98,7 @@ struct connection_ops {
|
|||
int (*wait_for_incoming_data)(RpcConnection *conn);
|
||||
size_t (*get_top_of_tower)(unsigned char *tower_data, const char *networkaddr, const char *endpoint);
|
||||
RPC_STATUS (*parse_top_of_tower)(const unsigned char *tower_data, size_t tower_size, char **networkaddr, char **endpoint);
|
||||
RPC_STATUS (*receive_fragment)(RpcConnection *conn, RpcPktHdr **Header, void **Payload);
|
||||
};
|
||||
|
||||
/* don't know what MS's structure looks like */
|
||||
|
|
|
@ -120,6 +120,14 @@ typedef struct
|
|||
} protocols[1];
|
||||
} RpcPktBindNAckHdr;
|
||||
|
||||
/* undocumented packet sent during RPC over HTTP */
|
||||
typedef struct
|
||||
{
|
||||
RpcPktCommonHdr common;
|
||||
unsigned short flags;
|
||||
unsigned short num_data_items;
|
||||
} RpcPktHttpHdr;
|
||||
|
||||
/* Union representing all possible packet headers */
|
||||
typedef union
|
||||
{
|
||||
|
@ -130,6 +138,7 @@ typedef union
|
|||
RpcPktBindHdr bind;
|
||||
RpcPktBindAckHdr bind_ack;
|
||||
RpcPktBindNAckHdr bind_nack;
|
||||
RpcPktHttpHdr http;
|
||||
} RpcPktHdr;
|
||||
|
||||
typedef struct
|
||||
|
@ -174,6 +183,7 @@ typedef struct
|
|||
#define PKT_SHUTDOWN 17
|
||||
#define PKT_CO_CANCEL 18
|
||||
#define PKT_ORPHANED 19
|
||||
#define PKT_HTTP 20
|
||||
|
||||
#define RESULT_ACCEPT 0
|
||||
#define RESULT_USER_REJECTION 1
|
||||
|
|
|
@ -59,13 +59,13 @@ enum secure_packet_direction
|
|||
|
||||
static RPC_STATUS I_RpcReAllocateBuffer(PRPC_MESSAGE pMsg);
|
||||
|
||||
static DWORD RPCRT4_GetHeaderSize(const RpcPktHdr *Header)
|
||||
DWORD RPCRT4_GetHeaderSize(const RpcPktHdr *Header)
|
||||
{
|
||||
static const DWORD header_sizes[] = {
|
||||
sizeof(Header->request), 0, sizeof(Header->response),
|
||||
sizeof(Header->fault), 0, 0, 0, 0, 0, 0, 0, sizeof(Header->bind),
|
||||
sizeof(Header->bind_ack), sizeof(Header->bind_nack),
|
||||
0, 0, 0, 0, 0
|
||||
0, 0, 0, 0, 0, 0, sizeof(Header->http)
|
||||
};
|
||||
ULONG ret = 0;
|
||||
|
||||
|
@ -76,7 +76,7 @@ static DWORD RPCRT4_GetHeaderSize(const RpcPktHdr *Header)
|
|||
if (Header->common.flags & RPC_FLG_OBJECT_UUID)
|
||||
ret += sizeof(UUID);
|
||||
} else {
|
||||
TRACE("invalid packet type\n");
|
||||
WARN("invalid packet type %u\n", Header->common.ptype);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -283,6 +283,118 @@ RpcPktHdr *RPCRT4_BuildBindAckHeader(unsigned long DataRepresentation,
|
|||
return header;
|
||||
}
|
||||
|
||||
RpcPktHdr *RPCRT4_BuildHttpHeader(unsigned long DataRepresentation,
|
||||
unsigned short flags,
|
||||
unsigned short num_data_items,
|
||||
unsigned int payload_size)
|
||||
{
|
||||
RpcPktHdr *header;
|
||||
|
||||
header = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(header->http) + payload_size);
|
||||
if (header == NULL) {
|
||||
ERR("failed to allocate memory\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RPCRT4_BuildCommonHeader(header, PKT_HTTP, DataRepresentation);
|
||||
/* since the packet isn't current sent using RPCRT4_Send, set the flags
|
||||
* manually here */
|
||||
header->common.flags = RPC_FLG_FIRST|RPC_FLG_LAST;
|
||||
header->common.call_id = 0;
|
||||
header->common.frag_len = sizeof(header->http) + payload_size;
|
||||
header->http.flags = flags;
|
||||
header->http.num_data_items = num_data_items;
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
#define WRITE_HTTP_PAYLOAD_FIELD_UINT32(payload, type, value) \
|
||||
do { \
|
||||
*(unsigned int *)(payload) = (type); \
|
||||
(payload) += 4; \
|
||||
*(unsigned int *)(payload) = (value); \
|
||||
(payload) += 4; \
|
||||
} while (0)
|
||||
|
||||
#define WRITE_HTTP_PAYLOAD_FIELD_UUID(payload, type, uuid) \
|
||||
do { \
|
||||
*(unsigned int *)(payload) = (type); \
|
||||
(payload) += 4; \
|
||||
*(UUID *)(payload) = (uuid); \
|
||||
(payload) += sizeof(UUID); \
|
||||
} while (0)
|
||||
|
||||
#define WRITE_HTTP_PAYLOAD_FIELD_FLOW_CONTROL(payload, bytes_transmitted, flow_control_increment, uuid) \
|
||||
do { \
|
||||
*(unsigned int *)(payload) = 0x00000001; \
|
||||
(payload) += 4; \
|
||||
*(unsigned int *)(payload) = (bytes_transmitted); \
|
||||
(payload) += 4; \
|
||||
*(unsigned int *)(payload) = (flow_control_increment); \
|
||||
(payload) += 4; \
|
||||
*(UUID *)(payload) = (uuid); \
|
||||
(payload) += sizeof(UUID); \
|
||||
} while (0)
|
||||
|
||||
RpcPktHdr *RPCRT4_BuildHttpConnectHeader(unsigned short flags, int out_pipe,
|
||||
const UUID *connection_uuid,
|
||||
const UUID *pipe_uuid,
|
||||
const UUID *association_uuid)
|
||||
{
|
||||
RpcPktHdr *header;
|
||||
unsigned int size;
|
||||
char *payload;
|
||||
|
||||
size = 8 + 4 + sizeof(UUID) + 4 + sizeof(UUID) + 8;
|
||||
if (!out_pipe)
|
||||
size += 8 + 4 + sizeof(UUID);
|
||||
|
||||
header = RPCRT4_BuildHttpHeader(NDR_LOCAL_DATA_REPRESENTATION, flags,
|
||||
out_pipe ? 4 : 6, size);
|
||||
if (!header) return NULL;
|
||||
payload = (char *)(&header->http+1);
|
||||
|
||||
/* FIXME: what does this part of the payload do? */
|
||||
WRITE_HTTP_PAYLOAD_FIELD_UINT32(payload, 0x00000006, 0x00000001);
|
||||
|
||||
WRITE_HTTP_PAYLOAD_FIELD_UUID(payload, 0x00000003, *connection_uuid);
|
||||
WRITE_HTTP_PAYLOAD_FIELD_UUID(payload, 0x00000003, *pipe_uuid);
|
||||
|
||||
if (out_pipe)
|
||||
/* FIXME: what does this part of the payload do? */
|
||||
WRITE_HTTP_PAYLOAD_FIELD_UINT32(payload, 0x00000000, 0x00010000);
|
||||
else
|
||||
{
|
||||
/* FIXME: what does this part of the payload do? */
|
||||
WRITE_HTTP_PAYLOAD_FIELD_UINT32(payload, 0x00000004, 0x40000000);
|
||||
/* FIXME: what does this part of the payload do? */
|
||||
WRITE_HTTP_PAYLOAD_FIELD_UINT32(payload, 0x00000005, 0x000493e0);
|
||||
|
||||
WRITE_HTTP_PAYLOAD_FIELD_UUID(payload, 0x0000000c, *association_uuid);
|
||||
}
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
RpcPktHdr *RPCRT4_BuildHttpFlowControlHeader(BOOL server, ULONG bytes_transmitted,
|
||||
ULONG flow_control_increment,
|
||||
const UUID *pipe_uuid)
|
||||
{
|
||||
RpcPktHdr *header;
|
||||
char *payload;
|
||||
|
||||
header = RPCRT4_BuildHttpHeader(NDR_LOCAL_DATA_REPRESENTATION, 0x2, 2,
|
||||
5 * sizeof(ULONG) + sizeof(UUID));
|
||||
if (!header) return NULL;
|
||||
payload = (char *)(&header->http+1);
|
||||
|
||||
WRITE_HTTP_PAYLOAD_FIELD_UINT32(payload, 0x0000000d, (server ? 0x0 : 0x3));
|
||||
|
||||
WRITE_HTTP_PAYLOAD_FIELD_FLOW_CONTROL(payload, bytes_transmitted,
|
||||
flow_control_increment, *pipe_uuid);
|
||||
return header;
|
||||
}
|
||||
|
||||
VOID RPCRT4_FreeHeader(RpcPktHdr *Header)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, Header);
|
||||
|
@ -362,6 +474,206 @@ static RPC_STATUS NCA2RPC_STATUS(NCA_STATUS status)
|
|||
}
|
||||
}
|
||||
|
||||
/* assumes the common header fields have already been validated */
|
||||
BOOL RPCRT4_IsValidHttpPacket(RpcPktHdr *hdr, unsigned char *data,
|
||||
unsigned short data_len)
|
||||
{
|
||||
unsigned short i;
|
||||
BYTE *p = data;
|
||||
|
||||
for (i = 0; i < hdr->http.num_data_items; i++)
|
||||
{
|
||||
ULONG type;
|
||||
|
||||
if (data_len < sizeof(ULONG))
|
||||
return FALSE;
|
||||
|
||||
type = *(ULONG *)p;
|
||||
p += sizeof(ULONG);
|
||||
data_len -= sizeof(ULONG);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 0x3:
|
||||
case 0xc:
|
||||
if (data_len < sizeof(GUID))
|
||||
return FALSE;
|
||||
p += sizeof(GUID);
|
||||
data_len -= sizeof(GUID);
|
||||
break;
|
||||
case 0x0:
|
||||
case 0x2:
|
||||
case 0x4:
|
||||
case 0x5:
|
||||
case 0x6:
|
||||
case 0xd:
|
||||
if (data_len < sizeof(ULONG))
|
||||
return FALSE;
|
||||
p += sizeof(ULONG);
|
||||
data_len -= sizeof(ULONG);
|
||||
break;
|
||||
case 0x1:
|
||||
if (data_len < 24)
|
||||
return FALSE;
|
||||
p += 24;
|
||||
data_len -= 24;
|
||||
break;
|
||||
default:
|
||||
FIXME("unimplemented type 0x%x\n", type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* assumes the HTTP packet has been validated */
|
||||
unsigned char *RPCRT4_NextHttpHeaderField(unsigned char *data)
|
||||
{
|
||||
ULONG type;
|
||||
|
||||
type = *(ULONG *)data;
|
||||
data += sizeof(ULONG);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 0x3:
|
||||
case 0xc:
|
||||
return data + sizeof(GUID);
|
||||
case 0x0:
|
||||
case 0x2:
|
||||
case 0x4:
|
||||
case 0x5:
|
||||
case 0x6:
|
||||
case 0xd:
|
||||
return data + sizeof(ULONG);
|
||||
case 0x1:
|
||||
return data + 24;
|
||||
default:
|
||||
FIXME("unimplemented type 0x%x\n", type);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
#define READ_HTTP_PAYLOAD_FIELD_TYPE(data) *(ULONG *)(data)
|
||||
#define GET_HTTP_PAYLOAD_FIELD_DATA(data) ((data) + sizeof(ULONG))
|
||||
|
||||
/* assumes the HTTP packet has been validated */
|
||||
RPC_STATUS RPCRT4_ParseHttpPrepareHeader1(RpcPktHdr *header,
|
||||
unsigned char *data, ULONG *field1)
|
||||
{
|
||||
ULONG type;
|
||||
if (header->http.flags != 0x0)
|
||||
{
|
||||
ERR("invalid flags 0x%x\n", header->http.flags);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
if (header->http.num_data_items != 1)
|
||||
{
|
||||
ERR("invalid number of data items %d\n", header->http.num_data_items);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
type = READ_HTTP_PAYLOAD_FIELD_TYPE(data);
|
||||
if (type != 0x00000002)
|
||||
{
|
||||
ERR("invalid type 0x%08x\n", type);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
*field1 = *(ULONG *)GET_HTTP_PAYLOAD_FIELD_DATA(data);
|
||||
return RPC_S_OK;
|
||||
}
|
||||
|
||||
/* assumes the HTTP packet has been validated */
|
||||
RPC_STATUS RPCRT4_ParseHttpPrepareHeader2(RpcPktHdr *header,
|
||||
unsigned char *data, ULONG *field1,
|
||||
ULONG *bytes_until_next_packet,
|
||||
ULONG *field3)
|
||||
{
|
||||
ULONG type;
|
||||
if (header->http.flags != 0x0)
|
||||
{
|
||||
ERR("invalid flags 0x%x\n", header->http.flags);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
if (header->http.num_data_items != 3)
|
||||
{
|
||||
ERR("invalid number of data items %d\n", header->http.num_data_items);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
|
||||
type = READ_HTTP_PAYLOAD_FIELD_TYPE(data);
|
||||
if (type != 0x00000006)
|
||||
{
|
||||
ERR("invalid type for field 1: 0x%08x\n", type);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
*field1 = *(ULONG *)GET_HTTP_PAYLOAD_FIELD_DATA(data);
|
||||
data = RPCRT4_NextHttpHeaderField(data);
|
||||
|
||||
type = READ_HTTP_PAYLOAD_FIELD_TYPE(data);
|
||||
if (type != 0x00000000)
|
||||
{
|
||||
ERR("invalid type for field 2: 0x%08x\n", type);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
*bytes_until_next_packet = *(ULONG *)GET_HTTP_PAYLOAD_FIELD_DATA(data);
|
||||
data = RPCRT4_NextHttpHeaderField(data);
|
||||
|
||||
type = READ_HTTP_PAYLOAD_FIELD_TYPE(data);
|
||||
if (type != 0x00000002)
|
||||
{
|
||||
ERR("invalid type for field 3: 0x%08x\n", type);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
*field3 = *(ULONG *)GET_HTTP_PAYLOAD_FIELD_DATA(data);
|
||||
|
||||
return RPC_S_OK;
|
||||
}
|
||||
|
||||
RPC_STATUS RPCRT4_ParseHttpFlowControlHeader(RpcPktHdr *header,
|
||||
unsigned char *data, BOOL server,
|
||||
ULONG *bytes_transmitted,
|
||||
ULONG *flow_control_increment,
|
||||
UUID *pipe_uuid)
|
||||
{
|
||||
ULONG type;
|
||||
if (header->http.flags != 0x2)
|
||||
{
|
||||
ERR("invalid flags 0x%x\n", header->http.flags);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
if (header->http.num_data_items != 2)
|
||||
{
|
||||
ERR("invalid number of data items %d\n", header->http.num_data_items);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
|
||||
type = READ_HTTP_PAYLOAD_FIELD_TYPE(data);
|
||||
if (type != 0x0000000d)
|
||||
{
|
||||
ERR("invalid type for field 1: 0x%08x\n", type);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
if (*(ULONG *)GET_HTTP_PAYLOAD_FIELD_DATA(data) != (server ? 0x3 : 0x0))
|
||||
{
|
||||
ERR("invalid type for 0xd field data: 0x%08x\n", *(ULONG *)GET_HTTP_PAYLOAD_FIELD_DATA(data));
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
data = RPCRT4_NextHttpHeaderField(data);
|
||||
|
||||
type = READ_HTTP_PAYLOAD_FIELD_TYPE(data);
|
||||
if (type != 0x00000001)
|
||||
{
|
||||
ERR("invalid type for field 2: 0x%08x\n", type);
|
||||
return RPC_S_PROTOCOL_ERROR;
|
||||
}
|
||||
*bytes_transmitted = *(ULONG *)GET_HTTP_PAYLOAD_FIELD_DATA(data);
|
||||
*flow_control_increment = *(ULONG *)(GET_HTTP_PAYLOAD_FIELD_DATA(data) + 4);
|
||||
*pipe_uuid = *(UUID *)(GET_HTTP_PAYLOAD_FIELD_DATA(data) + 8);
|
||||
|
||||
return RPC_S_OK;
|
||||
}
|
||||
|
||||
|
||||
static RPC_STATUS RPCRT4_SecurePacket(RpcConnection *Connection,
|
||||
enum secure_packet_direction dir,
|
||||
RpcPktHdr *hdr, unsigned int hdr_size,
|
||||
|
@ -687,7 +999,7 @@ RPC_STATUS RPCRT4_Send(RpcConnection *Connection, RpcPktHdr *Header,
|
|||
}
|
||||
|
||||
/* validates version and frag_len fields */
|
||||
static RPC_STATUS RPCRT4_ValidateCommonHeader(const RpcPktCommonHdr *hdr)
|
||||
RPC_STATUS RPCRT4_ValidateCommonHeader(const RpcPktCommonHdr *hdr)
|
||||
{
|
||||
DWORD hdr_length;
|
||||
|
||||
|
@ -716,11 +1028,11 @@ static RPC_STATUS RPCRT4_ValidateCommonHeader(const RpcPktCommonHdr *hdr)
|
|||
}
|
||||
|
||||
/***********************************************************************
|
||||
* RPCRT4_receive_fragment (internal)
|
||||
* RPCRT4_default_receive_fragment (internal)
|
||||
*
|
||||
* Receive a fragment from a connection.
|
||||
*/
|
||||
static RPC_STATUS RPCRT4_receive_fragment(RpcConnection *Connection, RpcPktHdr **Header, void **Payload)
|
||||
RPC_STATUS RPCRT4_default_receive_fragment(RpcConnection *Connection, RpcPktHdr **Header, void **Payload)
|
||||
{
|
||||
RPC_STATUS status;
|
||||
DWORD hdr_length;
|
||||
|
@ -794,6 +1106,14 @@ fail:
|
|||
return status;
|
||||
}
|
||||
|
||||
static RPC_STATUS RPCRT4_receive_fragment(RpcConnection *Connection, RpcPktHdr **Header, void **Payload)
|
||||
{
|
||||
if (Connection->ops->receive_fragment)
|
||||
return Connection->ops->receive_fragment(Connection, Header, Payload);
|
||||
else
|
||||
return RPCRT4_default_receive_fragment(Connection, Header, Payload);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* RPCRT4_ReceiveWithAuth (internal)
|
||||
*
|
||||
|
|
|
@ -30,10 +30,21 @@ RpcPktHdr *RPCRT4_BuildResponseHeader(unsigned long DataRepresentation, unsigned
|
|||
RpcPktHdr *RPCRT4_BuildBindHeader(unsigned long DataRepresentation, unsigned short MaxTransmissionSize, unsigned short MaxReceiveSize, unsigned long AssocGroupId, const RPC_SYNTAX_IDENTIFIER *AbstractId, const RPC_SYNTAX_IDENTIFIER *TransferId);
|
||||
RpcPktHdr *RPCRT4_BuildBindNackHeader(unsigned long DataRepresentation, unsigned char RpcVersion, unsigned char RpcVersionMinor);
|
||||
RpcPktHdr *RPCRT4_BuildBindAckHeader(unsigned long DataRepresentation, unsigned short MaxTransmissionSize, unsigned short MaxReceiveSize, unsigned long AssocGroupId, LPCSTR ServerAddress, unsigned long Result, unsigned long Reason, const RPC_SYNTAX_IDENTIFIER *TransferId);
|
||||
RpcPktHdr *RPCRT4_BuildHttpHeader(unsigned long DataRepresentation, unsigned short flags, unsigned short num_data_items, unsigned int payload_size);
|
||||
RpcPktHdr *RPCRT4_BuildHttpConnectHeader(unsigned short flags, int out_pipe, const UUID *connection_uuid, const UUID *pipe_uuid, const UUID *association_uuid);
|
||||
RpcPktHdr *RPCRT4_BuildHttpFlowControlHeader(BOOL server, ULONG bytes_transmitted, ULONG flow_control_increment, const UUID *pipe_uuid);
|
||||
VOID RPCRT4_FreeHeader(RpcPktHdr *Header);
|
||||
RPC_STATUS RPCRT4_Send(RpcConnection *Connection, RpcPktHdr *Header, void *Buffer, unsigned int BufferLength);
|
||||
RPC_STATUS RPCRT4_Receive(RpcConnection *Connection, RpcPktHdr **Header, PRPC_MESSAGE pMsg);
|
||||
RPC_STATUS RPCRT4_ReceiveWithAuth(RpcConnection *Connection, RpcPktHdr **Header, PRPC_MESSAGE pMsg, unsigned char **auth_data_out, unsigned long *auth_length_out);
|
||||
DWORD RPCRT4_GetHeaderSize(const RpcPktHdr *Header);
|
||||
RPC_STATUS RPCRT4_ValidateCommonHeader(const RpcPktCommonHdr *hdr);
|
||||
|
||||
BOOL RPCRT4_IsValidHttpPacket(RpcPktHdr *hdr, unsigned char *data, unsigned short data_len);
|
||||
unsigned char *RPCRT4_NextHttpHeaderField(unsigned char *data);
|
||||
RPC_STATUS RPCRT4_ParseHttpPrepareHeader1(RpcPktHdr *header, unsigned char *data, ULONG *field1);
|
||||
RPC_STATUS RPCRT4_ParseHttpPrepareHeader2(RpcPktHdr *header, unsigned char *data, ULONG *field1, ULONG *bytes_until_next_packet, ULONG *field3);
|
||||
RPC_STATUS RPCRT4_ParseHttpFlowControlHeader(RpcPktHdr *header, unsigned char *data, BOOL server, ULONG *bytes_transmitted, ULONG *flow_control_increment, UUID *pipe_uuid);
|
||||
NCA_STATUS RPC2NCA_STATUS(RPC_STATUS status);
|
||||
RPC_STATUS RPCRT4_AuthorizeConnection(RpcConnection* conn, BYTE *challenge, ULONG count);
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue