void rdp_write_info_packet(STREAM* s, rdpSettings* settings) { size_t length; uint32 flags; uint8* domain; uint16 cbDomain; uint8* userName; uint16 cbUserName; uint8* password; uint16 cbPassword; uint8* alternateShell; uint16 cbAlternateShell; uint8* workingDir; uint16 cbWorkingDir; boolean usedPasswordCookie = false; flags = INFO_MOUSE | INFO_UNICODE | INFO_LOGONERRORS | INFO_LOGONNOTIFY | INFO_MAXIMIZESHELL | INFO_ENABLEWINDOWSKEY | INFO_DISABLECTRLALTDEL; if (settings->audio_capture) flags |= RNS_INFO_AUDIOCAPTURE; if (!settings->audio_playback) flags |= INFO_NOAUDIOPLAYBACK; if (settings->autologon) flags |= INFO_AUTOLOGON; if (settings->remote_app) flags |= INFO_RAIL; if (settings->console_audio) flags |= INFO_REMOTECONSOLEAUDIO; if (settings->compression) flags |= INFO_COMPRESSION | INFO_PACKET_COMPR_TYPE_RDP6; domain = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->domain, &length); cbDomain = length; userName = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->username, &length); cbUserName = length; if (settings->password_cookie && settings->password_cookie->length > 0) { usedPasswordCookie = true; password = (uint8*)settings->password_cookie->data; cbPassword = settings->password_cookie->length - 2; /* Strip double zero termination */ } else { password = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->password, &length); cbPassword = length; } alternateShell = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->shell, &length); cbAlternateShell = length; workingDir = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->directory, &length); cbWorkingDir = length; stream_write_uint32(s, 0); /* CodePage */ stream_write_uint32(s, flags); /* flags */ stream_write_uint16(s, cbDomain); /* cbDomain */ stream_write_uint16(s, cbUserName); /* cbUserName */ stream_write_uint16(s, cbPassword); /* cbPassword */ stream_write_uint16(s, cbAlternateShell); /* cbAlternateShell */ stream_write_uint16(s, cbWorkingDir); /* cbWorkingDir */ if (cbDomain > 0) stream_write(s, domain, cbDomain); stream_write_uint16(s, 0); if (cbUserName > 0) stream_write(s, userName, cbUserName); stream_write_uint16(s, 0); if (cbPassword > 0) stream_write(s, password, cbPassword); stream_write_uint16(s, 0); if (cbAlternateShell > 0) stream_write(s, alternateShell, cbAlternateShell); stream_write_uint16(s, 0); if (cbWorkingDir > 0) stream_write(s, workingDir, cbWorkingDir); stream_write_uint16(s, 0); xfree(domain); xfree(userName); xfree(alternateShell); xfree(workingDir); if (!usedPasswordCookie) xfree(password); if (settings->rdp_version >= 5) rdp_write_extended_info_packet(s, settings); /* extraInfo */ }
void rdp_write_info_packet(STREAM* s, rdpSettings* settings) { size_t length; uint32 flags; uint8* domain; uint16 cbDomain; uint8* userName; uint16 cbUserName; uint8* password; uint16 cbPassword; uint8* alternateShell; uint16 cbAlternateShell; uint8* workingDir; uint16 cbWorkingDir; flags = INFO_MOUSE | INFO_UNICODE | INFO_LOGONERRORS | INFO_LOGONNOTIFY | INFO_MAXIMIZESHELL | INFO_ENABLEWINDOWSKEY | INFO_DISABLECTRLALTDEL | RNS_INFO_AUDIOCAPTURE; if (settings->autologon) flags |= INFO_AUTOLOGON; if (settings->remote_app) flags |= INFO_RAIL; if (settings->console_audio) flags |= INFO_REMOTECONSOLEAUDIO; if (settings->compression) flags |= INFO_COMPRESSION | INFO_PACKET_COMPR_TYPE_64K; domain = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->domain, &length); cbDomain = length; userName = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->username, &length); cbUserName = length; password = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->password, &length); cbPassword = length; alternateShell = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->shell, &length); cbAlternateShell = length; workingDir = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->directory, &length); cbWorkingDir = length; stream_write_uint32(s, 0); /* CodePage */ stream_write_uint32(s, flags); /* flags */ stream_write_uint16(s, cbDomain); /* cbDomain */ stream_write_uint16(s, cbUserName); /* cbUserName */ stream_write_uint16(s, cbPassword); /* cbPassword */ stream_write_uint16(s, cbAlternateShell); /* cbAlternateShell */ stream_write_uint16(s, cbWorkingDir); /* cbWorkingDir */ if (cbDomain > 0) stream_write(s, domain, cbDomain); stream_write_uint16(s, 0); if (cbUserName > 0) stream_write(s, userName, cbUserName); stream_write_uint16(s, 0); if (cbPassword > 0) stream_write(s, password, cbPassword); stream_write_uint16(s, 0); if (cbAlternateShell > 0) stream_write(s, alternateShell, cbAlternateShell); stream_write_uint16(s, 0); if (cbWorkingDir > 0) stream_write(s, workingDir, cbWorkingDir); stream_write_uint16(s, 0); xfree(domain); xfree(userName); xfree(password); xfree(alternateShell); xfree(workingDir); if (settings->rdp_version >= 5) rdp_write_extended_info_packet(s, settings); /* extraInfo */ }
void rdp_write_info_packet(wStream* s, rdpSettings* settings) { UINT32 flags; WCHAR* domain = NULL; int cbDomain = 0; WCHAR* userName = NULL; int cbUserName = 0; WCHAR* password = NULL; int cbPassword = 0; WCHAR* alternateShell = NULL; int cbAlternateShell = 0; WCHAR* workingDir = NULL; int cbWorkingDir = 0; BOOL usedPasswordCookie = FALSE; flags = INFO_MOUSE | INFO_UNICODE | INFO_LOGONERRORS | INFO_LOGONNOTIFY | INFO_MAXIMIZESHELL | INFO_ENABLEWINDOWSKEY | INFO_DISABLECTRLALTDEL; if (settings->AudioCapture) flags |= RNS_INFO_AUDIOCAPTURE; if (!settings->AudioPlayback) flags |= INFO_NOAUDIOPLAYBACK; if (settings->AutoLogonEnabled) flags |= INFO_AUTOLOGON; if (settings->RemoteApplicationMode) flags |= INFO_RAIL; if (settings->RemoteConsoleAudio) flags |= INFO_REMOTECONSOLEAUDIO; if (settings->CompressionEnabled) flags |= INFO_COMPRESSION | INFO_PACKET_COMPR_TYPE_64K; if (settings->Domain) { cbDomain = ConvertToUnicode(CP_UTF8, 0, settings->Domain, -1, &domain, 0) * 2; } else { domain = NULL; cbDomain = 0; } cbUserName = ConvertToUnicode(CP_UTF8, 0, settings->Username, -1, &userName, 0) * 2; if (settings->RedirectionPassword && settings->RedirectionPasswordLength > 0) { usedPasswordCookie = TRUE; password = (WCHAR*) settings->RedirectionPassword; cbPassword = settings->RedirectionPasswordLength - 2; /* Strip double zero termination */ } else { cbPassword = ConvertToUnicode(CP_UTF8, 0, settings->Password, -1, &password, 0) * 2; } cbAlternateShell = ConvertToUnicode(CP_UTF8, 0, settings->AlternateShell, -1, &alternateShell, 0) * 2; cbWorkingDir = ConvertToUnicode(CP_UTF8, 0, settings->ShellWorkingDirectory, -1, &workingDir, 0) * 2; Stream_Write_UINT32(s, 0); /* CodePage */ Stream_Write_UINT32(s, flags); /* flags */ Stream_Write_UINT16(s, cbDomain); /* cbDomain */ Stream_Write_UINT16(s, cbUserName); /* cbUserName */ Stream_Write_UINT16(s, cbPassword); /* cbPassword */ Stream_Write_UINT16(s, cbAlternateShell); /* cbAlternateShell */ Stream_Write_UINT16(s, cbWorkingDir); /* cbWorkingDir */ if (cbDomain > 0) Stream_Write(s, domain, cbDomain); Stream_Write_UINT16(s, 0); if (cbUserName > 0) Stream_Write(s, userName, cbUserName); Stream_Write_UINT16(s, 0); if (cbPassword > 0) Stream_Write(s, password, cbPassword); Stream_Write_UINT16(s, 0); if (cbAlternateShell > 0) Stream_Write(s, alternateShell, cbAlternateShell); Stream_Write_UINT16(s, 0); if (cbWorkingDir > 0) Stream_Write(s, workingDir, cbWorkingDir); Stream_Write_UINT16(s, 0); free(domain); free(userName); free(alternateShell); free(workingDir); if (!usedPasswordCookie) free(password); if (settings->RdpVersion >= 5) rdp_write_extended_info_packet(s, settings); /* extraInfo */ }