예제 #1
0
파일: rpc_bind.c 프로젝트: JozLes77/FreeRDP
int rpc_secure_bind(rdpRpc* rpc)
{
	int status;
	RPC_PDU* pdu;

	rpc->client->SynchronousSend = TRUE;
	rpc->client->SynchronousReceive = TRUE;

	while (rpc->State != RPC_CLIENT_STATE_CONTEXT_NEGOTIATED)
	{
		if (rpc->State == RPC_CLIENT_STATE_ESTABLISHED)
		{
			status = rpc_send_bind_pdu(rpc);

			if (status <= 0)
			{
				DEBUG_WARN( "rpc_secure_bind: error sending bind pdu!\n");
				return -1;
			}

			rpc->State = RPC_CLIENT_STATE_WAIT_SECURE_BIND_ACK;
		}
		else if (rpc->State ==  RPC_CLIENT_STATE_WAIT_SECURE_BIND_ACK)
		{
			pdu = rpc_recv_dequeue_pdu(rpc);

			if (!pdu)
			{
				DEBUG_WARN( "rpc_secure_bind: error receiving bind ack pdu!\n");
				return -1;
			}

			if (rpc_recv_bind_ack_pdu(rpc, Stream_Buffer(pdu->s), Stream_Length(pdu->s)) <= 0)
			{
				DEBUG_WARN( "rpc_secure_bind: error receiving bind ack pdu!\n");
				return -1;
			}

			rpc_client_receive_pool_return(rpc, pdu);

			if (rpc_send_rpc_auth_3_pdu(rpc) <= 0)
			{
				DEBUG_WARN( "rpc_secure_bind: error sending rpc_auth_3 pdu!\n");
				return -1;
			}

			rpc->State = RPC_CLIENT_STATE_CONTEXT_NEGOTIATED;
		}
		else
		{
			DEBUG_WARN( "rpc_secure_bind: invalid state: %d\n", rpc->State);
			return -1;
		}
	}

	rpc->client->SynchronousSend = TRUE;
	rpc->client->SynchronousReceive = TRUE;

	return 0;
}
예제 #2
0
파일: rpc.c 프로젝트: felfert/FreeRDP
boolean rpc_connect(rdpRpc* rpc)
{
	rpc->tls_in = rpc->transport->tls_in;
	rpc->tls_out = rpc->transport->tls_out;

	if (!rts_connect(rpc))
	{
		printf("rts_connect error!\n");
		return false;
	}

	if (!rpc_send_bind_pdu(rpc))
	{
		printf("rpc_send_bind_pdu error!\n");
		return false;
	}

	if (rpc_recv_bind_ack_pdu(rpc) <= 0)
	{
		printf("rpc_recv_bind_ack_pdu error!\n");
		return false;
	}

	if (!rpc_send_rpc_auth_3_pdu(rpc))
	{
		printf("rpc_send_rpc_auth_3 error!\n");
		return false;
	}

	return true;
}