рдЖрд░рдбреАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдпрд╣ рджреВрд╕рд░реА рд╕рдореАрдХреНрд╖рд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╣рдо rdesktop рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ xrdp рд╕рд░реНрд╡рд░ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рд▓реЗрдЦ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧреАрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдБ рдЫреЛрдЯреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдЧрд▓рддрд┐рдпрд╛рдБ рд╣реБрдИрдВ :)ред
рдиреЛрдЯ. FreeRDP рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓рд╛ рд▓реЗрдЦ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдЖрд░рдбреЗрд╕реНрдХрдЯреЙрдк
рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 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 рд▓реМрдЯрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╕рд░рдгреА рдУрд╡рд░рд░рди рд╣реЛ рдЬрд╛рдПрдЧреА рдЙрддреНрдкрд╛рджрди.
рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдИрдУрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
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 рдЬреИрд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП 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 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдПрдХ рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдЕрдиреНрдп: рдЪрд░ mod_time рдмрд╛рдж рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╣рдореЗрд╢рд╛ 0 рд░рд╣реЗрдЧрд╛ред
- рдЪрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ 0 рд╣реИ: mod_time 0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ (рдмрд╢рд░реНрддреЗ рдХрд┐ рджреВрд╕рд░реЗ рдЪрд░ рдХрд╛ рдорд╛рди рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ), рдХреНрдпреЛрдВрдХрд┐ рдиреНрдпреВрдирддрдо рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдЫреЛрдЯреЗ рдХреЛ рдЪреБрдиреЗрдВрдЧреЗред
- рджреЛрдиреЛрдВ рдЪрд░ 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);
....
}
рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЛрдб рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рд▓рд╛рдкрд░рд╡рд╛рд╣ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рд╣рдореЗрдВ рдПрдХ рдмрдлрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдорд┐рд▓реЗрдЧрд╛ - sprintf рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрдереЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рд╣рдо рд╕рд░рдгреА рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдХреЙрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ 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++;
}
....
}
....
}
рдпрд╣ рдХреЛрдб librfxcodec рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд░рд┐рдореЛрдЯрдПрдлрдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП jpeg2000 рдХреЛрдбреЗрдХ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдЧреНрд░рд╛рдлрд┐рдХ рдбреЗрдЯрд╛ рдЪреИрдирд▓ рдорд┐рд╢реНрд░рд┐рдд рд╣реИрдВ - "рдиреАрд▓реЗ" рд░рдВрдЧ рдХреЗ рдмрдЬрд╛рдп, "рд▓рд╛рд▓" рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрднрд╡рддрдГ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рджрд┐рдЦрд╛рдИ рджреАред
рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИ 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;
}
....
}
рдпрд╣рд╛рдВ рдЕрд╕рдорд╛рдирддрд╛ рдЬрд╛рдВрдЪ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рддреБрд▓рдирд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЯрд╛рдЗрдкреЛ рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ || рдЕрдорд╛рдиреНрдп рддрд░реНрдХреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдирд┐рд╖реНрдХрд░реНрд╖
рдСрдбрд┐рдЯ рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рдЧрдВрднреАрд░ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдкрд╛рдИ рдЧрдИ, рд▓реЗрдХрд┐рди рдХрдИ рдХрдорд┐рдпрд╛рдВ рдкрд╛рдИ рдЧрдИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрди рдбрд┐рдЬрд╝рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЙрдирдХрд╛ рджрд╛рдпрд░рд╛ рдЫреЛрдЯрд╛ рд╣реЛред рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдЖрдХрд▓рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ "
рдЖрдк рд╣рдорд╕реЗ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖реА рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдиреБрд╡рд╛рдж рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рд╕рд░реНрдЧреЗрдИ рд▓рд╛рд░рд┐рдиред
рд╕реНрд░реЛрдд: www.habr.com