static int rdg_bio_write(BIO* bio, const char* buf, int num) { int status; rdpRdg* rdg = (rdpRdg*)bio->ptr; BIO_clear_flags(bio, BIO_FLAGS_WRITE); status = rdg_write_data_packet(rdg, (BYTE*) buf, num); if (status < 0) { BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); return -1; } else if (status < num) { BIO_set_flags(bio, BIO_FLAGS_WRITE); WSASetLastError(WSAEWOULDBLOCK); } else { BIO_clear_flags(bio, BIO_FLAGS_WRITE); } return status; }
static int rdg_bio_write(BIO* bio, const char* buf, int num) { int status; rdpRdg* rdg = (rdpRdg*) BIO_get_data(bio); BIO_clear_flags(bio, BIO_FLAGS_WRITE); EnterCriticalSection(&rdg->writeSection); status = rdg_write_data_packet(rdg, (BYTE*) buf, num); LeaveCriticalSection(&rdg->writeSection); if (status < 0) { BIO_clear_flags(bio, BIO_FLAGS_SHOULD_RETRY); return -1; } else if (status < num) { BIO_set_flags(bio, BIO_FLAGS_WRITE); WSASetLastError(WSAEWOULDBLOCK); } else { BIO_set_flags(bio, BIO_FLAGS_WRITE); } return status; }
BOOL rdg_process_close_packet(rdpRdg* rdg) { BYTE buffer[sizeof(RdgPacketHeader) + 4]; RdgPacketHeader* header = (RdgPacketHeader*)buffer; memset(buffer, 0, sizeof(buffer)); header->type = PKT_TYPE_CLOSE_CHANNEL_RESPONSE; header->packetLength = sizeof(buffer); WLog_DBG(TAG, "Channel Close requested"); rdg->state = RDG_CLIENT_STATE_CLOSED; return (rdg_write_data_packet(rdg, buffer, sizeof(buffer)) > 0 ? TRUE : FALSE); }