diff --git a/include/freerdp/error.h b/include/freerdp/error.h index a5733bb8a..2f284b4f7 100755 --- a/include/freerdp/error.h +++ b/include/freerdp/error.h @@ -146,6 +146,7 @@ extern "C" { #define ERRINFO_ENCRYPT_FAILED 0x00001193 #define ERRINFO_ENCRYPTION_PACKAGE_MISMATCH 0x00001194 #define ERRINFO_DECRYPT_FAILED2 0x00001195 +#define ERRINFO_PEER_DISCONNECTED 0x00001196 #define ERRINFO_SUCCESS 0x00000000 #define ERRINFO_NONE 0xFFFFFFFF diff --git a/libfreerdp/core/errinfo.c b/libfreerdp/core/errinfo.c index ab8550c7d..7096a6e23 100644 --- a/libfreerdp/core/errinfo.c +++ b/libfreerdp/core/errinfo.c @@ -385,6 +385,9 @@ int connectErrorCode; #define ERRINFO_DECRYPT_FAILED2_STRING \ "Unencrypted data was encountered in a protocol stream which is meant to be encrypted with Standard RDP Security mechanisms (section 5.3.6)." +#define ERRINFO_PEER_DISCONNECTED_STRING \ + "The peer connection was lost." + /* Special codes */ #define ERRINFO_SUCCESS_STRING "Success." #define ERRINFO_NONE_STRING "" @@ -507,6 +510,7 @@ static const ERRINFO ERRINFO_CODES[] = ERRINFO_DEFINE(ENCRYPT_FAILED), ERRINFO_DEFINE(ENCRYPTION_PACKAGE_MISMATCH), ERRINFO_DEFINE(DECRYPT_FAILED2), + ERRINFO_DEFINE(PEER_DISCONNECTED), ERRINFO_DEFINE(NONE) }; diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index 01423bdb7..7ca758b0b 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -1042,6 +1042,7 @@ rdpRdp* rdp_new(rdpContext* context) rdp->extension = extension_new(context->instance); rdp->transport = transport_new(rdp->settings); + rdp->transport->rdp = rdp; rdp->license = license_new(rdp); rdp->input = input_new(rdp); rdp->update = update_new(rdp); @@ -1088,6 +1089,7 @@ void rdp_reset(rdpRdp* rdp) settings->ClientAddress = NULL; rdp->transport = transport_new(rdp->settings); + rdp->transport->rdp = rdp; rdp->license = license_new(rdp); rdp->nego = nego_new(rdp->transport); rdp->mcs = mcs_new(rdp->transport); diff --git a/libfreerdp/core/rdp.h b/libfreerdp/core/rdp.h index 9fece7007..ae7a4be27 100644 --- a/libfreerdp/core/rdp.h +++ b/libfreerdp/core/rdp.h @@ -208,4 +208,6 @@ void rdp_free(rdpRdp* rdp); BOOL rdp_decrypt(rdpRdp* rdp, wStream* s, int length, UINT16 securityFlags); +BOOL rdp_set_error_info(rdpRdp* rdp, UINT32 errorInfo); + #endif /* __RDP_H */ diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 6ff2ce683..4134c5dd1 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -46,6 +46,7 @@ #include "tpkt.h" #include "fastpath.h" #include "transport.h" +#include "rdp.h" #define BUFFER_SIZE 16384 @@ -1039,6 +1040,8 @@ static void* transport_client_thread(void* arg) status = WaitForMultipleObjects(nCount, handles, FALSE, 100); if (transport->layer == TRANSPORT_LAYER_CLOSED) { + rdpRdp* rdp = (rdpRdp*) transport->rdp; + rdp_set_error_info(rdp, ERRINFO_PEER_DISCONNECTED); break; } else if (status != WAIT_TIMEOUT) diff --git a/libfreerdp/core/transport.h b/libfreerdp/core/transport.h index 1525b19ee..1ba273f7a 100644 --- a/libfreerdp/core/transport.h +++ b/libfreerdp/core/transport.h @@ -78,6 +78,7 @@ struct rdp_transport CRITICAL_SECTION ReadLock; CRITICAL_SECTION WriteLock; wLog* log; + void* rdp; }; wStream* transport_send_stream_init(rdpTransport* transport, int size);