рдЖрд░рдбреАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдУрдкрди-рд╕реЛрд░реНрд╕ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рд╣рдорд╛рд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдпрд╣ рджреВрд╕рд░реА рдкреЛрд╕реНрдЯ рд╣реИред рдЖрдЬ рд╣рдо rdesktop рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ xrdp рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ C, C ++, C #, рдФрд░ Java рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ, рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХрдУрдПрд╕ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред
рдореИрдВ рдХреЗрд╡рд▓ рдЙрди рдмрдЧреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд░рд╣реЗ рдереЗред рджреВрд╕рд░реА рдУрд░, рдЪреВрдВрдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдмрд╣реБрдд рдЫреЛрдЯреА рд╣реИрдВ, рд╡реИрд╕реЗ рднреА рдЙрдирдореЗрдВ рдХрдИ рдХреАрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВ :)ред
рдиреЛрдЯред FreeRDP рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓рд╛ рд▓реЗрдЦ
рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред
rdesktop
rdesktop UNIX- рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реБрд▓реНрдХ RDP рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИред рдЕрдЧрд░ рдпрд╣ рд╕рд┐рдЧрд╡рд┐рди рдХреЗ рддрд╣рдд рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рднреА рдЪрд▓ рд╕рдХрддрд╛ рд╣реИред Rdesktop рдХреЛ GPLv3 рдХреЗ рддрд╣рдд рд░рд┐рд▓реАрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд▓реЛрдХрдкреНрд░рд┐рдп рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ ReactOS рдкрд░ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреГрддреАрдп-рдкрдХреНрд╖ рдЧреНрд░рд╛рдлрд╝рд┐рдХрд▓ рдлреНрд░рдВрдЯ-рдПрдВрдб рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрд╣реБрдд рдкреБрд░рд╛рдиреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐: рдпрд╣ 4 рдЕрдкреНрд░реИрд▓, 2001 рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдЬрд╛рд░реА рдХреА рдЧрдИ рдереА, рдФрд░ рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд░реВрдк рдореЗрдВ, 17 рд╕рд╛рд▓ рдкреБрд░рд╛рдиреА рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрд╣реБрдд рдЫреЛрдЯреА рд╣реИ - рд▓рдЧрднрдЧ 30 KLOC, рдЬреЛ рдХрд┐ рдЗрд╕рдХреА рдЙрдореНрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИред рдЗрд╕рдХреА рддреБрд▓рдирд╛ 320R KLOC рдХреЗ рд╕рд╛рде FreeRDP рд╕реЗ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рдХреНрд▓реЙрдХ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

рдЕрдЧрдореНрдп рдХреЛрдб
V779 рдЕрдиреБрдкрд▓рдмреНрдз рдХреЛрдб рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдореМрдЬреВрдж рд╣реЛред 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); }
рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐
рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреБрд░рдВрдд рдорд┐рд▓рддреА рд╣реИ:
рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдмрд╛рдж рдХрд╛ рдХреЛрдб рдкрд╣рд▓реЗ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рджреЛрд╖ рдЦрддрд░рдирд╛рдХ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕рднреА рдореЗрдореЛрд░реА рдХреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ
V557 рдРрд░реЗ рдЕрдВрдбрд░рд░реВрди рд╕рдВрднрд╡ рд╣реИред '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] = '\0';
EOF рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА рдмрдлрд░ рдореЗрдВ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИред рдЗрд╕реА рд╕рдордп, рдЗрд╕ рдХреЛрдб рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рддрдВрддреНрд░ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ
рд░реАрдб -1 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди
рдЖрдЙрдЯрдкреБрдЯ рд╕рд░рдгреА рдХреА рд╕реАрдорд╛ рд╕реЗ рдЖрдЧреЗ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред
рдИрдУрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд╛рд░ рдореЗрдВ
V739 рдИрдУрдПрдл рдХреА рддреБрд▓рдирд╛ 'рдЪрд╛рд░' рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред '(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++; } .... }
рдпрд╣ рдХреЛрдб рдЧрд▓рдд
EOF рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐
fgetc рдПрдХ рд╡рд░реНрдг рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЛрдб 0xFF рд╣реИ, рддреЛ рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд (
EOF ) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ред
EOF рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдорддреМрд░ рдкрд░ -1 рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CP1251 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ, рд░реВрд╕реА рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЗ рдЕрдВрддрд┐рдо рдЕрдХреНрд╖рд░ рдХреЛ 0xFF рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЯрд╛рдЗрдк
рдЪрд╛рд░ рдореЗрдВ рдирдВрдмрд░ -1 рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐
EOF (-1) рдХреА рддрд░рд╣ рд╣реА 0xFF рд╡рд░реНрдг, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП,
fgetc рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЯрд╛рдЗрдк
рдЗрдВрдЯ рдХреЗ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐рдпрд╛рдВ
рд╕реНрдирд┐рдкреЗрдЯ 1V547 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 'рд░рд╛рдЗрдЯ_рдЯрд╛рдЗрдо' рд╣рдореЗрд╢рд╛ рдЭреВрдареА рд╣реЛрддреА рд╣реИред 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. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд╖реНрдкрд╛рджрди рджреВрд╕рд░реА рд╢рд╛рдЦрд╛ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ: mod_time рдЪрд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рд╣рдореЗрд╢рд╛ 0 рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЕрдЧрд▓реА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИред
- рдЪрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ 0. рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, mod_time рдХреЛ 0 рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рджреВрд╕рд░реЗ рдЪрд░ рдХрд╛ рдЧреИрд░-рдЛрдгрд╛рддреНрдордХ рдорд╛рди рд╣реИ) рдХреНрдпреЛрдВрдХрд┐ MIN рдХрдо рд╕реЗ рдХрдо рджреЛ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ред
- рди рддреЛ рдЪрд░ рдореЗрдВ 0 рд╣реИ: рдиреНрдпреВрдирддрдо рдорд╛рди рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред
рдЙрд╕ рд▓рд╛рдЗрди рдХреЛ
рд▓рд┐рдЦрдиреЗ__ рдмрджрд▓рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдареАрдХ рдХрд░реЗрдЧрд╛:
- рдХреЗрд╡рд▓ рдПрдХ рдпрд╛ рди рддреЛ рдЪрд░ рдореЗрдВ 0 рд╣реИ: рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред
- рди рддреЛ рдЪрд░ рдореЗрдВ 0 рд╣реИ: рдиреНрдпреВрдирддрдо рдорд╛рди рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред
рд╕реНрдирд┐рдкреЗрдЯ 2V547 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реИред рд╕рдВрднрд╡рддрдГ '&&' рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рд╕реНрдХред резрекрез реп
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 рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЕрд╕реАрдорд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдирдХрд▓
V512 '
рд╕реНрдкреНрд░рд┐рдВрдЯрдл ' рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓ рд╕реЗ рдмрдлрд░ 'рдлрд╝реБрд▓рдкреИрде' рдХрд╛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╣реЛрдЧрд╛ред disk.c 1257
RD_NTSTATUS disk_query_directory(....) { .... char *dirname, fullpath[PATH_MAX]; .... sprintf(fullpath, "%s/%s", dirname, pdirent->d_name); .... }
рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдВрдд рддрдХ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЛрдб рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рджрд┐рди рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ: рдмрд╕ рдПрдХ рд▓рд╛рдкрд░рд╡рд╛рд╣ рдкрд░рд┐рд╡рд░реНрддрди рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐
рд╕реНрдкреНрд░рд┐рдВрдЯрдл рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдВрдХреНрд░реАрдЯрд┐рдВрдЧ рдкрде рд╕рд░рдгреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдирд┐рд╖реНрдкрд╛рджрди рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдХреЙрд▓ рдХреЛ
рд╕реНрдирд┐рдкрд░рдл (рдкреВрд░реНрдгрдкрде, PATH_MAX, ....) рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред
рдирд┐рд░рд░реНрдердХ рд╕реНрдерд┐рддрд┐
V560 рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛрддрд╛ рд╣реИ: Add> 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
xrdp рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ RDP рд╕рд░реНрд╡рд░ рд╣реИред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:
- xrdp - рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдпрд╣ рдЕрдкрд╛рдЪреЗ 2.0 рдХреЗ рддрд╣рдд рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- xorgxrdp - xorgp рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ Xorg рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ред рдпрд╣ X11 рдХреЗ рддрд╣рдд рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (MIT рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди рд╡рд┐рдЬреНрдЮрд╛рдкрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд┐рд╖рд┐рджреНрдз рд╣реИ)
рд╡рд┐рдХрд╛рд╕ rdesktop рдФрд░ FreeRDP рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ RDP рд╕рдорд░реНрдерди, X11rdp рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ VNC рд╕рд░реНрд╡рд░ рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ X11 рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреЛ рдХрд┐ Xorgxrdp рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдП рдереЗред
рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ xorgxrdp рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдкрд┐рдЫрд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рддрд░рд╣, xrdp рдПрдХ рдЫреЛрдЯрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓рдЧрднрдЧ 80 KLOC рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЕрдзрд┐рдХ рдЯрд╛рдЗрдкреЛ
V525 рдХреЛрдб рдореЗрдВ рд╕рдорд╛рди рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реЛрддрд╛ рд╣реИред 87, 88, 89 рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ 'r', 'g', 'r' рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред rxxencode_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;
рдпрд╣ рдХреЛрдб librfxcodec рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬреЛ RemoteFX рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jpeg2000 рдХреЛрдбреЗрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред "рд░реЗрдб" рдХрд▓рд░ рдЪреИрдирд▓ рдХреЛ рджреЛ рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ "рдмреНрд▓реВ" рдЪреИрдирд▓ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдХрдореА рдЖрдорддреМрд░ рдкрд░ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реЛрддреА рд╣реИред
рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди
rfx_encode_format_argb рдореЗрдВ рд╕рдорд╛рди рдмрдЧ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛:
V525 рдХреЛрдб рдореЗрдВ рд╕рдорд╛рди рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдЯрдо 'a', 'r', 'g', 'r' рдХреЛ рд▓рд╛рдЗрдиреЛрдВ 260, 261, 262, 263 рдкрд░ рдЬрд╛рдВрдЪреЗрдВред rfxencode_rgb_to_yuv.c 260
while (x < 64) { *la_buf++ = a; *lr_buf++ = r; *lg_buf++ = g; *lb_buf++ = r; x++; }
рдРрд▓рд╛рди рдХреА рдШреЛрд╖рдгрд╛
V557 рдРрд░реЗ рдУрд╡рд░рд░рди рд╕рдВрднрд╡ рд╣реИред 'I - 8' рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдорд╛рди 129 рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред genkeymap.c 142
Genkeymap.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╕рд░рдгреА рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рд╣рд┐рдд 1 рддрддреНрд╡ рд╕реЗ рдХрдо рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдИ рдмрдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ evdev-map.c рдлрд╝рд╛рдЗрд▓ рд╕рд╣реА рдЖрдХрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд╕рд░рдгреА рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬреЛ рдЗрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрдЬрд╛рдп рдорд╛рдореВрд▓реА рджреЛрд╖ рдмрдирд╛рддреА рд╣реИред
рдЧрд▓рдд рддреБрд▓рдирд╛
V560 рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣рдореЗрд╢рд╛ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ: (cap_len <0)ред xrdp_caps.c 616
рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдШреБ рдХреЗ рдПрдХ рдЪрд░ рдХрд╛ рдорд╛рди рдкреНрд░рдХрд╛рд░
int рдХреЗ рдПрдХ рдЪрд░ рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрдбрд╝реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрдврд╝рд╛ рдЧрдпрд╛ рдорд╛рди рдХрднреА рднреА рдЛрдгрд╛рддреНрдордХ рдирд╣реАрдВ рдмрди рд╕рдХрддрд╛ рд╣реИред
рдирд┐рд░рд░реНрдердХ рдЬрд╛рдБрдЪ
V560 рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛрддрд╛ рд╣реИ: (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; } .... }
рдирд╣реАрдВ рдХреЗ рдмрд░рд╛рдмрд░ рдЪреЗрдХ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓рд╛ рдЪреЗрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╢рд╛рдпрдж рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛
|| рдЧрд▓рдд рддрд░реНрдХреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЖрдЬ рдХреА рдЬрд╛рдБрдЪ рдореЗрдВ рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреАрдбрд╝реЗ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдЫреЛрдЯреЗ-рдореЛрдЯреЗ рджреЛрд╖реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреНрд░рдХрдЯ рдХрд┐рдпрд╛ред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ, рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдЯреЗ, рд╡реЗ рдЕрднреА рднреА рдХрдИ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХреБрдЫ рдЪрдордХрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬрд░реВрд░реА рдЯрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдордЬрд╝рдмреВрддреА рд╕реЗ рдЗрд╕рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ "
рд╕рдВрдЦреНрдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреБрд╖реНрдЯрд┐ рдХреА рдЧрдИ рднрд╛рд╡рдирд╛рдУрдВ " рд▓реЗрдЦ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛
рдХреА рдЧрдИ рд╣реИ ред
рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдбреЗрдореЛ рд╕рдВрд╕реНрдХрд░рдг рд╣рдорд╛рд░реА
рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред