ReactOS 0.4.16-dev-1946-g52006dd
rpc_transport.c File Reference
#include "ntstatus.h"
#include "ws2tcpip.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
#include "winerror.h"
#include "wininet.h"
#include "winternl.h"
#include "winioctl.h"
#include "rpc.h"
#include "rpcndr.h"
#include "wine/debug.h"
#include "rpc_binding.h"
#include "rpc_assoc.h"
#include "rpc_message.h"
#include "rpc_server.h"
#include "epm_towers.h"
Include dependency graph for rpc_transport.c:

Go to the source code of this file.

Classes

struct  _RpcConnection_np
 
struct  _RpcServerProtseq_np
 
struct  _RpcConnection_tcp
 
struct  _RpcServerProtseq_sock
 
struct  _RpcHttpAsyncData
 
struct  authinfo
 
struct  _RpcConnection_http
 
struct  _HttpTimerThreadData
 

Macros

#define WIN32_NO_STATUS
 
#define DEFAULT_NCACN_HTTP_TIMEOUT   (60 * 1000)
 
#define HTTP_IDLE_TIME   60000
 

Typedefs

typedef struct _RpcConnection_np RpcConnection_np
 
typedef struct _RpcServerProtseq_np RpcServerProtseq_np
 
typedef struct _RpcConnection_tcp RpcConnection_tcp
 
typedef struct _RpcServerProtseq_sock RpcServerProtseq_sock
 
typedef struct _RpcHttpAsyncData RpcHttpAsyncData
 
typedef struct _RpcConnection_http RpcConnection_http
 
typedef struct _HttpTimerThreadData HttpTimerThreadData
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (rpc)
 
static RpcConnectionrpcrt4_spawn_connection (RpcConnection *old_connection)
 
static RpcConnectionrpcrt4_conn_np_alloc (void)
 
static HANDLE get_np_event (RpcConnection_np *connection)
 
static void release_np_event (RpcConnection_np *connection, HANDLE event)
 
static RPC_STATUS rpcrt4_conn_create_pipe (RpcConnection *conn)
 
static RPC_STATUS rpcrt4_conn_open_pipe (RpcConnection *Connection, LPCSTR pname, BOOL wait)
 
static charncalrpc_pipe_name (const char *endpoint)
 
static RPC_STATUS rpcrt4_ncalrpc_open (RpcConnection *Connection)
 
static RPC_STATUS rpcrt4_protseq_ncalrpc_open_endpoint (RpcServerProtseq *protseq, const char *endpoint)
 
static charncacn_pipe_name (const char *endpoint)
 
static RPC_STATUS rpcrt4_ncacn_np_open (RpcConnection *Connection)
 
static RPC_STATUS rpcrt4_protseq_ncacn_np_open_endpoint (RpcServerProtseq *protseq, const char *endpoint)
 
static void rpcrt4_conn_np_handoff (RpcConnection_np *old_npc, RpcConnection_np *new_npc)
 
static RPC_STATUS rpcrt4_ncacn_np_handoff (RpcConnection *old_conn, RpcConnection *new_conn)
 
static RPC_STATUS is_pipe_listening (const char *pipe_name)
 
static RPC_STATUS rpcrt4_ncacn_np_is_server_listening (const char *endpoint)
 
static RPC_STATUS rpcrt4_ncalrpc_np_is_server_listening (const char *endpoint)
 
static RPC_STATUS rpcrt4_ncalrpc_handoff (RpcConnection *old_conn, RpcConnection *new_conn)
 
static int rpcrt4_conn_np_read (RpcConnection *conn, void *buffer, unsigned int count)
 
static int rpcrt4_conn_np_write (RpcConnection *conn, const void *buffer, unsigned int count)
 
static int rpcrt4_conn_np_close (RpcConnection *conn)
 
static void rpcrt4_conn_np_close_read (RpcConnection *conn)
 
static void rpcrt4_conn_np_cancel_call (RpcConnection *conn)
 
static int rpcrt4_conn_np_wait_for_incoming_data (RpcConnection *conn)
 
static size_t rpcrt4_ncacn_np_get_top_of_tower (unsigned char *tower_data, const char *networkaddr, const char *endpoint)
 
static RPC_STATUS rpcrt4_ncacn_np_parse_top_of_tower (const unsigned char *tower_data, size_t tower_size, char **networkaddr, char **endpoint)
 
static RPC_STATUS rpcrt4_conn_np_impersonate_client (RpcConnection *conn)
 
static RPC_STATUS rpcrt4_conn_np_revert_to_self (RpcConnection *conn)
 
static RpcServerProtseqrpcrt4_protseq_np_alloc (void)
 
static void rpcrt4_protseq_np_signal_state_changed (RpcServerProtseq *protseq)
 
static voidrpcrt4_protseq_np_get_wait_array (RpcServerProtseq *protseq, void *prev_array, unsigned int *count)
 
static void rpcrt4_protseq_np_free_wait_array (RpcServerProtseq *protseq, void *array)
 
static int rpcrt4_protseq_np_wait_for_new_connection (RpcServerProtseq *protseq, unsigned int count, void *wait_array)
 
static size_t rpcrt4_ncalrpc_get_top_of_tower (unsigned char *tower_data, const char *networkaddr, const char *endpoint)
 
static RPC_STATUS rpcrt4_ncalrpc_parse_top_of_tower (const unsigned char *tower_data, size_t tower_size, char **networkaddr, char **endpoint)
 
static BOOL rpcrt4_ncalrpc_is_authorized (RpcConnection *conn)
 
static RPC_STATUS rpcrt4_ncalrpc_authorize (RpcConnection *conn, BOOL first_time, unsigned char *in_buffer, unsigned int in_size, unsigned char *out_buffer, unsigned int *out_size)
 
static RPC_STATUS rpcrt4_ncalrpc_secure_packet (RpcConnection *conn, enum secure_packet_direction dir, RpcPktHdr *hdr, unsigned int hdr_size, unsigned char *stub_data, unsigned int stub_data_size, RpcAuthVerifier *auth_hdr, unsigned char *auth_value, unsigned int auth_value_size)
 
static RPC_STATUS rpcrt4_ncalrpc_inquire_auth_client (RpcConnection *conn, RPC_AUTHZ_HANDLE *privs, RPC_WSTR *server_princ_name, ULONG *authn_level, ULONG *authn_svc, ULONG *authz_svc, ULONG flags)
 
static RPC_STATUS rpcrt4_ncalrpc_inquire_client_pid (RpcConnection *conn, ULONG *pid)
 
static size_t rpcrt4_ip_tcp_get_top_of_tower (unsigned char *tower_data, const char *networkaddr, unsigned char tcp_protid, const char *endpoint)
 
static RPC_STATUS rpcrt4_ip_tcp_parse_top_of_tower (const unsigned char *tower_data, size_t tower_size, char **networkaddr, unsigned char tcp_protid, char **endpoint)
 
static BOOL rpcrt4_sock_wait_init (RpcConnection_tcp *tcpc)
 
static BOOL rpcrt4_sock_wait_for_recv (RpcConnection_tcp *tcpc)
 
static BOOL rpcrt4_sock_wait_for_send (RpcConnection_tcp *tcpc)
 
static RpcConnectionrpcrt4_conn_tcp_alloc (void)
 
static RPC_STATUS rpcrt4_ncacn_ip_tcp_open (RpcConnection *Connection)
 
static RPC_STATUS rpcrt4_protseq_ncacn_ip_tcp_open_endpoint (RpcServerProtseq *protseq, const char *endpoint)
 
static RPC_STATUS rpcrt4_conn_tcp_handoff (RpcConnection *old_conn, RpcConnection *new_conn)
 
static int rpcrt4_conn_tcp_read (RpcConnection *Connection, void *buffer, unsigned int count)
 
static int rpcrt4_conn_tcp_write (RpcConnection *Connection, const void *buffer, unsigned int count)
 
static int rpcrt4_conn_tcp_close (RpcConnection *conn)
 
static void rpcrt4_conn_tcp_close_read (RpcConnection *conn)
 
static void rpcrt4_conn_tcp_cancel_call (RpcConnection *conn)
 
static RPC_STATUS rpcrt4_conn_tcp_is_server_listening (const char *endpoint)
 
static int rpcrt4_conn_tcp_wait_for_incoming_data (RpcConnection *Connection)
 
static size_t rpcrt4_ncacn_ip_tcp_get_top_of_tower (unsigned char *tower_data, const char *networkaddr, const char *endpoint)
 
static RpcServerProtseqrpcrt4_protseq_sock_alloc (void)
 
static void rpcrt4_protseq_sock_signal_state_changed (RpcServerProtseq *protseq)
 
static voidrpcrt4_protseq_sock_get_wait_array (RpcServerProtseq *protseq, void *prev_array, unsigned int *count)
 
static void rpcrt4_protseq_sock_free_wait_array (RpcServerProtseq *protseq, void *array)
 
static int rpcrt4_protseq_sock_wait_for_new_connection (RpcServerProtseq *protseq, unsigned int count, void *wait_array)
 
static RPC_STATUS rpcrt4_ncacn_ip_tcp_parse_top_of_tower (const unsigned char *tower_data, size_t tower_size, char **networkaddr, char **endpoint)
 
static ULONG RpcHttpAsyncData_AddRef (RpcHttpAsyncData *data)
 
static ULONG RpcHttpAsyncData_Release (RpcHttpAsyncData *data)
 
static void prepare_async_request (RpcHttpAsyncData *async_data)
 
static RPC_STATUS wait_async_request (RpcHttpAsyncData *async_data, BOOL call_ret, HANDLE cancel_event)
 
static RpcConnectionrpcrt4_ncacn_http_alloc (void)
 
static VOID rpcrt4_http_keep_connection_active_timer_proc (PVOID param, BOOLEAN dummy)
 
static DWORD rpcrt4_http_timer_calc_timeout (DWORD *last_sent_time)
 
static DWORD CALLBACK rpcrt4_http_timer_thread (PVOID param)
 
static VOID WINAPI rpcrt4_http_internet_callback (HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength)
 
static RPC_STATUS rpcrt4_http_check_response (HINTERNET hor)
 
static RPC_STATUS rpcrt4_http_internet_connect (RpcConnection_http *httpc)
 
static int rpcrt4_http_async_read (HINTERNET req, RpcHttpAsyncData *async_data, HANDLE cancel_event, void *buffer, unsigned int count)
 
static RPC_STATUS send_echo_request (HINTERNET req, RpcHttpAsyncData *async_data, HANDLE cancel_event)
 
static RPC_STATUS insert_content_length_header (HINTERNET request, DWORD len)
 
static RPC_STATUS rpcrt4_http_prepare_in_pipe (HINTERNET in_request, RpcHttpAsyncData *async_data, HANDLE cancel_event, const UUID *connection_uuid, const UUID *in_pipe_uuid, const UUID *association_uuid, BOOL authorized)
 
static RPC_STATUS rpcrt4_http_read_http_packet (HINTERNET request, RpcHttpAsyncData *async_data, HANDLE cancel_event, RpcPktHdr *hdr, BYTE **data)
 
static RPC_STATUS rpcrt4_http_prepare_out_pipe (HINTERNET out_request, RpcHttpAsyncData *async_data, HANDLE cancel_event, const UUID *connection_uuid, const UUID *out_pipe_uuid, ULONG *flow_control_increment, BOOL authorized)
 
static UINT encode_base64 (const char *bin, unsigned int len, WCHAR *base64)
 
static char decode_char (WCHAR c)
 
static unsigned int decode_base64 (const WCHAR *base64, unsigned int len, char *buf)
 
static struct authinfoalloc_authinfo (void)
 
static void destroy_authinfo (struct authinfo *info)
 
static DWORD auth_scheme_from_header (const WCHAR *header)
 
static BOOL get_authvalue (HINTERNET request, DWORD scheme, WCHAR *buffer, DWORD buflen)
 
static RPC_STATUS do_authorization (HINTERNET request, SEC_WCHAR *servername, const RPC_HTTP_TRANSPORT_CREDENTIALS_W *creds, struct authinfo **auth_ptr)
 
static RPC_STATUS insert_authorization_header (HINTERNET request, ULONG scheme, char *data, int data_len)
 
static void drain_content (HINTERNET request, RpcHttpAsyncData *async_data, HANDLE cancel_event)
 
static RPC_STATUS authorize_request (RpcConnection_http *httpc, HINTERNET request)
 
static BOOL has_credentials (RpcConnection_http *httpc)
 
static BOOL is_secure (RpcConnection_http *httpc)
 
static RPC_STATUS set_auth_cookie (RpcConnection_http *httpc, const WCHAR *value)
 
static RPC_STATUS rpcrt4_ncacn_http_open (RpcConnection *Connection)
 
static RPC_STATUS rpcrt4_ncacn_http_handoff (RpcConnection *old_conn, RpcConnection *new_conn)
 
static int rpcrt4_ncacn_http_read (RpcConnection *Connection, void *buffer, unsigned int count)
 
static RPC_STATUS rpcrt4_ncacn_http_receive_fragment (RpcConnection *Connection, RpcPktHdr **Header, void **Payload)
 
static int rpcrt4_ncacn_http_write (RpcConnection *Connection, const void *buffer, unsigned int count)
 
static int rpcrt4_ncacn_http_close (RpcConnection *Connection)
 
static void rpcrt4_ncacn_http_close_read (RpcConnection *conn)
 
static void rpcrt4_ncacn_http_cancel_call (RpcConnection *Connection)
 
static RPC_STATUS rpcrt4_ncacn_http_is_server_listening (const char *endpoint)
 
static int rpcrt4_ncacn_http_wait_for_incoming_data (RpcConnection *Connection)
 
static size_t rpcrt4_ncacn_http_get_top_of_tower (unsigned char *tower_data, const char *networkaddr, const char *endpoint)
 
static RPC_STATUS rpcrt4_ncacn_http_parse_top_of_tower (const unsigned char *tower_data, size_t tower_size, char **networkaddr, char **endpoint)
 
const struct protseq_opsrpcrt4_get_protseq_ops (const char *protseq)
 
static const struct connection_opsrpcrt4_get_conn_protseq_ops (const char *protseq)
 
RPC_STATUS RPCRT4_OpenClientConnection (RpcConnection *Connection)
 
RPC_STATUS RPCRT4_CloseConnection (RpcConnection *Connection)
 
RPC_STATUS RPCRT4_CreateConnection (RpcConnection **Connection, BOOL server, LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAuthInfo *AuthInfo, RpcQualityOfService *QOS, LPCWSTR CookieAuth)
 
void rpcrt4_conn_release_and_wait (RpcConnection *connection)
 
RpcConnectionRPCRT4_GrabConnection (RpcConnection *connection)
 
void RPCRT4_ReleaseConnection (RpcConnection *connection)
 
RPC_STATUS RPCRT4_IsServerListening (const char *protseq, const char *endpoint)
 
RPC_STATUS RpcTransport_GetTopOfTower (unsigned char *tower_data, size_t *tower_size, const char *protseq, const char *networkaddr, const char *endpoint)
 
RPC_STATUS RpcTransport_ParseTopOfTower (const unsigned char *tower_data, size_t tower_size, char **protseq, char **networkaddr, char **endpoint)
 
RPC_STATUS WINAPI RpcNetworkIsProtseqValidW (RPC_WSTR protseq)
 
RPC_STATUS WINAPI RpcNetworkIsProtseqValidA (RPC_CSTR protseq)
 
RPC_STATUS WINAPI RpcProtseqVectorFreeA (RPC_PROTSEQ_VECTORA **protseqs)
 
RPC_STATUS WINAPI RpcProtseqVectorFreeW (RPC_PROTSEQ_VECTORW **protseqs)
 
RPC_STATUS WINAPI RpcNetworkInqProtseqsW (RPC_PROTSEQ_VECTORW **protseqs)
 
RPC_STATUS WINAPI RpcNetworkInqProtseqsA (RPC_PROTSEQ_VECTORA **protseqs)
 

Variables

struct {
   const WCHAR *   str
 
   unsigned int   len
 
   DWORD   scheme
 
auth_schemes []
 
static const struct connection_ops conn_protseq_list []
 
static const struct protseq_ops protseq_list []
 

Macro Definition Documentation

◆ DEFAULT_NCACN_HTTP_TIMEOUT

#define DEFAULT_NCACN_HTTP_TIMEOUT   (60 * 1000)

Definition at line 54 of file rpc_transport.c.

◆ HTTP_IDLE_TIME

#define HTTP_IDLE_TIME   60000

Definition at line 1957 of file rpc_transport.c.

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 27 of file rpc_transport.c.

Typedef Documentation

◆ HttpTimerThreadData

◆ RpcConnection_http

◆ RpcConnection_np

◆ RpcConnection_tcp

◆ RpcHttpAsyncData

◆ RpcServerProtseq_np

◆ RpcServerProtseq_sock

Function Documentation

◆ alloc_authinfo()

static struct authinfo * alloc_authinfo ( void  )
static

Definition at line 2663 of file rpc_transport.c.

2664{
2665 struct authinfo *ret;
2666
2667 if (!(ret = malloc(sizeof(*ret)))) return NULL;
2668
2669 SecInvalidateHandle(&ret->cred);
2670 SecInvalidateHandle(&ret->ctx);
2671 memset(&ret->exp, 0, sizeof(ret->exp));
2672 ret->scheme = 0;
2673 ret->attr = 0;
2674 ret->max_token = 0;
2675 ret->data = NULL;
2676 ret->data_len = 0;
2677 ret->finished = FALSE;
2678 return ret;
2679}
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
return ret
Definition: mutex.c:146
#define SecInvalidateHandle(x)
Definition: sspi.h:58
#define memset(x, y, z)
Definition: compat.h:39

Referenced by do_authorization().

◆ auth_scheme_from_header()

static DWORD auth_scheme_from_header ( const WCHAR header)
static

Definition at line 2709 of file rpc_transport.c.

2710{
2711 unsigned int i;
2712 for (i = 0; i < ARRAY_SIZE(auth_schemes); i++)
2713 {
2715 (header[auth_schemes[i].len] == ' ' || !header[auth_schemes[i].len])) return auth_schemes[i].scheme;
2716 }
2717 return 0;
2718}
#define ARRAY_SIZE(A)
Definition: main.h:20
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
const WCHAR * str
static const struct @593 auth_schemes[]
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)

Referenced by do_authorization(), and get_authvalue().

◆ authorize_request()

static RPC_STATUS authorize_request ( RpcConnection_http httpc,
HINTERNET  request 
)
static

Definition at line 2941 of file rpc_transport.c.

2942{
2943 struct authinfo *info = NULL;
2945 BOOL ret;
2946
2947 for (;;)
2948 {
2950 if (status != RPC_S_OK) break;
2951
2952 status = insert_authorization_header(request, info->scheme, info->data, info->data_len);
2953 if (status != RPC_S_OK) break;
2954
2958 if (status != RPC_S_OK || info->finished) break;
2959
2961 if (status != RPC_S_OK && status != ERROR_ACCESS_DENIED) break;
2963 }
2964
2965 if (info->scheme != RPC_C_HTTP_AUTHN_SCHEME_BASIC)
2967
2969 return status;
2970}
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
BOOL WINAPI HttpAddRequestHeadersW(HINTERNET hHttpRequest, LPCWSTR lpszHeader, DWORD dwHeaderLength, DWORD dwModifier)
Definition: http.c:1297
BOOL WINAPI HttpSendRequestW(HINTERNET hHttpRequest, LPCWSTR lpszHeaders, DWORD dwHeaderLength, LPVOID lpOptional, DWORD dwOptionalLength)
Definition: http.c:5595
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
static void drain_content(HINTERNET request, RpcHttpAsyncData *async_data, HANDLE cancel_event)
static RPC_STATUS wait_async_request(RpcHttpAsyncData *async_data, BOOL call_ret, HANDLE cancel_event)
static RPC_STATUS do_authorization(HINTERNET request, SEC_WCHAR *servername, const RPC_HTTP_TRANSPORT_CREDENTIALS_W *creds, struct authinfo **auth_ptr)
static RPC_STATUS insert_authorization_header(HINTERNET request, ULONG scheme, char *data, int data_len)
static void prepare_async_request(RpcHttpAsyncData *async_data)
static RPC_STATUS rpcrt4_http_check_response(HINTERNET hor)
static void destroy_authinfo(struct authinfo *info)
#define RPC_C_HTTP_AUTHN_SCHEME_BASIC
Definition: rpcdce.h:205
#define RPC_S_OK
Definition: rpcnterr.h:22
long RPC_STATUS
Definition: rpc.h:48
union _RPC_SECURITY_QOS_V2_W::@3414 u
RPC_HTTP_TRANSPORT_CREDENTIALS_W * HttpCredentials
Definition: rpcdce.h:279
RpcConnection common
RpcHttpAsyncData * async_data
RpcQualityOfService * QOS
Definition: rpc_binding.h:81
RPC_SECURITY_QOS_V2_W * qos
Definition: rpc_binding.h:57
Definition: tftpd.h:86
Definition: ps.c:97
#define HTTP_ADDREQ_FLAG_REPLACE
Definition: wininet.h:1711
#define HTTP_ADDREQ_FLAG_ADD
Definition: wininet.h:1707

Referenced by rpcrt4_ncacn_http_open().

◆ decode_base64()

static unsigned int decode_base64 ( const WCHAR base64,
unsigned int  len,
char buf 
)
static

Definition at line 2601 of file rpc_transport.c.

2602{
2603 unsigned int i = 0;
2604 char c0, c1, c2, c3;
2605 const WCHAR *p = base64;
2606
2607 while (len > 4)
2608 {
2609 if ((c0 = decode_char( p[0] )) > 63) return 0;
2610 if ((c1 = decode_char( p[1] )) > 63) return 0;
2611 if ((c2 = decode_char( p[2] )) > 63) return 0;
2612 if ((c3 = decode_char( p[3] )) > 63) return 0;
2613
2614 if (buf)
2615 {
2616 buf[i + 0] = (c0 << 2) | (c1 >> 4);
2617 buf[i + 1] = (c1 << 4) | (c2 >> 2);
2618 buf[i + 2] = (c2 << 6) | c3;
2619 }
2620 len -= 4;
2621 i += 3;
2622 p += 4;
2623 }
2624 if (p[2] == '=')
2625 {
2626 if ((c0 = decode_char( p[0] )) > 63) return 0;
2627 if ((c1 = decode_char( p[1] )) > 63) return 0;
2628
2629 if (buf) buf[i] = (c0 << 2) | (c1 >> 4);
2630 i++;
2631 }
2632 else if (p[3] == '=')
2633 {
2634 if ((c0 = decode_char( p[0] )) > 63) return 0;
2635 if ((c1 = decode_char( p[1] )) > 63) return 0;
2636 if ((c2 = decode_char( p[2] )) > 63) return 0;
2637
2638 if (buf)
2639 {
2640 buf[i + 0] = (c0 << 2) | (c1 >> 4);
2641 buf[i + 1] = (c1 << 4) | (c2 >> 2);
2642 }
2643 i += 2;
2644 }
2645 else
2646 {
2647 if ((c0 = decode_char( p[0] )) > 63) return 0;
2648 if ((c1 = decode_char( p[1] )) > 63) return 0;
2649 if ((c2 = decode_char( p[2] )) > 63) return 0;
2650 if ((c3 = decode_char( p[3] )) > 63) return 0;
2651
2652 if (buf)
2653 {
2654 buf[i + 0] = (c0 << 2) | (c1 >> 4);
2655 buf[i + 1] = (c1 << 4) | (c2 >> 2);
2656 buf[i + 2] = (c2 << 6) | c3;
2657 }
2658 i += 3;
2659 }
2660 return i;
2661}
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLfloat GLfloat p
Definition: glext.h:8902
static char decode_char(WCHAR c)
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by do_authorization().

◆ decode_char()

static char decode_char ( WCHAR  c)
inlinestatic

Definition at line 2591 of file rpc_transport.c.

2592{
2593 if (c >= 'A' && c <= 'Z') return c - 'A';
2594 if (c >= 'a' && c <= 'z') return c - 'a' + 26;
2595 if (c >= '0' && c <= '9') return c - '0' + 52;
2596 if (c == '+') return 62;
2597 if (c == '/') return 63;
2598 return 64;
2599}
const GLubyte * c
Definition: glext.h:8905

Referenced by decode_base64().

◆ destroy_authinfo()

static void destroy_authinfo ( struct authinfo info)
static

Definition at line 2681 of file rpc_transport.c.

2682{
2683 if (!info) return;
2684
2685 if (SecIsValidHandle(&info->ctx))
2687 if (SecIsValidHandle(&info->cred))
2689
2690 free(info->data);
2691 free(info);
2692}
#define free
Definition: debug_ros.c:5
#define SecIsValidHandle(x)
Definition: sspi.h:63
SECURITY_STATUS WINAPI DeleteSecurityContext(PCtxtHandle phContext)
Definition: wrapper.c:450
SECURITY_STATUS WINAPI FreeCredentialsHandle(PCredHandle phCredential)
Definition: wrapper.c:151

Referenced by authorize_request(), do_authorization(), and request_destroy().

◆ do_authorization()

static RPC_STATUS do_authorization ( HINTERNET  request,
SEC_WCHAR servername,
const RPC_HTTP_TRANSPORT_CREDENTIALS_W creds,
struct authinfo **  auth_ptr 
)
static

Definition at line 2732 of file rpc_transport.c.

2734{
2735 struct authinfo *info = *auth_ptr;
2738
2739 if ((!info && !(info = alloc_authinfo()))) return RPC_S_SERVER_UNAVAILABLE;
2740
2741 switch (creds->AuthnSchemes[0])
2742 {
2744 {
2745 int userlen = WideCharToMultiByte(CP_UTF8, 0, id->User, id->UserLength, NULL, 0, NULL, NULL);
2746 int passlen = WideCharToMultiByte(CP_UTF8, 0, id->Password, id->PasswordLength, NULL, 0, NULL, NULL);
2747
2748 info->data_len = userlen + passlen + 1;
2749 if (!(info->data = malloc(info->data_len)))
2750 {
2752 break;
2753 }
2754 WideCharToMultiByte(CP_UTF8, 0, id->User, id->UserLength, info->data, userlen, NULL, NULL);
2755 info->data[userlen] = ':';
2756 WideCharToMultiByte(CP_UTF8, 0, id->Password, id->PasswordLength, info->data + userlen + 1, passlen, NULL, NULL);
2757
2759 info->finished = TRUE;
2760 status = RPC_S_OK;
2761 break;
2762 }
2765 {
2766
2767 static SEC_WCHAR ntlmW[] = L"NTLM", negotiateW[] = L"Negotiate";
2769 SecBufferDesc out_desc, in_desc;
2770 SecBuffer out, in;
2773 int scheme_len;
2774 const WCHAR *p;
2775 WCHAR auth_value[2048];
2776 DWORD size = sizeof(auth_value);
2777 BOOL first = FALSE;
2778
2780 else scheme = negotiateW;
2781 scheme_len = lstrlenW( scheme );
2782
2783 if (!*auth_ptr)
2784 {
2785 TimeStamp exp;
2786 SecPkgInfoW *pkg_info;
2787
2789 if (ret != SEC_E_OK) break;
2790
2791 ret = QuerySecurityPackageInfoW(scheme, &pkg_info);
2792 if (ret != SEC_E_OK) break;
2793
2794 info->max_token = pkg_info->cbMaxToken;
2795 FreeContextBuffer(pkg_info);
2796 first = TRUE;
2797 }
2798 else
2799 {
2800 if (info->finished || !get_authvalue(request, creds->AuthnSchemes[0], auth_value, size)) break;
2801 if (auth_scheme_from_header(auth_value) != info->scheme)
2802 {
2803 ERR("authentication scheme changed\n");
2804 break;
2805 }
2806 }
2807 in.BufferType = SECBUFFER_TOKEN;
2808 in.cbBuffer = 0;
2809 in.pvBuffer = NULL;
2810
2811 in_desc.ulVersion = 0;
2812 in_desc.cBuffers = 1;
2813 in_desc.pBuffers = &in;
2814
2815 p = auth_value + scheme_len;
2816 if (!first && *p == ' ')
2817 {
2818 int len = lstrlenW(++p);
2819 in.cbBuffer = decode_base64(p, len, NULL);
2820 if (!(in.pvBuffer = malloc(in.cbBuffer))) break;
2821 decode_base64(p, len, in.pvBuffer);
2822 }
2823 out.BufferType = SECBUFFER_TOKEN;
2824 out.cbBuffer = info->max_token;
2825 if (!(out.pvBuffer = malloc(out.cbBuffer)))
2826 {
2827 free(in.pvBuffer);
2828 break;
2829 }
2830 out_desc.ulVersion = 0;
2831 out_desc.cBuffers = 1;
2832 out_desc.pBuffers = &out;
2833
2834 ret = InitializeSecurityContextW(first ? &info->cred : NULL, first ? NULL : &info->ctx,
2835 first ? servername : NULL, flags, 0, SECURITY_NETWORK_DREP,
2836 in.pvBuffer ? &in_desc : NULL, 0, &info->ctx, &out_desc,
2837 &info->attr, &info->exp);
2838 free(in.pvBuffer);
2839 if (ret == SEC_E_OK)
2840 {
2841 free(info->data);
2842 info->data = out.pvBuffer;
2843 info->data_len = out.cbBuffer;
2844 info->finished = TRUE;
2845 TRACE("sending last auth packet\n");
2846 status = RPC_S_OK;
2847 }
2848 else if (ret == SEC_I_CONTINUE_NEEDED)
2849 {
2850 free(info->data);
2851 info->data = out.pvBuffer;
2852 info->data_len = out.cbBuffer;
2853 TRACE("sending next auth packet\n");
2854 status = RPC_S_OK;
2855 }
2856 else
2857 {
2858 ERR("InitializeSecurityContextW failed with error 0x%08lx\n", ret);
2859 free(out.pvBuffer);
2860 break;
2861 }
2862 info->scheme = creds->AuthnSchemes[0];
2863 break;
2864 }
2865 default:
2866 FIXME("scheme %lu not supported\n", creds->AuthnSchemes[0]);
2867 break;
2868 }
2869
2870 if (status != RPC_S_OK)
2871 {
2873 *auth_ptr = NULL;
2874 return status;
2875 }
2876 *auth_ptr = info;
2877 return RPC_S_OK;
2878}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
#define TRUE
Definition: types.h:120
#define WideCharToMultiByte
Definition: compat.h:111
#define lstrlenW
Definition: compat.h:750
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
GLuint in
Definition: glext.h:9616
GLbitfield flags
Definition: glext.h:7161
const GLint * first
Definition: glext.h:5794
GLuint id
Definition: glext.h:5910
DWORD exp
Definition: msg.c:16058
LONG SECURITY_STATUS
Definition: sspi.h:34
#define SECPKG_CRED_OUTBOUND
Definition: sspi.h:291
#define SECBUFFER_TOKEN
Definition: sspi.h:161
#define SECURITY_NETWORK_DREP
Definition: sspi.h:474
#define ISC_REQ_DELEGATE
Definition: sspi.h:362
#define ISC_REQ_MUTUAL_AUTH
Definition: sspi.h:363
WCHAR SEC_WCHAR
Definition: sspi.h:29
#define ISC_REQ_CONNECTION
Definition: sspi.h:373
#define ISC_REQ_USE_DCE_STYLE
Definition: sspi.h:371
static const WCHAR negotiateW[]
Definition: request.c:886
static const WCHAR ntlmW[]
Definition: request.c:883
static DWORD auth_scheme_from_header(const WCHAR *header)
static unsigned int decode_base64(const WCHAR *base64, unsigned int len, char *buf)
static struct authinfo * alloc_authinfo(void)
static BOOL get_authvalue(HINTERNET request, DWORD scheme, WCHAR *buffer, DWORD buflen)
DWORD scheme
#define RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE
Definition: rpcdce.h:209
#define RPC_C_HTTP_AUTHN_SCHEME_NTLM
Definition: rpcdce.h:206
#define RPC_S_OUT_OF_MEMORY
Definition: rpcnterr.h:24
#define CP_UTF8
Definition: nls.h:20
#define TRACE(s)
Definition: solgame.cpp:4
SECURITY_STATUS WINAPI FreeContextBuffer(PVOID pv)
Definition: sspi.c:699
SEC_WINNT_AUTH_IDENTITY_W * TransportCredentials
Definition: rpcdce.h:245
ULONG cBuffers
Definition: sspi.h:182
ULONG ulVersion
Definition: sspi.h:181
ULONG cbMaxToken
Definition: sspi.h:117
uint32_t ULONG
Definition: typedefs.h:59
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define SEC_E_OK
Definition: winerror.h:3450
#define SEC_I_CONTINUE_NEEDED
Definition: winerror.h:4324
#define RPC_S_SERVER_UNAVAILABLE
Definition: winerror.h:1389
SECURITY_STATUS WINAPI AcquireCredentialsHandleW(SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialsUse, PLUID pvLogonID, PVOID pAuthData, SEC_GET_KEY_FN pGetKeyFn, PVOID pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry)
Definition: wrapper.c:105
SECURITY_STATUS WINAPI InitializeSecurityContextW(PCredHandle phCredential, PCtxtHandle phContext, SEC_WCHAR *pszTargetName, ULONG fContextReq, ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry)
Definition: wrapper.c:301
SECURITY_STATUS WINAPI QuerySecurityPackageInfoW(SEC_WCHAR *pszPackageName, PSecPkgInfoW *ppPackageInfo)
Definition: wrapper.c:750

Referenced by authorize_request().

◆ drain_content()

static void drain_content ( HINTERNET  request,
RpcHttpAsyncData async_data,
HANDLE  cancel_event 
)
static

Definition at line 2926 of file rpc_transport.c.

2927{
2928 DWORD count, len = 0, size = sizeof(len);
2929 char buf[2048];
2930
2932 if (!len) return;
2933 for (;;)
2934 {
2935 count = min(sizeof(buf), len);
2936 if (rpcrt4_http_async_read(request, async_data, cancel_event, buf, count) <= 0) return;
2937 len -= count;
2938 }
2939}
BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
Definition: http.c:3870
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define min(a, b)
Definition: monoChain.cc:55
unsigned int len
static int rpcrt4_http_async_read(HINTERNET req, RpcHttpAsyncData *async_data, HANDLE cancel_event, void *buffer, unsigned int count)
#define HTTP_QUERY_FLAG_NUMBER
Definition: wininet.h:1606
#define HTTP_QUERY_CONTENT_LENGTH
Definition: wininet.h:1528

Referenced by authorize_request(), and rpcrt4_ncacn_http_open().

◆ encode_base64()

static UINT encode_base64 ( const char bin,
unsigned int  len,
WCHAR base64 
)
static

Definition at line 2551 of file rpc_transport.c.

2552{
2553 static const char enc[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2554 UINT i = 0, x;
2555
2556 while (len > 0)
2557 {
2558 /* first 6 bits, all from bin[0] */
2559 base64[i++] = enc[(bin[0] & 0xfc) >> 2];
2560 x = (bin[0] & 3) << 4;
2561
2562 /* next 6 bits, 2 from bin[0] and 4 from bin[1] */
2563 if (len == 1)
2564 {
2565 base64[i++] = enc[x];
2566 base64[i++] = '=';
2567 base64[i++] = '=';
2568 break;
2569 }
2570 base64[i++] = enc[x | ((bin[1] & 0xf0) >> 4)];
2571 x = (bin[1] & 0x0f) << 2;
2572
2573 /* next 6 bits 4 from bin[1] and 2 from bin[2] */
2574 if (len == 2)
2575 {
2576 base64[i++] = enc[x];
2577 base64[i++] = '=';
2578 break;
2579 }
2580 base64[i++] = enc[x | ((bin[2] & 0xc0) >> 6)];
2581
2582 /* last 6 bits, all from bin [2] */
2583 base64[i++] = enc[bin[2] & 0x3f];
2584 bin += 3;
2585 len -= 3;
2586 }
2587 base64[i] = 0;
2588 return i;
2589}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
static struct _PeImage bin
unsigned int UINT
Definition: ndis.h:50

Referenced by insert_authorization_header().

◆ get_authvalue()

static BOOL get_authvalue ( HINTERNET  request,
DWORD  scheme,
WCHAR buffer,
DWORD  buflen 
)
static

Definition at line 2720 of file rpc_transport.c.

2721{
2722 DWORD len, index = 0;
2723 for (;;)
2724 {
2725 len = buflen;
2727 if (auth_scheme_from_header(buffer) == scheme) break;
2728 }
2729 return TRUE;
2730}
GLuint buffer
Definition: glext.h:5915
GLuint index
Definition: glext.h:6031
#define HTTP_QUERY_WWW_AUTHENTICATE
Definition: wininet.h:1563

Referenced by do_authorization().

◆ get_np_event()

static HANDLE get_np_event ( RpcConnection_np connection)
static

Definition at line 95 of file rpc_transport.c.

96{
98 return event ? event : CreateEventW(NULL, TRUE, FALSE, NULL);
99}
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
struct _cl_event * event
Definition: glext.h:7739
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651

Referenced by rpcrt4_conn_np_read(), rpcrt4_conn_np_write(), and rpcrt4_protseq_np_get_wait_array().

◆ has_credentials()

static BOOL has_credentials ( RpcConnection_http httpc)
static

Definition at line 2972 of file rpc_transport.c.

2973{
2976
2978 return FALSE;
2979
2980 creds = httpc->common.QOS->qos->u.HttpCredentials;
2982 return FALSE;
2983
2984 id = creds->TransportCredentials;
2985 if (!id || !id->User || !id->Password) return FALSE;
2986
2987 return TRUE;
2988}
#define RPC_C_HTTP_AUTHN_TARGET_SERVER
Definition: rpcdce.h:202
#define RPC_C_AUTHN_INFO_TYPE_HTTP
Definition: rpcdce.h:195
ULONG AdditionalSecurityInfoType
Definition: rpcdce.h:276

Referenced by rpcrt4_ncacn_http_open().

◆ insert_authorization_header()

static RPC_STATUS insert_authorization_header ( HINTERNET  request,
ULONG  scheme,
char data,
int  data_len 
)
static

Definition at line 2880 of file rpc_transport.c.

2881{
2882 static const WCHAR authW[] = {'A','u','t','h','o','r','i','z','a','t','i','o','n',':',' '};
2883 static const WCHAR basicW[] = {'B','a','s','i','c',' '};
2884 static const WCHAR negotiateW[] = {'N','e','g','o','t','i','a','t','e',' '};
2885 static const WCHAR ntlmW[] = {'N','T','L','M',' '};
2886 int scheme_len, auth_len = ARRAY_SIZE(authW), len = ((data_len + 2) * 4) / 3;
2887 const WCHAR *scheme_str;
2888 WCHAR *header, *ptr;
2890
2891 switch (scheme)
2892 {
2894 scheme_str = basicW;
2895 scheme_len = ARRAY_SIZE(basicW);
2896 break;
2898 scheme_str = negotiateW;
2899 scheme_len = ARRAY_SIZE(negotiateW);
2900 break;
2902 scheme_str = ntlmW;
2903 scheme_len = ARRAY_SIZE(ntlmW);
2904 break;
2905 default:
2906 ERR("unknown scheme %lu\n", scheme);
2908 }
2909 if ((header = malloc((auth_len + scheme_len + len + 2) * sizeof(WCHAR))))
2910 {
2911 memcpy(header, authW, auth_len * sizeof(WCHAR));
2912 ptr = header + auth_len;
2913 memcpy(ptr, scheme_str, scheme_len * sizeof(WCHAR));
2914 ptr += scheme_len;
2915 len = encode_base64(data, data_len, ptr);
2916 ptr[len++] = '\r';
2917 ptr[len++] = '\n';
2918 ptr[len] = 0;
2920 status = RPC_S_OK;
2921 free(header);
2922 }
2923 return status;
2924}
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
static const WCHAR basicW[]
Definition: request.c:882
static UINT encode_base64(const char *bin, unsigned int len, WCHAR *base64)

Referenced by authorize_request().

◆ insert_content_length_header()

static RPC_STATUS insert_content_length_header ( HINTERNET  request,
DWORD  len 
)
static

Definition at line 2377 of file rpc_transport.c.

2378{
2379 WCHAR header[ARRAY_SIZE(L"Content-Length: %u\r\n") + 10];
2380
2381 swprintf(header, L"Content-Length: %u\r\n", len);
2384}
#define swprintf
Definition: precomp.h:40

Referenced by rpcrt4_http_prepare_in_pipe(), and rpcrt4_http_prepare_out_pipe().

◆ is_pipe_listening()

static RPC_STATUS is_pipe_listening ( const char pipe_name)
static

Definition at line 619 of file rpc_transport.c.

620{
621 return WaitNamedPipeA(pipe_name, 1) ? RPC_S_OK : RPC_S_NOT_LISTENING;
622}
BOOL WINAPI WaitNamedPipeA(LPCSTR lpNamedPipeName, DWORD nTimeOut)
Definition: npipe.c:433
#define RPC_S_NOT_LISTENING
Definition: winerror.h:1382

Referenced by rpcrt4_ncacn_np_is_server_listening(), and rpcrt4_ncalrpc_np_is_server_listening().

◆ is_secure()

static BOOL is_secure ( RpcConnection_http httpc)
static

Definition at line 2990 of file rpc_transport.c.

2991{
2992 return httpc->common.QOS &&
2995}
#define RPC_C_HTTP_FLAG_USE_SSL
Definition: rpcdce.h:198

Referenced by open_connection(), rpcrt4_ncacn_http_open(), and set_auth_cookie().

◆ ncacn_pipe_name()

static char * ncacn_pipe_name ( const char endpoint)
static

Definition at line 485 of file rpc_transport.c.

487{
488#ifdef __REACTOS__
489 static const char prefix[] = "\\\\";
490 static const char local[] = ".";
491 char ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
492 DWORD bufLen = ARRAY_SIZE(ComputerName);
493#else
494 static const char prefix[] = "\\\\.";
495#endif
496 char *pipe_name;
497
498#ifdef __REACTOS__
499 if (server != NULL && *server != 0)
500 {
501 /* Trim any leading UNC server prefix. */
502 if (server[0] == '\\' && server[1] == '\\')
503 server += 2;
504
505 /* If the server represents the local computer, use instead
506 * the local prefix to avoid a round in UNC name resolution. */
507 if (GetComputerNameA(ComputerName, &bufLen) &&
508 (stricmp(ComputerName, server) == 0))
509 {
510 server = local;
511 }
512 }
513 else
514 {
515 server = local;
516 }
517#endif
518
519 /* protseq=ncacn_np: named pipes */
520#ifdef __REACTOS__
521 pipe_name = I_RpcAllocate(sizeof(prefix) + strlen(server) + strlen(endpoint));
522 strcpy(pipe_name, prefix);
523 strcat(pipe_name, server);
524 strcat(pipe_name, endpoint);
525#else
526 pipe_name = I_RpcAllocate(sizeof(prefix) + strlen(endpoint));
527 strcat(strcpy(pipe_name, prefix), endpoint);
528#endif
529 return pipe_name;
530}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define stricmp(_String1, _String2)
Definition: compat.h:24
#define local
Definition: zutil.h:30
void *WINAPI I_RpcAllocate(unsigned int Size)
Definition: rpcrt4_main.c:747
strcat
Definition: string.h:92
strcpy
Definition: string.h:131
BOOL WINAPI SHIM_OBJ_NAME() GetComputerNameA(LPSTR lpBuffer, LPDWORD lpnSize)
Definition: shimtest.c:21
Definition: nis.h:10
Character const *const prefix
Definition: tempnam.cpp:195
static rfbScreenInfoPtr server
Definition: vnc.c:74
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:267

Referenced by rpcrt4_ncacn_np_is_server_listening(), rpcrt4_ncacn_np_open(), and rpcrt4_protseq_ncacn_np_open_endpoint().

◆ ncalrpc_pipe_name()

static char * ncalrpc_pipe_name ( const char endpoint)
static

Definition at line 421 of file rpc_transport.c.

422{
423 static const char prefix[] = "\\\\.\\pipe\\lrpc\\";
424 char *pipe_name;
425
426 /* protseq=ncalrpc: supposed to use NT LPC ports,
427 * but we'll implement it with named pipes for now */
428 pipe_name = I_RpcAllocate(sizeof(prefix) + strlen(endpoint));
429 strcat(strcpy(pipe_name, prefix), endpoint);
430 return pipe_name;
431}

Referenced by rpcrt4_ncalrpc_np_is_server_listening(), rpcrt4_ncalrpc_open(), and rpcrt4_protseq_ncalrpc_open_endpoint().

◆ prepare_async_request()

static void prepare_async_request ( RpcHttpAsyncData async_data)
static

Definition at line 1991 of file rpc_transport.c.

1992{
1993 ResetEvent(async_data->completion_event);
1994 RpcHttpAsyncData_AddRef(async_data);
1995}
static ULONG RpcHttpAsyncData_AddRef(RpcHttpAsyncData *data)
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
Definition: synch.c:714

Referenced by authorize_request(), rpcrt4_http_async_read(), rpcrt4_http_prepare_in_pipe(), rpcrt4_http_prepare_out_pipe(), rpcrt4_ncacn_http_wait_for_incoming_data(), and send_echo_request().

◆ release_np_event()

static void release_np_event ( RpcConnection_np connection,
HANDLE  event 
)
static

Definition at line 101 of file rpc_transport.c.

102{
103 event = InterlockedExchangePointer(&connection->event_cache, event);
104 if (event)
106}
#define CloseHandle
Definition: compat.h:739

Referenced by rpcrt4_conn_np_read(), rpcrt4_conn_np_write(), and rpcrt4_protseq_np_wait_for_new_connection().

◆ RpcHttpAsyncData_AddRef()

static ULONG RpcHttpAsyncData_AddRef ( RpcHttpAsyncData data)
static

Definition at line 1971 of file rpc_transport.c.

1972{
1973 return InterlockedIncrement(&data->refs);
1974}
#define InterlockedIncrement
Definition: armddk.h:53

Referenced by prepare_async_request().

◆ RpcHttpAsyncData_Release()

static ULONG RpcHttpAsyncData_Release ( RpcHttpAsyncData data)
static

Definition at line 1976 of file rpc_transport.c.

1977{
1978 ULONG refs = InterlockedDecrement(&data->refs);
1979 if (!refs)
1980 {
1981 TRACE("destroying async data %p\n", data);
1982 CloseHandle(data->completion_event);
1983 free(data->inet_buffers.lpvBuffer);
1984 data->cs.DebugInfo->Spare[0] = 0;
1986 free(data);
1987 }
1988 return refs;
1989}
#define InterlockedDecrement
Definition: armddk.h:52
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)

Referenced by rpcrt4_http_internet_callback(), rpcrt4_ncacn_http_close(), and wait_async_request().

◆ RpcNetworkInqProtseqsA()

RPC_STATUS WINAPI RpcNetworkInqProtseqsA ( RPC_PROTSEQ_VECTORA **  protseqs)

Definition at line 3943 of file rpc_transport.c.

3944{
3945 RPC_PROTSEQ_VECTORA *pvector;
3946 unsigned int i;
3948
3949 TRACE("(%p)\n", protseqs);
3950
3951 *protseqs = malloc(sizeof(RPC_PROTSEQ_VECTORW) + sizeof(unsigned char*) * ARRAY_SIZE(protseq_list));
3952 if (!*protseqs)
3953 goto end;
3954 pvector = *protseqs;
3955 pvector->Count = 0;
3956 for (i = 0; i < ARRAY_SIZE(protseq_list); i++)
3957 {
3958 pvector->Protseq[i] = malloc(strlen(protseq_list[i].name) + 1);
3959 if (pvector->Protseq[i] == NULL)
3960 goto end;
3961 strcpy((char*)pvector->Protseq[i], protseq_list[i].name);
3962 pvector->Count++;
3963 }
3964 status = RPC_S_OK;
3965
3966end:
3967 if (status != RPC_S_OK)
3969 return status;
3970}
GLuint GLuint end
Definition: gl.h:1545
static struct list protseqs
Definition: rpc_server.c:69
RPC_STATUS WINAPI RpcProtseqVectorFreeA(RPC_PROTSEQ_VECTORA **protseqs)
static const struct protseq_ops protseq_list[]
unsigned char * Protseq[1]
Definition: rpcdce.h:91
unsigned int Count
Definition: rpcdce.h:90
Definition: name.c:39

◆ RpcNetworkInqProtseqsW()

RPC_STATUS WINAPI RpcNetworkInqProtseqsW ( RPC_PROTSEQ_VECTORW **  protseqs)

Definition at line 3910 of file rpc_transport.c.

3911{
3912 RPC_PROTSEQ_VECTORW *pvector;
3913 unsigned int i;
3915
3916 TRACE("(%p)\n", protseqs);
3917
3918 *protseqs = malloc(sizeof(RPC_PROTSEQ_VECTORW) + sizeof(unsigned short*) * ARRAY_SIZE(protseq_list));
3919 if (!*protseqs)
3920 goto end;
3921 pvector = *protseqs;
3922 pvector->Count = 0;
3923 for (i = 0; i < ARRAY_SIZE(protseq_list); i++)
3924 {
3925 pvector->Protseq[i] = malloc((strlen(protseq_list[i].name) + 1) * sizeof(unsigned short));
3926 if (pvector->Protseq[i] == NULL)
3927 goto end;
3929 (WCHAR*)pvector->Protseq[i], strlen(protseq_list[i].name) + 1);
3930 pvector->Count++;
3931 }
3932 status = RPC_S_OK;
3933
3934end:
3935 if (status != RPC_S_OK)
3937 return status;
3938}
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
RPC_STATUS WINAPI RpcProtseqVectorFreeW(RPC_PROTSEQ_VECTORW **protseqs)
unsigned int Count
Definition: rpcdce.h:96
unsigned short * Protseq[1]
Definition: rpcdce.h:97
char CHAR
Definition: xmlstorage.h:175

◆ RpcNetworkIsProtseqValidA()

RPC_STATUS WINAPI RpcNetworkIsProtseqValidA ( RPC_CSTR  protseq)

Definition at line 3858 of file rpc_transport.c.

3859{
3860 UNICODE_STRING protseqW;
3861
3862 if (RtlCreateUnicodeStringFromAsciiz(&protseqW, (char*)protseq))
3863 {
3865 RtlFreeUnicodeString(&protseqW);
3866 return ret;
3867 }
3868 return RPC_S_OUT_OF_MEMORY;
3869}
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
RPC_STATUS WINAPI RpcNetworkIsProtseqValidW(RPC_WSTR protseq)

Referenced by test_rpc_ncacn_ip_tcp().

◆ RpcNetworkIsProtseqValidW()

RPC_STATUS WINAPI RpcNetworkIsProtseqValidW ( RPC_WSTR  protseq)

Definition at line 3841 of file rpc_transport.c.

3842{
3843 char ps[0x10];
3844
3845 WideCharToMultiByte(CP_ACP, 0, protseq, -1,
3846 ps, sizeof ps, NULL, NULL);
3848 return RPC_S_OK;
3849
3850 FIXME("Unknown protseq %s\n", debugstr_w(protseq));
3851
3853}
#define debugstr_w
Definition: kernel32.h:32
static const struct connection_ops * rpcrt4_get_conn_protseq_ops(const char *protseq)
#define RPC_S_INVALID_RPC_PROTSEQ
Definition: winerror.h:1371

Referenced by RpcNetworkIsProtseqValidA().

◆ RpcProtseqVectorFreeA()

RPC_STATUS WINAPI RpcProtseqVectorFreeA ( RPC_PROTSEQ_VECTORA **  protseqs)

Definition at line 3874 of file rpc_transport.c.

3875{
3876 TRACE("(%p)\n", protseqs);
3877
3878 if (*protseqs)
3879 {
3880 unsigned int i;
3881 for (i = 0; i < (*protseqs)->Count; i++)
3882 free((*protseqs)->Protseq[i]);
3883 free(*protseqs);
3884 *protseqs = NULL;
3885 }
3886 return RPC_S_OK;
3887}

Referenced by RpcNetworkInqProtseqsA().

◆ RpcProtseqVectorFreeW()

RPC_STATUS WINAPI RpcProtseqVectorFreeW ( RPC_PROTSEQ_VECTORW **  protseqs)

Definition at line 3892 of file rpc_transport.c.

3893{
3894 TRACE("(%p)\n", protseqs);
3895
3896 if (*protseqs)
3897 {
3898 unsigned int i;
3899 for (i = 0; i < (*protseqs)->Count; i++)
3900 free((*protseqs)->Protseq[i]);
3901 free(*protseqs);
3902 *protseqs = NULL;
3903 }
3904 return RPC_S_OK;
3905}

Referenced by RpcNetworkInqProtseqsW().

◆ RPCRT4_CloseConnection()

RPC_STATUS RPCRT4_CloseConnection ( RpcConnection Connection)

Definition at line 3590 of file rpc_transport.c.

3591{
3592 TRACE("(Connection == ^%p)\n", Connection);
3593 if (SecIsValidHandle(&Connection->ctx))
3594 {
3595 DeleteSecurityContext(&Connection->ctx);
3596 SecInvalidateHandle(&Connection->ctx);
3597 }
3598 rpcrt4_conn_close(Connection);
3599 return RPC_S_OK;
3600}
static int rpcrt4_conn_close(RpcConnection *Connection)
Definition: rpc_binding.h:196
CtxtHandle ctx
Definition: rpc_binding.h:74

Referenced by RPCRT4_ReleaseConnection(), and RPCRT4_server_thread().

◆ rpcrt4_conn_create_pipe()

static RPC_STATUS rpcrt4_conn_create_pipe ( RpcConnection conn)
static

Definition at line 304 of file rpc_transport.c.

305{
306 RpcConnection_np *connection = (RpcConnection_np *) conn;
307#ifdef __REACTOS__
308 DWORD ErrCode;
309 SECURITY_ATTRIBUTES SecurityAttributes;
310 PSECURITY_DESCRIPTOR PipeSecDesc;
311#endif
312
313 TRACE("listening on %s\n", connection->listen_pipe);
314
315#ifdef __REACTOS__
316 ErrCode = rpcrt4_create_pipe_security(&PipeSecDesc);
317 if (ErrCode != ERROR_SUCCESS)
318 {
319 ERR("rpcrt4_conn_create_pipe(): Pipe security descriptor creation failed\n");
321 }
322
323 SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
324 SecurityAttributes.lpSecurityDescriptor = PipeSecDesc;
325 SecurityAttributes.bInheritHandle = FALSE;
326
330 RPC_MAX_PACKET_SIZE, RPC_MAX_PACKET_SIZE, 5000, &SecurityAttributes);
331 HeapFree(GetProcessHeap(), 0, PipeSecDesc);
332#else
337#endif
338 if (connection->pipe == INVALID_HANDLE_VALUE)
339 {
340 WARN("CreateNamedPipe failed with error %ld\n", GetLastError());
342 {
344 }
345 else
346 {
348 }
349 }
350
351 return RPC_S_OK;
352}
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERROR_SUCCESS
Definition: deptool.c:10
#define GetProcessHeap()
Definition: compat.h:736
struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapFree(x, y, z)
Definition: compat.h:735
#define FILE_FLAG_OVERLAPPED
Definition: disk.h:46
HANDLE WINAPI CreateNamedPipeA(LPCSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: npipe.c:220
#define RPC_MAX_PACKET_SIZE
Definition: rpc_defs.h:184
LPVOID lpSecurityDescriptor
Definition: compat.h:193
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define PIPE_ACCESS_DUPLEX
Definition: winbase.h:166
#define PIPE_READMODE_MESSAGE
Definition: winbase.h:172
#define PIPE_TYPE_MESSAGE
Definition: winbase.h:170
#define PIPE_UNLIMITED_INSTANCES
Definition: winbase.h:177
#define RPC_S_CANT_CREATE_ENDPOINT
Definition: winerror.h:1387
#define ERROR_FILE_EXISTS
Definition: winerror.h:287
#define RPC_S_DUPLICATE_ENDPOINT
Definition: winerror.h:1405

Referenced by rpcrt4_ncacn_np_handoff(), rpcrt4_ncalrpc_handoff(), rpcrt4_protseq_ncacn_np_open_endpoint(), rpcrt4_protseq_ncalrpc_open_endpoint(), and rpcrt4_protseq_np_get_wait_array().

◆ rpcrt4_conn_np_alloc()

static RpcConnection * rpcrt4_conn_np_alloc ( void  )
static

Definition at line 89 of file rpc_transport.c.

90{
91 RpcConnection_np *npc = calloc(1, sizeof(RpcConnection_np));
92 return &npc->common;
93}
#define calloc
Definition: rosglue.h:14
RpcConnection common
Definition: rpc_transport.c:80

◆ rpcrt4_conn_np_cancel_call()

static void rpcrt4_conn_np_cancel_call ( RpcConnection conn)
static

Definition at line 764 of file rpc_transport.c.

765{
766 RpcConnection_np *connection = (RpcConnection_np *)conn;
767 CancelIoEx(connection->pipe, NULL);
768}
BOOL WINAPI DECLSPEC_HOTPATCH CancelIoEx(HANDLE handle, LPOVERLAPPED overlapped)
Definition: file.c:3005

◆ rpcrt4_conn_np_close()

static int rpcrt4_conn_np_close ( RpcConnection conn)
static

Definition at line 729 of file rpc_transport.c.

730{
731 RpcConnection_np *connection = (RpcConnection_np *) conn;
732 if (connection->pipe)
733 {
734 FlushFileBuffers(connection->pipe);
735 CloseHandle(connection->pipe);
736 connection->pipe = 0;
737 }
738 if (connection->listen_event)
739 {
740 CloseHandle(connection->listen_event);
741 connection->listen_event = 0;
742 }
743 if (connection->event_cache)
744 {
745 CloseHandle(connection->event_cache);
746 connection->event_cache = 0;
747 }
748 return 0;
749}
BOOL WINAPI FlushFileBuffers(IN HANDLE hFile)
Definition: fileinfo.c:25

◆ rpcrt4_conn_np_close_read()

static void rpcrt4_conn_np_close_read ( RpcConnection conn)
static

Definition at line 751 of file rpc_transport.c.

752{
753 RpcConnection_np *connection = (RpcConnection_np*)conn;
755
756 connection->read_closed = TRUE;
757#ifdef __REACTOS__ /* FIXME: We should also cancel I/O for other threads */
758 NtCancelIoFile(connection->pipe, &io_status);
759#else
760 NtCancelIoFileEx(connection->pipe, &connection->io_status, &io_status);
761#endif
762}
NTSYSAPI NTSTATUS WINAPI NtCancelIoFileEx(HANDLE, PIO_STATUS_BLOCK, PIO_STATUS_BLOCK)
static HANDLE PIO_APC_ROUTINE void PIO_STATUS_BLOCK io_status
Definition: comm.c:56
NTSTATUS NTAPI NtCancelIoFile(IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock)
Definition: file.c:4020
IO_STATUS_BLOCK io_status
Definition: rpc_transport.c:84

◆ rpcrt4_conn_np_handoff()

static void rpcrt4_conn_np_handoff ( RpcConnection_np old_npc,
RpcConnection_np new_npc 
)
static

Definition at line 589 of file rpc_transport.c.

590{
591 /* because of the way named pipes work, we'll transfer the connected pipe
592 * to the child, then reopen the server binding to continue listening */
593
594 new_npc->pipe = old_npc->pipe;
595 old_npc->pipe = 0;
596 assert(!old_npc->listen_event);
597}
#define assert(x)
Definition: debug.h:53

Referenced by rpcrt4_ncacn_np_handoff(), and rpcrt4_ncalrpc_handoff().

◆ rpcrt4_conn_np_impersonate_client()

static RPC_STATUS rpcrt4_conn_np_impersonate_client ( RpcConnection conn)
static

Definition at line 888 of file rpc_transport.c.

889{
890 RpcConnection_np *npc = (RpcConnection_np *)conn;
891 BOOL ret;
892
893 TRACE("(%p)\n", conn);
894
895 if (conn->AuthInfo && SecIsValidHandle(&conn->ctx))
897
899 if (!ret)
900 {
902 WARN("ImpersonateNamedPipeClient failed with error %lu\n", error);
903 switch (error)
904 {
907 }
908 }
909 return RPC_S_OK;
910}
BOOL WINAPI ImpersonateNamedPipeClient(HANDLE hNamedPipe)
Definition: security.c:1024
#define error(str)
Definition: mkdosfs.c:1605
RPC_STATUS RPCRT4_default_impersonate_client(RpcConnection *conn)
Definition: rpc_message.c:1127
RpcAuthInfo * AuthInfo
Definition: rpc_binding.h:77
#define ERROR_CANNOT_IMPERSONATE
Definition: winerror.h:1194
#define RPC_S_NO_CONTEXT_AVAILABLE
Definition: winerror.h:1430

◆ rpcrt4_conn_np_read()

static int rpcrt4_conn_np_read ( RpcConnection conn,
void buffer,
unsigned int  count 
)
static

Definition at line 671 of file rpc_transport.c.

672{
673 RpcConnection_np *connection = (RpcConnection_np *) conn;
676
677 event = get_np_event(connection);
678 if (!event)
679 return -1;
680
681 if (connection->read_closed)
683 else
684 status = NtReadFile(connection->pipe, event, NULL, NULL, &connection->io_status, buffer, count, NULL, NULL);
685 if (status == STATUS_PENDING)
686 {
687 /* check read_closed again before waiting to avoid a race */
688 if (connection->read_closed)
689 {
691#ifdef __REACTOS__ /* FIXME: We should also cancel I/O for other threads */
692 NtCancelIoFile(connection->pipe, &io_status);
693#else
694 NtCancelIoFileEx(connection->pipe, &connection->io_status, &io_status);
695#endif
696 }
698 status = connection->io_status.Status;
699 }
700 release_np_event(connection, event);
701 return status && status != STATUS_BUFFER_OVERFLOW ? -1 : connection->io_status.Information;
702}
LONG NTSTATUS
Definition: precomp.h:26
#define INFINITE
Definition: serial.h:102
static HANDLE get_np_event(RpcConnection_np *connection)
Definition: rpc_transport.c:95
static void release_np_event(RpcConnection_np *connection, HANDLE event)
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define STATUS_PENDING
Definition: telnetd.h:14
#define STATUS_CANCELLED
Definition: udferr_usr.h:170

Referenced by rpcrt4_conn_np_wait_for_incoming_data().

◆ rpcrt4_conn_np_revert_to_self()

static RPC_STATUS rpcrt4_conn_np_revert_to_self ( RpcConnection conn)
static

Definition at line 912 of file rpc_transport.c.

913{
914 BOOL ret;
915
916 TRACE("(%p)\n", conn);
917
918 if (conn->AuthInfo && SecIsValidHandle(&conn->ctx))
920
921 ret = RevertToSelf();
922 if (!ret)
923 {
924 WARN("RevertToSelf failed with error %lu\n", GetLastError());
926 }
927 return RPC_S_OK;
928}
BOOL WINAPI RevertToSelf(void)
Definition: security.c:855
RPC_STATUS RPCRT4_default_revert_to_self(RpcConnection *conn)
Definition: rpc_message.c:1155

◆ rpcrt4_conn_np_wait_for_incoming_data()

static int rpcrt4_conn_np_wait_for_incoming_data ( RpcConnection conn)
static

Definition at line 770 of file rpc_transport.c.

771{
772 return rpcrt4_conn_np_read(conn, NULL, 0);
773}
static int rpcrt4_conn_np_read(RpcConnection *conn, void *buffer, unsigned int count)

◆ rpcrt4_conn_np_write()

static int rpcrt4_conn_np_write ( RpcConnection conn,
const void buffer,
unsigned int  count 
)
static

Definition at line 704 of file rpc_transport.c.

705{
706 RpcConnection_np *connection = (RpcConnection_np *) conn;
710
711 event = get_np_event(connection);
712 if (!event)
713 return -1;
714
716 if (status == STATUS_PENDING)
717 {
719 status = io_status.Status;
720 }
721 release_np_event(connection, event);
722 if (status)
723 return -1;
724
725 assert(io_status.Information == count);
726 return count;
727}
NTSYSAPI NTSTATUS NTAPI NtWriteFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID WriteBuffer, IN ULONG WriteBufferLength, IN PLARGE_INTEGER FileOffset OPTIONAL, IN PULONG LockOperationKey OPTIONAL)

◆ rpcrt4_conn_open_pipe()

static RPC_STATUS rpcrt4_conn_open_pipe ( RpcConnection Connection,
LPCSTR  pname,
BOOL  wait 
)
static

Definition at line 354 of file rpc_transport.c.

355{
356 RpcConnection_np *npc = (RpcConnection_np *) Connection;
357 HANDLE pipe;
358 DWORD err, dwMode;
359
360 TRACE("connecting to %s\n", pname);
361
362 while (TRUE) {
363 DWORD dwFlags = 0;
364 if (Connection->QOS)
365 {
367 switch (Connection->QOS->qos->ImpersonationType)
368 {
370 /* FIXME: what to do here? */
371 break;
374 break;
377 break;
380 break;
383 break;
384 }
387 }
390 if (pipe != INVALID_HANDLE_VALUE) break;
391 err = GetLastError();
392 if (err == ERROR_PIPE_BUSY) {
394 TRACE("retrying busy server\n");
395 continue;
396 }
397 TRACE("connection failed, error=%lx\n", err);
399#ifdef __REACTOS__
400 } else if (err == ERROR_BAD_NETPATH) {
401 TRACE("connection failed, error=%x\n", err);
403#endif
404 }
405 if (!wait || !WaitNamedPipeA(pname, NMPWAIT_WAIT_FOREVER)) {
406 err = GetLastError();
407 WARN("connection failed, error=%lx\n", err);
409 }
410 }
411
412 /* success */
413 /* pipe is connected; change to message-read mode. */
414 dwMode = PIPE_READMODE_MESSAGE;
415 SetNamedPipeHandleState(pipe, &dwMode, NULL, NULL);
416 npc->pipe = pipe;
417
418 return RPC_S_OK;
419}
#define OPEN_EXISTING
Definition: compat.h:775
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define GENERIC_READ
Definition: compat.h:135
GLenum pname
Definition: glext.h:5645
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
BOOL WINAPI SetNamedPipeHandleState(HANDLE hNamedPipe, LPDWORD lpMode, LPDWORD lpMaxCollectionCount, LPDWORD lpCollectDataTimeout)
Definition: npipe.c:774
#define GENERIC_WRITE
Definition: nt_native.h:90
#define err(...)
#define RPC_C_IMP_LEVEL_IDENTIFY
Definition: rpcdce.h:175
#define RPC_C_QOS_IDENTITY_DYNAMIC
Definition: rpcdce.h:181
#define RPC_C_IMP_LEVEL_DELEGATE
Definition: rpcdce.h:177
#define RPC_C_IMP_LEVEL_IMPERSONATE
Definition: rpcdce.h:176
#define RPC_C_IMP_LEVEL_ANONYMOUS
Definition: rpcdce.h:174
#define RPC_C_IMP_LEVEL_DEFAULT
Definition: rpcdce.h:173
#define NMPWAIT_WAIT_FOREVER
Definition: winbase.h:135
#define SECURITY_DELEGATION
Definition: winbase.h:523
#define NMPWAIT_USE_DEFAULT_WAIT
Definition: winbase.h:136
#define SECURITY_IMPERSONATION
Definition: winbase.h:522
#define SECURITY_ANONYMOUS
Definition: winbase.h:520
#define SECURITY_SQOS_PRESENT
Definition: winbase.h:526
#define SECURITY_IDENTIFICATION
Definition: winbase.h:521
#define SECURITY_CONTEXT_TRACKING
Definition: winbase.h:524
#define RPC_S_SERVER_TOO_BUSY
Definition: winerror.h:1390
#define ERROR_BAD_NETPATH
Definition: winerror.h:267
#define ERROR_PIPE_BUSY
Definition: winerror.h:405

Referenced by rpcrt4_ncacn_np_open(), and rpcrt4_ncalrpc_open().

◆ rpcrt4_conn_release_and_wait()

void rpcrt4_conn_release_and_wait ( RpcConnection connection)

Definition at line 3666 of file rpc_transport.c.

3667{
3668 HANDLE event = NULL;
3669
3670 if (connection->ref > 1)
3671 event = connection->wait_release = CreateEventW(NULL, TRUE, FALSE, NULL);
3672
3673 RPCRT4_ReleaseConnection(connection);
3674
3675 if(event)
3676 {
3679 }
3680}
void RPCRT4_ReleaseConnection(RpcConnection *connection)
HANDLE wait_release
Definition: rpc_binding.h:66

Referenced by RPCRT4_server_thread().

◆ rpcrt4_conn_tcp_alloc()

static RpcConnection * rpcrt4_conn_tcp_alloc ( void  )
static

Definition at line 1429 of file rpc_transport.c.

1430{
1431 RpcConnection_tcp *tcpc;
1432 tcpc = calloc(1, sizeof(RpcConnection_tcp));
1433 if (tcpc == NULL)
1434 return NULL;
1435 tcpc->sock = -1;
1436 if (!rpcrt4_sock_wait_init(tcpc))
1437 {
1438 free(tcpc);
1439 return NULL;
1440 }
1441 return &tcpc->common;
1442}
static BOOL rpcrt4_sock_wait_init(RpcConnection_tcp *tcpc)
RpcConnection common

◆ rpcrt4_conn_tcp_cancel_call()

static void rpcrt4_conn_tcp_cancel_call ( RpcConnection conn)
static

Definition at line 1778 of file rpc_transport.c.

1779{
1780 RpcConnection_tcp *connection = (RpcConnection_tcp *) conn;
1781
1782 TRACE("%p\n", connection);
1783
1784 SetEvent(connection->cancel_event);
1785}
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733

◆ rpcrt4_conn_tcp_close()

static int rpcrt4_conn_tcp_close ( RpcConnection conn)
static

Definition at line 1758 of file rpc_transport.c.

1759{
1760 RpcConnection_tcp *connection = (RpcConnection_tcp *) conn;
1761
1762 TRACE("%d\n", connection->sock);
1763
1764 if (connection->sock != -1)
1765 closesocket(connection->sock);
1766 connection->sock = -1;
1767 CloseHandle(connection->sock_event);
1768 CloseHandle(connection->cancel_event);
1769 return 0;
1770}
#define closesocket
Definition: ncftp.h:477

◆ rpcrt4_conn_tcp_close_read()

static void rpcrt4_conn_tcp_close_read ( RpcConnection conn)
static

Definition at line 1772 of file rpc_transport.c.

1773{
1774 RpcConnection_tcp *connection = (RpcConnection_tcp *) conn;
1775 shutdown(connection->sock, SD_RECEIVE);
1776}
INT WSAAPI shutdown(IN SOCKET s, IN INT how)
Definition: sockctrl.c:506
#define SD_RECEIVE
Definition: winsock.h:48

◆ rpcrt4_conn_tcp_handoff()

static RPC_STATUS rpcrt4_conn_tcp_handoff ( RpcConnection old_conn,
RpcConnection new_conn 
)
static

Definition at line 1672 of file rpc_transport.c.

1673{
1674 int ret;
1675 struct sockaddr_in address;
1676 socklen_t addrsize;
1679 u_long nonblocking;
1680
1681 addrsize = sizeof(address);
1682 ret = accept(server->sock, (struct sockaddr*) &address, &addrsize);
1683 if (ret < 0)
1684 {
1685 ERR("Failed to accept a TCP connection: error %d\n", ret);
1687 }
1688
1689 nonblocking = 1;
1690 ioctlsocket(ret, FIONBIO, &nonblocking);
1691 client->sock = ret;
1692
1693 client->common.NetworkAddr = malloc(INET6_ADDRSTRLEN);
1694 ret = getnameinfo((struct sockaddr*)&address, addrsize, client->common.NetworkAddr, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
1695 if (ret != 0)
1696 {
1697 ERR("Failed to retrieve the IP address, error %d\n", ret);
1699 }
1700
1701 TRACE("Accepted a new TCP connection from %s\n", client->common.NetworkAddr);
1702 return RPC_S_OK;
1703}
unsigned long u_long
Definition: linux.h:269
GLuint address
Definition: glext.h:9393
int socklen_t
Definition: tcp.c:35
#define ioctlsocket
Definition: ncftp.h:481
static FILE * client
Definition: client.c:37
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23
#define RPC_S_OUT_OF_RESOURCES
Definition: winerror.h:1388
#define FIONBIO
Definition: winsock.h:143
#define NI_NUMERICHOST
Definition: ws2def.h:354
#define INET6_ADDRSTRLEN
Definition: ws2ipdef.h:132
#define getnameinfo
Definition: wspiapi.h:45

◆ rpcrt4_conn_tcp_is_server_listening()

static RPC_STATUS rpcrt4_conn_tcp_is_server_listening ( const char endpoint)
static

Definition at line 1787 of file rpc_transport.c.

1788{
1789 FIXME("\n");
1790 return RPC_S_ACCESS_DENIED;
1791}
#define RPC_S_ACCESS_DENIED
Definition: rpcnterr.h:29

◆ rpcrt4_conn_tcp_read()

static int rpcrt4_conn_tcp_read ( RpcConnection Connection,
void buffer,
unsigned int  count 
)
static

Definition at line 1705 of file rpc_transport.c.

1707{
1708 RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
1709 int bytes_read = 0;
1710 while (bytes_read != count)
1711 {
1712 int r = recv(tcpc->sock, (char *)buffer + bytes_read, count - bytes_read, 0);
1713 if (!r)
1714 return -1;
1715 else if (r > 0)
1716 bytes_read += r;
1717 else if (WSAGetLastError() == WSAEINTR)
1718 continue;
1719 else if (WSAGetLastError() != WSAEWOULDBLOCK)
1720 {
1721 WARN("recv() failed: %u\n", WSAGetLastError());
1722 return -1;
1723 }
1724 else
1725 {
1726 if (!rpcrt4_sock_wait_for_recv(tcpc))
1727 return -1;
1728 }
1729 }
1730 TRACE("%d %p %u -> %d\n", tcpc->sock, buffer, count, bytes_read);
1731 return bytes_read;
1732}
INT WSAAPI recv(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags)
Definition: recv.c:23
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
static BOOL rpcrt4_sock_wait_for_recv(RpcConnection_tcp *tcpc)
#define WSAEWOULDBLOCK
Definition: winerror.h:2851
#define WSAEINTR
Definition: winerror.h:2841
int PASCAL FAR WSAGetLastError(void)
Definition: dllmain.c:131

◆ rpcrt4_conn_tcp_wait_for_incoming_data()

static int rpcrt4_conn_tcp_wait_for_incoming_data ( RpcConnection Connection)
static

Definition at line 1793 of file rpc_transport.c.

1794{
1795 RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
1796
1797 TRACE("%p\n", Connection);
1798
1799 if (!rpcrt4_sock_wait_for_recv(tcpc))
1800 return -1;
1801 return 0;
1802}

◆ rpcrt4_conn_tcp_write()

static int rpcrt4_conn_tcp_write ( RpcConnection Connection,
const void buffer,
unsigned int  count 
)
static

Definition at line 1734 of file rpc_transport.c.

1736{
1737 RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
1738 int bytes_written = 0;
1739 while (bytes_written != count)
1740 {
1741 int r = send(tcpc->sock, (const char *)buffer + bytes_written, count - bytes_written, 0);
1742 if (r >= 0)
1743 bytes_written += r;
1744 else if (WSAGetLastError() == WSAEINTR)
1745 continue;
1746 else if (WSAGetLastError() != WSAEWOULDBLOCK)
1747 return -1;
1748 else
1749 {
1750 if (!rpcrt4_sock_wait_for_send(tcpc))
1751 return -1;
1752 }
1753 }
1754 TRACE("%d %p %u -> %d\n", tcpc->sock, buffer, count, bytes_written);
1755 return bytes_written;
1756}
INT WSAAPI send(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags)
Definition: send.c:23
static BOOL rpcrt4_sock_wait_for_send(RpcConnection_tcp *tcpc)

◆ RPCRT4_CreateConnection()

RPC_STATUS RPCRT4_CreateConnection ( RpcConnection **  Connection,
BOOL  server,
LPCSTR  Protseq,
LPCSTR  NetworkAddr,
LPCSTR  Endpoint,
LPCWSTR  NetworkOptions,
RpcAuthInfo AuthInfo,
RpcQualityOfService QOS,
LPCWSTR  CookieAuth 
)

Definition at line 3602 of file rpc_transport.c.

3605{
3606 static LONG next_id;
3607 const struct connection_ops *ops;
3608 RpcConnection* NewConnection;
3609
3610 ops = rpcrt4_get_conn_protseq_ops(Protseq);
3611 if (!ops)
3612 {
3613 FIXME("not supported for protseq %s\n", Protseq);
3615 }
3616
3617 NewConnection = ops->alloc();
3618 NewConnection->ref = 1;
3619 NewConnection->server = server;
3620 NewConnection->ops = ops;
3621 NewConnection->NetworkAddr = strdup(NetworkAddr);
3622 NewConnection->Endpoint = strdup(Endpoint);
3623 NewConnection->NetworkOptions = wcsdup(NetworkOptions);
3624 NewConnection->CookieAuth = wcsdup(CookieAuth);
3626 NewConnection->NextCallId = 1;
3627
3628 SecInvalidateHandle(&NewConnection->ctx);
3629 if (AuthInfo) RpcAuthInfo_AddRef(AuthInfo);
3630 NewConnection->AuthInfo = AuthInfo;
3631 NewConnection->auth_context_id = InterlockedIncrement( &next_id );
3633 NewConnection->QOS = QOS;
3634
3635 list_init(&NewConnection->conn_pool_entry);
3636 list_init(&NewConnection->protseq_entry);
3637
3638 TRACE("connection: %p\n", NewConnection);
3639 *Connection = NewConnection;
3640
3641 return RPC_S_OK;
3642}
static void list_init(struct list_entry *head)
Definition: list.h:51
long LONG
Definition: pedump.c:60
ULONG RpcAuthInfo_AddRef(RpcAuthInfo *AuthInfo)
Definition: rpc_binding.c:1165
ULONG RpcQualityOfService_AddRef(RpcQualityOfService *qos)
Definition: rpc_binding.c:1342
_Check_return_ _CRTIMP char *__cdecl strdup(_In_opt_z_ const char *_Src)
_Check_return_ _CRTIMP wchar_t *__cdecl wcsdup(_In_z_ const wchar_t *_Str)
LPSTR NetworkAddr
Definition: rpc_binding.h:67
struct list conn_pool_entry
Definition: rpc_binding.h:85
USHORT NextCallId
Definition: rpc_binding.h:93
LPWSTR NetworkOptions
Definition: rpc_binding.h:69
USHORT MaxTransmissionSize
Definition: rpc_binding.h:71
const struct connection_ops * ops
Definition: rpc_binding.h:70
struct list protseq_entry
Definition: rpc_binding.h:94
LPWSTR CookieAuth
Definition: rpc_binding.h:82
ULONG auth_context_id
Definition: rpc_binding.h:78
RpcConnection *(* alloc)(void)
Definition: rpc_binding.h:102
#define RPC_S_PROTSEQ_NOT_SUPPORTED
Definition: winerror.h:1370
struct _QualityOfService QOS

Referenced by RpcAssoc_GetClientConnection(), rpcrt4_protseq_ncacn_ip_tcp_open_endpoint(), rpcrt4_protseq_ncacn_np_open_endpoint(), rpcrt4_protseq_ncalrpc_open_endpoint(), and rpcrt4_spawn_connection().

◆ rpcrt4_get_conn_protseq_ops()

static const struct connection_ops * rpcrt4_get_conn_protseq_ops ( const char protseq)
static

Definition at line 3571 of file rpc_transport.c.

3572{
3573 unsigned int i;
3574 for(i = 0; i < ARRAY_SIZE(conn_protseq_list); i++)
3575 if (!strcmp(conn_protseq_list[i].name, protseq))
3576 return &conn_protseq_list[i];
3577 return NULL;
3578}
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
static const struct connection_ops conn_protseq_list[]

Referenced by RpcNetworkIsProtseqValidW(), RPCRT4_CreateConnection(), RPCRT4_IsServerListening(), and RpcTransport_GetTopOfTower().

◆ rpcrt4_get_protseq_ops()

const struct protseq_ops * rpcrt4_get_protseq_ops ( const char protseq)

Definition at line 3562 of file rpc_transport.c.

3563{
3564 unsigned int i;
3565 for(i = 0; i < ARRAY_SIZE(protseq_list); i++)
3566 if (!strcmp(protseq_list[i].name, protseq))
3567 return &protseq_list[i];
3568 return NULL;
3569}

Referenced by alloc_serverprotoseq().

◆ RPCRT4_GrabConnection()

RpcConnection * RPCRT4_GrabConnection ( RpcConnection connection)

Definition at line 3682 of file rpc_transport.c.

3683{
3684 LONG ref = InterlockedIncrement(&connection->ref);
3685 TRACE("%p ref=%lu\n", connection, ref);
3686 return connection;
3687}
Definition: send.c:48

Referenced by RPCRT4_io_thread(), and RPCRT4_server_thread().

◆ rpcrt4_http_async_read()

static int rpcrt4_http_async_read ( HINTERNET  req,
RpcHttpAsyncData async_data,
HANDLE  cancel_event,
void buffer,
unsigned int  count 
)
static

Definition at line 2316 of file rpc_transport.c.

2318{
2319 char *buf = buffer;
2320 BOOL ret;
2321 unsigned int bytes_left = count;
2323
2324 async_data->inet_buffers.lpvBuffer = malloc(count);
2325
2326 while (bytes_left)
2327 {
2328 async_data->inet_buffers.dwBufferLength = bytes_left;
2329 prepare_async_request(async_data);
2330 ret = InternetReadFileExW(req, &async_data->inet_buffers, IRF_ASYNC, 0);
2331 status = wait_async_request(async_data, ret, cancel_event);
2332 if (status != RPC_S_OK)
2333 {
2335 TRACE("call cancelled\n");
2336 break;
2337 }
2338
2339 if (!async_data->inet_buffers.dwBufferLength)
2340 break;
2341 memcpy(buf, async_data->inet_buffers.lpvBuffer,
2342 async_data->inet_buffers.dwBufferLength);
2343
2344 bytes_left -= async_data->inet_buffers.dwBufferLength;
2345 buf += async_data->inet_buffers.dwBufferLength;
2346 }
2347
2348 free(async_data->inet_buffers.lpvBuffer);
2349 async_data->inet_buffers.lpvBuffer = NULL;
2350
2351 TRACE("%p %p %u -> %lu\n", req, buffer, count, status);
2352 return status == RPC_S_OK ? count : -1;
2353}
BOOL WINAPI InternetReadFileExW(HINTERNET hFile, LPINTERNET_BUFFERSW lpBuffer, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:2248
DWORD dwBufferLength
Definition: wininet.h:278
LPVOID lpvBuffer
Definition: wininet.h:277
INTERNET_BUFFERSW inet_buffers
#define RPC_S_CALL_CANCELLED
Definition: winerror.h:1482
#define IRF_ASYNC
Definition: wininet.h:622

Referenced by drain_content(), rpcrt4_http_prepare_out_pipe(), rpcrt4_http_read_http_packet(), rpcrt4_ncacn_http_read(), and send_echo_request().

◆ rpcrt4_http_check_response()

static RPC_STATUS rpcrt4_http_check_response ( HINTERNET  hor)
static

Definition at line 2159 of file rpc_transport.c.

2160{
2161 BOOL ret;
2163 DWORD size;
2164 DWORD index;
2165 WCHAR buf[32];
2166 WCHAR *status_text = buf;
2167 TRACE("\n");
2168
2169 index = 0;
2170 size = sizeof(status_code);
2172 if (!ret)
2173 return GetLastError();
2175 return RPC_S_OK;
2176 index = 0;
2177 size = sizeof(buf);
2178 ret = HttpQueryInfoW(hor, HTTP_QUERY_STATUS_TEXT, status_text, &size, &index);
2180 {
2181 status_text = malloc(size);
2182 ret = HttpQueryInfoW(hor, HTTP_QUERY_STATUS_TEXT, status_text, &size, &index);
2183 }
2184
2185 ERR("server returned: %ld %s\n", status_code, ret ? debugstr_w(status_text) : "<status text unavailable>");
2186 if(status_text != buf) free(status_text);
2187
2189 return ERROR_ACCESS_DENIED;
2191}
#define index(s, c)
Definition: various.h:29
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define HTTP_STATUS_OK
Definition: winhttp.h:240
#define HTTP_STATUS_DENIED
Definition: winhttp.h:256
#define HTTP_QUERY_STATUS_TEXT
Definition: wininet.h:1543
#define HTTP_QUERY_STATUS_CODE
Definition: wininet.h:1542

Referenced by authorize_request(), rpcrt4_http_prepare_out_pipe(), rpcrt4_ncacn_http_open(), and send_echo_request().

◆ rpcrt4_http_internet_callback()

static VOID WINAPI rpcrt4_http_internet_callback ( HINTERNET  hInternet,
DWORD_PTR  dwContext,
DWORD  dwInternetStatus,
LPVOID  lpvStatusInformation,
DWORD  dwStatusInformationLength 
)
static

Definition at line 2134 of file rpc_transport.c.

2140{
2141 RpcHttpAsyncData *async_data = (RpcHttpAsyncData *)dwContext;
2142
2143 switch (dwInternetStatus)
2144 {
2146 TRACE("INTERNET_STATUS_REQUEST_COMPLETED\n");
2147 if (async_data)
2148 {
2149 INTERNET_ASYNC_RESULT *async_result = lpvStatusInformation;
2150
2151 async_data->async_result = async_result->dwResult ? ERROR_SUCCESS : async_result->dwError;
2152 SetEvent(async_data->completion_event);
2153 RpcHttpAsyncData_Release(async_data);
2154 }
2155 break;
2156 }
2157}
static ULONG RpcHttpAsyncData_Release(RpcHttpAsyncData *data)
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898

Referenced by rpcrt4_http_internet_connect().

◆ rpcrt4_http_internet_connect()

static RPC_STATUS rpcrt4_http_internet_connect ( RpcConnection_http httpc)
static

Definition at line 2193 of file rpc_transport.c.

2194{
2195 LPWSTR proxy = NULL;
2196 LPWSTR user = NULL;
2198 LPWSTR servername = NULL;
2199 const WCHAR *option;
2201
2202 if (httpc->common.QOS &&
2204 {
2205 const RPC_HTTP_TRANSPORT_CREDENTIALS_W *http_cred = httpc->common.QOS->qos->u.HttpCredentials;
2206 if (http_cred->TransportCredentials)
2207 {
2208 WCHAR *p;
2209 const SEC_WINNT_AUTH_IDENTITY_W *cred = http_cred->TransportCredentials;
2210 ULONG len = cred->DomainLength + 1 + cred->UserLength;
2211 user = malloc((len + 1) * sizeof(WCHAR));
2212 if (!user)
2214 p = user;
2215 if (cred->DomainLength)
2216 {
2217 memcpy(p, cred->Domain, cred->DomainLength * sizeof(WCHAR));
2218 p += cred->DomainLength;
2219 *p = '\\';
2220 p++;
2221 }
2222 memcpy(p, cred->User, cred->UserLength * sizeof(WCHAR));
2223 p[cred->UserLength] = 0;
2224
2226 }
2227 }
2228
2229 for (option = httpc->common.NetworkOptions; option;
2230 option = (wcschr(option, ',') ? wcschr(option, ',')+1 : NULL))
2231 {
2232 if (!_wcsnicmp(option, L"RpcProxy=", ARRAY_SIZE(L"RpcProxy=")-1))
2233 {
2234 const WCHAR *value_start = option + ARRAY_SIZE(L"RpcProxy=")-1;
2235 const WCHAR *value_end;
2236 const WCHAR *p;
2237
2238 value_end = wcschr(option, ',');
2239 if (!value_end)
2240 value_end = value_start + lstrlenW(value_start);
2241 for (p = value_start; p < value_end; p++)
2242 if (*p == ':')
2243 {
2244 port = wcstol(p+1, NULL, 10);
2245 value_end = p;
2246 break;
2247 }
2248 TRACE("RpcProxy value is %s\n", debugstr_wn(value_start, value_end-value_start));
2249 servername = RPCRT4_strndupW(value_start, value_end-value_start);
2250 }
2251 else if (!_wcsnicmp(option, L"HttpProxy=", ARRAY_SIZE(L"HttpProxy=")-1))
2252 {
2253 const WCHAR *value_start = option + ARRAY_SIZE(L"HttpProxy=")-1;
2254 const WCHAR *value_end;
2255
2256 value_end = wcschr(option, ',');
2257 if (!value_end)
2258 value_end = value_start + lstrlenW(value_start);
2259 TRACE("HttpProxy value is %s\n", debugstr_wn(value_start, value_end-value_start));
2260 proxy = RPCRT4_strndupW(value_start, value_end-value_start);
2261 }
2262 else
2263 FIXME("unhandled option %s\n", debugstr_w(option));
2264 }
2265
2268 if (!httpc->app_info)
2269 {
2270 free(password);
2271 free(user);
2272 free(proxy);
2273 free(servername);
2274 ERR("InternetOpenW failed with error %ld\n", GetLastError());
2276 }
2278
2279 /* if no RpcProxy option specified, set the HTTP server address to the
2280 * RPC server address */
2281 if (!servername)
2282 {
2283 servername = malloc((strlen(httpc->common.NetworkAddr) + 1) * sizeof(WCHAR));
2284 if (!servername)
2285 {
2286 free(password);
2287 free(user);
2288 free(proxy);
2290 }
2291 MultiByteToWideChar(CP_ACP, 0, httpc->common.NetworkAddr, -1, servername, strlen(httpc->common.NetworkAddr) + 1);
2292 }
2293
2294 port = (httpc->common.QOS &&
2298
2299 httpc->session = InternetConnectW(httpc->app_info, servername, port, user, password,
2300 INTERNET_SERVICE_HTTP, 0, 0);
2301
2302 free(password);
2303 free(user);
2304 free(proxy);
2305
2306 if (!httpc->session)
2307 {
2308 ERR("InternetConnectW failed with error %ld\n", GetLastError());
2309 free(servername);
2311 }
2312 httpc->servername = servername;
2313 return RPC_S_OK;
2314}
void user(int argc, const char *argv[])
Definition: cmds.c:1350
#define wcschr
Definition: compat.h:17
USHORT port
Definition: uri.c:228
INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackW(HINTERNET hInternet, INTERNET_STATUS_CALLBACK lpfnIntCB)
Definition: internet.c:2075
HINTERNET WINAPI InternetConnectW(HINTERNET hInternet, LPCWSTR lpszServerName, INTERNET_PORT nServerPort, LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:1258
HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType, LPCWSTR lpszProxy, LPCWSTR lpszProxyBypass, DWORD dwFlags)
Definition: internet.c:979
int proxy
Definition: main.c:67
#define debugstr_wn
Definition: kernel32.h:33
static WCHAR password[]
Definition: url.c:33
LPWSTR RPCRT4_strndupW(LPCWSTR src, INT slen)
Definition: rpc_binding.c:79
static VOID WINAPI rpcrt4_http_internet_callback(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength)
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
unsigned short * Domain
Definition: rpcdce.h:225
unsigned short * User
Definition: rpcdce.h:223
unsigned short * Password
Definition: rpcdce.h:227
Definition: getopt.h:109
WORD INTERNET_PORT
Definition: winhttp.h:38
#define INTERNET_DEFAULT_HTTP_PORT
Definition: winhttp.h:36
#define INTERNET_DEFAULT_HTTPS_PORT
Definition: winhttp.h:37
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
#define INTERNET_OPEN_TYPE_PROXY
Definition: wininet.h:523
#define INTERNET_OPEN_TYPE_PRECONFIG
Definition: wininet.h:521
#define INTERNET_SERVICE_HTTP
Definition: wininet.h:562
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by rpcrt4_ncacn_http_open().

◆ rpcrt4_http_keep_connection_active_timer_proc()

static VOID rpcrt4_http_keep_connection_active_timer_proc ( PVOID  param,
BOOLEAN  dummy 
)
static

Definition at line 2087 of file rpc_transport.c.

2088{
2089 HINTERNET in_request = param;
2090 RpcPktHdr *idle_pkt;
2091
2093 0, 0);
2094 if (idle_pkt)
2095 {
2096 DWORD bytes_written;
2097 InternetWriteFile(in_request, idle_pkt, idle_pkt->common.frag_len, &bytes_written);
2098 free(idle_pkt);
2099 }
2100}
BOOL WINAPI InternetWriteFile(HINTERNET hFile, LPCVOID lpBuffer, DWORD dwNumOfBytesToWrite, LPDWORD lpdwNumOfBytesWritten)
Definition: internet.c:2114
GLfloat param
Definition: glext.h:5796
RpcPktHdr * RPCRT4_BuildHttpHeader(ULONG DataRepresentation, unsigned short flags, unsigned short num_data_items, unsigned int payload_size)
Definition: rpc_message.c:292
#define NDR_LOCAL_DATA_REPRESENTATION
Definition: rpcndr.h:68
unsigned short frag_len
Definition: rpc_defs.h:33
RpcPktCommonHdr common
Definition: rpc_defs.h:152

Referenced by rpcrt4_http_timer_thread().

◆ rpcrt4_http_prepare_in_pipe()

static RPC_STATUS rpcrt4_http_prepare_in_pipe ( HINTERNET  in_request,
RpcHttpAsyncData async_data,
HANDLE  cancel_event,
const UUID connection_uuid,
const UUID in_pipe_uuid,
const UUID association_uuid,
BOOL  authorized 
)
static

Definition at line 2387 of file rpc_transport.c.

2390{
2391 BOOL ret;
2393 RpcPktHdr *hdr;
2394 INTERNET_BUFFERSW buffers_in;
2395 DWORD bytes_written;
2396
2397 if (!authorized)
2398 {
2399 /* ask wininet to authorize, if necessary */
2400 status = send_echo_request(in_request, async_data, cancel_event);
2401 if (status != RPC_S_OK) return status;
2402 }
2403 memset(&buffers_in, 0, sizeof(buffers_in));
2404 buffers_in.dwStructSize = sizeof(buffers_in);
2405 /* FIXME: get this from the registry */
2406 buffers_in.dwBufferTotal = 1024 * 1024 * 1024; /* 1Gb */
2407 status = insert_content_length_header(in_request, buffers_in.dwBufferTotal);
2408 if (status != RPC_S_OK) return status;
2409
2410 prepare_async_request(async_data);
2411 ret = HttpSendRequestExW(in_request, &buffers_in, NULL, 0, 0);
2412 status = wait_async_request(async_data, ret, cancel_event);
2413 if (status != RPC_S_OK) return status;
2414
2415 TRACE("sending HTTP connect header to server\n");
2416 hdr = RPCRT4_BuildHttpConnectHeader(FALSE, connection_uuid, in_pipe_uuid, association_uuid);
2417 if (!hdr) return RPC_S_OUT_OF_RESOURCES;
2418 ret = InternetWriteFile(in_request, hdr, hdr->common.frag_len, &bytes_written);
2419 free(hdr);
2420 if (!ret)
2421 {
2422 ERR("InternetWriteFile failed with error %ld\n", GetLastError());
2424 }
2425
2426 return RPC_S_OK;
2427}
BOOL WINAPI HttpSendRequestExW(HINTERNET hRequest, LPINTERNET_BUFFERSW lpBuffersIn, LPINTERNET_BUFFERSW lpBuffersOut, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:5500
char hdr[14]
Definition: iptest.cpp:33
RpcPktHdr * RPCRT4_BuildHttpConnectHeader(int out_pipe, const UUID *connection_uuid, const UUID *pipe_uuid, const UUID *association_uuid)
Definition: rpc_message.c:345
static RPC_STATUS insert_content_length_header(HINTERNET request, DWORD len)
static RPC_STATUS send_echo_request(HINTERNET req, RpcHttpAsyncData *async_data, HANDLE cancel_event)
DWORD dwBufferTotal
Definition: wininet.h:279
DWORD dwStructSize
Definition: wininet.h:272

Referenced by rpcrt4_ncacn_http_open().

◆ rpcrt4_http_prepare_out_pipe()

static RPC_STATUS rpcrt4_http_prepare_out_pipe ( HINTERNET  out_request,
RpcHttpAsyncData async_data,
HANDLE  cancel_event,
const UUID connection_uuid,
const UUID out_pipe_uuid,
ULONG flow_control_increment,
BOOL  authorized 
)
static

Definition at line 2474 of file rpc_transport.c.

2478{
2479 BOOL ret;
2481 RpcPktHdr *hdr;
2482 BYTE *data_from_server;
2483 RpcPktHdr pkt_from_server;
2484 ULONG field1, field3;
2485 BYTE buf[20];
2486
2487 if (!authorized)
2488 {
2489 /* ask wininet to authorize, if necessary */
2490 status = send_echo_request(out_request, async_data, cancel_event);
2491 if (status != RPC_S_OK) return status;
2492 }
2493 else
2494 rpcrt4_http_async_read(out_request, async_data, cancel_event, buf, sizeof(buf));
2495
2496 hdr = RPCRT4_BuildHttpConnectHeader(TRUE, connection_uuid, out_pipe_uuid, NULL);
2497 if (!hdr) return RPC_S_OUT_OF_RESOURCES;
2498
2499 status = insert_content_length_header(out_request, hdr->common.frag_len);
2500 if (status != RPC_S_OK)
2501 {
2502 free(hdr);
2503 return status;
2504 }
2505
2506 TRACE("sending HTTP connect header to server\n");
2507 prepare_async_request(async_data);
2508 ret = HttpSendRequestW(out_request, NULL, 0, hdr, hdr->common.frag_len);
2509 status = wait_async_request(async_data, ret, cancel_event);
2510 free(hdr);
2511 if (status != RPC_S_OK) return status;
2512
2513 status = rpcrt4_http_check_response(out_request);
2514 if (status != RPC_S_OK) return status;
2515
2516 status = rpcrt4_http_read_http_packet(out_request, async_data, cancel_event,
2517 &pkt_from_server, &data_from_server);
2518 if (status != RPC_S_OK) return status;
2519 status = RPCRT4_ParseHttpPrepareHeader1(&pkt_from_server, data_from_server,
2520 &field1);
2521 free(data_from_server);
2522 if (status != RPC_S_OK) return status;
2523 TRACE("received (%ld) from first prepare header\n", field1);
2524
2525 for (;;)
2526 {
2527 status = rpcrt4_http_read_http_packet(out_request, async_data, cancel_event,
2528 &pkt_from_server, &data_from_server);
2529 if (status != RPC_S_OK) return status;
2530 if (pkt_from_server.http.flags != 0x0001) break;
2531
2532 TRACE("http idle packet, waiting for real packet\n");
2533 free(data_from_server);
2534 if (pkt_from_server.http.num_data_items != 0)
2535 {
2536 ERR("HTTP idle packet should have no data items instead of %d\n",
2537 pkt_from_server.http.num_data_items);
2538 return RPC_S_PROTOCOL_ERROR;
2539 }
2540 }
2541 status = RPCRT4_ParseHttpPrepareHeader2(&pkt_from_server, data_from_server,
2542 &field1, flow_control_increment,
2543 &field3);
2544 free(data_from_server);
2545 if (status != RPC_S_OK) return status;
2546 TRACE("received (0x%08lx 0x%08lx %ld) from second prepare header\n", field1, *flow_control_increment, field3);
2547
2548 return RPC_S_OK;
2549}
RPC_STATUS RPCRT4_ParseHttpPrepareHeader2(RpcPktHdr *header, unsigned char *data, ULONG *field1, ULONG *bytes_until_next_packet, ULONG *field3)
Definition: rpc_message.c:587
RPC_STATUS RPCRT4_ParseHttpPrepareHeader1(RpcPktHdr *header, unsigned char *data, ULONG *field1)
Definition: rpc_message.c:562
static RPC_STATUS rpcrt4_http_read_http_packet(HINTERNET request, RpcHttpAsyncData *async_data, HANDLE cancel_event, RpcPktHdr *hdr, BYTE **data)
unsigned short num_data_items
Definition: rpc_defs.h:139
unsigned short flags
Definition: rpc_defs.h:138
RpcPktHttpHdr http
Definition: rpc_defs.h:159
#define RPC_S_PROTOCOL_ERROR
Definition: winerror.h:1395
unsigned char BYTE
Definition: xxhash.c:193

Referenced by rpcrt4_ncacn_http_open().

◆ rpcrt4_http_read_http_packet()

static RPC_STATUS rpcrt4_http_read_http_packet ( HINTERNET  request,
RpcHttpAsyncData async_data,
HANDLE  cancel_event,
RpcPktHdr hdr,
BYTE **  data 
)
static

Definition at line 2429 of file rpc_transport.c.

2431{
2432 unsigned short data_len;
2433 unsigned int size;
2434
2435 if (rpcrt4_http_async_read(request, async_data, cancel_event, hdr, sizeof(hdr->common)) < 0)
2437 if (hdr->common.ptype != PKT_HTTP || hdr->common.frag_len < sizeof(hdr->http))
2438 {
2439 ERR("wrong packet type received %d or wrong frag_len %d\n",
2440 hdr->common.ptype, hdr->common.frag_len);
2441 return RPC_S_PROTOCOL_ERROR;
2442 }
2443
2444 size = sizeof(hdr->http) - sizeof(hdr->common);
2445 if (rpcrt4_http_async_read(request, async_data, cancel_event, &hdr->common + 1, size) < 0)
2447
2448 data_len = hdr->common.frag_len - sizeof(hdr->http);
2449 if (data_len)
2450 {
2451 *data = malloc(data_len);
2452 if (!*data)
2454 if (rpcrt4_http_async_read(request, async_data, cancel_event, *data, data_len) < 0)
2455 {
2456 free(*data);
2458 }
2459 }
2460 else
2461 *data = NULL;
2462
2463 if (!RPCRT4_IsValidHttpPacket(hdr, *data, data_len))
2464 {
2465 ERR("invalid http packet\n");
2466 free(*data);
2467 return RPC_S_PROTOCOL_ERROR;
2468 }
2469
2470 return RPC_S_OK;
2471}
@ PKT_HTTP
Definition: rpc_defs.h:208
BOOL RPCRT4_IsValidHttpPacket(RpcPktHdr *hdr, unsigned char *data, unsigned short data_len)
Definition: rpc_message.c:479

Referenced by rpcrt4_http_prepare_out_pipe().

◆ rpcrt4_http_timer_calc_timeout()

static DWORD rpcrt4_http_timer_calc_timeout ( DWORD last_sent_time)
inlinestatic

Definition at line 2102 of file rpc_transport.c.

2103{
2105 DWORD cached_last_sent_time = *last_sent_time;
2106 return HTTP_IDLE_TIME - (cur_time - cached_last_sent_time > HTTP_IDLE_TIME ? 0 : cur_time - cached_last_sent_time);
2107}
time_t cur_time
ULONG WINAPI DECLSPEC_HOTPATCH GetTickCount(void)
Definition: sync.c:182
#define HTTP_IDLE_TIME

Referenced by rpcrt4_http_timer_thread().

◆ rpcrt4_http_timer_thread()

static DWORD CALLBACK rpcrt4_http_timer_thread ( PVOID  param)
static

Definition at line 2109 of file rpc_transport.c.

2110{
2111 HttpTimerThreadData *data_in = param;
2113 DWORD timeout;
2114
2115 SetThreadDescription(GetCurrentThread(), L"wine_rpcrt4_http_timer");
2116
2117 data = *data_in;
2118 free(data_in);
2119
2120 for (timeout = HTTP_IDLE_TIME;
2121 WaitForSingleObject(data.timer_cancelled, timeout) == WAIT_TIMEOUT;
2123 {
2124 /* are we too soon after last send? */
2125 if (GetTickCount() - *data.last_sent_time < HTTP_IDLE_TIME)
2126 continue;
2128 }
2129
2130 CloseHandle(data.timer_cancelled);
2131 return 0;
2132}
HRESULT WINAPI DECLSPEC_HOTPATCH SetThreadDescription(HANDLE thread, PCWSTR description)
#define WAIT_TIMEOUT
Definition: dderror.h:14
static DWORD rpcrt4_http_timer_calc_timeout(DWORD *last_sent_time)
static VOID rpcrt4_http_keep_connection_active_timer_proc(PVOID param, BOOLEAN dummy)
Definition: dhcpd.h:248
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148

Referenced by rpcrt4_ncacn_http_open().

◆ rpcrt4_ip_tcp_get_top_of_tower()

static size_t rpcrt4_ip_tcp_get_top_of_tower ( unsigned char tower_data,
const char networkaddr,
unsigned char  tcp_protid,
const char endpoint 
)
static

Definition at line 1206 of file rpc_transport.c.

1210{
1211 twr_tcp_floor_t *tcp_floor;
1212 twr_ipv4_floor_t *ipv4_floor;
1213 struct addrinfo *ai;
1214 struct addrinfo hints;
1215 int ret;
1216 size_t size = sizeof(*tcp_floor) + sizeof(*ipv4_floor);
1217
1218 TRACE("(%p, %s, %s)\n", tower_data, networkaddr, endpoint);
1219
1220 if (!tower_data)
1221 return size;
1222
1223 tcp_floor = (twr_tcp_floor_t *)tower_data;
1224 tower_data += sizeof(*tcp_floor);
1225
1226 ipv4_floor = (twr_ipv4_floor_t *)tower_data;
1227
1228 tcp_floor->count_lhs = sizeof(tcp_floor->protid);
1229 tcp_floor->protid = tcp_protid;
1230 tcp_floor->count_rhs = sizeof(tcp_floor->port);
1231
1232 ipv4_floor->count_lhs = sizeof(ipv4_floor->protid);
1233 ipv4_floor->protid = EPM_PROTOCOL_IP;
1234 ipv4_floor->count_rhs = sizeof(ipv4_floor->ipv4addr);
1235
1236 hints.ai_flags = AI_NUMERICHOST;
1237 /* FIXME: only support IPv4 at the moment. how is IPv6 represented by the EPM? */
1238 hints.ai_family = PF_INET;
1239 hints.ai_socktype = SOCK_STREAM;
1240 hints.ai_protocol = IPPROTO_TCP;
1241 hints.ai_addrlen = 0;
1242 hints.ai_addr = NULL;
1243 hints.ai_canonname = NULL;
1244 hints.ai_next = NULL;
1245
1246#ifdef __REACTOS__
1247 static BOOL wsa_inited;
1248 if (!wsa_inited)
1249 {
1250 WSADATA wsadata;
1251 WSAStartup(MAKEWORD(2, 2), &wsadata);
1252 /* Note: WSAStartup can be called more than once so we don't bother with
1253 * making accesses to wsa_inited thread-safe */
1254 wsa_inited = TRUE;
1255 }
1256#endif
1257
1258 ret = getaddrinfo(networkaddr, endpoint, &hints, &ai);
1259 if (ret)
1260 {
1261 ret = getaddrinfo("0.0.0.0", endpoint, &hints, &ai);
1262 if (ret)
1263 {
1264 ERR("getaddrinfo failed, error %u\n", WSAGetLastError());
1265 return 0;
1266 }
1267 }
1268
1269 if (ai->ai_family == PF_INET)
1270 {
1271 const struct sockaddr_in *sin = (const struct sockaddr_in *)ai->ai_addr;
1272 tcp_floor->port = sin->sin_port;
1273 ipv4_floor->ipv4addr = sin->sin_addr.s_addr;
1274 }
1275 else
1276 {
1277 ERR("unexpected protocol family %d\n", ai->ai_family);
1278 freeaddrinfo(ai);
1279 return 0;
1280 }
1281
1282 freeaddrinfo(ai);
1283
1284 return size;
1285}
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
#define IPPROTO_TCP
Definition: ip.h:196
#define SOCK_STREAM
Definition: tcpip.h:118
#define EPM_PROTOCOL_IP
Definition: epm_towers.h:29
namespace GUID const ADDRINFOEXW * hints
Definition: sock.c:80
struct sockaddr * ai_addr
Definition: ws2def.h:671
int ai_family
Definition: ws2def.h:666
u_int16 count_lhs
Definition: epm_towers.h:73
u_int16 count_rhs
Definition: epm_towers.h:75
u_int32 ipv4addr
Definition: epm_towers.h:76
u_int16 count_lhs
Definition: epm_towers.h:65
u_int16 port
Definition: epm_towers.h:68
u_int16 count_rhs
Definition: epm_towers.h:67
#define MAKEWORD(a, b)
Definition: typedefs.h:248
#define PF_INET
Definition: winsock.h:367
#define AI_NUMERICHOST
Definition: ws2def.h:295
#define getaddrinfo
Definition: wspiapi.h:44
#define freeaddrinfo
Definition: wspiapi.h:46

Referenced by rpcrt4_ncacn_http_get_top_of_tower(), and rpcrt4_ncacn_ip_tcp_get_top_of_tower().

◆ rpcrt4_ip_tcp_parse_top_of_tower()

static RPC_STATUS rpcrt4_ip_tcp_parse_top_of_tower ( const unsigned char tower_data,
size_t  tower_size,
char **  networkaddr,
unsigned char  tcp_protid,
char **  endpoint 
)
static

Definition at line 1287 of file rpc_transport.c.

1292{
1293 const twr_tcp_floor_t *tcp_floor = (const twr_tcp_floor_t *)tower_data;
1294 const twr_ipv4_floor_t *ipv4_floor;
1295 struct in_addr in_addr;
1296
1297 TRACE("(%p, %d, %p, %p)\n", tower_data, (int)tower_size, networkaddr, endpoint);
1298
1299 if (tower_size < sizeof(*tcp_floor))
1300 return EPT_S_NOT_REGISTERED;
1301
1302 tower_data += sizeof(*tcp_floor);
1303 tower_size -= sizeof(*tcp_floor);
1304
1305 if (tower_size < sizeof(*ipv4_floor))
1306 return EPT_S_NOT_REGISTERED;
1307
1308 ipv4_floor = (const twr_ipv4_floor_t *)tower_data;
1309
1310 if ((tcp_floor->count_lhs != sizeof(tcp_floor->protid)) ||
1311 (tcp_floor->protid != tcp_protid) ||
1312 (tcp_floor->count_rhs != sizeof(tcp_floor->port)) ||
1313 (ipv4_floor->count_lhs != sizeof(ipv4_floor->protid)) ||
1314 (ipv4_floor->protid != EPM_PROTOCOL_IP) ||
1315 (ipv4_floor->count_rhs != sizeof(ipv4_floor->ipv4addr)))
1316 return EPT_S_NOT_REGISTERED;
1317
1318 if (endpoint)
1319 {
1320 *endpoint = I_RpcAllocate(6 /* sizeof("65535") + 1 */);
1321 if (!*endpoint)
1323 sprintf(*endpoint, "%u", ntohs(tcp_floor->port));
1324 }
1325
1326 if (networkaddr)
1327 {
1328 *networkaddr = I_RpcAllocate(INET_ADDRSTRLEN);
1329 if (!*networkaddr)
1330 {
1331 if (endpoint)
1332 {
1334 *endpoint = NULL;
1335 }
1337 }
1338 in_addr.s_addr = ipv4_floor->ipv4addr;
1339 if (!inet_ntop(AF_INET, &in_addr, *networkaddr, INET_ADDRSTRLEN))
1340 {
1341 ERR("inet_ntop: %u\n", WSAGetLastError());
1342 I_RpcFree(*networkaddr);
1343 *networkaddr = NULL;
1344 if (endpoint)
1345 {
1347 *endpoint = NULL;
1348 }
1349 return EPT_S_NOT_REGISTERED;
1350 }
1351 }
1352
1353 return RPC_S_OK;
1354}
#define AF_INET
Definition: tcpip.h:117
#define INET_ADDRSTRLEN
Definition: inet.h:142
#define ntohs(x)
Definition: module.h:210
#define sprintf
Definition: sprintf.c:45
void WINAPI I_RpcFree(void *Object)
Definition: rpcrt4_main.c:755
Definition: tcpip.h:126
in_addr_t s_addr
Definition: inet.h:64
const char *WSAAPI inet_ntop(int af, const void *src, char *dst, size_t cnt)
Definition: unix_func.c:8
#define EPT_S_NOT_REGISTERED
Definition: winerror.h:1418

Referenced by rpcrt4_ncacn_http_parse_top_of_tower(), and rpcrt4_ncacn_ip_tcp_parse_top_of_tower().

◆ RPCRT4_IsServerListening()

RPC_STATUS RPCRT4_IsServerListening ( const char protseq,
const char endpoint 
)

Definition at line 3732 of file rpc_transport.c.

3733{
3734 const struct connection_ops *ops;
3735
3736 ops = rpcrt4_get_conn_protseq_ops(protseq);
3737 if (!ops)
3738 {
3739 FIXME("not supported for protseq %s\n", protseq);
3740 return RPC_S_INVALID_BINDING;
3741 }
3742
3743 return ops->is_server_listening(endpoint);
3744}
RPC_STATUS(* is_server_listening)(const char *endpoint)
Definition: rpc_binding.h:110
#define RPC_S_INVALID_BINDING
Definition: winerror.h:1369

Referenced by RpcMgmtIsServerListening().

◆ rpcrt4_ncacn_http_alloc()

static RpcConnection * rpcrt4_ncacn_http_alloc ( void  )
static

Definition at line 2060 of file rpc_transport.c.

2061{
2062 RpcConnection_http *httpc;
2063 httpc = calloc(1, sizeof(*httpc));
2064 if (!httpc) return NULL;
2065 httpc->async_data = calloc(1, sizeof(RpcHttpAsyncData));
2066 if (!httpc->async_data)
2067 {
2068 free(httpc);
2069 return NULL;
2070 }
2071 TRACE("async data = %p\n", httpc->async_data);
2073 httpc->async_data->refs = 1;
2076 httpc->async_data->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": RpcHttpAsyncData.cs");
2077 return &httpc->common;
2078}
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
PRTL_CRITICAL_SECTION_DEBUG DebugInfo
Definition: rtltypes.h:1450
CRITICAL_SECTION cs
#define DWORD_PTR
Definition: treelist.c:76
struct _INTERNET_BUFFERSW INTERNET_BUFFERSW
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1138

◆ rpcrt4_ncacn_http_cancel_call()

static void rpcrt4_ncacn_http_cancel_call ( RpcConnection Connection)
static

Definition at line 3391 of file rpc_transport.c.

3392{
3393 RpcConnection_http *httpc = (RpcConnection_http *) Connection;
3394
3395 SetEvent(httpc->cancel_event);
3396}

◆ rpcrt4_ncacn_http_close()

static int rpcrt4_ncacn_http_close ( RpcConnection Connection)
static

Definition at line 3358 of file rpc_transport.c.

3359{
3360 RpcConnection_http *httpc = (RpcConnection_http *) Connection;
3361
3362 TRACE("\n");
3363
3364 SetEvent(httpc->timer_cancelled);
3365 if (httpc->in_request)
3367 httpc->in_request = NULL;
3368 if (httpc->out_request)
3370 httpc->out_request = NULL;
3371 if (httpc->app_info)
3373 httpc->app_info = NULL;
3374 if (httpc->session)
3376 httpc->session = NULL;
3378 if (httpc->cancel_event)
3379 CloseHandle(httpc->cancel_event);
3380 free(httpc->servername);
3381 httpc->servername = NULL;
3382
3383 return 0;
3384}
BOOL WINAPI InternetCloseHandle(HINTERNET hInternet)
Definition: internet.c:1414

Referenced by rpcrt4_ncacn_http_close_read().

◆ rpcrt4_ncacn_http_close_read()

static void rpcrt4_ncacn_http_close_read ( RpcConnection conn)
static

Definition at line 3386 of file rpc_transport.c.

3387{
3388 rpcrt4_ncacn_http_close(conn); /* FIXME */
3389}
static int rpcrt4_ncacn_http_close(RpcConnection *Connection)

◆ rpcrt4_ncacn_http_get_top_of_tower()

static size_t rpcrt4_ncacn_http_get_top_of_tower ( unsigned char tower_data,
const char networkaddr,
const char endpoint 
)
static

Definition at line 3417 of file rpc_transport.c.

3420{
3421 return rpcrt4_ip_tcp_get_top_of_tower(tower_data, networkaddr,
3423}
#define EPM_PROTOCOL_HTTP
Definition: epm_towers.h:47
static size_t rpcrt4_ip_tcp_get_top_of_tower(unsigned char *tower_data, const char *networkaddr, unsigned char tcp_protid, const char *endpoint)

◆ rpcrt4_ncacn_http_handoff()

static RPC_STATUS rpcrt4_ncacn_http_handoff ( RpcConnection old_conn,
RpcConnection new_conn 
)
static

Definition at line 3175 of file rpc_transport.c.

3176{
3177 assert(0);
3179}

◆ rpcrt4_ncacn_http_is_server_listening()

static RPC_STATUS rpcrt4_ncacn_http_is_server_listening ( const char endpoint)
static

Definition at line 3398 of file rpc_transport.c.

3399{
3400 FIXME("\n");
3401 return RPC_S_ACCESS_DENIED;
3402}

◆ rpcrt4_ncacn_http_open()

static RPC_STATUS rpcrt4_ncacn_http_open ( RpcConnection Connection)
static

Definition at line 3042 of file rpc_transport.c.

3043{
3044 RpcConnection_http *httpc = (RpcConnection_http *)Connection;
3045 static const WCHAR wszRpcProxyPrefix[] = L"/rpc/rpcproxy.dll?";
3046 LPCWSTR wszAcceptTypes[] = { L"application/rpc", NULL };
3047 DWORD flags;
3048 WCHAR *url;
3050 BOOL secure, credentials;
3051 HttpTimerThreadData *timer_data;
3052 HANDLE thread;
3053
3054 TRACE("(%s, %s)\n", Connection->NetworkAddr, Connection->Endpoint);
3055
3056 if (Connection->server)
3057 {
3058 ERR("ncacn_http servers not supported yet\n");
3060 }
3061
3062 if (httpc->in_request)
3063 return RPC_S_OK;
3064
3066
3067 UuidCreate(&httpc->connection_uuid);
3068 UuidCreate(&httpc->in_pipe_uuid);
3069 UuidCreate(&httpc->out_pipe_uuid);
3070
3072 if (status != RPC_S_OK)
3073 return status;
3074
3075 url = malloc(sizeof(wszRpcProxyPrefix) +
3076 (strlen(Connection->NetworkAddr) + 1 + strlen(Connection->Endpoint)) * sizeof(WCHAR));
3077 if (!url)
3078 return RPC_S_OUT_OF_MEMORY;
3079 memcpy(url, wszRpcProxyPrefix, sizeof(wszRpcProxyPrefix));
3080 MultiByteToWideChar(CP_ACP, 0, Connection->NetworkAddr, -1, url+ARRAY_SIZE(wszRpcProxyPrefix)-1,
3081 strlen(Connection->NetworkAddr)+1);
3082 lstrcatW(url, L":");
3083 MultiByteToWideChar(CP_ACP, 0, Connection->Endpoint, -1, url+lstrlenW(url), strlen(Connection->Endpoint)+1);
3084
3085 secure = is_secure(httpc);
3086 credentials = has_credentials(httpc);
3087
3091 if (credentials) flags |= INTERNET_FLAG_NO_AUTH;
3092
3093 status = set_auth_cookie(httpc, Connection->CookieAuth);
3094 if (status != RPC_S_OK)
3095 {
3096 free(url);
3097 return status;
3098 }
3099 httpc->in_request = HttpOpenRequestW(httpc->session, L"RPC_IN_DATA", url, NULL, NULL, wszAcceptTypes,
3100 flags, (DWORD_PTR)httpc->async_data);
3101 if (!httpc->in_request)
3102 {
3103 ERR("HttpOpenRequestW failed with error %ld\n", GetLastError());
3104 free(url);
3106 }
3107
3108 if (credentials)
3109 {
3110 status = authorize_request(httpc, httpc->in_request);
3111 if (status != RPC_S_OK)
3112 {
3113 free(url);
3114 return status;
3115 }
3117 if (status != RPC_S_OK)
3118 {
3119 free(url);
3120 return status;
3121 }
3122 drain_content(httpc->in_request, httpc->async_data, httpc->cancel_event);
3123 }
3124
3125 httpc->out_request = HttpOpenRequestW(httpc->session, L"RPC_OUT_DATA", url, NULL, NULL, wszAcceptTypes,
3126 flags, (DWORD_PTR)httpc->async_data);
3127 free(url);
3128 if (!httpc->out_request)
3129 {
3130 ERR("HttpOpenRequestW failed with error %ld\n", GetLastError());
3132 }
3133
3134 if (credentials)
3135 {
3136 status = authorize_request(httpc, httpc->out_request);
3137 if (status != RPC_S_OK)
3138 return status;
3139 }
3140
3142 &httpc->connection_uuid, &httpc->in_pipe_uuid,
3143 &Connection->assoc->http_uuid, credentials);
3144 if (status != RPC_S_OK)
3145 return status;
3146
3148 &httpc->connection_uuid, &httpc->out_pipe_uuid,
3149 &httpc->flow_control_increment, credentials);
3150 if (status != RPC_S_OK)
3151 return status;
3152
3153 httpc->flow_control_mark = httpc->flow_control_increment / 2;
3154 httpc->last_sent_time = GetTickCount();
3156
3157 timer_data = malloc(sizeof(*timer_data));
3158 if (!timer_data)
3159 return ERROR_OUTOFMEMORY;
3160 timer_data->timer_param = httpc->in_request;
3161 timer_data->last_sent_time = &httpc->last_sent_time;
3162 timer_data->timer_cancelled = httpc->timer_cancelled;
3163 /* FIXME: should use CreateTimerQueueTimer when implemented */
3164 thread = CreateThread(NULL, 0, rpcrt4_http_timer_thread, timer_data, 0, NULL);
3165 if (!thread)
3166 {
3167 free(timer_data);
3168 return GetLastError();
3169 }
3171
3172 return RPC_S_OK;
3173}
static HANDLE thread
Definition: service.c:33
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
HINTERNET WINAPI HttpOpenRequestW(HINTERNET hHttpSession, LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion, LPCWSTR lpszReferrer, LPCWSTR *lpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext)
Definition: http.c:3469
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
static const WCHAR url[]
Definition: encode.c:1384
static int secure
Definition: server.c:157
static RPC_STATUS rpcrt4_http_internet_connect(RpcConnection_http *httpc)
static RPC_STATUS rpcrt4_http_prepare_out_pipe(HINTERNET out_request, RpcHttpAsyncData *async_data, HANDLE cancel_event, const UUID *connection_uuid, const UUID *out_pipe_uuid, ULONG *flow_control_increment, BOOL authorized)
static BOOL is_secure(RpcConnection_http *httpc)
static RPC_STATUS rpcrt4_http_prepare_in_pipe(HINTERNET in_request, RpcHttpAsyncData *async_data, HANDLE cancel_event, const UUID *connection_uuid, const UUID *in_pipe_uuid, const UUID *association_uuid, BOOL authorized)
static RPC_STATUS authorize_request(RpcConnection_http *httpc, HINTERNET request)
static DWORD CALLBACK rpcrt4_http_timer_thread(PVOID param)
static BOOL has_credentials(RpcConnection_http *httpc)
static RPC_STATUS set_auth_cookie(RpcConnection_http *httpc, const WCHAR *value)
RPC_STATUS WINAPI UuidCreate(UUID *Uuid)
Definition: rpcrt4_main.c:330
struct _RpcAssoc * assoc
Definition: rpc_binding.h:88
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define INTERNET_FLAG_PRAGMA_NOCACHE
Definition: wininet.h:85
#define INTERNET_FLAG_NO_AUTO_REDIRECT
Definition: wininet.h:73
#define INTERNET_FLAG_KEEP_CONNECTION
Definition: wininet.h:72
#define INTERNET_FLAG_NO_CACHE_WRITE
Definition: wininet.h:66
#define INTERNET_FLAG_SECURE
Definition: wininet.h:71
#define INTERNET_FLAG_NO_AUTH
Definition: wininet.h:76
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

◆ rpcrt4_ncacn_http_parse_top_of_tower()

static RPC_STATUS rpcrt4_ncacn_http_parse_top_of_tower ( const unsigned char tower_data,
size_t  tower_size,
char **  networkaddr,
char **  endpoint 
)
static

Definition at line 3425 of file rpc_transport.c.

3429{
3430 return rpcrt4_ip_tcp_parse_top_of_tower(tower_data, tower_size,
3431 networkaddr, EPM_PROTOCOL_HTTP,
3432 endpoint);
3433}
static RPC_STATUS rpcrt4_ip_tcp_parse_top_of_tower(const unsigned char *tower_data, size_t tower_size, char **networkaddr, unsigned char tcp_protid, char **endpoint)

◆ rpcrt4_ncacn_http_read()

static int rpcrt4_ncacn_http_read ( RpcConnection Connection,
void buffer,
unsigned int  count 
)
static

Definition at line 3181 of file rpc_transport.c.

3183{
3184 RpcConnection_http *httpc = (RpcConnection_http *) Connection;
3185 return rpcrt4_http_async_read(httpc->out_request, httpc->async_data, httpc->cancel_event, buffer, count);
3186}

Referenced by rpcrt4_ncacn_http_receive_fragment().

◆ rpcrt4_ncacn_http_receive_fragment()

static RPC_STATUS rpcrt4_ncacn_http_receive_fragment ( RpcConnection Connection,
RpcPktHdr **  Header,
void **  Payload 
)
static

Definition at line 3188 of file rpc_transport.c.

3189{
3190 RpcConnection_http *httpc = (RpcConnection_http *) Connection;
3192 DWORD hdr_length;
3193 LONG dwRead;
3194 RpcPktCommonHdr common_hdr;
3195
3196 *Header = NULL;
3197
3198 TRACE("(%p, %p, %p)\n", Connection, Header, Payload);
3199
3200again:
3201 /* read packet common header */
3202 dwRead = rpcrt4_ncacn_http_read(Connection, &common_hdr, sizeof(common_hdr));
3203 if (dwRead != sizeof(common_hdr)) {
3204 WARN("Short read of header, %ld bytes\n", dwRead);
3206 goto fail;
3207 }
3208 if (!memcmp(&common_hdr, "HTTP/1.1", sizeof("HTTP/1.1")) ||
3209 !memcmp(&common_hdr, "HTTP/1.0", sizeof("HTTP/1.0")))
3210 {
3211 FIXME("server returned %s\n", debugstr_a((const char *)&common_hdr));
3213 goto fail;
3214 }
3215
3216 status = RPCRT4_ValidateCommonHeader(&common_hdr);
3217 if (status != RPC_S_OK) goto fail;
3218
3219 hdr_length = RPCRT4_GetHeaderSize((RpcPktHdr*)&common_hdr);
3220 if (hdr_length == 0) {
3221 WARN("header length == 0\n");
3223 goto fail;
3224 }
3225
3226 *Header = malloc(hdr_length);
3227 if (!*Header)
3228 {
3230 goto fail;
3231 }
3232 memcpy(*Header, &common_hdr, sizeof(common_hdr));
3233
3234 /* read the rest of packet header */
3235 dwRead = rpcrt4_ncacn_http_read(Connection, &(*Header)->common + 1, hdr_length - sizeof(common_hdr));
3236 if (dwRead != hdr_length - sizeof(common_hdr)) {
3237 WARN("bad header length, %ld bytes, hdr_length %ld\n", dwRead, hdr_length);
3239 goto fail;
3240 }
3241
3242 if (common_hdr.frag_len - hdr_length)
3243 {
3244 *Payload = malloc(common_hdr.frag_len - hdr_length);
3245 if (!*Payload)
3246 {
3248 goto fail;
3249 }
3250
3251 dwRead = rpcrt4_ncacn_http_read(Connection, *Payload, common_hdr.frag_len - hdr_length);
3252 if (dwRead != common_hdr.frag_len - hdr_length)
3253 {
3254 WARN("bad data length, %ld/%ld\n", dwRead, common_hdr.frag_len - hdr_length);
3256 goto fail;
3257 }
3258 }
3259 else
3260 *Payload = NULL;
3261
3262 if ((*Header)->common.ptype == PKT_HTTP)
3263 {
3264 if (!RPCRT4_IsValidHttpPacket(*Header, *Payload, common_hdr.frag_len - hdr_length))
3265 {
3266 ERR("invalid http packet of length %d bytes\n", (*Header)->common.frag_len);
3268 goto fail;
3269 }
3270 if ((*Header)->http.flags == 0x0001)
3271 {
3272 TRACE("http idle packet, waiting for real packet\n");
3273 if ((*Header)->http.num_data_items != 0)
3274 {
3275 ERR("HTTP idle packet should have no data items instead of %d\n", (*Header)->http.num_data_items);
3277 goto fail;
3278 }
3279 }
3280 else if ((*Header)->http.flags == 0x0002)
3281 {
3282 ULONG bytes_transmitted;
3283 ULONG flow_control_increment;
3284 UUID pipe_uuid;
3286 Connection->server,
3287 &bytes_transmitted,
3288 &flow_control_increment,
3289 &pipe_uuid);
3290 if (status != RPC_S_OK)
3291 goto fail;
3292 TRACE("received http flow control header (0x%lx, 0x%lx, %s)\n",
3293 bytes_transmitted, flow_control_increment, debugstr_guid(&pipe_uuid));
3294 /* FIXME: do something with parsed data */
3295 }
3296 else
3297 {
3298 FIXME("unrecognised http packet with flags 0x%04x\n", (*Header)->http.flags);
3300 goto fail;
3301 }
3302 free(*Header);
3303 *Header = NULL;
3304 free(*Payload);
3305 *Payload = NULL;
3306 goto again;
3307 }
3308
3309 /* success */
3310 status = RPC_S_OK;
3311
3312 httpc->bytes_received += common_hdr.frag_len;
3313
3314 TRACE("httpc->bytes_received = 0x%lx\n", httpc->bytes_received);
3315
3316 if (httpc->bytes_received > httpc->flow_control_mark)
3317 {
3319 httpc->bytes_received,
3321 &httpc->out_pipe_uuid);
3322 if (hdr)
3323 {
3324 DWORD bytes_written;
3325 BOOL ret2;
3326 TRACE("sending flow control packet at 0x%lx\n", httpc->bytes_received);
3327 ret2 = InternetWriteFile(httpc->in_request, hdr, hdr->common.frag_len, &bytes_written);
3328 free(hdr);
3329 if (ret2)
3330 httpc->flow_control_mark = httpc->bytes_received + httpc->flow_control_increment / 2;
3331 }
3332 }
3333
3334fail:
3335 if (status != RPC_S_OK) {
3336 free(*Header);
3337 *Header = NULL;
3338 free(*Payload);
3339 *Payload = NULL;
3340 }
3341 return status;
3342}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
Definition: Header.h:9
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_a
Definition: kernel32.h:31
RPC_STATUS RPCRT4_ValidateCommonHeader(const RpcPktCommonHdr *hdr)
Definition: rpc_message.c:1251
RPC_STATUS RPCRT4_ParseHttpFlowControlHeader(RpcPktHdr *header, unsigned char *data, BOOL server, ULONG *bytes_transmitted, ULONG *flow_control_increment, UUID *pipe_uuid)
Definition: rpc_message.c:633
DWORD RPCRT4_GetHeaderSize(const RpcPktHdr *Header)
Definition: rpc_message.c:58
RpcPktHdr * RPCRT4_BuildHttpFlowControlHeader(BOOL server, ULONG bytes_transmitted, ULONG flow_control_increment, const UUID *pipe_uuid)
Definition: rpc_message.c:385
static int rpcrt4_ncacn_http_read(RpcConnection *Connection, void *buffer, unsigned int count)

◆ rpcrt4_ncacn_http_wait_for_incoming_data()

static int rpcrt4_ncacn_http_wait_for_incoming_data ( RpcConnection Connection)
static

Definition at line 3404 of file rpc_transport.c.

3405{
3406 RpcConnection_http *httpc = (RpcConnection_http *) Connection;
3407 BOOL ret;
3409
3414 return status == RPC_S_OK ? 0 : -1;
3415}
BOOL WINAPI InternetQueryDataAvailable(HINTERNET hFile, LPDWORD lpdwNumberOfBytesAvailable, DWORD dwFlags, DWORD_PTR dwContext)
Definition: internet.c:3959

◆ rpcrt4_ncacn_http_write()

static int rpcrt4_ncacn_http_write ( RpcConnection Connection,
const void buffer,
unsigned int  count 
)
static

Definition at line 3344 of file rpc_transport.c.

3346{
3347 RpcConnection_http *httpc = (RpcConnection_http *) Connection;
3348 DWORD bytes_written;
3349 BOOL ret;
3350
3351 httpc->last_sent_time = ~0U; /* disable idle packet sending */
3352 ret = InternetWriteFile(httpc->in_request, buffer, count, &bytes_written);
3353 httpc->last_sent_time = GetTickCount();
3354 TRACE("%p %p %u -> %s\n", httpc->in_request, buffer, count, ret ? "TRUE" : "FALSE");
3355 return ret ? bytes_written : -1;
3356}
#define U(x)
Definition: wordpad.c:45

◆ rpcrt4_ncacn_ip_tcp_get_top_of_tower()

static size_t rpcrt4_ncacn_ip_tcp_get_top_of_tower ( unsigned char tower_data,
const char networkaddr,
const char endpoint 
)
static

Definition at line 1804 of file rpc_transport.c.

1807{
1808 return rpcrt4_ip_tcp_get_top_of_tower(tower_data, networkaddr,
1810}
#define EPM_PROTOCOL_TCP
Definition: epm_towers.h:27

◆ rpcrt4_ncacn_ip_tcp_open()

static RPC_STATUS rpcrt4_ncacn_ip_tcp_open ( RpcConnection Connection)
static

Definition at line 1444 of file rpc_transport.c.

1445{
1446 RpcConnection_tcp *tcpc = (RpcConnection_tcp *) Connection;
1447 int sock;
1448 int ret;
1449 struct addrinfo *ai;
1450 struct addrinfo *ai_cur;
1451 struct addrinfo hints;
1452
1453 TRACE("(%s, %s)\n", Connection->NetworkAddr, Connection->Endpoint);
1454
1455 if (tcpc->sock != -1)
1456 return RPC_S_OK;
1457
1458 hints.ai_flags = 0;
1459 hints.ai_family = PF_UNSPEC;
1460 hints.ai_socktype = SOCK_STREAM;
1461 hints.ai_protocol = IPPROTO_TCP;
1462 hints.ai_addrlen = 0;
1463 hints.ai_addr = NULL;
1464 hints.ai_canonname = NULL;
1465 hints.ai_next = NULL;
1466
1467 ret = getaddrinfo(Connection->NetworkAddr, Connection->Endpoint, &hints, &ai);
1468 if (ret)
1469 {
1470 ERR("getaddrinfo for %s:%s failed, error %u\n", Connection->NetworkAddr,
1471 Connection->Endpoint, WSAGetLastError());
1473 }
1474
1475 for (ai_cur = ai; ai_cur; ai_cur = ai_cur->ai_next)
1476 {
1477 int val;
1478 u_long nonblocking;
1479
1480 if (ai_cur->ai_family != AF_INET && ai_cur->ai_family != AF_INET6)
1481 {
1482 TRACE("skipping non-IP/IPv6 address family\n");
1483 continue;
1484 }
1485
1486 if (TRACE_ON(rpc))
1487 {
1488 char host[256];
1489 char service[256];
1490 getnameinfo(ai_cur->ai_addr, ai_cur->ai_addrlen,
1491 host, sizeof(host), service, sizeof(service),
1493 TRACE("trying %s:%s\n", host, service);
1494 }
1495
1496 sock = socket(ai_cur->ai_family, ai_cur->ai_socktype, ai_cur->ai_protocol);
1497 if (sock == -1)
1498 {
1499 WARN("socket() failed: %u\n", WSAGetLastError());
1500 continue;
1501 }
1502
1503 if (0>connect(sock, ai_cur->ai_addr, ai_cur->ai_addrlen))
1504 {
1505 WARN("connect() failed: %u\n", WSAGetLastError());
1507 continue;
1508 }
1509
1510 /* RPC depends on having minimal latency so disable the Nagle algorithm */
1511 val = 1;
1512 setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
1513 nonblocking = 1;
1514 ioctlsocket(sock, FIONBIO, &nonblocking);
1515
1516 tcpc->sock = sock;
1517
1518 freeaddrinfo(ai);
1519 TRACE("connected\n");
1520 return RPC_S_OK;
1521 }
1522
1523 freeaddrinfo(ai);
1524 ERR("couldn't connect to %s:%s\n", Connection->NetworkAddr, Connection->Endpoint);
1526}
#define TRACE_ON(x)
Definition: compat.h:75
GLuint GLfloat * val
Definition: glext.h:7180
INT WSAAPI setsockopt(IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen)
Definition: sockctrl.c:421
SOCKET WSAAPI socket(IN INT af, IN INT type, IN INT protocol)
Definition: socklife.c:143
size_t ai_addrlen
Definition: ws2def.h:669
int ai_socktype
Definition: ws2def.h:667
int ai_protocol
Definition: ws2def.h:668
struct addrinfo * ai_next
Definition: ws2def.h:672
Definition: txthost.c:37
Definition: tcpcore.h:1455
#define TCP_NODELAY
Definition: tcpdef.h:117
#define PF_UNSPEC
Definition: winsock.h:365
#define AF_INET6
Definition: winsock.h:363
#define NI_NUMERICSERV
Definition: ws2def.h:356

◆ rpcrt4_ncacn_ip_tcp_parse_top_of_tower()

static RPC_STATUS rpcrt4_ncacn_ip_tcp_parse_top_of_tower ( const unsigned char tower_data,
size_t  tower_size,
char **  networkaddr,
char **  endpoint 
)
static

Definition at line 1944 of file rpc_transport.c.

1948{
1949 return rpcrt4_ip_tcp_parse_top_of_tower(tower_data, tower_size,
1950 networkaddr, EPM_PROTOCOL_TCP,
1951 endpoint);
1952}

◆ rpcrt4_ncacn_np_get_top_of_tower()

static size_t rpcrt4_ncacn_np_get_top_of_tower ( unsigned char tower_data,
const char networkaddr,
const char endpoint 
)
static

Definition at line 775 of file rpc_transport.c.

778{
779 twr_empty_floor_t *smb_floor;
780 twr_empty_floor_t *nb_floor;
781 size_t size;
782 size_t networkaddr_size;
783 size_t endpoint_size;
784
785 TRACE("(%p, %s, %s)\n", tower_data, networkaddr, endpoint);
786
787 networkaddr_size = networkaddr ? strlen(networkaddr) + 1 : 1;
788 endpoint_size = endpoint ? strlen(endpoint) + 1 : 1;
789 size = sizeof(*smb_floor) + endpoint_size + sizeof(*nb_floor) + networkaddr_size;
790
791 if (!tower_data)
792 return size;
793
794 smb_floor = (twr_empty_floor_t *)tower_data;
795
796 tower_data += sizeof(*smb_floor);
797
798 smb_floor->count_lhs = sizeof(smb_floor->protid);
799 smb_floor->protid = EPM_PROTOCOL_SMB;
800 smb_floor->count_rhs = endpoint_size;
801
802 if (endpoint)
803 memcpy(tower_data, endpoint, endpoint_size);
804 else
805 tower_data[0] = 0;
806 tower_data += endpoint_size;
807
808 nb_floor = (twr_empty_floor_t *)tower_data;
809
810 tower_data += sizeof(*nb_floor);
811
812 nb_floor->count_lhs = sizeof(nb_floor->protid);
813 nb_floor->protid = EPM_PROTOCOL_NETBIOS;
814 nb_floor->count_rhs = networkaddr_size;
815
816 if (networkaddr)
817 memcpy(tower_data, networkaddr, networkaddr_size);
818 else
819 tower_data[0] = 0;
820
821 return size;
822}
#define EPM_PROTOCOL_NETBIOS
Definition: epm_towers.h:37
#define EPM_PROTOCOL_SMB
Definition: epm_towers.h:35
u_int16 count_lhs
Definition: epm_towers.h:81
u_int16 count_rhs
Definition: epm_towers.h:83

◆ rpcrt4_ncacn_np_handoff()

static RPC_STATUS rpcrt4_ncacn_np_handoff ( RpcConnection old_conn,
RpcConnection new_conn 
)
static

Definition at line 599 of file rpc_transport.c.

600{
603
606
607 /* Store the local computer name as the NetworkAddr for ncacn_np as long as
608 * we don't support named pipes over the network. */
609 new_conn->NetworkAddr = malloc(len);
610 if (!GetComputerNameA(new_conn->NetworkAddr, &len))
611 {
612 ERR("Failed to retrieve the computer name, error %lu\n", GetLastError());
614 }
615
616 return status;
617}
static RPC_STATUS rpcrt4_conn_create_pipe(RpcConnection *conn)
static void rpcrt4_conn_np_handoff(RpcConnection_np *old_npc, RpcConnection_np *new_npc)

◆ rpcrt4_ncacn_np_is_server_listening()

static RPC_STATUS rpcrt4_ncacn_np_is_server_listening ( const char endpoint)
static

Definition at line 624 of file rpc_transport.c.

625{
626 char *pipe_name;
628
629#ifdef __REACTOS__
630 pipe_name = ncacn_pipe_name(NULL, endpoint);
631#else
632 pipe_name = ncacn_pipe_name(endpoint);
633#endif
634 status = is_pipe_listening(pipe_name);
635 I_RpcFree(pipe_name);
636 return status;
637}
static RPC_STATUS is_pipe_listening(const char *pipe_name)
static char * ncacn_pipe_name(const char *endpoint)

◆ rpcrt4_ncacn_np_open()

static RPC_STATUS rpcrt4_ncacn_np_open ( RpcConnection Connection)
static

Definition at line 532 of file rpc_transport.c.

533{
534 RpcConnection_np *npc = (RpcConnection_np *) Connection;
536 LPSTR pname;
537
538 /* already connected? */
539 if (npc->pipe)
540 return RPC_S_OK;
541
542#ifdef __REACTOS__
543 pname = ncacn_pipe_name(Connection->NetworkAddr, Connection->Endpoint);
544#else
545 pname = ncacn_pipe_name(Connection->Endpoint);
546#endif
547 r = rpcrt4_conn_open_pipe(Connection, pname, FALSE);
549
550 return r;
551}
static RPC_STATUS rpcrt4_conn_open_pipe(RpcConnection *Connection, LPCSTR pname, BOOL wait)
char * LPSTR
Definition: xmlstorage.h:182

◆ rpcrt4_ncacn_np_parse_top_of_tower()

static RPC_STATUS rpcrt4_ncacn_np_parse_top_of_tower ( const unsigned char tower_data,
size_t  tower_size,
char **  networkaddr,
char **  endpoint 
)
static

Definition at line 824 of file rpc_transport.c.

828{
829 const twr_empty_floor_t *smb_floor = (const twr_empty_floor_t *)tower_data;
830 const twr_empty_floor_t *nb_floor;
831
832 TRACE("(%p, %d, %p, %p)\n", tower_data, (int)tower_size, networkaddr, endpoint);
833
834 if (tower_size < sizeof(*smb_floor))
836
837 tower_data += sizeof(*smb_floor);
838 tower_size -= sizeof(*smb_floor);
839
840 if ((smb_floor->count_lhs != sizeof(smb_floor->protid)) ||
841 (smb_floor->protid != EPM_PROTOCOL_SMB) ||
842 (smb_floor->count_rhs > tower_size) ||
843 (tower_data[smb_floor->count_rhs - 1] != '\0'))
845
846 if (endpoint)
847 {
848 *endpoint = I_RpcAllocate(smb_floor->count_rhs);
849 if (!*endpoint)
851 memcpy(*endpoint, tower_data, smb_floor->count_rhs);
852 }
853 tower_data += smb_floor->count_rhs;
854 tower_size -= smb_floor->count_rhs;
855
856 if (tower_size < sizeof(*nb_floor))
858
859 nb_floor = (const twr_empty_floor_t *)tower_data;
860
861 tower_data += sizeof(*nb_floor);
862 tower_size -= sizeof(*nb_floor);
863
864 if ((nb_floor->count_lhs != sizeof(nb_floor->protid)) ||
865 (nb_floor->protid != EPM_PROTOCOL_NETBIOS) ||
866 (nb_floor->count_rhs > tower_size) ||
867 (tower_data[nb_floor->count_rhs - 1] != '\0'))
869
870 if (networkaddr)
871 {
872 *networkaddr = I_RpcAllocate(nb_floor->count_rhs);
873 if (!*networkaddr)
874 {
875 if (endpoint)
876 {
878 *endpoint = NULL;
879 }
881 }
882 memcpy(*networkaddr, tower_data, nb_floor->count_rhs);
883 }
884
885 return RPC_S_OK;
886}

◆ rpcrt4_ncalrpc_authorize()

static RPC_STATUS rpcrt4_ncalrpc_authorize ( RpcConnection conn,
BOOL  first_time,
unsigned char in_buffer,
unsigned int  in_size,
unsigned char out_buffer,
unsigned int out_size 
)
static

Definition at line 1143 of file rpc_transport.c.

1148{
1149 /* since this protocol is local to the machine there is no need to
1150 * authenticate the caller */
1151 *out_size = 0;
1152 return RPC_S_OK;
1153}
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID ULONG out_size
Definition: file.c:100

◆ rpcrt4_ncalrpc_get_top_of_tower()

static size_t rpcrt4_ncalrpc_get_top_of_tower ( unsigned char tower_data,
const char networkaddr,
const char endpoint 
)
static

Definition at line 1074 of file rpc_transport.c.

1077{
1078 twr_empty_floor_t *pipe_floor;
1079 size_t size;
1080 size_t endpoint_size;
1081
1082 TRACE("(%p, %s, %s)\n", tower_data, networkaddr, endpoint);
1083
1084 endpoint_size = strlen(endpoint) + 1;
1085 size = sizeof(*pipe_floor) + endpoint_size;
1086
1087 if (!tower_data)
1088 return size;
1089
1090 pipe_floor = (twr_empty_floor_t *)tower_data;
1091
1092 tower_data += sizeof(*pipe_floor);
1093
1094 pipe_floor->count_lhs = sizeof(pipe_floor->protid);
1095 pipe_floor->protid = EPM_PROTOCOL_PIPE;
1096 pipe_floor->count_rhs = endpoint_size;
1097
1098 memcpy(tower_data, endpoint, endpoint_size);
1099
1100 return size;
1101}
#define EPM_PROTOCOL_PIPE
Definition: epm_towers.h:36

◆ rpcrt4_ncalrpc_handoff()

static RPC_STATUS rpcrt4_ncalrpc_handoff ( RpcConnection old_conn,
RpcConnection new_conn 
)
static

Definition at line 650 of file rpc_transport.c.

651{
654
655 TRACE("%s\n", old_conn->Endpoint);
656
659
660 /* Store the local computer name as the NetworkAddr for ncalrpc. */
661 new_conn->NetworkAddr = malloc(len);
662 if (!GetComputerNameA(new_conn->NetworkAddr, &len))
663 {
664 ERR("Failed to retrieve the computer name, error %lu\n", GetLastError());
666 }
667
668 return status;
669}

◆ rpcrt4_ncalrpc_inquire_auth_client()

static RPC_STATUS rpcrt4_ncalrpc_inquire_auth_client ( RpcConnection conn,
RPC_AUTHZ_HANDLE privs,
RPC_WSTR server_princ_name,
ULONG authn_level,
ULONG authn_svc,
ULONG authz_svc,
ULONG  flags 
)
static

Definition at line 1167 of file rpc_transport.c.

1170{
1171 TRACE("(%p, %p, %p, %p, %p, %p, 0x%lx)\n", conn, privs,
1172 server_princ_name, authn_level, authn_svc, authz_svc, flags);
1173
1174 if (privs)
1175 {
1176 FIXME("privs not implemented\n");
1177 *privs = NULL;
1178 }
1179 if (server_princ_name)
1180 {
1181 FIXME("server_princ_name not implemented\n");
1182 *server_princ_name = NULL;
1183 }
1184 if (authn_level) *authn_level = RPC_C_AUTHN_LEVEL_PKT_PRIVACY;
1185 if (authn_svc) *authn_svc = RPC_C_AUTHN_WINNT;
1186 if (authz_svc)
1187 {
1188 FIXME("authorization service not implemented\n");
1189 *authz_svc = RPC_C_AUTHZ_NONE;
1190 }
1191 if (flags)
1192 FIXME("flags 0x%lx not implemented\n", flags);
1193
1194 return RPC_S_OK;
1195}
#define RPC_C_AUTHZ_NONE
Definition: rpcdce.h:167
#define RPC_C_AUTHN_LEVEL_PKT_PRIVACY
Definition: rpcdce.h:151
#define RPC_C_AUTHN_WINNT
Definition: rpcdce.h:158

◆ rpcrt4_ncalrpc_inquire_client_pid()

static RPC_STATUS rpcrt4_ncalrpc_inquire_client_pid ( RpcConnection conn,
ULONG pid 
)
static

Definition at line 1197 of file rpc_transport.c.

1198{
1199 RpcConnection_np *connection = (RpcConnection_np *)conn;
1200
1202}
BOOL WINAPI GetNamedPipeClientProcessId(HANDLE pipe, ULONG *id)
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3837

◆ rpcrt4_ncalrpc_is_authorized()

static BOOL rpcrt4_ncalrpc_is_authorized ( RpcConnection conn)
static

Definition at line 1138 of file rpc_transport.c.

1139{
1140 return FALSE;
1141}

◆ rpcrt4_ncalrpc_np_is_server_listening()

static RPC_STATUS rpcrt4_ncalrpc_np_is_server_listening ( const char endpoint)
static

Definition at line 639 of file rpc_transport.c.

640{
641 char *pipe_name;
643
644 pipe_name = ncalrpc_pipe_name(endpoint);
645 status = is_pipe_listening(pipe_name);
646 I_RpcFree(pipe_name);
647 return status;
648}
static char * ncalrpc_pipe_name(const char *endpoint)

◆ rpcrt4_ncalrpc_open()

static RPC_STATUS rpcrt4_ncalrpc_open ( RpcConnection Connection)
static

Definition at line 433 of file rpc_transport.c.

434{
435 RpcConnection_np *npc = (RpcConnection_np *) Connection;
437 LPSTR pname;
438
439 /* already connected? */
440 if (npc->pipe)
441 return RPC_S_OK;
442
443 pname = ncalrpc_pipe_name(Connection->Endpoint);
444 r = rpcrt4_conn_open_pipe(Connection, pname, TRUE);
446
447 return r;
448}

◆ rpcrt4_ncalrpc_parse_top_of_tower()

static RPC_STATUS rpcrt4_ncalrpc_parse_top_of_tower ( const unsigned char tower_data,
size_t  tower_size,
char **  networkaddr,
char **  endpoint 
)
static

Definition at line 1103 of file rpc_transport.c.

1107{
1108 const twr_empty_floor_t *pipe_floor = (const twr_empty_floor_t *)tower_data;
1109
1110 TRACE("(%p, %d, %p, %p)\n", tower_data, (int)tower_size, networkaddr, endpoint);
1111
1112 if (tower_size < sizeof(*pipe_floor))
1113 return EPT_S_NOT_REGISTERED;
1114
1115 tower_data += sizeof(*pipe_floor);
1116 tower_size -= sizeof(*pipe_floor);
1117
1118 if ((pipe_floor->count_lhs != sizeof(pipe_floor->protid)) ||
1119 (pipe_floor->protid != EPM_PROTOCOL_PIPE) ||
1120 (pipe_floor->count_rhs > tower_size) ||
1121 (tower_data[pipe_floor->count_rhs - 1] != '\0'))
1122 return EPT_S_NOT_REGISTERED;
1123
1124 if (networkaddr)
1125 *networkaddr = NULL;
1126
1127 if (endpoint)
1128 {
1129 *endpoint = I_RpcAllocate(pipe_floor->count_rhs);
1130 if (!*endpoint)
1132 memcpy(*endpoint, tower_data, pipe_floor->count_rhs);
1133 }
1134
1135 return RPC_S_OK;
1136}

◆ rpcrt4_ncalrpc_secure_packet()

static RPC_STATUS rpcrt4_ncalrpc_secure_packet ( RpcConnection conn,
enum secure_packet_direction  dir,
RpcPktHdr hdr,
unsigned int  hdr_size,
unsigned char stub_data,
unsigned int  stub_data_size,
RpcAuthVerifier auth_hdr,
unsigned char auth_value,
unsigned int  auth_value_size 
)
static

Definition at line 1155 of file rpc_transport.c.

1161{
1162 /* since this protocol is local to the machine there is no need to secure
1163 * the packet */
1164 return RPC_S_OK;
1165}

◆ RPCRT4_OpenClientConnection()

RPC_STATUS RPCRT4_OpenClientConnection ( RpcConnection Connection)

Definition at line 3582 of file rpc_transport.c.

3583{
3584 TRACE("(Connection == ^%p)\n", Connection);
3585
3586 assert(!Connection->server);
3587 return Connection->ops->open_connection_client(Connection);
3588}

Referenced by RpcAssoc_GetClientConnection().

◆ rpcrt4_protseq_ncacn_ip_tcp_open_endpoint()

static RPC_STATUS rpcrt4_protseq_ncacn_ip_tcp_open_endpoint ( RpcServerProtseq protseq,
const char endpoint 
)
static

Definition at line 1528 of file rpc_transport.c.

1529{
1531 int sock;
1532 int ret;
1533 struct addrinfo *ai;
1534 struct addrinfo *ai_cur;
1535 struct addrinfo hints;
1536
1537 TRACE("(%p, %s)\n", protseq, endpoint);
1538
1539 hints.ai_flags = AI_PASSIVE /* for non-localhost addresses */;
1540 hints.ai_family = PF_UNSPEC;
1541 hints.ai_socktype = SOCK_STREAM;
1542 hints.ai_protocol = IPPROTO_TCP;
1543 hints.ai_addrlen = 0;
1544 hints.ai_addr = NULL;
1545 hints.ai_canonname = NULL;
1546 hints.ai_next = NULL;
1547
1548 ret = getaddrinfo(NULL, endpoint ? endpoint : "0", &hints, &ai);
1549 if (ret)
1550 {
1551 ERR("getaddrinfo for port %s failed, error %u\n", endpoint, WSAGetLastError());
1552 if ((ret == EAI_SERVICE) || (ret == EAI_NONAME))
1555 }
1556
1557 for (ai_cur = ai; ai_cur; ai_cur = ai_cur->ai_next)
1558 {
1559 RpcConnection_tcp *tcpc;
1560 RPC_STATUS create_status;
1561 struct sockaddr_storage sa;
1562 socklen_t sa_len;
1563 char service[NI_MAXSERV];
1564 u_long nonblocking;
1565
1566 if (ai_cur->ai_family != AF_INET && ai_cur->ai_family != AF_INET6)
1567 {
1568 TRACE("skipping non-IP/IPv6 address family\n");
1569 continue;
1570 }
1571
1572 if (TRACE_ON(rpc))
1573 {
1574 char host[256];
1575 getnameinfo(ai_cur->ai_addr, ai_cur->ai_addrlen,
1576 host, sizeof(host), service, sizeof(service),
1578 TRACE("trying %s:%s\n", host, service);
1579 }
1580
1581 sock = socket(ai_cur->ai_family, ai_cur->ai_socktype, ai_cur->ai_protocol);
1582 if (sock == -1)
1583 {
1584 WARN("socket() failed: %u\n", WSAGetLastError());
1586 continue;
1587 }
1588
1589 ret = bind(sock, ai_cur->ai_addr, ai_cur->ai_addrlen);
1590 if (ret < 0)
1591 {
1592 WARN("bind failed: %u\n", WSAGetLastError());
1596 else
1598 continue;
1599 }
1600
1601 sa_len = sizeof(sa);
1602 if (getsockname(sock, (struct sockaddr *)&sa, &sa_len))
1603 {
1604 WARN("getsockname() failed: %u\n", WSAGetLastError());
1607 continue;
1608 }
1609
1610 ret = getnameinfo((struct sockaddr *)&sa, sa_len,
1611 NULL, 0, service, sizeof(service),
1613 if (ret)
1614 {
1615 WARN("getnameinfo failed, error %u\n", WSAGetLastError());
1618 continue;
1619 }
1620
1621 create_status = RPCRT4_CreateConnection((RpcConnection **)&tcpc, TRUE,
1622 protseq->Protseq, NULL,
1623 service, NULL, NULL, NULL, NULL);
1624 if (create_status != RPC_S_OK)
1625 {
1627 status = create_status;
1628 continue;
1629 }
1630
1631 tcpc->sock = sock;
1632 ret = listen(sock, protseq->MaxCalls);
1633 if (ret < 0)
1634 {
1635 WARN("listen failed: %u\n", WSAGetLastError());
1638 continue;
1639 }
1640 /* need a non-blocking socket, otherwise accept() has a potential
1641 * race-condition (poll() says it is readable, connection drops,
1642 * and accept() blocks until the next connection comes...)
1643 */
1644 nonblocking = 1;
1645 ret = ioctlsocket(sock, FIONBIO, &nonblocking);
1646 if (ret < 0)
1647 {
1648 WARN("couldn't make socket non-blocking, error %d\n", ret);
1651 continue;
1652 }
1653
1654 EnterCriticalSection(&protseq->cs);
1655 list_add_tail(&protseq->listeners, &tcpc->common.protseq_entry);
1656 tcpc->common.protseq = protseq;
1657 LeaveCriticalSection(&protseq->cs);
1658
1659 freeaddrinfo(ai);
1660
1661 /* since IPv4 and IPv6 share the same port space, we only need one
1662 * successful bind to listen for both */
1663 TRACE("listening on %s\n", endpoint);
1664 return RPC_S_OK;
1665 }
1666
1667 freeaddrinfo(ai);
1668 ERR("couldn't listen on port %s\n", endpoint);
1669 return status;
1670}
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
RPC_STATUS RPCRT4_CreateConnection(RpcConnection **Connection, BOOL server, LPCSTR Protseq, LPCSTR NetworkAddr, LPCSTR Endpoint, LPCWSTR NetworkOptions, RpcAuthInfo *AuthInfo, RpcQualityOfService *QOS, LPCWSTR CookieAuth)
INT WSAAPI getsockname(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
Definition: sockctrl.c:213
INT WSAAPI listen(IN SOCKET s, IN INT backlog)
Definition: sockctrl.c:123
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: socklife.c:36
struct _RpcServerProtseq * protseq
Definition: rpc_binding.h:95
struct list listeners
Definition: rpc_server.h:36
CRITICAL_SECTION cs
Definition: rpc_server.h:38
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define RPC_S_INVALID_ENDPOINT_FORMAT
Definition: winerror.h:1373
#define WSAEADDRINUSE
Definition: winerror.h:2864
#define AI_PASSIVE
Definition: ws2def.h:293
#define NI_MAXSERV
Definition: ws2def.h:360
#define EAI_NONAME
Definition: ws2tcpip.h:38
#define EAI_SERVICE
Definition: ws2tcpip.h:39

◆ rpcrt4_protseq_ncacn_np_open_endpoint()

static RPC_STATUS rpcrt4_protseq_ncacn_np_open_endpoint ( RpcServerProtseq protseq,
const char endpoint 
)
static

Definition at line 553 of file rpc_transport.c.

554{
556 RpcConnection *Connection;
557 char generated_endpoint[26];
558
559 if (!endpoint)
560 {
561 static LONG np_nameless_id;
562 DWORD process_id = GetCurrentProcessId();
563 ULONG id = InterlockedExchangeAdd(&np_nameless_id, 1 );
564 snprintf(generated_endpoint, sizeof(generated_endpoint),
565 "\\\\pipe\\\\%08lx.%03lx", process_id, id);
566 endpoint = generated_endpoint;
567 }
568
569 r = RPCRT4_CreateConnection(&Connection, TRUE, protseq->Protseq, NULL,
571 if (r != RPC_S_OK)
572 return r;
573
574#ifdef __REACTOS__
575 ((RpcConnection_np*)Connection)->listen_pipe = ncacn_pipe_name(NULL, Connection->Endpoint);
576#else
577 ((RpcConnection_np*)Connection)->listen_pipe = ncacn_pipe_name(Connection->Endpoint);
578#endif
579 r = rpcrt4_conn_create_pipe(Connection);
580
581 EnterCriticalSection(&protseq->cs);
582 list_add_head(&protseq->listeners, &Connection->protseq_entry);
583 Connection->protseq = protseq;
584 LeaveCriticalSection(&protseq->cs);
585
586 return r;
587}
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
#define InterlockedExchangeAdd
Definition: interlocked.h:196
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
#define snprintf
Definition: wintirpc.h:48

◆ rpcrt4_protseq_ncalrpc_open_endpoint()

static RPC_STATUS rpcrt4_protseq_ncalrpc_open_endpoint ( RpcServerProtseq protseq,
const char endpoint 
)
static

Definition at line 450 of file rpc_transport.c.

451{
453 RpcConnection *Connection;
454 char generated_endpoint[22];
455
456 if (!endpoint)
457 {
458 static LONG lrpc_nameless_id;
459 DWORD process_id = GetCurrentProcessId();
460 ULONG id = InterlockedIncrement(&lrpc_nameless_id);
461 snprintf(generated_endpoint, sizeof(generated_endpoint),
462 "LRPC%08lx.%08lx", process_id, id);
463 endpoint = generated_endpoint;
464 }
465
466 r = RPCRT4_CreateConnection(&Connection, TRUE, protseq->Protseq, NULL,
468 if (r != RPC_S_OK)
469 return r;
470
471 ((RpcConnection_np*)Connection)->listen_pipe = ncalrpc_pipe_name(Connection->Endpoint);
472 r = rpcrt4_conn_create_pipe(Connection);
473
474 EnterCriticalSection(&protseq->cs);
475 list_add_head(&protseq->listeners, &Connection->protseq_entry);
476 Connection->protseq = protseq;
477 LeaveCriticalSection(&protseq->cs);
478
479 return r;
480}

◆ rpcrt4_protseq_np_alloc()

static RpcServerProtseq * rpcrt4_protseq_np_alloc ( void  )
static

Definition at line 936 of file rpc_transport.c.

937{
938 RpcServerProtseq_np *ps = calloc(1, sizeof(*ps));
939 if (ps)
941 return &ps->common;
942}
RpcServerProtseq common

◆ rpcrt4_protseq_np_free_wait_array()

static void rpcrt4_protseq_np_free_wait_array ( RpcServerProtseq protseq,
void array 
)
static

Definition at line 1013 of file rpc_transport.c.

1014{
1015 free(array);
1016}

◆ rpcrt4_protseq_np_get_wait_array()

static void * rpcrt4_protseq_np_get_wait_array ( RpcServerProtseq protseq,
void prev_array,
unsigned int count 
)
static

Definition at line 950 of file rpc_transport.c.

951{
952 HANDLE *objs = prev_array;
953 RpcConnection_np *conn;
955
956 EnterCriticalSection(&protseq->cs);
957
958 /* open and count connections */
959 *count = 1;
960 LIST_FOR_EACH_ENTRY(conn, &protseq->listeners, RpcConnection_np, common.protseq_entry)
961 {
962 if (!conn->pipe && rpcrt4_conn_create_pipe(&conn->common) != RPC_S_OK)
963 continue;
964 if (!conn->listen_event)
965 {
968
969 event = get_np_event(conn);
970 if (!event)
971 continue;
972
974 switch (status)
975 {
976 case STATUS_SUCCESS:
978 conn->io_status.Status = status;
980 break;
981 case STATUS_PENDING:
982 break;
983 default:
984 ERR("pipe listen error %lx\n", status);
985 continue;
986 }
987
988 conn->listen_event = event;
989 }
990 (*count)++;
991 }
992
993 /* make array of connections */
994 objs = realloc(objs, *count * sizeof(HANDLE));
995 if (!objs)
996 {
997 ERR("couldn't allocate objs\n");
998 LeaveCriticalSection(&protseq->cs);
999 return NULL;
1000 }
1001
1002 objs[0] = npps->mgr_event;
1003 *count = 1;
1004 LIST_FOR_EACH_ENTRY(conn, &protseq->listeners, RpcConnection_np, common.protseq_entry)
1005 {
1006 if (conn->listen_event)
1007 objs[(*count)++] = conn->listen_event;
1008 }
1009 LeaveCriticalSection(&protseq->cs);
1010 return objs;
1011}
#define realloc
Definition: debug_ros.c:6
NTSYSAPI NTSTATUS NTAPI NtFsControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
#define FSCTL_PIPE_LISTEN
Definition: pipe.c:63
#define STATUS_PIPE_CONNECTED
Definition: ntstatus.h:508
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define STATUS_SUCCESS
Definition: shellext.h:65
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

◆ rpcrt4_protseq_np_signal_state_changed()

static void rpcrt4_protseq_np_signal_state_changed ( RpcServerProtseq protseq)
static

Definition at line 944 of file rpc_transport.c.

945{
947 SetEvent(npps->mgr_event);
948}

◆ rpcrt4_protseq_np_wait_for_new_connection()

static int rpcrt4_protseq_np_wait_for_new_connection ( RpcServerProtseq protseq,
unsigned int  count,
void wait_array 
)
static

Definition at line 1018 of file rpc_transport.c.

1019{
1020 HANDLE b_handle;
1021 HANDLE *objs = wait_array;
1022 DWORD res;
1023 RpcConnection *cconn = NULL;
1024 RpcConnection_np *conn;
1025
1026 if (!objs)
1027 return -1;
1028
1029 do
1030 {
1031 /* an alertable wait isn't strictly necessary, but due to our
1032 * overlapped I/O implementation in Wine we need to free some memory
1033 * by the file user APC being called, even if no completion routine was
1034 * specified at the time of starting the async operation */
1036 } while (res == WAIT_IO_COMPLETION);
1037
1038 if (res == WAIT_OBJECT_0)
1039 return 0;
1040 else if (res == WAIT_FAILED)
1041 {
1042 ERR("wait failed with error %ld\n", GetLastError());
1043 return -1;
1044 }
1045 else
1046 {
1047 b_handle = objs[res - WAIT_OBJECT_0];
1048 /* find which connection got a RPC */
1049 EnterCriticalSection(&protseq->cs);
1050 LIST_FOR_EACH_ENTRY(conn, &protseq->listeners, RpcConnection_np, common.protseq_entry)
1051 {
1052 if (b_handle == conn->listen_event)
1053 {
1054 release_np_event(conn, conn->listen_event);
1055 conn->listen_event = NULL;
1057 cconn = rpcrt4_spawn_connection(&conn->common);
1058 else
1059 ERR("listen failed %lx\n", conn->io_status.Status);
1060 break;
1061 }
1062 }
1063 LeaveCriticalSection(&protseq->cs);
1064 if (!cconn)
1065 {
1066 ERR("failed to locate connection for handle %p\n", b_handle);
1067 return -1;
1068 }
1069 RPCRT4_new_client(cconn);
1070 return 1;
1071 }
1072}
GLuint res
Definition: glext.h:9613
void RPCRT4_new_client(RpcConnection *conn)
Definition: rpc_server.c:626
static RpcConnection * rpcrt4_spawn_connection(RpcConnection *old_connection)
DWORD WINAPI WaitForMultipleObjectsEx(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:169
#define WAIT_IO_COMPLETION
Definition: winbase.h:388
#define WAIT_OBJECT_0
Definition: winbase.h:383
#define WAIT_FAILED
Definition: winbase.h:390

◆ rpcrt4_protseq_sock_alloc()

static RpcServerProtseq * rpcrt4_protseq_sock_alloc ( void  )
static

Definition at line 1818 of file rpc_transport.c.

1819{
1820 RpcServerProtseq_sock *ps = calloc(1, sizeof(*ps));
1821 if (ps)
1822 {
1823 static BOOL wsa_inited;
1824 if (!wsa_inited)
1825 {
1826 WSADATA wsadata;
1827 WSAStartup(MAKEWORD(2, 2), &wsadata);
1828 /* Note: WSAStartup can be called more than once so we don't bother with
1829 * making accesses to wsa_inited thread-safe */
1830 wsa_inited = TRUE;
1831 }
1833 }
1834 return &ps->common;
1835}
RpcServerProtseq common

◆ rpcrt4_protseq_sock_free_wait_array()

static void rpcrt4_protseq_sock_free_wait_array ( RpcServerProtseq protseq,
void array 
)
static

Definition at line 1888 of file rpc_transport.c.

1889{
1890 free(array);
1891}

◆ rpcrt4_protseq_sock_get_wait_array()

static void * rpcrt4_protseq_sock_get_wait_array ( RpcServerProtseq protseq,
void prev_array,
unsigned int count 
)
static

Definition at line 1843 of file rpc_transport.c.

1844{
1845 HANDLE *objs = prev_array;
1846 RpcConnection_tcp *conn;
1848
1849 EnterCriticalSection(&protseq->cs);
1850
1851 /* open and count connections */
1852 *count = 1;
1853 LIST_FOR_EACH_ENTRY(conn, &protseq->listeners, RpcConnection_tcp, common.protseq_entry)
1854 {
1855 if (conn->sock != -1)
1856 (*count)++;
1857 }
1858
1859 /* make array of connections */
1860 objs = realloc(objs, *count * sizeof(HANDLE));
1861 if (!objs)
1862 {
1863 ERR("couldn't allocate objs\n");
1864 LeaveCriticalSection(&protseq->cs);
1865 return NULL;
1866 }
1867
1868 objs[0] = sockps->mgr_event;
1869 *count = 1;
1870 LIST_FOR_EACH_ENTRY(conn, &protseq->listeners, RpcConnection_tcp, common.protseq_entry)
1871 {
1872 if (conn->sock != -1)
1873 {
1874 int res = WSAEventSelect(conn->sock, conn->sock_event, FD_ACCEPT);
1875 if (res == SOCKET_ERROR)
1876 ERR("WSAEventSelect() failed with error %d\n", WSAGetLastError());
1877 else
1878 {
1879 objs[*count] = conn->sock_event;
1880 (*count)++;
1881 }
1882 }
1883 }
1884 LeaveCriticalSection(&protseq->cs);
1885 return objs;
1886}
INT WSAAPI WSAEventSelect(IN SOCKET s, IN WSAEVENT hEventObject, IN LONG lNetworkEvents)
Definition: select.c:182
#define SOCKET_ERROR
Definition: winsock.h:327
#define FD_ACCEPT
Definition: winsock.h:402

◆ rpcrt4_protseq_sock_signal_state_changed()

static void rpcrt4_protseq_sock_signal_state_changed ( RpcServerProtseq protseq)
static

Definition at line 1837 of file rpc_transport.c.

1838{
1840 SetEvent(sockps->mgr_event);
1841}

◆ rpcrt4_protseq_sock_wait_for_new_connection()

static int rpcrt4_protseq_sock_wait_for_new_connection ( RpcServerProtseq protseq,
unsigned int  count,
void wait_array 
)
static

Definition at line 1893 of file rpc_transport.c.

1894{
1895 HANDLE b_handle;
1896 HANDLE *objs = wait_array;
1897 DWORD res;
1898 RpcConnection *cconn = NULL;
1899 RpcConnection_tcp *conn;
1900
1901 if (!objs)
1902 return -1;
1903
1904 do
1905 {
1906 /* an alertable wait isn't strictly necessary, but due to our
1907 * overlapped I/O implementation in Wine we need to free some memory
1908 * by the file user APC being called, even if no completion routine was
1909 * specified at the time of starting the async operation */
1911 } while (res == WAIT_IO_COMPLETION);
1912
1913 if (res == WAIT_OBJECT_0)
1914 return 0;
1915 if (res == WAIT_FAILED)
1916 {
1917 ERR("wait failed with error %ld\n", GetLastError());
1918 return -1;
1919 }
1920
1921 b_handle = objs[res - WAIT_OBJECT_0];
1922
1923 /* find which connection got a RPC */
1924 EnterCriticalSection(&protseq->cs);
1925 LIST_FOR_EACH_ENTRY(conn, &protseq->listeners, RpcConnection_tcp, common.protseq_entry)
1926 {
1927 if (b_handle == conn->sock_event)
1928 {
1929 cconn = rpcrt4_spawn_connection(&conn->common);
1930 break;
1931 }
1932 }
1933 LeaveCriticalSection(&protseq->cs);
1934 if (!cconn)
1935 {
1936 ERR("failed to locate connection for handle %p\n", b_handle);
1937 return -1;
1938 }
1939
1940 RPCRT4_new_client(cconn);
1941 return 1;
1942}

◆ RPCRT4_ReleaseConnection()

void RPCRT4_ReleaseConnection ( RpcConnection connection)

Definition at line 3689 of file rpc_transport.c.

3690{
3691 LONG ref;
3692
3693 /* protseq stores a list of active connections, but does not own references to them.
3694 * It may need to grab a connection from the list, which could lead to a race if
3695 * connection is being released, but not yet removed from the list. We handle that
3696 * by synchronizing on CS here. */
3697 if (connection->protseq)
3698 {
3699 EnterCriticalSection(&connection->protseq->cs);
3700 ref = InterlockedDecrement(&connection->ref);
3701 if (!ref)
3702 list_remove(&connection->protseq_entry);
3703 LeaveCriticalSection(&connection->protseq->cs);
3704 }
3705 else
3706 {
3707 ref = InterlockedDecrement(&connection->ref);
3708 }
3709
3710 TRACE("%p ref=%lu\n", connection, ref);
3711
3712 if (!ref)
3713 {
3714 RPCRT4_CloseConnection(connection);
3715 free(connection->Endpoint);
3716 free(connection->NetworkAddr);
3717 free(connection->NetworkOptions);
3718 free(connection->CookieAuth);
3719 if (connection->AuthInfo) RpcAuthInfo_Release(connection->AuthInfo);
3720 if (connection->QOS) RpcQualityOfService_Release(connection->QOS);
3721
3722 /* server-only */
3723 if (connection->server_binding) RPCRT4_ReleaseBinding(connection->server_binding);
3724 else if (connection->assoc) RpcAssoc_ConnectionReleased(connection->assoc);
3725
3726 if (connection->wait_release) SetEvent(connection->wait_release);
3727
3728 free(connection);
3729 }
3730}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
void RpcAssoc_ConnectionReleased(RpcAssoc *assoc)
Definition: rpc_assoc.c:447
ULONG RpcAuthInfo_Release(RpcAuthInfo *AuthInfo)
Definition: rpc_binding.c:1170
RPC_STATUS RPCRT4_ReleaseBinding(RpcBinding *Binding)
Definition: rpc_binding.c:237
ULONG RpcQualityOfService_Release(RpcQualityOfService *qos)
Definition: rpc_binding.c:1347
RPC_STATUS RPCRT4_CloseConnection(RpcConnection *Connection)
struct _RpcBinding * server_binding
Definition: rpc_binding.h:96

Referenced by I_RpcReceive(), I_RpcSend(), RpcAssoc_GetClientConnection(), RpcAssoc_Release(), RPCRT4_CloseBinding(), rpcrt4_conn_release_and_wait(), RPCRT4_io_thread(), RPCRT4_new_client(), rpcrt4_protseq_ncacn_ip_tcp_open_endpoint(), and RPCRT4_worker_thread().

◆ rpcrt4_sock_wait_for_recv()

static BOOL rpcrt4_sock_wait_for_recv ( RpcConnection_tcp tcpc)
static

Definition at line 1386 of file rpc_transport.c.

1387{
1388 HANDLE wait_handles[2];
1389 DWORD res;
1391 {
1392 ERR("WSAEventSelect() failed with error %d\n", WSAGetLastError());
1393 return FALSE;
1394 }
1395 wait_handles[0] = tcpc->sock_event;
1396 wait_handles[1] = tcpc->cancel_event;
1397 res = WaitForMultipleObjects(2, wait_handles, FALSE, INFINITE);
1398 switch (res)
1399 {
1400 case WAIT_OBJECT_0:
1401 return TRUE;
1402 case WAIT_OBJECT_0 + 1:
1403 return FALSE;
1404 default:
1405 ERR("WaitForMultipleObjects() failed with error %ld\n", GetLastError());
1406 return FALSE;
1407 }
1408}
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
#define FD_READ
Definition: winsock.h:399
#define FD_CLOSE
Definition: winsock.h:404

Referenced by rpcrt4_conn_tcp_read(), and rpcrt4_conn_tcp_wait_for_incoming_data().

◆ rpcrt4_sock_wait_for_send()

static BOOL rpcrt4_sock_wait_for_send ( RpcConnection_tcp tcpc)
static

Definition at line 1410 of file rpc_transport.c.

1411{
1412 DWORD res;
1414 {
1415 ERR("WSAEventSelect() failed with error %d\n", WSAGetLastError());
1416 return FALSE;
1417 }
1419 switch (res)
1420 {
1421 case WAIT_OBJECT_0:
1422 return TRUE;
1423 default:
1424 ERR("WaitForMultipleObjects() failed with error %ld\n", GetLastError());
1425 return FALSE;
1426 }
1427}
#define FD_WRITE
Definition: winsock.h:400

Referenced by rpcrt4_conn_tcp_write().

◆ rpcrt4_sock_wait_init()

static BOOL rpcrt4_sock_wait_init ( RpcConnection_tcp tcpc)
static

Definition at line 1364 of file rpc_transport.c.

1365{
1366 static BOOL wsa_inited;
1367 if (!wsa_inited)
1368 {
1369 WSADATA wsadata;
1370 WSAStartup(MAKEWORD(2, 2), &wsadata);
1371 /* Note: WSAStartup can be called more than once so we don't bother with
1372 * making accesses to wsa_inited thread-safe */
1373 wsa_inited = TRUE;
1374 }
1377 if (!tcpc->sock_event || !tcpc->cancel_event)
1378 {
1379 ERR("event creation failed\n");
1380 if (tcpc->sock_event) CloseHandle(tcpc->sock_event);
1381 return FALSE;
1382 }
1383 return TRUE;
1384}

Referenced by rpcrt4_conn_tcp_alloc().

◆ rpcrt4_spawn_connection()

static RpcConnection * rpcrt4_spawn_connection ( RpcConnection old_connection)
static

Definition at line 3644 of file rpc_transport.c.

3645{
3646 RpcConnection *connection;
3648
3649 err = RPCRT4_CreateConnection(&connection, old_connection->server, rpcrt4_conn_get_name(old_connection),
3650 old_connection->NetworkAddr, old_connection->Endpoint, NULL,
3651 old_connection->AuthInfo, old_connection->QOS, old_connection->CookieAuth);
3652 if (err != RPC_S_OK)
3653 return NULL;
3654
3655 rpcrt4_conn_handoff(old_connection, connection);
3656 if (old_connection->protseq)
3657 {
3658 EnterCriticalSection(&old_connection->protseq->cs);
3659 connection->protseq = old_connection->protseq;
3660 list_add_tail(&old_connection->protseq->connections, &connection->protseq_entry);
3661 LeaveCriticalSection(&old_connection->protseq->cs);
3662 }
3663 return connection;
3664}
static const char * rpcrt4_conn_get_name(const RpcConnection *Connection)
Definition: rpc_binding.h:179
static RPC_STATUS rpcrt4_conn_handoff(RpcConnection *old_conn, RpcConnection *new_conn)
Definition: rpc_binding.h:211

Referenced by rpcrt4_protseq_np_wait_for_new_connection(), and rpcrt4_protseq_sock_wait_for_new_connection().

◆ RpcTransport_GetTopOfTower()

RPC_STATUS RpcTransport_GetTopOfTower ( unsigned char tower_data,
size_t tower_size,
const char protseq,
const char networkaddr,
const char endpoint 
)

Definition at line 3746 of file rpc_transport.c.

3751{
3752 twr_empty_floor_t *protocol_floor;
3754
3755 *tower_size = 0;
3756
3757 if (!protseq_ops)
3759
3760 if (!tower_data)
3761 {
3762 *tower_size = sizeof(*protocol_floor);
3763 *tower_size += protseq_ops->get_top_of_tower(NULL, networkaddr, endpoint);
3764 return RPC_S_OK;
3765 }
3766
3767 protocol_floor = (twr_empty_floor_t *)tower_data;
3768 protocol_floor->count_lhs = sizeof(protocol_floor->protid);
3769 protocol_floor->protid = protseq_ops->epm_protocols[0];
3770 protocol_floor->count_rhs = 0;
3771
3772 tower_data += sizeof(*protocol_floor);
3773
3774 *tower_size = protseq_ops->get_top_of_tower(tower_data, networkaddr, endpoint);
3775 if (!*tower_size)
3776 return EPT_S_NOT_REGISTERED;
3777
3778 *tower_size += sizeof(*protocol_floor);
3779
3780 return RPC_S_OK;
3781}

Referenced by TowerConstruct().

◆ RpcTransport_ParseTopOfTower()

RPC_STATUS RpcTransport_ParseTopOfTower ( const unsigned char tower_data,
size_t  tower_size,
char **  protseq,
char **  networkaddr,
char **  endpoint 
)

Definition at line 3783 of file rpc_transport.c.

3788{
3789 const twr_empty_floor_t *protocol_floor;
3790 const twr_empty_floor_t *floor4;
3791 const struct connection_ops *protseq_ops = NULL;
3793 unsigned int i;
3794
3795 if (tower_size < sizeof(*protocol_floor))
3796 return EPT_S_NOT_REGISTERED;
3797
3798 protocol_floor = (const twr_empty_floor_t *)tower_data;
3799 tower_data += sizeof(*protocol_floor);
3800 tower_size -= sizeof(*protocol_floor);
3801 if ((protocol_floor->count_lhs != sizeof(protocol_floor->protid)) ||
3802 (protocol_floor->count_rhs > tower_size))
3803 return EPT_S_NOT_REGISTERED;
3804 tower_data += protocol_floor->count_rhs;
3805 tower_size -= protocol_floor->count_rhs;
3806
3807 floor4 = (const twr_empty_floor_t *)tower_data;
3808 if ((tower_size < sizeof(*floor4)) ||
3809 (floor4->count_lhs != sizeof(floor4->protid)))
3810 return EPT_S_NOT_REGISTERED;
3811
3812 for(i = 0; i < ARRAY_SIZE(conn_protseq_list); i++)
3813 if ((protocol_floor->protid == conn_protseq_list[i].epm_protocols[0]) &&
3814 (floor4->protid == conn_protseq_list[i].epm_protocols[1]))
3815 {
3817 break;
3818 }
3819
3820 if (!protseq_ops)
3821 return EPT_S_NOT_REGISTERED;
3822
3823 status = protseq_ops->parse_top_of_tower(tower_data, tower_size, networkaddr, endpoint);
3824
3825 if ((status == RPC_S_OK) && protseq)
3826 {
3827 *protseq = I_RpcAllocate(strlen(protseq_ops->name) + 1);
3828 strcpy(*protseq, protseq_ops->name);
3829 }
3830
3831 return status;
3832}
const char * name
Definition: rpc_server.h:50

Referenced by TowerExplode().

◆ send_echo_request()

static RPC_STATUS send_echo_request ( HINTERNET  req,
RpcHttpAsyncData async_data,
HANDLE  cancel_event 
)
static

Definition at line 2355 of file rpc_transport.c.

2356{
2357 BYTE buf[20];
2358 BOOL ret;
2360
2361 TRACE("sending echo request to server\n");
2362
2363 prepare_async_request(async_data);
2364 ret = HttpSendRequestW(req, NULL, 0, NULL, 0);
2365 status = wait_async_request(async_data, ret, cancel_event);
2366 if (status != RPC_S_OK) return status;
2367
2369 if (status != RPC_S_OK) return status;
2370
2371 rpcrt4_http_async_read(req, async_data, cancel_event, buf, sizeof(buf));
2372 /* FIXME: do something with retrieved data */
2373
2374 return RPC_S_OK;
2375}

Referenced by rpcrt4_http_prepare_in_pipe(), and rpcrt4_http_prepare_out_pipe().

◆ set_auth_cookie()

static RPC_STATUS set_auth_cookie ( RpcConnection_http httpc,
const WCHAR value 
)
static

Definition at line 2997 of file rpc_transport.c.

2998{
2999 static WCHAR httpW[] = L"http";
3000 static WCHAR httpsW[] = L"https";
3001 URL_COMPONENTSW uc;
3002 DWORD len;
3003 WCHAR *url;
3004 BOOL ret;
3005
3006 if (!value) return RPC_S_OK;
3007
3008 uc.dwStructSize = sizeof(uc);
3009 uc.lpszScheme = is_secure(httpc) ? httpsW : httpW;
3010 uc.dwSchemeLength = 0;
3011 uc.lpszHostName = httpc->servername;
3012 uc.dwHostNameLength = 0;
3013 uc.nPort = 0;
3014 uc.lpszUserName = NULL;
3015 uc.dwUserNameLength = 0;
3016 uc.lpszPassword = NULL;
3017 uc.dwPasswordLength = 0;
3018 uc.lpszUrlPath = NULL;
3019 uc.dwUrlPathLength = 0;
3020 uc.lpszExtraInfo = NULL;
3021 uc.dwExtraInfoLength = 0;
3022
3025
3026 if (!(url = malloc(len))) return RPC_S_OUT_OF_MEMORY;
3027
3028 len = len / sizeof(WCHAR) - 1;
3029 if (!InternetCreateUrlW(&uc, 0, url, &len))
3030 {
3031 free(url);
3033 }
3034
3036 free(url);
3037 if (!ret) return RPC_S_SERVER_UNAVAILABLE;
3038
3039 return RPC_S_OK;
3040}
BOOL WINAPI InternetCreateUrlW(LPURL_COMPONENTSW lpUrlComponents, DWORD dwFlags, LPWSTR lpszUrl, LPDWORD lpdwUrlLength)
Definition: internet.c:4425
static const WCHAR httpW[]
Definition: assoc.c:94
DWORD dwStructSize
Definition: wininet.h:211
DWORD dwUrlPathLength
Definition: wininet.h:223
DWORD dwExtraInfoLength
Definition: wininet.h:225
LPWSTR lpszPassword
Definition: wininet.h:220
LPWSTR lpszHostName
Definition: wininet.h:215
DWORD dwUserNameLength
Definition: wininet.h:219
DWORD dwHostNameLength
Definition: wininet.h:216
LPWSTR lpszScheme
Definition: wininet.h:212
LPWSTR lpszUserName
Definition: wininet.h:218
LPWSTR lpszUrlPath
Definition: wininet.h:222
LPWSTR lpszExtraInfo
Definition: wininet.h:224
DWORD dwPasswordLength
Definition: wininet.h:221
INTERNET_PORT nPort
Definition: wininet.h:217
DWORD dwSchemeLength
Definition: wininet.h:213
Definition: pdh_main.c:96
BOOL WINAPI InternetSetCookieW(const WCHAR *url, const WCHAR *name, const WCHAR *data)
Definition: cookie.c:1122

Referenced by rpcrt4_ncacn_http_open().

◆ wait_async_request()

static RPC_STATUS wait_async_request ( RpcHttpAsyncData async_data,
BOOL  call_ret,
HANDLE  cancel_event 
)
static

Definition at line 1997 of file rpc_transport.c.

1998{
1999 HANDLE handles[2] = { async_data->completion_event, cancel_event };
2000 DWORD res;
2001
2002 if(call_ret) {
2003 RpcHttpAsyncData_Release(async_data);
2004 return RPC_S_OK;
2005 }
2006
2008 RpcHttpAsyncData_Release(async_data);
2009 ERR("Request failed with error %ld\n", GetLastError());
2011 }
2012
2014 if(res != WAIT_OBJECT_0) {
2015 TRACE("Cancelled\n");
2016 return RPC_S_CALL_CANCELLED;
2017 }
2018
2019 if(async_data->async_result) {
2020 ERR("Async request failed with error %d\n", async_data->async_result);
2022 }
2023
2024 return RPC_S_OK;
2025}
#define ERROR_IO_PENDING
Definition: dderror.h:15
#define DEFAULT_NCACN_HTTP_TIMEOUT
Definition: rpc_transport.c:54
static EFI_HANDLE * handles
Definition: uefidisk.c:62

Referenced by authorize_request(), rpcrt4_http_async_read(), rpcrt4_http_prepare_in_pipe(), rpcrt4_http_prepare_out_pipe(), rpcrt4_ncacn_http_wait_for_incoming_data(), and send_echo_request().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( rpc  )

Variable Documentation

◆ 

const struct { ... } auth_schemes[]
Initial value:
=
{
{ L"Basic", ARRAY_SIZE(L"Basic") - 1, RPC_C_HTTP_AUTHN_SCHEME_BASIC },
{ L"NTLM", ARRAY_SIZE(L"NTLM") - 1, RPC_C_HTTP_AUTHN_SCHEME_NTLM },
{ L"Passport", ARRAY_SIZE(L"Passport") - 1, RPC_C_HTTP_AUTHN_SCHEME_PASSPORT },
{ L"Digest", ARRAY_SIZE(L"Digest") - 1, RPC_C_HTTP_AUTHN_SCHEME_DIGEST },
{ L"Negotiate", ARRAY_SIZE(L"Negotiate") - 1, RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE }
}
#define RPC_C_HTTP_AUTHN_SCHEME_PASSPORT
Definition: rpcdce.h:207
#define RPC_C_HTTP_AUTHN_SCHEME_DIGEST
Definition: rpcdce.h:208

Referenced by auth_scheme_from_header().

◆ conn_protseq_list

const struct connection_ops conn_protseq_list[]
static

Definition at line 3435 of file rpc_transport.c.

Referenced by rpcrt4_get_conn_protseq_ops(), and RpcTransport_ParseTopOfTower().

◆ len

◆ protseq_list

const struct protseq_ops protseq_list[]
static
Initial value:
=
{
{
"ncacn_np",
},
{
"ncalrpc",
},
{
"ncacn_ip_tcp",
},
}
static void * rpcrt4_protseq_sock_get_wait_array(RpcServerProtseq *protseq, void *prev_array, unsigned int *count)
static void rpcrt4_protseq_np_free_wait_array(RpcServerProtseq *protseq, void *array)
static int rpcrt4_protseq_sock_wait_for_new_connection(RpcServerProtseq *protseq, unsigned int count, void *wait_array)
static RpcServerProtseq * rpcrt4_protseq_np_alloc(void)
static RPC_STATUS rpcrt4_protseq_ncalrpc_open_endpoint(RpcServerProtseq *protseq, const char *endpoint)
static void * rpcrt4_protseq_np_get_wait_array(RpcServerProtseq *protseq, void *prev_array, unsigned int *count)
static void rpcrt4_protseq_sock_free_wait_array(RpcServerProtseq *protseq, void *array)
static RPC_STATUS rpcrt4_protseq_ncacn_ip_tcp_open_endpoint(RpcServerProtseq *protseq, const char *endpoint)
static int rpcrt4_protseq_np_wait_for_new_connection(RpcServerProtseq *protseq, unsigned int count, void *wait_array)
static RpcServerProtseq * rpcrt4_protseq_sock_alloc(void)
static void rpcrt4_protseq_sock_signal_state_changed(RpcServerProtseq *protseq)
static void rpcrt4_protseq_np_signal_state_changed(RpcServerProtseq *protseq)
static RPC_STATUS rpcrt4_protseq_ncacn_np_open_endpoint(RpcServerProtseq *protseq, const char *endpoint)

Definition at line 3531 of file rpc_transport.c.

Referenced by RpcNetworkInqProtseqsA(), RpcNetworkInqProtseqsW(), and rpcrt4_get_protseq_ops().

◆ scheme

DWORD scheme

Definition at line 2698 of file rpc_transport.c.

Referenced by ActivateThemeFile(), ApplyScheme(), BackgroundCopyJob_RemoveCredentials(), cache_authorization(), calc_url_length(), compose_request_url(), CRYPT_GetRetrieveFunction(), do_authorization(), DrawThemePreview(), encode_auth_data(), FileProtocol_StartEx(), FtpProtocol_StartEx(), generate_security_id(), get_authvalue(), get_protocol_handler(), get_scheme(), get_scheme_code(), get_scheme_string(), get_slash_dir(), get_url_length(), get_zone_from_domains(), HttpProtocol_StartEx(), index_from_scheme(), InitColorButtons(), insert_authorization_header(), INTERNET_GetSchemeString(), InternetCrackUrlA(), InternetCrackUrlW_test(), InternetCreateUrlW(), is_urlmon_protocol(), LoadCurrentScheme(), LoadSchemeFromReg(), LoadSchemeFromTheme(), map_security_uri_to_zone(), MIDIMAP_LoadSettingsScheme(), MkProtocol_StartEx(), MyDrawCaptionButtons(), MyDrawCaptionTemp(), MyDrawEdge(), MyDrawFrameButton(), MyDrawFrameCaption(), MyDrawFrameControl(), MyDrawFrameScroll(), MyDrawMenuBarTemp(), MyDrawScrollbar(), MyIntDrawRectEdge(), NotConfigured(), nsProtocolHandler_AllowPort(), nsURI_GetScheme(), nsURI_SchemeIs(), nsURI_SetScheme(), OnCreate(), OnPaint(), ParseURLA(), PowerEnumerate(), PowerReadACValueIndex(), PowerReadDCValueIndex(), PowerWriteACValueIndex(), PowerWriteDCValueIndex(), retrieve_cached_authorization(), rewrite_url(), scheme_char_is_dot_separator(), scheme_char_is_hostname_separator(), scheme_char_is_separator(), scheme_is_always_relative(), scheme_is_opaque(), scheme_preserves_backslashes(), scheme_uses_hostname(), SchemeGetFont(), SchemeGetMetric(), SchemeSetMetric(), set_request_credentials(), CUIFObject::SetScheme(), super_navigate(), test_colors(), TIFFFindCODEC(), TIFFInitDumpMode(), TIFFIsCODECConfigured(), TIFFRegisterCODEC(), TIFFSetCompressionScheme(), UpdatePreviewTheme(), UrlGetPartW(), uses_default_port(), WinHttpCrackUrl(), WinHttpCrackUrl_test(), WinHttpCreateUrl(), WMCheckURLScheme(), and xmlBufSetAllocationScheme().

◆ str

const WCHAR* str

Definition at line 2696 of file rpc_transport.c.

Referenced by __adjust_float_buffer(), __convert_float_buffer(), __declspec(), __do_widen(), __insert_grouping(), __STRINGTOLD(), __wcserror(), __wcserror_s(), _atoldbl(), _bstr_(), _BSTR_CY(), _BSTR_DATE(), _BSTR_DEC(), _CDataObject_CreateInstance(), _check_ws_ignored(), _check_ws_preserved(), _cputs(), _doc_get_elems_by_name(), _dump_DIDEVCAPS(), _dwarfnametounit(), _elem_fire_event(), _enumeratorRememberedW(), _get_disp_id(), _get_elem_attr_node(), _get_elem_id(), _i64toa_s(), _i64tow_s(), _insert_adjacent_elem(), _ismbslead(), _ismbstrail(), _ItemizeInternal(), _itoa_s(), _itow_s(), _link_put_href(), _link_put_rel(), _link_put_rev(), _link_put_type(), _ltoa_s(), _ltow_s(), _mbsbtype(), _mbschr(), _mbscpy(), _mbsdec(), _mbslen(), _mbsnbcnt(), _mbsnccnt(), _mbsnextc(), _mbsninc(), _mbsrchr(), _mbsrchr_l(), _mbstrlen(), _mbtowc_l(), _parse_script_a(), _reader_name(), _reader_namespace(), _reader_prefix(), _reader_qname(), _reader_value(), _Return_type_success_(), _set_body_scroll(), _set_button_name(), _set_dispex_value(), _set_elem_language(), _set_object_name(), _set_style_filter(), _set_stylesheet_csstext(), _set_text_data(), _set_text_decoration(), _set_window_name(), _set_window_status(), _strdup(), _strerror(), _Strftime(), _strinc(), _strncnt(), _strnextc(), _strninc(), _strupr_s(), _strxspn(), _tcslen(), _tcsnlen(), _test_anchor_get_target(), _test_anchor_hash(), _test_anchor_hostname(), _test_anchor_href(), _test_anchor_name(), _test_anchor_put_href(), _test_anchor_put_name(), _test_anchor_put_rel(), _test_anchor_put_search(), _test_anchor_put_target(), _test_anchor_rel(), _test_anchor_search(), _test_attr_node_name(), _test_body_scroll(), _test_bstr_var(), _test_button_name(), _test_compatmode(), _test_current_style_filter(), _test_elem_set_innertext(), _test_event_qualifier(), _test_event_type(), _test_framebase_name(), _test_framebase_put_name(), _test_framebase_src(), _test_input_defaultValue(), _test_input_put_defaultValue(), _test_link_media(), _test_object_name(), _test_range_paste_html(), _test_range_set_end_point(), _test_script_text(), _test_style_filter(), _test_style_put_media(), _test_style_put_type(), _test_style_remove_attribute(), _test_stylesheet_csstext(), _test_text_data(), _test_text_decoration(), _text_append_data(), _tmain(), _ttoi(), _tzset(), _ui64toa_s(), _ui64tow_s(), _variantbstr_(), _vsnprintf(), _vsnprintf_s_wrapper(), _vsnwprintf_s_wrapper(), _vsnwprintf_wrapper(), _vsprintf_p_wrapper(), _vswprintf_c_l_wrapper(), _vswprintf_c_wrapper(), _vswprintf_l_wrapper(), _vswprintf_p_l_wrapper(), _vswprintf_wrapper(), _wcsdup(), _wcslwr_s(), _wcsnset(), _wcsrev(), _wcsset(), _wcsupr_s(), _wgetenv(), _wtof(), _wtoi64(), _wtoi64_l(), _wtol(), a2bstr(), a2co(), a2w(), AccPropServices_SetHmenuPropStr(), AccPropServices_SetHwndPropStr(), ActionDlg_OnBrowse(), add_bstr_property(), add_cert_to_list(), add_cert_to_view(), add_comserver_record(), add_dynamic_var(), add_ifaceps_record(), add_local_oid_text_to_control(), add_progid_record(), add_ruler_units(), add_store_certs(), add_string(), add_string_resource_to_control(), add_string_resource_with_paraformat_to_control(), add_undo_insert_run(), ATL::CPathT< StringType >::AddBackslash(), AddDllDirectory(), AddEntryToList(), ATL::CPathT< StringType >::AddExtension(), AddrToAddrStr(), afm_parser_read_vals(), afm_stream_read_one(), afm_stream_read_string(), alloc_bstr_arg(), alloc_str_from_narrow(), AllocStringA(), AllocStringW(), ATL::CPathT< StringType >::Append(), append_simple_quote(), append_str(), append_string(), append_string_len(), areBlanks(), areinclass(), argvtosT(), Array_unshift(), ask_confirm(), ask_overwrite_value(), asprintf(), assembly_dup_str(), AssocQueryStringA(), AssocQueryStringByKeyA(), AssocQueryStringByKeyW(), AssocQueryStringW(), ata_mode_to_str(), ata_str_to_mode(), atoiW(), atol(), atolW(), atowstr(), attr_to_eid(), auth_scheme_from_header(), AVICompressorPropertyBag_Load(), AVIFILE_LoadFile(), AVIFILE_SaveFile(), BaseGetNamedObjectDirectory(), basic_tests(), CEnumMergedFolder::Begin(), BrFolder_GetName(), bstr_from_str(), bstr_to_nsacstr(), buffer_to_string(), build_ascii_request(), build_clr_surrogate_section(), build_dllredirect_section(), build_tlib_section(), build_wndclass_section(), ATL::CPathT< StringType >::BuildRoot(), Builtin_Invoke(), Pane::calc_tabbed_width(), Pane::calc_width(), call_enum_date_func(), ATL::CPathT< StringType >::Canonicalize(), cb(), ATL::CComVariant::CComVariant(), cert_mgr_show_cert_usages(), CertStrToNameW(), CFn_WMCommand(), CharLowerA(), CharLowerBuffA(), CharLowerBuffW(), CharLowerW(), CharUpperA(), CharUpperBuffA(), CharUpperBuffW(), CharUpperW(), check_bstr_length(), check_display_name_(), check_dropdown_(), NumPutGetTest::check_get_float(), check_jscript(), check_lnk_(), check_vertical_font(), checkeql(), chk_chr(), chop_blank(), ClassTest(), cleanup(), ClearCommandLine(), clnt_spcreateerror(), clnt_sperror(), CLRRuntimeHost_ExecuteInDefaultAppDomain(), cmdid_from_string(), co_strdupAtoW(), co_strdupW(), co_strdupWtoA(), ATL::CPathT< StringType >::Combine(), COMBOEX_FindStringExact(), COMBOEX_GetListboxText(), ATL::CPathT< StringType >::CompactPath(), ATL::CPathT< StringType >::CompactPathEx(), compare_cert_by_name_str(), compare_menu_data(), compare_query_(), compiler_alloc_bstr(), compiler_alloc_bstr_len(), compiler_alloc_string(), compiler_alloc_string_len(), CompleteFilename(), construct_function(), consume_if(), consume_if_equals(), consume_one(), context_dump_fbo_attachment(), convert_bios_date(), convert_from_unicode(), convert_hex_csv_to_hex(), convert_hex_to_dword(), convert_str(), convert_str_to_blob(), convert_to_unicode(), convertHexCSVToHex(), convertHexToDWord(), convertHexToDWORDStr(), convertHexToHexCSV(), cookie_set_to_string(), copy_filename_WtoA(), CountParts(), create_command(), create_doc(), create_doc_with_string(), create_key(), create_lnk_(), create_match_array(), create_menu_from_data(), create_menuitem_from_data(), create_nsfile(), create_regexp(), create_registrar(), create_string(), create_subkey(), create_system_dirid(), CResourceTypeNode::CResourceTypeNode(), CRYPT_ANSIToUnicode(), CRYPT_AsnDecodeBMPString(), CRYPT_AsnDecodeIA5String(), CRYPT_AsnDecodeNameValueInternal(), CRYPT_AsnDecodeOidIgnoreTag(), CRYPT_AsnDecodeUnicodeNameValueInternal(), CRYPT_AsnDecodeUnicodeString(), CRYPT_AsnEncodeBMPString(), CRYPT_AsnEncodeIA5String(), CRYPT_AsnEncodeNumericString(), CRYPT_AsnEncodePrintableString(), CRYPT_AsnEncodeStringCoerce(), CRYPT_AsnEncodeUnicodeStringCoerce(), CRYPT_AsnEncodeUniversalString(), CRYPT_AsnEncodeUTF8String(), crypt_format_extension(), CRYPT_FormatAltNameEntry(), CRYPT_FormatAltNameInfo(), CRYPT_FormatAuthorityInfoAccess(), CRYPT_FormatAuthorityKeyId2(), CRYPT_FormatBasicConstraints2(), CRYPT_FormatBits(), CRYPT_FormatCertIssuer(), CRYPT_FormatCertSerialNumber(), CRYPT_FormatCPS(), CRYPT_FormatCRLDistPoints(), CRYPT_FormatEnhancedKeyUsage(), CRYPT_FormatHexString(), CRYPT_FormatHexStringWithPrefix(), CRYPT_FormatKeyId(), CRYPT_FormatKeyUsage(), CRYPT_FormatNetscapeCertType(), CRYPT_FormatReason(), CRYPT_FormatSpcFinancialCriteria(), CRYPT_FormatUnicodeString(), CRYPT_FormatUserNotice(), CRYPT_GetNextKeyW(), CRYPT_GetNextValueW(), CRYPT_guid2wstr(), CRYPT_QueryMessageObject(), CRYPT_UnicodeToANSI(), CryptEnumProvidersA(), CryptEnumProviderTypesA(), CryptGetDefaultProviderA(), CryptSetProviderExA(), dbgstr_w(), dde_msg_client_wndproc(), dde_server_wndproc(), debug_append(), debug_output_string(), debug_target_return_string(), debugstr_jsstr(), debugstr_xmlstr(), DECLARE_INTERFACE_(), decode_base85_guid(), decode_surrogate_pair(), decode_utf8_char(), decodeA(), decodeAndCompareBase64_A(), decodeBase64WithFmt(), decodeBase64WithLen(), decodeBase64WithLenBroken(), decodeBase64WithLenFmt(), decodeW(), XMLStorage::DecodeXMLString(), default_dbgstr_an(), default_dbgstr_wn(), DefaultBookmarkName(), ATL::CStringT< BaseType, StringTraits >::DefaultTrimChars(), deflateBound(), deflateSetDictionary(), deformat_component(), deformat_environment(), deformat_file(), deformat_index(), deformat_literal(), deformat_property(), deformat_string_internal(), delete_command(), ATL::CComBSTR::Detach(), detach_xhr_event_listener(), device_io(), DIALOG_DlgDirSelect(), BtrfsChangeDriveLetter::DlgProc(), dns_strdup_aw(), dns_strdup_uw(), dns_strdup_wa(), dns_strdup_wu(), do_attribute_tag_format(), do_attributeless_tag_format(), _Messages::do_get(), do_query(), do_reg_operation(), do_regexp_match_next(), CAutoComplete::DoBackWord(), doc_load_string(), docstr(), DoGetZipName(), double_to_string(), draw_text_2(), DrawCaptionTempA(), DrawCaptionTempW(), DrawTest(), DrawTextA(), DrawTextExA(), DrawTextExW(), DrawTextExWorker(), DrawTextW(), DrawTree(), DropPrefix(), dump_alt_name_entry(), dump_child_(), dup_formstr(), DuplicateStringA(), DuplicateStringAEx(), DuplicateStringW(), DuplicateStringWEx(), dwarfdumpsym(), EDIT_WM_Char(), EditActionDlgProc(), EditDlg_OnCommand(), editor_handle_message(), EditTypeDlg_OnChangeIcon(), EditTypeDlg_OnCommand(), elf_search_auxv(), ElfrIntReportEventW(), EMFDC_ExtTextOut(), EMFDRV_ExtTextOut(), emfpathdrv_ExtTextOut(), CDeviceView::EnableSelectedDevice(), encode_base85_guid(), encodeA(), encodeAndCompareBase64_A(), encodeW(), XMLStorage::EncodeXMLString(), EndLog(), enum_compartments(), EnumPropsA(), EnumPropsExA(), EnumPropsExW(), EnumPropsW(), EnumResourceNamesA(), EnumResourceNamesExA(), EnumResourceNamesExW(), EnumResourceNamesW(), EnumResourceTypesA(), EnumResourceTypesExA(), EnumResourceTypesExW(), EnumResourceTypesW(), EnumSystemLocalesEx(), StringTest::erase(), err_string_prop(), Error_toString(), Escape(), escape_string(), exec_query(), Execute(), expand_environment(), expand_variables(), expand_variables_buffer(), export_string_data(), export_value_name(), CShellLink::Extract(), Extract(), FatalAppExitA(), FatalAppExitW(), FD31_DupToW(), FD31_Validate(), FD31_WMDrawItem(), FD31_WMInitDialog(), FGets(), field_format_detailed_cert_name(), field_format_detailed_extension(), field_format_extension_hex_with_ascii(), file_name(), file_name_AtoW(), file_nameA(), filecoll_enumvariant_Next(), filedlg_collect_places_pidls(), FileMonikerImpl_DecomposePath(), FilenameA2W(), FilenameU2A_FitOrFail(), fill_sid(), fill_window(), find_cert_by_name_str_a(), find_cert_by_name_str_w(), FindTest::find_char(), find_control(), find_entry_by_name(), find_format(), find_lcname_entry(), find_prop(), find_string_index(), find_top_window(), find_window_class(), FindActCtxSectionStringW(), ATL::CPathT< StringType >::FindExtension(), ATL::CPathT< StringType >::FindFileName(), FindPrefixAndSuffix(), FindSubStrI(), NumPutGetTest::fix_float_long(), FmtIdToPropStgName(), foldercoll_enumvariant_Next(), FONT_GetCharsByRangeA(), FONT_mbtowc(), for(), format_insert(), format_lex(), format_message(), format_replace(), format_str_is_number(), format_string(), ATL::CStringT< BaseType, StringTraits >::FormatMessage(), FormatString(), FormatStringV(), FormatVerisignExtension(), free_stack(), free_str(), FreeStrRet(), ft_mem_strdup(), Function_get_value(), Function_toString(), function_value(), get_antecedent(), get_antecedent_table(), get_attribute_value(), get_base_dir(), get_cert_mgr_usages(), get_cert_usages(), get_char_script(), get_clean_line(), get_config_key_string(), get_csidl_dir(), get_deformatted_field(), get_dispid(), get_doc_string(), get_document_charset(), get_elem_by_id(), get_escaped_string(), get_extrac_args(), get_file_handle(), get_file_name(), get_formstr_data(), get_geo_info(), get_item_names_string(), get_key_value(), get_language_sort(), get_ldnumber(), get_locale_info(), get_mmioFromProfile(), get_module_filename(), get_next_line(), get_nsstyle_attr_var(), get_nt_pathW(), get_olemisc_value(), get_operation(), get_predefined_entity(), get_proc_address(), get_prop(), get_properties(), get_registered_task(), get_res_nameA(), get_res_nameW(), get_settingid(), get_str_hash(), get_string_subst(), get_stringvalue(), get_text_node_data(), get_user_notice_from_qualifier(), get_windows_version_str(), get_word(), ATL::CRegObject::get_word(), GetAdvertisedArg(), CShellLink::GetAdvertiseInfo(), GetAltMonthNames(), getbyte(), GetCharABCWidthsA(), GetCharABCWidthsFloatA(), GetCharWidth32A(), GetCharWidthA(), GetCharWidthFloatA(), GetChmString(), GetDlgItemInt(), GetDocumentTitle(), getenv(), GetFinalPathNameByHandleA(), GetFullName(), GetGeoInfoW(), GetImageName(), CAvailableApplicationInfo::GetInstallerType(), getline(), GetName(), GetPart(), GetProcessDefaultLayout(), GetResponse(), CQueryAssociations::GetString(), getstring_test(), Global_Asc(), Global_CStr(), Global_InvokeEx(), Global_LCase(), Global_Left(), Global_Len(), Global_LTrim(), Global_Mid(), Global_Right(), Global_RTrim(), Global_Space(), Global_Trim(), Global_UCase(), guiAsk(), guiDelta(), GUIDFromStringA(), GUIDFromStringW(), guiDir(), guiError(), guiOut(), guiStatus(), guiStep(), guiWarning(), gzgets(), HaliMPFamily(), hash_Ly(), hash_Ly_W(), HashAddString(), heap_strdup(), heap_strdupA(), heap_strdupAtoW(), HEAP_strdupAtoW(), heap_strdupUtoW(), heap_strdupW(), heap_strdupWtoA(), heap_strdupWtoU(), heap_strdupWtoUTF8(), heap_strndupAtoW(), heap_strndupW(), heap_strndupWtoU(), hex_clr(), hexify(), History_del_current_entry(), hlink_co_strdupW(), hlink_strdupW(), HLPFILE_AddHotSpotLinks(), HLPFILE_AllocLink(), HLPFILE_RtfAddControl(), HLPFILE_RtfAddRawString(), HLPFILE_RtfAddText(), HLPFILE_SystemCommands(), HTMLDocument5_createComment(), HTMLElement2_get_readyState(), HTMLElement3_get_contentEditable(), HTMLElement3_put_contentEditable(), HTMLElement_populate_props(), HTMLFormElement_get_dispid(), HTMLFormElement_get_target(), HTMLFormElement_put_target(), HTMLFrameBase_get_marginHeight(), HTMLFrameBase_get_marginWidth(), HTMLImgElement_get_align(), HTMLImgElement_put_align(), HTMLLinkElement_get_media(), HTMLLinkElement_put_media(), HTMLSelectElement_put_name(), HTMLTable3_get_summary(), HTMLTable3_put_summary(), HTMLTable_get_frame(), HTMLTable_put_frame(), HTMLTableCell_get_align(), HTMLTableCell_put_align(), HTMLWindow2_item(), HTTP_build_req(), HTTP_ParseTime(), ICONTITLE_SetTitlePos(), id2string(), iframe_onreadystatechange(), IMLangFontLink_Test(), InfpGetSubstitutionString(), init_debug(), init_error_constr(), FstreamTest::input(), SstreamTest::input(), StringTest::insert(), InstallerImpl_ProductInfo(), integer_to_string(), Internal_EnumUILanguages(), interp_forin(), interp_in(), interp_str(), interp_throw_type(), SstreamTest::io(), StringTest::io(), ipv6_string_to_address(), IRecordInfoImpl_RecordCopy(), is_correct_dir(), is_drive_path(), is_drive_spec(), is_drive_specA(), is_elem_name(), is_empty_string(), is_escaped_drive_spec(), is_implicit_file_path(), is_interpreted_func(), is_null_bstr(), is_str_env_drive_dir(), is_string_in_list(), is_unc_path(), is_valid_name(), is_valid_ncname(), is_valid_pubid(), IsApiSetImplemented(), IsBadStringPtrA(), IsBadStringPtrW(), IsDots(), IShellBrowserImpl_ICommDlgBrowser_IncludeObject(), IsNLSDefinedString(), IsNormalizedString(), IsProductCode(), ITERATE_WriteRegistryValues(), ITextRange_fnGetText(), ITextRange_fnSetText(), ITextSelection_fnSetText(), ITS_IMonikerImpl_GetDisplayName(), ITSS_IEnumSTATSTG_Next(), join_find_row(), JSGlobal_decodeURI(), JSGlobal_decodeURIComponent(), JSGlobal_encodeURI(), JSGlobal_encodeURIComponent(), JSGlobal_escape(), JSGlobal_parseFloat(), JSGlobal_parseInt(), JSGlobal_unescape(), JSON_parse(), jsstr_addref(), jsstr_alloc(), jsstr_as_heap(), jsstr_as_inline(), jsstr_as_rope(), jsstr_cmp(), jsstr_cmp_str(), jsstr_extract(), jsstr_flatten(), jsstr_flush(), jsstr_free(), jsstr_init(), jsstr_is_heap(), jsstr_is_inline(), jsstr_is_rope(), jsstr_length(), jsstr_release(), jsstr_rope_extract(), jsstr_rope_flatten(), jsstr_substr(), jsstr_tag(), jsstr_try_flat(), jsval_string(), jsval_to_variant(), KERNELBASE_lstrlenA(), KERNELBASE_lstrlenW(), keyed_event_thread(), length_as_utf8(), lhash_val_of_name_sys(), LHashValOfNameSys(), LHashValOfNameSysA(), LIBXML_ATTR_FORMAT(), ListTest::list3(), LISTBOX_FindFileStrPos(), LISTBOX_FindString(), LISTBOX_FindStringPos(), LISTBOX_GetText(), LISTBOX_HandleChar(), LISTBOX_InsertItem(), LISTBOX_InsertString(), literal_as_string(), load_doc(), load_manifest(), load_persistent_cookie(), load_res(), load_string(), LoadLibraryExW(), LoadPart(), locale_replace_separator(), locale_return_grouping(), LogDriverInfoStream(), LogfAllocAndBuildNewRecord(), LPK_ApplyMirroring(), LPK_DrawUnderscore(), BoundTest::lwrbnd2(), MACRO_AddAccelerator(), MACRO_CheckItem(), MACRO_Compare(), MACRO_DeleteItem(), MACRO_DeleteMark(), MACRO_DestroyButton(), MACRO_DisableItem(), MACRO_EnableItem(), MACRO_ExecProgram(), MACRO_ExtAbleItem(), MACRO_FileExist(), MACRO_Generate(), MACRO_GotoMark(), MACRO_IsMark(), MACRO_IsNotMark(), MACRO_MPrintID(), MACRO_PopupContext(), MACRO_PopupHash(), MACRO_PositionWindow(), MACRO_SaveMark(), MACRO_SetContents(), MACRO_SetHelpOnFile(), MACRO_ShortCut(), MACRO_TestALink(), MACRO_TestKLink(), MACRO_UncheckItem(), main(), MAIN_MessageBoxIDS_s(), MainWndProc(), make_import_file_filter(), make_wstr(), MakeGuidString(), ATL::CPathT< StringType >::MakePretty(), MakeStrRetFromString(), mark_task_process(), marshall_unicode_as_utf8(), Tokenizer::match(), matches_domain_pattern(), maybe_to_primitive(), mblen(), mbrlen(), mbrtowc(), mbstowcs_codepage(), mbtowc(), MCI_DumpCommandTable(), MCI_GetCommandTable(), MCI_GetString(), MCI_IsCommandTableValid(), MCI_ParseOptArgs(), MCI_SetCommandTable(), MCI_strdupAtoW(), MCIAVI_drvOpen(), MCIAVI_mciInfo(), MCIAVI_mciSet(), MCICDA_Info(), MCIQTZ_drvOpen(), MCIWndProc(), ME_CallWordBreakProc(), ME_CharFromPointContext(), ME_FindNextURLCandidate(), ME_GetTextW(), ME_InsertTextFromCursor(), ME_MakeStringConst(), ME_PointFromCharContext(), ME_ReplaceSel(), MENU_mnu2mnuii(), MENU_ParseResource(), METADC_ExtTextOut(), metadc_text(), MFDRV_ExtTextOut(), MFDRV_MetaExtTextOut(), MIDI_mciInfo(), MMDevEnum_GetDevice(), MMDevice_GetId(), move_next_char(), move_prev_char(), msi_add_string(), msi_atou(), msi_build_directory_name(), msi_create_assembly_enum(), msi_dup_property(), msi_dup_record_field(), msi_get_property_int(), msi_load_suminfo_properties(), MSI_RecordCopyField(), msi_select_update(), msi_split_string(), msi_strcpy_to_awstring(), msi_string2id(), msi_strncpyW(), msi_strncpyWtoA(), MsiDecomposeDescriptorA(), MsiSummaryInfoGetPropertyA(), MsiSummaryInfoGetPropertyW(), MsiSummaryInfoSetPropertyA(), MsiSummaryInfoSetPropertyW(), msvcrt_int_to_base32(), msvcrt_int_to_base32_w(), msvcrt_wstrdupa(), mswBufferAppendStrA(), mswBufferAppendStrW(), multi_sz_lenA(), multi_sz_lenW(), MyDrawCaptionTemp(), myStrdupFunc(), mystrrchr(), name_from_pidl(), name_value_to_str(), NativeFunction_toString(), NdisReadConfiguration(), NdisReadNetworkAddress(), NdrNonConformantStringBufferSize(), NdrNonConformantStringMarshall(), tinyxml2::XMLDocument::NewComment(), tinyxml2::XMLDocument::NewDeclaration(), tinyxml2::XMLDocument::NewText(), tinyxml2::XMLDocument::NewUnknown(), CACLCustomMRU::Next(), next_part(), NLS_GetLocaleString(), NotifyArea::Notify(), nsACString_Finish(), nsACString_GetData(), nsACString_Init(), nsACString_InitDepend(), nsACString_SetData(), nsAString_Finish(), nsAString_GetData(), nsAString_Init(), nsAString_InitDepend(), nsChannelBSC_on_response(), nsnode_to_nsstring(), nsnode_to_nsstring_rec(), nsstr_to_truncated_bstr(), nt_mailslot_test(), NtUserDrawCaptionTemp(), NumPutGetTest::num_get_float(), NumPutGetTest::num_put_float(), number_to_exponential(), number_to_fixed(), Number_toExponential(), Number_toFixed(), Number_toPrecision(), Number_toString(), Object_toString(), OleUIAddVerbMenuW(), CEditCompatModes::OnInitDialog(), OnMainCreate(), OnMenuSelect(), opatmatch(), open_subkey(), StringTest::oper_tmp(), ATL::CStringT< BaseType, StringTraits >::operator+=(), superstring::operator/(), output_formatstring(), output_line(), OutputWorker::output_number(), OutputWorker::output_tabbed_text(), OutputWorker::output_text(), output_writeconsole(), OutputDebugStringA(), OutputDebugStringW(), pap_mailbox822(), pap_qstring(), para_num_get_str(), XMLStorage::XMLReaderBase::parse(), parse_add_interface_class(), parse_assembly(), parse_attr(), parse_com_class_misc(), parse_display_name(), parse_files(), parse_filetime(), parse_hhc(), parse_hhindex(), parse_identifier(), parse_ipv4_component(), parse_ipv6_component(), parse_json_value(), parse_key(), parse_languages(), parse_nummethods(), parse_options(), parse_path(), parse_platform(), parse_port(), parse_print(), parse_procedure(), parse_procedure_a(), parse_prop(), parse_regexp_flags(), parse_script(), parse_script_ae(), parse_script_expr(), parse_supportedos_elem(), parse_transform_desc(), parse_typelib_flags(), parse_typelib_version(), parse_uint(), parse_value(), parse_version(), partstrlwr(), PATH_ExtTextOut(), path_from_pidlA(), path_from_pidlW(), path_GetText(), patmatch(), pCDevSettings_AllocAndCopyString(), pCDevSettings_GetMonitorDevice(), pCDevSettings_GetMonitorName(), PCM_drvOpen(), pdb_load_stream_name_table(), peek_one(), CDownloadManager::PerformDownloadAndInstall(), perror(), PersistFile_Save(), PersistStreamInit_Save(), pev_get_val(), PIDGenSimpA(), PIDGenSimpW(), pool_strdup(), pp_xstrdup(), pphash(), prepend_str(), PRINT_RECORD(), print_withspace(), PrintMessageAnsi(), processor_arch_from_string(), PropertStorage_WriteWStringToStream(), PropStgNameToFmtId(), PropSysAllocString(), PropSysFreeString(), PROPVAR_WCHARToGUID(), PropVariantToBSTR(), PSM_FindLastPrefix(), PSM_PrepareToDraw(), push_instr_bstr(), push_instr_bstr_uint(), push_instr_str(), push_instr_str_uint(), push_instr_uint_str(), put_inner_html(), put_resource_id(), BtrfsContextMenu::QueryContextMenu(), queueoutstr(), ATL::CPathT< StringType >::QuoteSpaces(), range_to_string(), read_dependencies(), read_hlink_string(), read_line(), read_platform_entry(), read_properties_from_data(), read_urls(), read_version_entry(), ReadCommand(), ReadConversion(), reader_cmp(), reader_init_cstrvalue(), readerinput_strdupW(), readline(), TNetwork::ReadString(), record_to_row(), reg_add(), reg_copy(), reg_delete(), reg_export(), reg_import(), reg_query(), regexp_execute(), RegExp_get_source(), regexp_match(), regexp_match_next(), regexp_new(), regexp_string_match(), register_resource(), REGPROC_escape_string(), REGPROC_export_string(), REGPROC_unescape_string(), REGPROC_write_line(), RegQueryCStringW(), RegSetValueExW(), ATL::CPathT< StringType >::RelativePathTo(), remainder_is_none_or_newline(), remove_header(), remove_quotes(), ATL::CPathT< StringType >::RemoveArgs(), ATL::CPathT< StringType >::RemoveBackslash(), ATL::CPathT< StringType >::RemoveBlanks(), ATL::CPathT< StringType >::RemoveExtension(), ATL::CPathT< StringType >::RemoveFileSpec(), RemoveQuotes(), ATL::CPathT< StringType >::RenameExtension(), rep_call(), StringTest::replace(), ReportProductInfoEvent(), res_free_str(), res_strdupW(), return_bstr(), return_nscstr(), return_nsstr(), return_string(), return_strval(), return_wstr_nsacstr(), RpcBindingSetOption(), RpcBindingToStringBindingW(), RSHELL_CStartMenu_CreateInstance(), RtlCharToInteger(), RtlGUIDFromString(), RtlIntegerToChar(), RtlUnicodeStringToInteger(), run_bom_tests(), run_domtest(), run_from_res(), run_insert(), run_is_entirely_ws(), run_is_splittable(), run_test(), runtimestyle_test(), s_get_a_bstr(), safestrlwr(), safestrupr(), save_cert_mgr_usages(), save_prop(), SdbMakeIndexKeyFromString(), SdbpAddStringToTable(), SdbpCreate(), section_get_dword(), SECUR32_AllocMultiByteFromWide(), SECUR32_AllocWideFromMultiByte(), SECUR32_strdupW(), seed_dirs(), SstreamTest::seek_gp(), send_file(), CHttpClient::SendFile(), serialize_string(), SERV_dup(), server_ddeml_callback(), server_end_to_end_callback(), ServiceNameToPortNumber(), TConfig::set_bool(), set_cert_string_property(), set_doc_string(), set_file_name(), set_general_cert_properties(), set_help_file_name(), set_help_string_dll(), set_prop(), set_st_entry(), set_status_text(), set_string_index(), set_stringT(), CShellLink::SetAdvertiseInfo(), SetClipboardFromString(), TestController::SetCurrentContainer(), TestController::SetCurrentTestCategory(), TestController::SetCurrentTestName(), SetDlgItemInt(), CShellLink::SetIconLocation(), tinyxml2::StrPair::SetInternedStr(), SetLocaleInfoW(), tinyxml2::XMLElement::SetName(), CShellLink::SetPath(), tinyxml2::StrPair::SetStr(), setStringValue(), CDeviceNode::SetupNode(), SetupSetDirectoryIdA(), SetupSetDirectoryIdW(), tinyxml2::XMLNode::SetValue(), shader_arb_append_imm_vec4(), shader_arb_get_dst_param(), shader_glsl_append_imm_vec4(), shader_glsl_swizzle_to_str(), shader_glsl_write_mask_to_str(), SHELL32_GUIDToStringA(), SHELL32_GUIDToStringW(), SHGetFileInfoW(), show_store_certs(), SHSetIniStringW(), SHTruncateString(), size_hlink_string(), ATL::CPathT< StringType >::SkipRoot(), SlistTest::slist1(), SLTG_DoVars(), SLTG_ReadStringA(), snprintfW(), split_multi_string_values(), sprintfW(), SQLInstall_narrow(), SQLInstall_strdup(), SQLInstall_strdup_multi(), sscanf(), stabbuf_append(), stack_find(), stack_push(), stack_push_string(), start_binding(), start_debugger(), START_TEST(), StgSetTimes(), stop_binding(), storages_find_row(), store_user_dirid(), str_dup_upper(), str_is_number(), str_to_buffer(), str_to_color(), str_to_eid(), str_to_enum(), str_to_number(), strarray_add(), strarray_add_uniq(), strarray_bsearch(), strarray_exists(), strarray_fromstring(), strarray_tostring(), strAtoW(), strbuf_append(), strbuf_append_jsstr(), strbuf_write(), ATL::CRegObject::strbuf_write(), strcat_param(), StrCatBuffA(), StrCatBuffW(), StrCatChainW(), StrChrA(), StrChrIA(), StrChrIW(), StrChrNW(), StrChrW(), strchrW(), StrCmpCA(), StrCmpCW(), StrCmpICA(), StrCmpICW(), StrCmpIW(), StrCmpLogicalW(), StrCmpNA(), StrCmpNCA(), StrCmpNCW(), StrCmpNIA(), StrCmpNICA(), StrCmpNICW(), StrCmpNIW(), StrCmpNW(), StrCmpW(), StrCSpnA(), StrCSpnIA(), StrCSpnIW(), StrCSpnW(), strcspnW(), StrDup(), strdup_AtoW(), StrDupA(), strdupA(), strdupAtoW(), strdupAW(), strdupnAtoW(), strdupUtoW(), StrDupW(), strdupW(), strdupWtoA(), strdupWtoU(), stream_chunk_get_wstr(), stream_init(), Stream_LoadString(), STREAM_ReadString(), Stream_WriteString(), STREAM_WriteString(), streams_find_row(), strendswith(), strfmt(), strfreeA(), strfreeU(), strfreeW(), strftime(), strftime_date(), strftime_int(), strftime_str(), strftime_time(), string2id(), string2intW(), string_alloc(), String_charAt(), String_charCodeAt(), String_concat(), STRING_evaluate(), String_indexOf(), string_is_alpha(), string_is_digit(), String_lastIndexOf(), String_match(), String_replace(), String_search(), String_slice(), String_split(), String_substr(), String_substring(), string_to_hex(), string_to_nscmptype(), string_to_unit(), String_toLowerCase(), String_toUpperCase(), String_trim(), StringConstr_value(), StringFromGUID2(), StringHash(), stringify(), dbgrpt_char_traits< char >::StringLength(), dbgrpt_char_traits< wchar_t >::StringLength(), StringListAppend(), StringToColor(), StringToGuid(), strip_spaces(), ATL::CPathT< StringType >::StripPath(), ATL::CPathT< StringType >::StripToRoot(), StrIsIntlEqualA(), StrIsIntlEqualW(), strlen(), strlen_aw(), strlenW(), strlwrW(), strpbrk(), StrPBrkA(), strpbrkW(), StrPBrkW(), StrRChrA(), StrRChrIA(), StrRChrIW(), strrchrW(), StrRChrW(), strrstr(), StrRStrIA(), StrRStrIW(), strspn(), StrSpnA(), strspnW(), StrSpnW(), strstr_wa(), StrStrA(), StrStrIA(), StrStrIW(), StrStrNIW(), StrStrNW(), StrStrW(), strstrW(), StrTo(), StrToInt64ExA(), StrToInt64ExW(), StrToIntA(), StrToIntExA(), StrToIntExW(), StrToIntW(), strtok(), strtok_s(), StrTrimA(), StrTrimW(), struprW(), strUtoW(), strWtoA(), strWtoU(), substr(), substr_skip(), substrz(), suminfo_set_prop(), summaryinfo_invoke(), swscanf(), SysAllocString(), SysAllocStringByteLen(), SysAllocStringLen(), SysFreeString(), SysReAllocString(), SysReAllocStringLen(), SysStringByteLen(), SysStringLen(), table_id_error(), table_validate_new(), TableFindPtr(), TaskManager_OnMenuSelect(), test___STRINGTOLD(), test___strncnt(), test__Gettnames(), test__mbstok(), test__strtod(), test__strupr(), test__wcsset_s(), test__wcstoi64(), test__wcstol(), test__wcstombs_s_l(), test_Add(), test_assembly_name_props_line(), test_atoi(), test_atoi64(), test_atol(), test_automagic(), test_BcryptHash(), test_body_style(), test_bstr_cache(), test_BstrCopy(), test_callbacks(), test_case_sensitive(), test_CertGetNameString_value_(), test_CertRDNValueToStrA(), test_CertRDNValueToStrW(), test_change_types(), test_contenteditable(), test_cookies(), test_cp855(), test_cp932(), test_create(), test_create_attribute(), test_create_elems(), test_CreateAssemblyNameObject(), test_createNode(), test_CreateTextFile(), test_CreateWellKnownSid(), test_CredMarshalCredentialA(), test_crtGetStringTypeW(), test_CryptBinaryToString(), test_CryptStringToBinary(), test_current_style(), test_dbcs_wm_char(), test_ddeml_client(), test_default_client_accessible_object(), test_default_selection(), test_defaults(), test_detached_font_getters(), test_directory(), test_disp(), test_dom_implementation(), test_domdoc(), test_domnode(), test_DriveCollection(), test_edit_control_3(), test_edit_control_5(), test_edit_control_6(), test_elem_dispex(), test_elems(), test_EM_GETLINE(), test_EM_GETMODIFY(), test_EM_GETMODIFY_esCallback(), test_EM_STREAMIN_esCallback(), test_encodeUnicodeNameValue(), test_esCallback_written_1(), test_eval(), test_event(), test_ExtTextOutScale(), test_fcvt(), test_file_sharing(), test_FileCollection(), test_filename(), test_FolderCollection(), test_form_target(), test_format_object(), test_FormattingXML(), test_framebase(), test_func(), test_get_attributes(), test_get_childNodes(), test_get_firstChild(), test_get_lastChild(), test_get_nodeTypeString(), test_get_prefix(), test_get_set(), test_get_tagName(), test_get_text(), test_GetAltMonthNames(), test_getAttributeNode(), test_GetCharABCWidths(), test_getElementsByTagName(), test_GetFile(), test_GetFolder(), test_GetIconLocation(), test_getstring(), test_handles_process(), test_handles_process_open(), test_hash(), test_host(), test_hostname(), test_href(), test_iframe_connections(), test_iframe_elem(), test_imgload(), test_import_resolution(), test_indent(), test_InitPropVariantFromGUIDAsString(), test_invokeex(), test_isexpression(), test_ITextFont(), test_keyed_events(), test_label_elem(), test_LoadStringA(), test_location(), test_longstrings(), test_marshal_BSTR(), test_marshal_VARIANT(), test_md5(), test_menu_resource_layout(), test_merging_text(), test_mouse_keyboard(), test_msirecord(), test_mutant(), test_mxwriter_characters(), test_mxwriter_domdoc(), test_mxwriter_properties(), test_name_collisions(), test_name_limits(), test_namedmap_newenum(), test_namespace_pipe(), test_namespaces_as_attributes(), test_namespaces_basic(), test_namespaces_change(), test_notify(), test_NtCreateKey(), test_NtOpenKey(), test_NtQueryKey(), test_null_device(), test_object_elem(), test_OleRegGetUserType(), test_onreadystatechange(), test_parse_context(), test_ParseDisplayName(), test_ParseName(), test_ParseNetworkString(), test_paste(), test_PathAddBackslash(), test_PathCombineA(), test_pathname(), test_persiststreaminit(), Test_popen(), test_port(), test_printf_format(), test_PropVariantToStringAlloc(), test_protocol(), test_put_hash(), test_put_href(), test_put_nodeTypedValue(), test_query_object(), test_quoted_RDN(), test_Read(), test_read_attribute(), test_read_cdata(), test_read_comment(), test_read_element(), test_read_pi(), test_read_public_dtd(), test_read_system_dtd(), test_read_text(), test_ReadAll(), test_redirection(), test_reference(), test_removeNamedItem(), test_retval(), test_RtlCharToInteger(), test_RtlCopyString(), test_RtlGUIDFromString(), test_RtlHashUnicodeString(), test_RtlInitString(), test_RtlIsNameLegalDOS8Dot3(), test_RtlStringFromGUID(), test_RtlUnicodeStringToInteger(), test_saxreader(), test_saxreader_properties(), test_saxstr(), test_schema_refs(), test_script_dispatch(), test_ScriptGetFontProperties(), test_search(), test_setAttributeNode(), test_SetText(), test_sha1(), test_sha256(), test_sha384(), test_sha512(), test_sid(), test_SQLValidDSN(), test_SQLValidDSNW(), test_start(), test_StdHlink(), test_strcspn(), test_strdup(), test_StringFromGUID2(), test_strnlen(), test_strtof(), test_style2(), test_style3(), test_style6(), test_symboliclink(), test_SysAllocString(), test_SysAllocStringByteLen(), test_SysAllocStringLen(), test_SysReAllocString(), test_SysReAllocStringLen(), test_SysStringByteLen(), test_SysStringLen(), test_SystemFunction007(), test_td_elem(), test_textfont_global_defaults(), test_token_label(), test_undefined_byte_char(), test_user_agent(), test_UuidFromString(), test_VarFormatNumber(), test_Verbs(), test_vsnwprintf(), test_wcsdup(), test_window(), test_WM_SETTEXT_esCallback(), test_WriteConsoleOutputCharacterA(), test_WriteConsoleOutputCharacterW(), test_wshshell(), test_wtoi(), test_wtoi64(), test_wtol(), test_xcvt(), test_xmlelem(), test_xmlelem_collection(), test_XMLHTTP(), test_xmlns_attribute(), test_xmlTypes(), test_XPath(), test_XSLPattern(), test_xsltemplate(), testJustification(), TEXT_DrawUnderscore(), TEXT_Ellipsify(), TEXT_NextLineW(), TEXT_PathEllipsify(), TEXT_Reprefix(), TEXT_WordBreak(), textAsk(), textDelta(), textDir(), textOut(), textrange_set_font(), textStatus(), textStep(), throw_error(), throw_generic_error(), throw_range_error(), throw_reference_error(), throw_regexp_error(), throw_syntax_error(), throw_type_error(), throw_uri_error(), TLB_append_str(), TLB_get_bstr(), TLB_GUIDFromString(), TLB_SanitizeBSTR(), TLB_str_memcmp(), to_array(), to_flat_string(), to_safearray(), to_string(), tinyxml2::XMLUtil::ToBool(), tinyxml2::XMLUtil::ToDouble(), tinyxml2::XMLUtil::ToFloat(), tohex(), tinyxml2::XMLUtil::ToInt(), token_to_str(), tokenize(), TOOLBAR_GetStringA(), TOOLBAR_GetStringW(), TOOLBAR_InternalInsertButtonsT(), ToUnicode(), tinyxml2::XMLUtil::ToUnsigned(), translate_data_def(), translate_list(), translate_macro(), translate_record(), trim(), ATL::CStringT< BaseType, StringTraits >::Trim(), ATL::CStringT< BaseType, StringTraits >::TrimLeft(), ATL::CStringT< BaseType, StringTraits >::TrimRight(), txt_clr(), txt_fputs(), uacpi_free_dynamic_string(), uacpi_log(), uacpi_object_create_cstring(), uacpi_string_to_integer(), uacpi_strlen(), uacpi_strnlen(), unescape(), unescape_string(), UnescapeChar(), UnescapeHex(), UnescapeOther(), UnicodeString::UnicodeString(), CDeviceView::UninstallSelectedDevice(), UninstallThread(), Unquote(), unquote_string(), ATL::CPathT< StringType >::UnquoteSpaces(), update_margin_edits(), update_parent_display(), update_src_text(), BoundTest::uprbnd2(), UrlUnescapeAndMakeFileNameValid(), anonymous_namespace{mstscax.cpp}::UUIDToString(), valisttosT(), value_get_str_field(), var2str(), variant_change_type(), variant_to_jsval(), VariantToString(), vasprintf(), verify_str_imp2(), CFileDefExt::VersionPageProc(), VfdCheckDriverFile(), VfdFreeUnicode(), vsnprintfW(), vsprintf_wrapper(), vsprintfW(), vsscanf_wrapper(), vswprintf_wrapper(), w2a(), WAVE_mciInfo(), WAVEMAP_drvOpen(), wbem_services_ExecMethod(), wchar_from_str(), wcscspn(), wcsftime(), wcspbrk(), wcsspn(), wcstod(), wcstok(), wcstok_s(), WebBrowserPriv2IE8_NavigateWithBindCtx2(), WebBrowserPriv2IE9_NavigateWithBindCtx2(), wine_compose(), wine_dbgstr_an(), wine_dbgstr_icerr(), wine_dbgstr_wn(), wine_debugstr_an(), wine_get_dos_file_name(), wined3d_adapter_init_gl_caps(), WINHELP_MessageBoxIDS_s(), WinMain(), WLDAP32_ber_printf(), WLDAP32_ber_scanf(), WMSFT_compile_names(), WMSFT_compile_strings(), word_break(), wpp_add_cmdline_define(), wrapAllowPermLayer(), write_array_tfs(), write_complex_struct_pointer_layout(), write_complex_struct_pointer_ref(), write_complex_struct_tfs(), write_double_translated_ansi_nolock(), write_file(), write_formatdesc(), write_hlink_string(), write_ip_tfs(), write_pointer_tfs(), write_progid_record(), write_simple_struct_tfs(), write_string(), write_struct_members(), write_struct_tfs(), write_type_tfs(), WriteConsoleOutputCharacterA(), WriteConsoleOutputCharacterW(), writer_strdupW(), writer_strndupW(), TNetwork::WriteString(), Database::WriteString(), wstrbuf_append_len(), wstrbuf_append_nodetxt(), xkeymap_from_locale(), xml_attr_cmp(), xml_elem_cmp(), xmlBufAdd(), xmlBufCat(), xmlBufCCat(), xmlDictOwns(), xmlMemoryStrdup(), xmlMemStrdupLoc(), xmlParse3986Authority(), xmlParse3986DecOctet(), xmlParse3986Fragment(), xmlParse3986HierPart(), xmlParse3986Host(), xmlParse3986PathAbEmpty(), xmlParse3986PathAbsolute(), xmlParse3986PathNoScheme(), xmlParse3986PathRootless(), xmlParse3986Port(), xmlParse3986Query(), xmlParse3986RelativeRef(), xmlParse3986Scheme(), xmlParse3986Segment(), xmlParse3986URI(), xmlParse3986URIReference(), xmlParse3986Userinfo(), xmlParseStringCharRef(), xmlParseStringEntityRef(), xmlParseStringName(), xmlParseStringPEReference(), xmlParseURI(), xmlParseURIRaw(), xmlParseURIReference(), xmlReportError(), xmlSAX2TextNode(), xmlstr_cmp(), xmlstr_cmpi(), xmlStrcasestr(), xmlStrchr(), xmlstrdupW(), xmlStringDecodeEntities(), xmlStringLenDecodeEntities(), xmlStrlen(), xmlStrQEqual(), xmlStrstr(), xmlStrsub(), xmlURIEscape(), xmlURIEscapeStr(), xmlURIUnescapeString(), xmlValidNormalizeString(), xmlwriter_WriteCData(), xsltAttrTemplateValueProcess(), xsltAttrTemplateValueProcessNode(), xsltCompileAttr(), xsltComputeSortResultInternal(), xsltEvalAVT(), xsltGenerateIdFunction(), xsltInitCtxtKey(), xsltIsBlank(), xsltTransformError(), xsltUnparsedEntityURIFunction(), xsltXPathCompile(), xsltXPathCompileFlags(), xstrdup(), XStringToKeysym(), xstrsave(), xstrsaveA(), and xwin_process_events().