RDP เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดชเตเดชเตบ เดธเตเดดเตโเดธเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดฒเตเดเดจเดเตเดเดณเตเดเต เดชเดฐเดฎเตเดชเดฐเดฏเดฟเดฒเต เดฐเดฃเตเดเดพเดฎเดคเตเดคเต เด
เดตเดฒเตเดเดจเดฎเดพเดฃเดฟเดคเต. เด
เดคเดฟเตฝ เดจเดฎเตเดฎเตพ rdesktop เดเตเดฒเดฏเดจเตเดฑเตเด xrdp เดธเตเตผเดตเดฑเตเด เดจเตเดเตเดเตเด.
เดชเดฟเดถเดเตเดเตพ เดคเดฟเดฐเดฟเดเตเดเดฑเดฟเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดเดชเดเดฐเดฃเดฎเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต
เดเดจเดฟเดเตเดเต เดฐเดธเดเดฐเดฎเดพเดฏเดฟ เดคเตเดจเตเดจเดฟเดฏ เดคเตเดฑเตเดฑเตเดเตพ เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดฒเตเดเดจเด เด เดตเดคเดฐเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเต. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดชเตเดฐเตเดเดเตเดฑเตเดฑเตเดเตพ เดเตเดฑเตเดคเดพเดฃเต, เด เดคเดฟเดจเดพเตฝ เดเตเดฑเดเตเดเต เดคเตเดฑเตเดฑเตเดเตพ เดเดฃเตเดเดพเดฏเดฟเดฐเตเดจเตเดจเต :).
เด
เดญเดฟเดชเดพเดฏเดชเตเดชเตเดเตเด. FreeRDP เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดชเดฐเดฟเดถเตเดงเดจเดฏเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดเดฐเต เดฎเตเตป เดฒเตเดเดจเด เดเดพเดฃเดพเด
rdesktop
เด เดเตเดฒเดฏเดจเตเดฑเต เดตเดณเดฐเต เดเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฃเต - เดเดคเต ReactOS-เตฝ เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต, เดเตเดเดพเดคเต เดจเดฟเดเตเดเตพเดเตเดเต เด เดคเดฟเดจเดพเดฏเดฟ เดฎเตเดจเตเดจเดพเด-เดเดเตเดทเดฟ เดเตเดฐเดพเดซเดฟเดเตเดเตฝ เดซเตเดฐเดฃเตเดเต-เดเตปเดกเตเดเดณเตเด เดเดฃเตเดเตเดคเตเดคเดพเดจเดพเดเตเด. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เด เดฆเตเดฆเตเดนเดคเตเดคเดฟเดจเต เดชเตเดฐเดพเดฏเดฎเตเดฃเตเดเต: เด เดฆเตเดฆเตเดนเดคเตเดคเดฟเดจเตเดฑเต เดเดฆเตเดฏ เดฑเดฟเดฒเตเดธเต 4 เดเดชเตเดฐเดฟเตฝ 2001 เดจเต เดจเดเดจเตเดจเต - เดเดดเตเดคเตเดฎเตเดชเตเตพ, เด เดฆเตเดฆเตเดนเดคเตเดคเดฟเดจเต 17 เดตเดฏเดธเตเดธเดพเดฏเดฟเดฐเตเดจเตเดจเต.
เดเดพเตป เดจเตเดฐเดคเตเดคเต เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเดคเตเดชเตเดฒเต, เดชเดฆเตเดงเดคเดฟ เดตเดณเดฐเต เดเตเดฑเตเดคเดพเดฃเต. เด เดคเดฟเตฝ เดเดเดฆเตเดถเด 30 เดเดฏเดฟเดฐเด เดเตเดกเต เดฒเตเดจเตเดเตพ เด เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต, เดเดคเต เด เดคเดฟเดจเตเดฑเต เดชเตเดฐเดพเดฏเด เดเดฃเดเตเดเดฟเดฒเตเดเตเดเตเดเตเดฎเตเดชเตเตพ เด เตฝเดชเตเดชเด เดตเดฟเดเดฟเดคเตเดฐเดฎเดพเดฃเต. เดคเดพเดฐเดคเดฎเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ, FreeRDP-เดฏเดฟเตฝ 320 เดเดฏเดฟเดฐเด เดฒเตเดจเตเดเตพ เด เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเตเดฒเตเดเตเดเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเตเดฑเต เดเดเตเดเตเดชเตเดเตเดเต เดเดคเดพ:
เดเดคเตเดคเดฟเดเตเดเตเดฐเดพเดจเดพเดเดพเดคเตเดค เดเตเดกเต
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);
}
เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเตฝ เดชเดฟเดถเดเต เดเดเตเดเดณเต เดเดเตป เดจเตเดฐเดฟเดเตเดจเตเดจเต เดชเตเดฐเดงเดพเดจ: เดเดชเตเดชเดฑเตเดฑเตเดฑเดฑเดฟเดจเต เดถเตเดทเด เดเตเดกเต เดตเดฐเตเดจเตเดจเดคเต เดเดเตเดเตพ เดเดพเดฃเตเดจเตเดจเต เดฎเดเดเตเดเด - เด เดถเดเดฒเด เดฎเตเดฎเตเดฎเดฑเดฟ เดเตเดฒเตเดจเดฟเดเดเต เดจเดเดคเตเดคเตเดจเตเดจเต. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดชเดฟเดถเดเต เดเดฐเต เดญเตเดทเดฃเดฟ เดเดฏเตผเดคเตเดคเตเดจเตเดจเดฟเดฒเตเดฒ: เดชเตเดฐเตเดเตเดฐเดพเด เดชเตเดฑเดคเตเดคเตเดเดเดจเตเดจเดคเดฟเดจเต เดถเตเดทเด เด เดจเตเดตเดฆเดฟเดเตเด เดเดฒเตเดฒเดพ เดฎเตเดฎเตเดฎเดฑเดฟเดฏเตเด เดเดชเตเดชเดฑเตเดฑเตเดฑเดฟเดเดเต เดธเดฟเดธเตเดฑเตเดฑเด เดฎเดพเดฏเตโเดเตเดเตเด.
เดชเดฟเดถเดเต เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตฝ เดเดฒเตเดฒ
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 เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต
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++;
}
....
}
เดซเดฏเดฒเดฟเดจเตเดฑเต เด เดตเดธเดพเดจเดคเตเดคเดฟเตฝ เดเดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดฑเต เดคเตเดฑเตเดฑเดพเดฏ เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตฝ เดเดตเดฟเดเต เดเดพเดฃเดพเด: if fgetc 0xFF เดเตเดกเต เดเดณเตเดณ เดเดฐเต เดชเตเดฐเดคเตเดเด เดจเตฝเดเตเดจเตเดจเต, เด เดคเต เดซเดฏเดฒเดฟเดจเตเดฑเต เด เดตเดธเดพเดจเดฎเดพเดฏเดฟ เดตเตเดฏเดพเดเตเดฏเดพเดจเดฟเดเตเดเดชเตเดชเตเดเตเด (EOF).
EOF เดเดคเต เดเดฐเต เดธเตเดฅเดฟเดฐเดพเดเตเดเดฎเดพเดฃเต, เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ -1 เดเดฏเดฟ เดจเดฟเตผเดตเดเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, CP1251 เดเตปเดเตเดกเดฟเดเดเดฟเตฝ, เดฑเดทเตเดฏเตป เด เดเตเดทเดฐเดฎเดพเดฒเดฏเตเดเต เด เดตเดธเดพเดจ เด เดเตเดทเดฐเดคเตเดคเดฟเดจเต 0xFF เดเดจเตเดจ เดเตเดกเต เดเดฃเตเดเต, เดเดคเต เดจเดฎเตเดฎเตพ เดเดฐเต เดตเตเดฐเดฟเดฏเดฌเดฟเดณเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเดพเดฃเต เดธเดเดธเดพเดฐเดฟเดเตเดเตเดจเตเดจเดคเตเดเตเดเดฟเตฝ -1 เดเดจเตเดจ เดธเดเดเตเดฏเดฏเตเดฎเดพเดฏเดฟ เดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. เดชเตเดฐเดคเตเดเด. เดเดฟเดนเตเดจเด 0xFF เดชเตเดฒเตเดฏเดพเดฃเตเดจเตเดจเต เดเดคเต เดฎเดพเดฑเตเดจเตเดจเต EOF (-1) เดซเดฏเดฒเดฟเดจเตเดฑเต เด เดตเดธเดพเดจเดฎเดพเดฏเดฟ เดตเตเดฏเดพเดเตเดฏเดพเดจเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเต. เด เดคเตเดคเดฐเด เดชเดฟเดถเดเตเดเตพ เดเดดเดฟเดตเดพเดเตเดเดพเตป, เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต เดซเดฒเด fgetc เดชเตเดฒเตเดณเตเดณ เดเดฐเต เดตเตเดฐเดฟเดฏเดฌเดฟเดณเดฟเตฝ เดธเตเดเตเดทเดฟเดเตเดเดฃเด int.
เด เดเตเดทเดฐเดคเตเดคเตเดฑเตเดฑเตเดเตพ
เดถเดเดฒเด 1
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
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 เดเดจเตเดจเต เดฎเตเดฒเตเดฏเดเตเดเตพ เดเดฃเตเดเดพเดเดฐเตเดคเต.
เด เตบเดฒเดฟเดฎเดฟเดฑเตเดฑเดกเต เดฒเตเตป เดชเดเตผเดคเตเดคเตฝ
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, ....).
เด เดจเดพเดตเดถเตเดฏเดฎเดพเดฏ เด เดตเดธเตเดฅ
static void
inRepos(STREAM in, unsigned int read)
{
SERVER_DWORD add = 4 - read % 4;
if (add < 4 && add > 0)
{
....
}
}
เดชเดฐเดฟเดถเตเดพเดงเดจ เดเตเตผเดเตเดเตเด > 0 เดเดตเดฟเดเต เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ: เดตเตเดฐเดฟเดฏเดฌเดฟเตพ เดเดฒเตเดฒเดพเดฏเตเดชเตเดชเตเดดเตเด เดชเตเดเตเดฏเดคเตเดคเตเดเตเดเดพเตพ เดตเดฒเตเดคเดพเดฏเดฟเดฐเดฟเดเตเดเตเด, เดเดพเดฐเดฃเด % 4 เดตเดพเดฏเดฟเดเตเดเตเด เดกเดฟเดตเดฟเดทเดจเตเดฑเต เดถเตเดทเดฟเดเตเดเตเดจเตเดจ เดญเดพเดเด เดคเดฟเดฐเดฟเดเต เดจเตฝเดเตเด, เดชเดเตเดทเต เด เดคเต เดเดฐเดฟเดเตเดเดฒเตเด 4 เดจเต เดคเตเดฒเตเดฏเดฎเดพเดเดฟเดฒเตเดฒ.
xrdp
- xrdp - เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตฝ. เด เดชเตเดชเดพเดเตเดเต 2.0 เดฒเตเดธเตปเดธเดฟเดจเต เดเตเดดเดฟเตฝ เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดคเต.
- xorgxrdp - xrdp เดเดชเดฏเตเดเดฟเดเตเดเตเดณเตเดณ Xorg เดกเตเดฐเตเดตเดฑเตเดเดณเตเดเต เดเดฐเต เดเตเดเตเดเด. เดฒเตเดธเตปเดธเต - X11 (เดเดเดเดเดฟ เดชเตเดฒเต, เดเดจเตเดจเดพเตฝ เดชเดฐเดธเตเดฏเดคเตเดคเดฟเตฝ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต เดจเดฟเดฐเตเดงเดฟเดเตเดเตเดจเตเดจเต)
rdesktop, FreeRDP เดเดจเตเดจเดฟเดตเดฏเตเดเต เดซเดฒเดเตเดเดณเต เด เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟเดฏเดพเดฃเต เดชเดฆเตเดงเดคเดฟเดฏเตเดเต เดตเดฟเดเดธเดจเด. เดคเตเดเดเตเดเดคเตเดคเดฟเตฝ, เดเตเดฐเดพเดซเดฟเดเตเดธเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป, เดจเดฟเดเตเดเตพ เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด VNC เดธเตเตผเดตเตผ เด เดฒเตเดฒเตเดเตเดเดฟเตฝ RDP เดชเดฟเดจเตเดคเตเดฃเดฏเตเดณเตเดณ เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด X11 เดธเตเตผเดตเตผ เดเดชเดฏเตเดเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต - X11rdp, เดเดจเตเดจเดพเตฝ xorgxrdp เดฏเตเดเต เดตเดฐเดตเตเดเต เด เดตเดฏเตเดเต เดเดตเดถเตเดฏเด เด เดชเตเดฐเดคเตเดฏเดเตเดทเดฎเดพเดฏเดฟ.
เด เดฒเตเดเดจเดคเตเดคเดฟเตฝ เดเดเตเดเตพ xorgxrdp เดเดตเตผ เดเตเดฏเตเดฏเดฟเดฒเตเดฒ.
xrdp เดชเตเดฐเตเดเดเตเดฑเตเดฑเต, เดฎเตเดฎเตเดชเดคเตเดคเตเดคเต เดชเตเดฒเต, เดตเดณเดฐเต เดเตเดฑเตเดคเดพเดฃเต, เด เดคเดฟเตฝ เดเดเดฆเตเดถเด 80 เดเดฏเดฟเดฐเด เดฒเตเดจเตเดเตพ เด เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต.
เดเตเดเตเดคเตฝ เด เดเตเดทเดฐเดคเตเดคเตเดฑเตเดฑเตเดเตพ
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++;
}
....
}
....
}
RemoteFX-เดจเตเดณเตเดณ jpeg2000 เดเตเดกเตเดเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจ librfxcodec เดฒเตเดฌเตเดฐเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเดพเดฃเต เด เดเตเดกเต เดเดเตเดคเตเดคเดคเต. เดเดตเดฟเดเต, เดชเตเดฐเดคเตเดฏเดเตเดทเดคเตเดคเดฟเตฝ, เดเตเดฐเดพเดซเดฟเดเต เดกเดพเดฑเตเดฑ เดเดพเดจเดฒเตเดเตพ เดเดเดเดฒเตผเดจเตเดจเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต - "เดจเตเดฒ" เดจเดฟเดฑเดคเตเดคเดฟเดจเต เดชเดเดฐเด "เดเตเดตเดชเตเดชเต" เดฐเตเดเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจเต. เดเตเดชเตเดชเดฟ-เดชเตเดธเตเดฑเตเดฑเดฟเดจเตเดฑเต เดซเดฒเดฎเดพเดฏเดฟ เด เดชเดฟเดถเดเต เดฆเตเดถเตเดฏเดฎเดพเดเดพเตป เดธเดพเดงเตเดฏเดคเดฏเตเดฃเตเดเต.
เดธเดฎเดพเดจเดฎเดพเดฏ เดเดฐเต เดซเดเดเตโเดทเดจเดฟเดฒเตเด เดเดคเต เดชเตเดฐเดถเตโเดจเด เดธเดเดญเดตเดฟเดเตเดเต rfx_encode_format_argb, เด เดจเดฒเตเดธเตผ เดเดเตเดเดณเตเดเต เดชเดฑเดเตเดเต:
while (x < 64)
{
*la_buf++ = a;
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r;
x++;
}
เด เดฑเต เดชเตเดฐเดเตเดฏเดพเดชเดจเด
// 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 เดซเดฏเดฒเดฟเตฝ เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเดฟเดฏเดฟเดเตเดเตเดฃเตเดเต, เด เดคเดฟเดจเดพเตฝ เด เดคเดฟเดฐเตเดเตพเดเตเดเต เดชเตเดฑเดคเตเดคเต เดเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เด เดคเดฟเดจเดพเตฝ เดเดคเต เดเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเดตเตเดจเตเดจ เดเดฐเต เดฌเดเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต.
เดคเตเดฑเตเดฑเดพเดฏ เดคเดพเดฐเดคเดฎเตเดฏเด
// 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))
{
....
}
....
}
เดซเดเดเตเดทเตป เดเดฐเต เดคเดฐเด เดตเตเดฐเดฟเดฏเดฌเดฟเตพ เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเต เดเดชเตเดชเดฟเดเดพเดคเตเดค เดทเตเตผเดเตเดเต เดเดฐเต เดตเตเดฐเดฟเดฏเดฌเดฟเดณเดฟเดฒเตเดเตเดเต int. เดเดตเดฟเดเต เดชเดฐเดฟเดถเตเดงเดจ เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ, เดเดพเดฐเดฃเด เดเดเตเดเตพ เดเดชเตเดชเดฟเดเดพเดคเตเดค เดตเตเดฐเดฟเดฏเดฌเดฟเตพ เดตเดพเดฏเดฟเดเตเดเตเดเดฏเตเด เดซเดฒเด เดเดฐเต เดตเดฒเดฟเดฏ เดตเตเดฐเดฟเดฏเดฌเดฟเดณเดฟเดฒเตเดเตเดเต เดจเตฝเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต, เด เดคเดฟเดจเดพเตฝ เดตเตเดฐเดฟเดฏเดฌเดฟเดณเดฟเดจเต เดจเตเดเดฑเตเดฑเตเดตเต เดฎเตเดฒเตเดฏเด เดเดเตเดเตเดเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ.
เด เดจเดพเดตเดถเตเดฏ เดชเดฐเดฟเดถเตเดงเดจเดเตพ
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-เดฏเตเดเต เดเตเดฐเดฏเตฝ เดชเดคเดฟเดชเตเดชเต เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดฏเดพเด
เดเดเดเตเดฒเตเดทเต เดธเดเดธเดพเดฐเดฟเดเตเดเตเดจเตเดจ เดชเตเดฐเตเดเตเดทเดเดฐเตเดฎเดพเดฏเดฟ เด เดฒเตเดเดจเด เดชเดเตเดเดฟเดเดพเตป เดจเดฟเดเตเดเตพ เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเตเดตเตเดเตเดเดฟเตฝ, เดตเดฟเดตเตผเดคเตเดคเดจ เดฒเดฟเดเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเตเด: เดธเตเตผเดเดฟ เดฒเดพเดฑเดฟเตป.
เด
เดตเดฒเดเดฌเด: www.habr.com