boolean rdp_read_info_packet(STREAM* s, rdpSettings* settings) { uint32 flags; uint16 cbDomain; uint16 cbUserName; uint16 cbPassword; uint16 cbAlternateShell; uint16 cbWorkingDir; stream_seek_uint32(s); /* CodePage */ stream_read_uint32(s, flags); /* flags */ settings->autologon = ((flags & INFO_AUTOLOGON) ? true : false); settings->remote_app = ((flags & INFO_RAIL) ? true : false); settings->console_audio = ((flags & INFO_REMOTECONSOLEAUDIO) ? true : false); settings->compression = ((flags & INFO_COMPRESSION) ? true : false); stream_read_uint16(s, cbDomain); /* cbDomain */ stream_read_uint16(s, cbUserName); /* cbUserName */ stream_read_uint16(s, cbPassword); /* cbPassword */ stream_read_uint16(s, cbAlternateShell); /* cbAlternateShell */ stream_read_uint16(s, cbWorkingDir); /* cbWorkingDir */ if (stream_get_left(s) < cbDomain + 2) return false; if (cbDomain > 0) { settings->domain = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbDomain); stream_seek(s, cbDomain); } stream_seek(s, 2); if (stream_get_left(s) < cbUserName + 2) return false; if (cbUserName > 0) { settings->username = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbUserName); stream_seek(s, cbUserName); } stream_seek(s, 2); if (stream_get_left(s) < cbPassword + 2) return false; if (cbPassword > 0) { settings->password = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbPassword); stream_seek(s, cbPassword); } stream_seek(s, 2); if (stream_get_left(s) < cbAlternateShell + 2) return false; if (cbAlternateShell > 0) { settings->shell = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbAlternateShell); stream_seek(s, cbAlternateShell); } stream_seek(s, 2); if (stream_get_left(s) < cbWorkingDir + 2) return false; if (cbWorkingDir > 0) { settings->directory = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbWorkingDir); stream_seek(s, cbWorkingDir); } stream_seek(s, 2); if (settings->rdp_version >= 5) return rdp_read_extended_info_packet(s, settings); /* extraInfo */ return true; }
BOOL rdp_read_info_packet(wStream* s, rdpSettings* settings) { UINT32 flags; UINT16 cbDomain; UINT16 cbUserName; UINT16 cbPassword; UINT16 cbAlternateShell; UINT16 cbWorkingDir; if (Stream_GetRemainingLength(s) < 18) // invalid packet return FALSE; Stream_Seek_UINT32(s); /* CodePage */ Stream_Read_UINT32(s, flags); /* flags */ settings->AudioCapture = ((flags & RNS_INFO_AUDIOCAPTURE) ? TRUE : FALSE); settings->AudioPlayback = ((flags & INFO_NOAUDIOPLAYBACK) ? FALSE : TRUE); settings->AutoLogonEnabled = ((flags & INFO_AUTOLOGON) ? TRUE : FALSE); settings->RemoteApplicationMode = ((flags & INFO_RAIL) ? TRUE : FALSE); settings->RemoteConsoleAudio = ((flags & INFO_REMOTECONSOLEAUDIO) ? TRUE : FALSE); settings->CompressionEnabled = ((flags & INFO_COMPRESSION) ? TRUE : FALSE); Stream_Read_UINT16(s, cbDomain); /* cbDomain */ Stream_Read_UINT16(s, cbUserName); /* cbUserName */ Stream_Read_UINT16(s, cbPassword); /* cbPassword */ Stream_Read_UINT16(s, cbAlternateShell); /* cbAlternateShell */ Stream_Read_UINT16(s, cbWorkingDir); /* cbWorkingDir */ if (Stream_GetRemainingLength(s) < cbDomain + 2) return FALSE; if (cbDomain > 0) { ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s), cbDomain / 2, &settings->Domain, 0, NULL, NULL); Stream_Seek(s, cbDomain); } Stream_Seek(s, 2); if (Stream_GetRemainingLength(s) < cbUserName + 2) return FALSE; if (cbUserName > 0) { ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s), cbUserName / 2, &settings->Username, 0, NULL, NULL); Stream_Seek(s, cbUserName); } Stream_Seek(s, 2); if (Stream_GetRemainingLength(s) < cbPassword + 2) return FALSE; if (cbPassword > 0) { ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s), cbPassword / 2, &settings->Password, 0, NULL, NULL); Stream_Seek(s, cbPassword); } Stream_Seek(s, 2); if (Stream_GetRemainingLength(s) < cbAlternateShell + 2) return FALSE; if (cbAlternateShell > 0) { ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s), cbAlternateShell / 2, &settings->AlternateShell, 0, NULL, NULL); Stream_Seek(s, cbAlternateShell); } Stream_Seek(s, 2); if (Stream_GetRemainingLength(s) < cbWorkingDir + 2) return FALSE; if (cbWorkingDir > 0) { ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) Stream_Pointer(s), cbWorkingDir / 2, &settings->ShellWorkingDirectory, 0, NULL, NULL); Stream_Seek(s, cbWorkingDir); } Stream_Seek(s, 2); if (settings->RdpVersion >= 5) return rdp_read_extended_info_packet(s, settings); /* extraInfo */ return TRUE; }