ืืึธืก ืืื ืื ืจืืข ืจืขืฆืขื ืืืข ืืื ืึท ืกืขืจืืข ืคืื โโโโืึทืจืืืงืืขื ืืืขืื ืืขืกืืื ื ืขืคึฟืขื ืขื ืืงืืจ ืืืืื ืคึฟืึทืจ ืืจืืขืื ืืื ืื RDP ืคึผืจืึธืืึธืงืึธื. ืืื ืขืก ืืืจ ืืืขืื ืงืืงื ืืื ืื rdesktop ืงืืืขื ื ืืื ืื xrdp ืกืขืจืืืขืจ.
ืืขืืืืื ื ืืื ืึท ืืขืฆืืึทื ืฆื ืืืขื ืืืคืืฆืืจื ืขืจืจืึธืจืก
ืืขืจ ืึทืจืืืงื ืืื ืืืืื ืื ืขืจืจืึธืจืก ืืืึธืก ืืขืืืขื ืืฉืืงืึทืืืข ืฆื ืืืจ. ืึธืืขืจ, ืื ืคึผืจืึทืืืฉืขืงืก ืืขื ืขื ืงืืืื, ืึทืืื ืขืก ืืขื ืขื ืืขืืืขื ืืืืื ืืง ืืืกืืืืงืก :).
ืืึธื. ื ืคืจืืขืจืืืงื ืึทืจืืืงื ืืืขืื FreeRDP ืคึผืจืืืขืงื ืืืขืจืึทืคืึทืงืืืฉืึทื ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื
ืจืืขืกืงืืึธืคึผ
ืืขืจ ืงืืืขื ื ืืื ืืืืขืจ ืคืึธืืงืก - ืขืก ืืื ืืขื ืืฆื ืืืจื ืคืขืืืงืืึทื ืืื ReactOS, ืืื ืืืจ ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื ืืจืื-ืคึผืึทืจืืื ืืจืึทืคืืงืึทื ืคืจืึธื ื ืขื ืืก ืคึฟืึทืจ ืืื. ืึธืืขืจ, ืขืจ ืืื ืืึทื ืฅ ืึทืื: ืืืื ืขืจืฉืืขืจ ืืขืืืื ื ืืื ืืขืืืขื ืืืืฃ ืืคืจืื 4, 2001 - ืืื ืืขืจ ืฆืืื ืคืื ืฉืจืืืื, ืขืจ ืืื 17 ืืืจ ืึทืื.
ืืื ืืื ืืืืขืจืงื ืคืจืืขืจ, ืื ืคึผืจืืืขืงื ืืื ืืืืขืจ ืงืืืื. ืขืก ืึผืืื ืืขืขืจืขื 30 ืืืืื ื ืฉืืจืืช ืคืื ืงืึธื, ืืืึธืก ืืื ืึท ืืืกื ืืึธืื ืข ืงืึทื ืกืืืขืจืื ื ืืืึทื ืขืืืขืจ. ืคึฟืึทืจ ืคืึทืจืืืืึทื, FreeRDP ืึผืืื 320 ืืืืื ื ืฉืืจืืช. ืืึธ ืืื ืืขืจ ืจืขืืืืืึทื ืคืื ืื Cloc ืคึผืจืึธืืจืึทื:
ืื ืจืขืึทืืฉืึทืืืข ืงืึธื
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++;
}
....
}
ืืึธ ืืืจ ืืขื ืคืึทืืฉ ืืึทื ืืืื ื ืฆื ืืขืจืืจืืืื ืืขื ืกืืฃ ืคืื ืืขืจ ืืขืงืข: ืืืื fgetc ืงืขืจื ืึท ืืึทืจืึทืงืืขืจ ืืืขืืขื ืก ืงืึธื ืืื 0xFF, ืขืก ืืืขื ืืืื ืื ืืขืจืคึผืจืึทืืึทื ืืื ืืขืจ ืกืืฃ ืคืื ืืขืจ ืืขืงืข (EOF).
EOF ืขืก ืืื ืึท ืงืขืกืืืืขืจืืืง, ืืืืฉืึทืืืึทืื ืืืคืืื ื ืืื -1. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืื ืื CP1251 ืงืึธืืืจืื ื, ืื ืืขืฆืืข ืืจืืื ืคืื ืื ืจืืกืืฉืข ืืืคืืืขื ืืื ืื ืงืึธื 0xFF, ืืืึธืก ืงืึธืจืึทืกืคึผืึทื ืื ืฆื ืื ื ืืืขืจ -1 ืืืื ืืืจ ืืขื ืขื ืืขืจืขืื ืืืขืื ืึท ืืืึทืืขืืืืืง ืืื ืืึทื ืง. ืขืก ืืืจื ืก ืืืืก ืึทื ืืขืจ ืกืืืืึธื 0xFF, ืืื EOF (-1) ืืื ืื ืืขืจืคึผืจืึทืืึทื ืืื ืืขืจ ืกืืฃ ืคืื ืืขืจ ืืขืงืข. ืฆื ืืืกืืืืื ืึทืืึท ืขืจืจืึธืจืก, ืืขืจ ืจืขืืืืืึทื ืคืื ืื ืคึฟืื ืงืฆืืข ืืื fgetc ืืึธื ืืืื ืกืืึธืจื ืืื ืึท ืืืึทืืขืืืืืง ืืื ืื ื.
ืืืคึผืึธืก
ืคืจืึทืืืขื ื 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; // <=
....
}
ืืึธืืขืจ ืืขืจ ืืืืจ ืคืื ืืขื ืงืึธื ืืื ืขืก ืคืึทืืฉ || ะธ && ืืื ืฆืืฉืืึทื ื. ืืื ืก ืืึทืืจืึทืืื ืืขืืืขื ืึธืคึผืฆืืขืก ืคึฟืึทืจ ืืืึทืืืขืก ืฉืจืืื_ืฆืืื ะธ 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);
....
}
ืืืขื ืืืจ ืงืืง ืืื ืื ืคืื ืงืฆืืข ืืื ืคืื, ืขืก ืืืขื ืืืื ืงืืึธืจ ืึทื ืืขืจ ืงืึธื ืืื ื ืืฉื ืคืึทืจืฉืึทืคื ืคึผืจืึธืืืขืืก. ืึธืืขืจ, ืืื ืงืขื ืืืืคืฉืืืื ืืื ืืขืจ ืฆืืงืื ืคึฟื: ืืืื ืึธืคึผืืขืืึธืื ืืืืฉื ืืื ืืืจ ืืืขืื ืืึทืงืืืขื ืึท ืืึทืคืขืจ ืืืืคื - ืกืคึผืจืื ื ืืื ื ืื ืืืืจืขื ืขืฆื ืืืจื ืขืคึผืขืก, ืึทืืื ืืืขื ืงืึทื ืงืึทืืึทื ืืืืื ื ืคึผืึทืืก ืืืจ ืงืขื ืขื ืืืื ืืืืึทืืขืจ ืคืื ืื ืืึทืื ืืจืื ืคืื ืื ืืขื ืืข. ืขืก ืืื ืจืขืงืึทืืขื ืืื ืฆื ืืึทืืขืจืงื ืืขื ืจืืคื ืืืืฃ snprintf (fullpath, 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 - ืคึผืจืึธืืึธืงืึธื ืืืคึผืืึทืืขื ืืืืฉืึทื. ืคืื ืื ืืขืจืืขืืืืื ืืื ืืขืจ ืื Apache 2.0 ืืขืจืืืืืขื ืืฉ.
- xorgxrdp - ื ืกืืื ืคืื Xorg ืืจืืืืขืจืก ืคึฟืึทืจ ื ืืฆื ืืื xrdp. License - X11 (ืืื MIT, ืึธืืขืจ ืคึผืจืึธืืืืืึทืฅ ื ืืฆื ืืื ืืึทื ืฆืข)
ืื ืึทื ืืืืืงืืื ื ืคืื ืื ืคึผืจืืืขืงื ืืื ืืืืืจื ืืืืฃ ืื ืจืขืืืืืึทืื ืคืื rdesktop ืืื FreeRDP. ืืืืืขืก, ืฆื ืึทืจืืขืื ืืื ืืจืึทืคืืงืก, ืืืจ ืืึธืื ืฆื ื ืืฆื ืึท ืืึทืืื ืืขืจ VNC ืกืขืจืืืขืจ ืึธืืขืจ ืึท ืกืคึผืขืฆืืขื X11 ืกืขืจืืืขืจ ืืื RDP ืฉืืืฆื - 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++;
}
....
}
....
}
ืืขืจ ืงืึธื ืืื ืืขื ืืืขื ืคืื ืื ืืืืจืคืงืกืงืึธืืขืง ืืืืืืึธืืขืง, ืืืึธืก ืืืคึผืืึทืืึทื ืฅ ืื 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 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