Add peer SetState function to manually set state

Expose internal state machine manipulation to allow skipping parts
of a peer connection state
This commit is contained in:
akallabeth 2022-03-18 09:23:00 +01:00 committed by akallabeth
parent 453d3b4c8b
commit f7b6d3be73
2 changed files with 22 additions and 1 deletions

View File

@ -72,6 +72,7 @@ typedef int (*psPeerVirtualChannelWrite)(freerdp_peer* peer, HANDLE hChannel, co
UINT32 length);
typedef void* (*psPeerVirtualChannelGetData)(freerdp_peer* peer, HANDLE hChannel);
typedef int (*psPeerVirtualChannelSetData)(freerdp_peer* peer, HANDLE hChannel, void* data);
typedef BOOL (*psPeerSetState)(freerdp_peer* peer, CONNECTION_STATE state);
/** @brief the result of the license callback */
typedef enum
@ -151,6 +152,18 @@ struct rdp_freerdp_peer
ALIGN64 psPeerLicenseCallback LicenseCallback;
ALIGN64 psPeerSendChannelPacket SendChannelPacket;
/**
* @brief SetState Function pointer allowing to manually set the state of the
* internal state machine.
*
* This is useful if certain parts of a RDP connection must be skipped (e.g.
* when replaying a RDP connection dump the authentication/negotiate parts
* must be skipped)
*
* \note Must be called after \b Initialize as that also modifies the state.
*/
ALIGN64 psPeerSetState SetState;
};
#ifdef __cplusplus

View File

@ -216,6 +216,13 @@ static int freerdp_peer_virtual_channel_set_data(freerdp_peer* client, HANDLE hC
return 1;
}
static BOOL freerdp_peer_set_state(freerdp_peer* client, CONNECTION_STATE state)
{
WINPR_ASSERT(client);
WINPR_ASSERT(client->context);
return rdp_server_transition_to_state(client->context->rdp, state) >= 0;
}
static BOOL freerdp_peer_initialize(freerdp_peer* client)
{
rdpRdp* rdp;
@ -233,7 +240,7 @@ static BOOL freerdp_peer_initialize(freerdp_peer* client)
settings->ServerMode = TRUE;
settings->FrameAcknowledge = 0;
settings->LocalConnection = client->local;
rdp_server_transition_to_state(rdp, CONNECTION_STATE_INITIAL);
rdp_server_transition_to_state(rdp, CONNECTION_STATE_MCS_CONNECT);
if (settings->RdpKeyFile)
{
@ -978,6 +985,7 @@ freerdp_peer* freerdp_peer_new(int sockfd)
client->VirtualChannelRead = NULL; /* must be defined by server application */
client->VirtualChannelGetData = freerdp_peer_virtual_channel_get_data;
client->VirtualChannelSetData = freerdp_peer_virtual_channel_set_data;
client->SetState = freerdp_peer_set_state;
}
return client;