
RDP เชชเซเชฐเซเชเซเชเซเชฒ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชชเชจ เชธเซเชฐเซเชธ เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพ เชตเชฟเชถเซเชจเชพ เชฒเซเชเซเชจเซ เชถเซเชฐเซเชฃเซเชฎเชพเช เช เชฌเซเชเซ เชธเชฎเซเชเซเชทเชพ เชเซ. เชคเซเชฎเชพเช เชเชชเชฃเซ rdesktop เชเซเชฒเชพเชฏเชจเซเช เช
เชจเซ xrdp เชธเชฐเซเชตเชฐเชจเซ เชเซเชเชถเซเช.
เชญเซเชฒเซเชจเซ เชเชณเชเชตเชพ เชฎเชพเชเซเชจเชพ เชธเชพเชงเชจ เชคเชฐเซเชเซ เชเชชเชฏเซเช เชฅเชพเชฏ เชเซ . ะญัะพ ััะฐัะธัะตัะบะธะน ะฐะฝะฐะปะธะทะฐัะพั ะบะพะดะฐ ะดะปั ัะทัะบะพะฒ C, C++, C# ะธ Java, ะดะพัััะฟะฝัะน ะฝะฐ ะฟะปะฐััะพัะผะฐั
Windows, Linux ะธ macOS.
เชฒเซเช เชซเชเซเชค เชคเซ เชญเซเชฒเซ เชฐเชเซ เชเชฐเซ เชเซ เชเซ เชฎเชจเซ เชฐเชธเชชเซเชฐเชฆ เชฒเชพเชเชคเซ เชนเชคเซ. เชเซ เชเซ, เชชเซเชฐเซเชเซเชเซเช เชจเชพเชจเชพ เชเซ, เชคเซเชฅเซ เชฅเซเชกเซ เชญเซเชฒเซ เชนเชคเซ :).
เชจเซเชเชงเชฃเซ. เชซเซเชฐเซเชเชฐเชกเซเชชเซ เชชเซเชฐเซเชเซเชเซเช เชตเซเชฐเชฟเชซเชฟเชเซเชถเชจ เชตเชฟเชถเซ เช เชเชพเชเชจเซ เชฒเซเช เชฎเชณเซ เชถเชเซ เชเซ .
rdesktop
โ ัะฒะพะฑะพะดะฝะฐั ัะตะฐะปะธะทะฐัะธั ะบะปะธะตะฝัะฐ RDP ะดะปั UNIX-based ัะธััะตะผ. ะะณะพ ัะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัะทะพะฒะฐัั ะธ ะฟะพะด Windows, ะตัะปะธ ัะพะฑะธัะฐัั ะฟัะพะตะบั ะฟะพะด Cygwin. ะะธัะตะฝะทะธัะพะฒะฐะฝ ะฟะพะด GPLv3.
เช เชเซเชฒเชพเชฏเชเช เชเซเชฌ เช เชฒเซเชเชชเซเชฐเชฟเชฏ เชเซ - เชคเซ ReactOS เชฎเชพเช เชกเชฟเชซเซเชฒเซเช เชฐเซเชชเซ เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชฏ เชเซ, เช เชจเซ เชคเชฎเซ เชคเซเชจเชพ เชฎเชพเชเซ เชคเซเชคเซเชฏ-เชชเชเซเชท เชเซเชฐเชพเชซเชฟเชเชฒ เชซเซเชฐเชจเซเช-เชเชจเซเชกเซเชธ เชชเชฃ เชถเซเชงเซ เชถเชเซ เชเซ. เชเซ เชเซ, เชคเซ เชเซเชฌ เชตเซเชฆเซเชง เชเซ: เชคเซเชจเซ เชชเซเชฐเชฅเชฎ เชฐเชเซเชเชค 4 เชเชชเซเชฐเชฟเชฒ, 2001 เชจเชพ เชฐเซเช เชฅเช เชนเชคเซ - เชฒเซเชเชจ เชธเชฎเชฏเซ, เชคเซ 17 เชตเชฐเซเชทเชจเซ เชเซ.
เชฎเซเช เช เชเชพเช เชจเซเชเชงเซเชฏเซเช เชเซ เชคเซเชฎ, เชชเซเชฐเซเชเซเชเซเช เชคเชฆเซเชฆเชจ เชจเชพเชจเซ เชเซ. เชคเซเชฎเชพเช เชเซเชกเชจเซ เชฒเชเชญเช 30 เชนเชเชพเชฐ เชฒเชพเชเชจ เชเซ, เชเซ เชคเซเชจเซ เชเชเชฎเชฐเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฐเชพเชเซเชจเซ เชฅเซเชกเซ เชตเชฟเชเชฟเชคเซเชฐ เชเซ. เชธเชฐเชเชพเชฎเชฃเซ เชฎเชพเชเซ, เชซเซเชฐเซเชเชฐเชกเซเชชเซเชฎเชพเช 320 เชนเชเชพเชฐ เชฐเซเชเชพเช เชเซ. เช เชนเซเช เชเซเชฒเซเช เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซเช เชเชเชเชชเซเช เชเซ:

เช เชเชฎเซเชฏ เชเซเชก
เช เชจเซเชชเชฒเชฌเซเชง เชเซเชก เชฎเชณเซเชฏเซ. เชถเชเซเชฏ เชเซ เชเซ เชเซเช เชญเซเชฒ เชนเชพเชเชฐ เชนเซเชฏ. rdesktop.c 1502
int
main(int argc, char *argv[])
{
....
return handle_disconnect_reason(deactivated, ext_disc_reason);
if (g_redirect_username)
xfree(g_redirect_username);
xfree(g_username);
}เชซเชเชเซเชถเชจเชฎเชพเช เชญเซเชฒ เชคเชฐเชค เช เชเชชเชฃเซ เชธเชพเชฎเซ เชเชตเซ เชเซ เชฎเซเชเซเชฏ: เชเชชเชฃเซ เชเชชเชฐเซเชเชฐ เชชเชเซ เชเซเชก เชเชตเชคเชพ เชเซเชเช เชเซเช เชตเชณเชคเชฐ โ เช เชเซเชเชกเซ เชฎเซเชฎเชฐเซ เชธเชซเชพเช เชเชฐเซ เชเซ. เชเซ เชเซ, เชญเซเชฒเชฅเซ เชเซเช เชเชคเชฐเซ เชจเชฅเซ: เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฌเชนเชพเชฐ เชจเซเชเชณเซเชฏเชพ เชชเชเซ เชฌเชงเซ เชซเชพเชณเชตเซเชฒ เชฎเซเชฎเชฐเซ เชเชชเชฐเซเชเชฟเชเช เชธเชฟเชธเซเชเชฎ เชฆเซเชตเชพเชฐเชพ เชธเชพเชซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ.
เชเซเช เชญเซเชฒ เชนเซเชจเซเชกเชฒเชฟเชเช เชจเชฅเซ
เช เชฐเซ เช เชจเซเชกเชฐเชฐเชจ เชถเชเซเชฏ เชเซ. 'n' เชเชจเซเชกเซเชเซเชธเชจเซเช เชฎเซเชฒเซเชฏ -1 เชธเซเชงเซ เชชเชนเซเชเชเซ เชถเชเซ เชเซ. rdesktop.c 1872
RD_BOOL
subprocess(char *const argv[], str_handle_lines_t linehandler, void *data)
{
int n = 1;
char output[256];
....
while (n > 0)
{
n = read(fd[0], output, 255);
output[n] = ' '; // <=
str_handle_lines(output, &rest, linehandler, data);
}
....
}เช เชเชฟเชธเซเชธเชพเชฎเชพเช เชเซเชก เชธเซเชจเชฟเชชเซเช เชซเชพเชเชฒเชฎเชพเชเชฅเซ เชฌเชซเชฐเชฎเชพเช เชซเชพเชเชฒ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เชคเซเชฏเชพเช เชธเซเชงเซ เชตเชพเชเชเซ เชเซ. เชเซ เชเซ, เช เชนเซเช เชธเชเชญเชพเชณเชตเชพเชฎเชพเช เชเซเช เชญเซเชฒ เชจเชฅเซ: เชเซ เชเชเชเช เชเซเชเซเช เชฅเชพเชฏ, เชคเซ เชชเชเซ เชตเชพเชเชเชตเซเช -1 เชชเชฐเชค เชเชตเชถเซ, เช เชจเซ เชชเชเซ เชเชฐเซ เชเชตเชฐเชฐเชจ เชฅเช เชเชถเซ เชเชเชเชชเซเช.
เชเชพเชฐ เชชเซเชฐเชเชพเชฐเชฎเชพเช EOF เชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ
EOF เชจเซ เชคเซเชฒเชจเชพ 'char' เชชเซเชฐเชเชพเชฐเชจเชพ เชฎเซเชฒเซเชฏ เชธเชพเชฅเซ เชฅเชตเซ เชเซเชเช เชจเชนเซเช. '(c = fgetc(fp))' 'int' เชชเซเชฐเชเชพเชฐเชจเซเช เชนเซเชตเซเช เชเซเชเช. ctrl.c 500
int
ctrl_send_command(const char *cmd, const char *arg)
{
char result[CTRL_RESULT_SIZE], c, *escaped;
....
while ((c = fgetc(fp)) != EOF && index < CTRL_RESULT_SIZE && c != 'n')
{
result[index] = c;
index++;
}
....
}เช เชนเซเช เชเชชเชฃเซ เชซเชพเชเชฒเชจเชพ เช เชเชค เชธเซเชงเซ เชชเชนเซเชเชเชตเชพเชจเซเช เชเซเชเซเช เชนเซเชจเซเชกเชฒเชฟเชเช เชเซเชฏเซเช เชเซ: เชเซ fgetc เชเช เช เชเซเชทเชฐ เชชเชฐเชค เชเชฐเซ เชเซ เชเซเชจเซ เชเซเชก 0xFF เชเซ, เชคเซเชจเซ เชซเชพเชเชฒเชจเชพ เช เชเชค เชคเชฐเซเชเซ เช เชฐเซเชฅเชเชเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ (EOF).
EOF เชคเซ เชธเซเชฅเชฟเชฐ เชเซ, เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ -1 เชคเชฐเซเชเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชฅเชพเชฏ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, CP1251 เชเชจเซเชเซเชกเชฟเชเชเชฎเชพเช, เชฐเชถเชฟเชฏเชจ เชฎเซเชณเชพเชเซเชทเชฐเซเชจเชพ เชเซเชฒเซเชฒเชพ เช เชเซเชทเชฐเชฎเชพเช เชเซเชก 0xFF เชเซ, เชเซ เชจเชเชฌเชฐ -1 เชจเซ เช เชจเซเชฐเซเชช เชเซ เชเซ เชเชชเชฃเซ เชเชฒ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช เชเชฐเชจเชพเช เชชเชฐเชเซเชฐเชฃ เชเชพเชฎเซ. เชคเซ เชคเชพเชฐเชฃ เชเชชเซ เชเซ เชเซ เชชเซเชฐเชคเซเช 0xFF, เชเซเชฎ EOF (-1) เชซเชพเชเชฒเชจเชพ เช เชเชค เชคเชฐเซเชเซ เช เชฐเซเชฅเชเชเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชเชตเซ เชญเซเชฒเซเชจเซ เชเชพเชณเชตเชพ เชฎเชพเชเซ, เชเชพเชฐเซเชฏเชจเซเช เชชเชฐเชฟเชฃเชพเชฎ เชเซ fgetc เชเซเชตเชพ เชเชฒเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชนเซเชตเซเช เชเซเชเช เชชเซเชฐเซเชฃเชพเชเช.
เชเชพเชเชชเซ
เชเซเชเชกเซ 1
เช เชญเชฟเชตเซเชฏเชเซเชคเชฟ 'write_time' เชนเชเชฎเซเชถเชพ เชเซเชเซ เชนเซเชฏ เชเซ. disk.c 805
RD_NTSTATUS
disk_set_information(....)
{
time_t write_time, change_time, access_time, mod_time;
....
if (write_time || change_time)
mod_time = MIN(write_time, change_time);
else
mod_time = write_time ? write_time : change_time; // <=
....
}เชเชฆเชพเช เช เชเซเชกเชจเชพ เชฒเซเชเชเชจเซ เชคเซ เชเซเชเซเช เชฒเชพเชเซเชฏเซเช เชเซ || ะธ && เชธเซเชฅเชฟเชคเชฟเชฎเชพเช. เชเชพเชฒเซ เชฎเซเชฒเซเชฏเซ เชฎเชพเชเซเชจเชพ เชธเชเชญเชตเชฟเชค เชตเชฟเชเชฒเซเชชเซเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเชเช เชฒเชเชตเชพเชจเซ_เชธเชฎเชฏ ะธ เชซเซเชฐเชซเชพเชฐ_เชธเชฎเชฏ:
- เชฌเชเชจเซ เชเชฒ 0 เชจเซ เชฌเชฐเชพเชฌเชฐ เชเซ: เช เชเชฟเชธเซเชธเชพเชฎเชพเช เชเชชเชฃเซ เชเช เชถเชพเชเชพเชฎเชพเช เชธเชฎเชพเชชเซเชค เชฅเชเชถเซเช เชฌเซเชเซเช: เชเชฒ เชฎเซเชก_เชธเชฎเชฏ เช เชจเซเชเชพเชฎเซ เชธเซเชฅเชฟเชคเชฟเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชงเชพ เชตเชฟเชจเชพ เชนเชเชฎเซเชถเชพ 0 เชฐเชนเซเชถเซ.
- เชเชฒเซเชฎเชพเชเชจเซเช เชเช 0 เชเซ: เชฎเซเชก_เชธเชฎเชฏ 0 เชจเซ เชฌเชฐเชพเชฌเชฐ เชนเชถเซ (เชเซ เชเซ เช เชจเซเชฏ เชเชฒเชฎเชพเช เชฌเชฟเชจ-เชจเชเชพเชฐเชพเชคเซเชฎเช เชฎเซเชฒเซเชฏ เชนเซเชฏ), เชเชพเชฐเชฃ เชเซ MIN เชฌเซ เชตเชฟเชเชฒเซเชชเซเชฎเชพเชเชฅเซ เชจเชพเชจเชพเชจเซ เชชเชธเชเชฆ เชเชฐเชถเซ.
- เชฌเชเชจเซ เชเชฒเซ 0 เชจเซ เชฌเชฐเชพเชฌเชฐ เชจเชฅเซ: เชจเซเชฏเซเชจเชคเชฎ เชฎเซเชฒเซเชฏ เชชเชธเชเชฆ เชเชฐเซ.
เชเซเชฏเชพเชฐเซ เชธเชพเชฅเซ เชถเชฐเชค เชฌเชฆเชฒเซ เชฒเชเซ_เชธเชฎเชฏ && เชซเซเชฐเชซเชพเชฐ_เชธเชฎเชฏ เชตเชฐเซเชคเชจ เชฏเซเชเซเชฏ เชฆเซเชเชพเชถเซ:
- เชเช เช เชฅเชตเชพ เชฌเชเชจเซ เชเชฒ 0 เชจเซ เชฌเชฐเชพเชฌเชฐ เชจเชฅเซ: เชฌเชฟเชจ-เชถเซเชจเซเชฏ เชฎเซเชฒเซเชฏ เชชเชธเชเชฆ เชเชฐเซ.
- เชฌเชเชจเซ เชเชฒเซ 0 เชจเซ เชฌเชฐเชพเชฌเชฐ เชจเชฅเซ: เชจเซเชฏเซเชจเชคเชฎ เชฎเซเชฒเซเชฏ เชชเชธเชเชฆ เชเชฐเซ.
เชเซเชเชกเซ 2
เช เชญเชฟเชตเซเชฏเชเซเชคเชฟ เชนเชเชฎเซเชถเชพ เชธเชพเชเซ เชนเซเชฏ เชเซ. เชเชฆเชพเช เช เชนเซเช '&&' เชเชชเชฐเซเชเชฐเชจเซ เชเชชเชฏเซเช เชฅเชตเซ เชเซเชเช. disk.c 1419
static RD_NTSTATUS
disk_device_control(RD_NTHANDLE handle, uint32 request, STREAM in,
STREAM out)
{
....
if (((request >> 16) != 20) || ((request >> 16) != 9))
return RD_STATUS_INVALID_PARAMETER;
....
}เชฆเซเชเซเชคเซ เชฐเซเชคเซ เชเชชเชฐเซเชเชฐเซ เช เชนเซเช เชชเชฃ เชญเชณเซ เชเชฏเชพ เชเซ || ะธ &&, เช เชฅเชตเชพ == ะธ !=: เชเชฒเชฎเชพเช เชเช เช เชธเชฎเชฏเซ 20 เช เชจเซ 9 เชฎเซเชฒเซเชฏ เชนเซเช เชถเชเชคเซเช เชจเชฅเซ.
เช เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฐเซเชเชพ เชจเชเชฒ
'sprintf' เชซเชเชเซเชถเชจเชจเซ เชเซเชฒ เชฌเชซเชฐ 'เชซเซเชฒเชชเชพเชฅ'เชจเชพ เชเชตเชฐเชซเซเชฒเซ เชคเชฐเชซ เชฆเซเชฐเซ เชเชถเซ. disk.c 1257
RD_NTSTATUS
disk_query_directory(....)
{
....
char *dirname, fullpath[PATH_MAX];
....
/* Get information for directory entry */
sprintf(fullpath, "%s/%s", dirname, pdirent->d_name);
....
}เชเซเชฏเชพเชฐเซ เชคเชฎเซ เชเชพเชฐเซเชฏเชจเซ เชธเชเชชเซเชฐเซเชฃ เชฐเซเชคเซ เชเซเชถเซ, เชคเซเชฏเชพเชฐเซ เชคเซ เชธเซเชชเชทเซเช เชฅเช เชเชถเซ เชเซ เช เชเซเชก เชธเชฎเชธเซเชฏเชพเชเชจเซเช เชเชพเชฐเชฃ เชจเชฅเซ. เชเซ เชเซ, เชคเซเช เชญเชตเชฟเชทเซเชฏเชฎเชพเช เชเชฆเซเชญเชตเชถเซ: เชเช เชฌเซเชฆเชฐเชเชพเชฐ เชซเซเชฐเชซเชพเชฐ เช เชจเซ เช เชฎเชจเซ เชฌเชซเชฐ เชเชตเชฐเชซเซเชฒเซ เชฎเชณเชถเซ - เชธเซเชชเซเชฐเชฟเชจเซเช เชเซเช เชชเชฃ เชตเชธเซเชคเซ เชฆเซเชตเชพเชฐเชพ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชจเชฅเซ, เชคเซเชฅเซ เชเซเชฏเชพเชฐเซ เชชเชพเชฅเชจเซ เชเซเชกเซเช เชคเซเชฏเชพเชฐเซ เชเชชเชฃเซ เชเชฐเซเชจเซ เชธเซเชฎเชพเชเชฅเซ เชเชเชณ เชตเชงเซ เชถเชเซเช เชเซเช. เช เชเซเชฒ เชชเชฐ เชจเซเชเชฟเชธ เชเชฐเชตเชพเชจเซ เชญเชฒเชพเชฎเชฃ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ snprintf(เชซเซเชฒเชชเชพเชฅ, PATH_MAX, ....).
เชจเชฟเชฐเชฐเซเชฅเช เชธเซเชฅเชฟเชคเชฟ
เชถเชฐเชคเซ เช เชญเชฟเชตเซเชฏเชเซเชคเชฟเชจเซ เชเช เชญเชพเช เชนเชเชฎเซเชถเชพ เชธเชพเชเซ เชนเซเชฏ เชเซ: เชเชฎเซเชฐเซ > 0. scard.c 507
static void
inRepos(STREAM in, unsigned int read)
{
SERVER_DWORD add = 4 - read % 4;
if (add < 4 && add > 0)
{
....
}
}เชจเชฟเชฐเซเชเซเชทเชฃ > 0 เชเชฎเซเชฐเซ เช เชนเซเช เชเซเช เชเชฐเซเชฐ เชจเชฅเซ: เชเชฒ เชนเชเชฎเซเชถเชพ เชถเซเชจเซเชฏ เชเชฐเชคเชพ เชตเชงเชพเชฐเซ เชนเชถเซ, เชเชพเชฐเชฃ เชเซ % 4 เชตเชพเชเชเซ เชตเชฟเชญเชพเชเชจเซ เชฌเชพเชเซเชจเซ เชญเชพเช เชชเชฐเชค เชเชฐเชถเซ, เชชเชฐเชเชคเซ เชคเซ เชเซเชฏเชพเชฐเซเชฏ 4 เชจเซ เชฌเชฐเชพเชฌเชฐ เชจเชนเซเช เชนเซเชฏ.
xrdp
- เชเชชเชจ เชธเซเชฐเซเชธ เชเซเชก เชธเชพเชฅเซ เชเชฐเชกเซเชชเซ เชธเชฐเซเชตเชฐเชจเซเช เช เชฎเชฒเซเชเชฐเชฃ. เชชเซเชฐเซเชเซเชเซเชเชจเซ 2 เชญเชพเชเซเชฎเชพเช เชตเชนเซเชเชเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชเซ:
- xrdp - เชชเซเชฐเซเชเซเชเซเชฒ เช เชฎเชฒเซเชเชฐเชฃ. Apache 2.0 เชฒเชพเชฏเชธเชจเซเชธ เชนเซเช เชณ เชตเชฟเชคเชฐเชฟเชค.
- xorgxrdp - xrdp เชธเชพเชฅเซ เชตเชพเชชเชฐเชตเชพ เชฎเชพเชเซ Xorg เชกเซเชฐเชพเชเชตเชฐเซเชจเซ เชธเชฎเซเชน. เชฒเชพเชเชธเชจเซเชธ - X11 (เชเซเชฎ เชเซ MIT, เชชเชฐเชเชคเซ เชเชพเชนเซเชฐเชพเชคเชฎเชพเช เชเชชเชฏเซเชเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเชฐเซ เชเซ)
เชชเซเชฐเซเชเซเชเซเชเชจเซ เชตเชฟเชเชพเชธ rdesktop เช เชจเซ FreeRDP เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ เชชเชฐ เชเชงเชพเชฐเชฟเชค เชเซ. เชถเชฐเซเชเชคเชฎเชพเช, เชเซเชฐเชพเชซเชฟเชเซเชธ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เช เชฒเช VNC เชธเชฐเซเชตเชฐ, เช เชฅเชตเชพ RDP เชธเชชเซเชฐเซเช - X11rdp เชธเชพเชฅเซ เชตเชฟเชถเชฟเชทเซเช X11 เชธเชฐเซเชตเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชชเชกเซเชฏเซ, เชชเชฐเชเชคเซ xorgxrdp เชจเชพ เชเชเชฎเชจ เชธเชพเชฅเซ, เชคเซเชฎเชจเซ เชเชฐเซเชฐเชฟเชฏเชพเชค เช เชฆเซเชถเซเชฏ เชฅเช เชเช.
เช เชฒเซเชเชฎเชพเช เช เชฎเซ xorgxrdpเชจเซ เชเชตเชฐเซเชถเซเช เชจเชนเซเช.
xrdp เชชเซเชฐเซเชเซเชเซเช, เช เชเชพเชเชจเชพ เชชเซเชฐเซเชเซเชเซเชเชจเซ เชเซเชฎ, เชเซเชฌ เช เชจเชพเชจเซ เชเซ เช เชจเซ เชคเซเชฎเชพเช เชฒเชเชญเช 80 เชนเชเชพเชฐ เชฒเชพเชเชจเซ เชเซ.

เชตเชงเซ เชเชพเชเชชเซ
เชเซเชกเชฎเชพเช เชธเชฎเชพเชจ เชฌเซเชฒเซเชเซเชธเชจเซ เชธเชเชเซเชฐเชน เชเซ. 87, 88, 89 เชชเชเชเซเชคเชฟเชเชฎเชพเช 'r', 'g', 'r' เชตเชธเซเชคเซเช เชคเชชเชพเชธเซ. rfxencode_rgb_to_yuv.c 87
static int
rfx_encode_format_rgb(const char *rgb_data, int width, int height,
int stride_bytes, int pixel_format,
uint8 *r_buf, uint8 *g_buf, uint8 *b_buf)
{
....
switch (pixel_format)
{
case RFX_FORMAT_BGRA:
....
while (x < 64)
{
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r; // <=
x++;
}
....
}
....
}เช เชเซเชก librfxcodec เชฒเชพเชเชฌเซเชฐเซเชฐเซเชฎเชพเชเชฅเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ, เชเซ RemoteFX เชฎเชพเชเซ jpeg2000 เชเซเชกเซเชเชจเซ เช เชฎเชฒ เชเชฐเซ เชเซ. เช เชนเซเช, เชฆเซเชเซเชคเซ เชฐเซเชคเซ, เชเซเชฐเชพเชซเชฟเช เชกเซเชเชพ เชเซเชจเชฒเซ เชฎเชฟเชถเซเชฐเชฟเชค เชเซ - "เชตเชพเชฆเชณเซ" เชฐเชเชเชจเซ เชฌเชฆเชฒเซ, "เชฒเชพเชฒ" เชฐเซเชเซเชฐเซเชก เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เช เชญเซเชฒ เชฎเซเชเชพ เชญเชพเชเซ เชเซเชชเซ-เชชเซเชธเซเชเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ เชฆเซเชเชพเช เชเซ.
เชธเชฎเชพเชจ เชเชพเชฐเซเชฏเชฎเชพเช เชธเชฎเชพเชจ เชธเชฎเชธเซเชฏเชพ เชเชตเซ rfx_encode_format_argb, เชเซ เชตเชฟเชถเซเชฒเซเชทเชเซ เช เชฎเชจเซ เชชเชฃ เชเชนเซเชฏเซเช:
เชเซเชกเชฎเชพเช เชธเชฎเชพเชจ เชฌเซเชฒเซเชเซเชธเชจเซ เชธเชเชเซเชฐเชน เชเซ. 260, 261, 262, 263 เชฒเชพเชเชจเชฎเชพเช เชเชเชเชฎเซเชธ 'a', 'r', 'g', 'r' เชคเชชเชพเชธเซ. rfxencode_rgb_to_yuv.c 260
while (x < 64)
{
*la_buf++ = a;
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r;
x++;
}เชเชฐเซ เชเซเชทเชฃเชพ
เชเชฐเซ เชเชตเชฐเชฐเชจ เชถเชเซเชฏ เชเซ. 'i โ 8' เชเชจเซเชกเซเชเซเชธเชจเซเช เชฎเซเชฒเซเชฏ 129 เชธเซเชงเซ เชชเชนเซเชเชเซ เชถเชเซ เชเซ. genkeymap.c 142
// evdev-map.c
int xfree86_to_evdev[137-8+1] = {
....
};
// genkeymap.c
extern int xfree86_to_evdev[137-8];
int main(int argc, char **argv)
{
....
for (i = 8; i <= 137; i++) /* Keycodes */
{
if (is_evdev)
e.keycode = xfree86_to_evdev[i-8];
....
}
....
}เช เชฌเซ เชซเชพเชเชฒเซเชฎเชพเช เชเชฐเซเชจเซ เชเซเชทเชฃเชพ เช เชจเซ เชตเซเชฏเชพเชเซเชฏเชพ เช เชธเชเชเชค เชเซ - เชเชฆ 1 เชฅเซ เช เชฒเช เชเซ. เชเซ เชเซ, เชเซเช เชญเซเชฒเซ เชฅเชคเซ เชจเชฅเซ - เชฏเซเชเซเชฏ เชเชฆ evdev-map.c เชซเชพเชเชฒเชฎเชพเช เชเชฒเซเชฒเซเชเชฟเชค เชเซ, เชคเซเชฅเซ เชคเซเชฏเชพเช เชเซเช เชฎเชฐเซเชฏเชพเชฆเชพเชจเซ เชฌเชนเชพเชฐ เชจเชฅเซ. เชคเซ เช เชฎเชพเชคเซเชฐ เชเช เชญเซเชฒ เชเซ เชเซเชจเซ เชธเชฐเชณเชคเชพเชฅเซ เช เซเช เชเชฐเซ เชถเชเชพเชฏ เชเซ.
เชเซเชเซ เชธเชฐเชเชพเชฎเชฃเซ
เชถเชฐเชคเซ เช เชญเชฟเชตเซเชฏเชเซเชคเชฟเชจเซ เชเช เชญเชพเช เชนเชเชฎเซเชถเชพ เชเซเชเซ เชนเซเชฏ เชเซ: (cap_len < 0). xrdp_caps.c 616
// common/parse.h
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
#define in_uint16_le(s, v) do
....
#else
#define in_uint16_le(s, v) do
{
(v) = *((unsigned short*)((s)->p));
(s)->p += 2;
} while (0)
#endif
int
xrdp_caps_process_confirm_active(struct xrdp_rdp *self, struct stream *s)
{
int cap_len;
....
in_uint16_le(s, cap_len);
....
if ((cap_len < 0) || (cap_len > 1024 * 1024))
{
....
}
....
}เชซเชเชเซเชถเชจ เชเช เชชเซเชฐเชเชพเชฐเชจเซเช เชเชฒ เชตเชพเชเชเซ เชเซ เชเซเชเชเชฎเชพเช เชธเชนเซ เชตเชฟเชจเชพเชจเซเช เชเซเชตเชพ เชเชฒ เชฎเชพเช เชชเซเชฐเซเชฃเชพเชเช. เช เชนเซเช เชคเชชเชพเชธ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ เชเชพเชฐเชฃ เชเซ เชเชชเชฃเซ เชธเชนเซ เชจ เชเชฐเซเชฒ เชตเซเชฐเซเชเชฌเชฒ เชตเชพเชเชเซเช เชเซเช เช เชจเซ เชชเชฐเชฟเชฃเชพเชฎ เชฎเซเชเชพ เชตเซเชฐเซเชเชฌเชฒเชจเซ เชธเซเชเชชเซ เชฐเชนเซเชฏเชพ เชเซเช, เชคเซเชฅเซ เชตเซเชฐเซเชเชฌเชฒ เชจเชเชพเชฐเชพเชคเซเชฎเช เชฎเซเชฒเซเชฏ เชฒเช เชถเชเชคเซเช เชจเชฅเซ.
เชฌเชฟเชจเชเชฐเซเชฐเซ เชคเชชเชพเชธ
เชถเชฐเชคเซ เช เชญเชฟเชตเซเชฏเชเซเชคเชฟเชจเซ เชเช เชญเชพเช เชนเชเชฎเซเชถเชพ เชธเชพเชเซ เชนเซเชฏ เชเซ: (bpp != 16). libxrdp.c 704
int EXPORT_CC
libxrdp_send_pointer(struct xrdp_session *session, int cache_idx,
char *data, char *mask, int x, int y, int bpp)
{
....
if ((bpp == 15) && (bpp != 16) && (bpp != 24) && (bpp != 32))
{
g_writeln("libxrdp_send_pointer: error");
return 1;
}
....
}เช เชธเชฎเชพเชจเชคเชพ เชคเชชเชพเชธเชจเซ เช เชนเซเช เชเซเช เช เชฐเซเชฅ เชจเชฅเซ เชเชพเชฐเชฃ เชเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชถเชฐเซเชเชคเชฎเชพเช เชธเชฐเชเชพเชฎเชฃเซ เชเซ. เชธเชเชญเชต เชเซ เชเซ เช เชเช เชเชพเชเชชเซ เชเซ เช เชจเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชเชชเชฐเซเชเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเชเชคเซ เชนเชคเซ || เช เชฎเชพเชจเซเชฏ เชฆเชฒเซเชฒเซเชจเซ เชซเชฟเชฒเซเชเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ.
เชจเชฟเชทเซเชเชฐเซเชท
เชเชกเชฟเช เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชเซเช เชเชเชญเซเชฐ เชญเซเชฒเซ เชเชณเชเชตเชพเชฎเชพเช เชเชตเซ เชจ เชนเชคเซ, เชชเชฐเชเชคเซ เชเชฃเซ เชเชพเชฎเซเช เชฎเชณเซ เชเชตเซ เชนเชคเซ. เชเซ เชเซ, เช เชกเชฟเชเชพเชเชจเชจเซ เชเชชเชฏเซเช เชเชฃเซ เชธเชฟเชธเซเชเชฎเซเชฎเชพเช เชฅเชพเชฏ เชเซ, เชญเชฒเซ เชคเซ เช เชตเชเชพเชถเชฎเชพเช เชจเชพเชจเซ เชนเซเชฏ. เชจเชพเชจเชพ เชชเซเชฐเซเชเซเชเซเชเชฎเชพเช เชเชฃเซ เชฌเชงเซ เชญเซเชฒเซ เชนเซเชตเซ เชเชฐเซเชฐเซ เชจเชฅเซ, เชคเซเชฅเซ เชคเชฎเชพเชฐเซ เชฎเชพเชคเซเชฐ เชจเชพเชจเชพ เชชเซเชฐเซเชเซเชเซเชเซเชธ เชชเชฐ เช เชตเชฟเชถเซเชฒเซเชทเชเชจเซ เชเชพเชฎเชเซเชฐเซเชจเซ เชจเชฟเชฐเซเชฃเชฏ เชจ เชฒเซเชตเซ เชเซเชเช. เชคเชฎเซ เชฒเซเชเชฎเชพเช เช เชตเชฟเชถเซ เชตเชงเซ เชตเชพเชเชเซ เชถเชเซ เชเซ โ".
เชคเชฎเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซเชฅเซ PVS-Studio เชจเซเช เชเซเชฐเชพเชฏเชฒ เชตเชฐเซเชเชจ เชกเชพเชเชจเชฒเซเชก เชเชฐเซ เชถเชเซ เชเซ .
เชเซ เชคเชฎเซ เช เชฒเซเช เช
เชเชเซเชฐเซเชเซ เชฌเซเชฒเชคเชพ เชชเซเชฐเซเชเซเชทเชเซ เชธเชพเชฅเซ เชถเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซ, เชคเซ เชเซเชชเชพ เชเชฐเซเชจเซ เช
เชจเซเชตเชพเชฆ เชฒเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซ: Sergey Larin.
เชธเซเชฐเซเชธ: www.habr.com
