
Nke a bụ nlebanya nke abụọ n'usoro isiokwu gbasara ịnwale mmemme isi mmalite maka ịrụ ọrụ na ụkpụrụ RDP. N'ime ya anyị ga-elele onye ahịa rdesktop na sava xrdp.
Ejiri ya dị ka ngwá ọrụ iji chọpụta mperi Ọ bụ ihe nyocha koodu static maka C, C++, C# na Java, dị na nyiwe Windows, Linux и macOS.
Isiokwu ahụ na-enye naanị mmejọ ndị ahụ masịrị m. Otú ọ dị, ọrụ ndị ahụ dị ntakịrị, ya mere enwere mmejọ ole na ole :).
Примечание. Enwere ike ịchọta edemede gara aga gbasara nkwenye ọrụ FreeRDP .
desktọọpụ
— свободная реализация клиента RDP для UNIX-based систем. Его также можно использовать и под Windows, если собирать проект под Cygwin. Лицензирован под GPLv3.
Onye ahịa a na-ewu ewu nke ukwuu - a na-eji ya na ndabara na ReactOS, ị nwekwara ike ịhụ njedebe ihu nke ndị ọzọ maka ya. Otú ọ dị, ọ bụ nnọọ agadi: ntọhapụ mbụ ya mere na April 4, 2001 - n'oge ederede, ọ bụ 17 afọ.
Dị ka m kwuru na mbụ, ọrụ a dị nnọọ obere. O nwere ihe dị ka ahịrị 30 puku ahịrị koodu, nke bụ ihe dị ịtụnanya n'ịtụle afọ ya. Maka ntụnyere, FreeRDP nwere ahịrị 320 puku. Nke a bụ mmepụta nke mmemme Cloc:

Koodu enweghị ike iru
Achọpụtara koodu adịghị. O kwere omume na njehie dị. 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);
}Njehie ahụ na-ezute anyị ozugbo na ọrụ ahụ isi: anyị na-ahụ koodu na-abịa mgbe onye ọrụ nloghachi - iberibe a na-arụ ebe nchekwa ihicha. Agbanyeghị, njehie ahụ anaghị etinye egwu: sistemụ arụmọrụ ga-ehichapụ ebe nchekwa niile ekenyere mgbe mmemme ahụ gachara.
Enweghị njikwa njehie
Enwere ike ime usoro nhazi. Uru nke ndeksi 'n' nwere ike iru -1. rddesktop.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);
}
....
}Mpempe koodu dị na nke a na-agụ site na faịlụ n'ime ihe nchekwa ruo mgbe faịlụ ahụ gwụ. Otú ọ dị, ọ dịghị njehie na-edozi ebe a: ọ bụrụ na ihe na-ezighị ezi, mgbe ahụ agụ ga-alaghachi -1, mgbe ahụ, a ga-ejupụta n'usoro mmepụta.
Iji EOF n'ụdị char
Ekwesighi iji EOF tụnyere uru nke ụdị 'char'. '(c = fgetc(fp))' kwesịrị ịbụ nke ụdị '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++;
}
....
}N'ebe a, anyị na-ahụ njikwa na-ezighi ezi nke iru na njedebe nke faịlụ: ọ bụrụ fgetc weghachiri agwa nke koodu ya bụ 0xFF, a ga-atụgharị ya dị ka njedebe nke faịlụ (EOF).
EOF ọ bụ ihe na-adịgide adịgide, a na-akọwakarị ya dị ka -1. Dịka ọmụmaatụ, na ntinye koodu CP1251, mkpụrụedemede ikpeazụ nke mkpụrụedemede Russia nwere koodu 0xFF, nke dabara na nọmba -1 ma ọ bụrụ na anyị na-ekwu maka mgbanwe dị ka. nkwupùta. Ọ tụgharịrị na akara 0xFF, dị ka EOF (-1) ka akọwara dị ka njedebe nke faịlụ. Iji zere njehie dị otú ahụ, nsonaazụ nke ọrụ ahụ bụ fgetc kwesịrị ịchekwa na mgbanwe dị ka Int.
Ụdịdị
Iberibe 1
Okwu 'write_time' na-abụ ụgha mgbe niile. diski.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; // <=
....
}Ikekwe onye dere koodu a nwetara ya ezighi ezi || и && n'ọnọdụ. Ka anyị tụlee nhọrọ ndị nwere ike ime maka ụkpụrụ dee_oge и mgbanwe_oge:
- Ụdị mgbanwe abụọ ahụ hà nhata 0: na nke a, anyị ga-ejedebe na alaka ọzọ: mgbanwe mod_oge ga-abụ 0 mgbe niile n'agbanyeghị ọnọdụ na-esote.
- Otu n'ime mgbanwe bụ 0: mod_oge ga-adị nhata 0 (ọ bụrụhaala na mgbanwe nke ọzọ nwere uru na-adịghị mma), n'ihi na min ga-ahọrọ nke nta n'ime nhọrọ abụọ ahụ.
- Ụdị mgbanwe abụọ a erughị 0: họrọ uru kacha nta.
Mgbe ejiri dochie ọnọdụ ahụ dee_oge && mgbanwe_oge omume ahụ ga-adị mma:
- Otu ma ọ bụ abụọ agbanweghị nha 0: họrọ uru na-abụghị efu.
- Ụdị mgbanwe abụọ a erughị 0: họrọ uru kacha nta.
Iberibe 2
Nkwupụta bụ eziokwu mgbe niile. Eleghị anya a ga-eji onye ọrụ '&&' mee ihe ebe a. diski.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;
....
}O doro anya na ndị ọrụ na-agwakọtakwa ebe a || и &&, ma ọ bụ == и !=: A mgbanwe enweghị ike inwe uru 20 na 9 n'otu oge.
Nṅomi ahịrị na-akparaghị ókè
Oku nke ọrụ 'sprintf' ga-eduga n'oke nke ihe nchekwa 'fullpath'. diski.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);
....
}Mgbe ị na-elele ọrụ ahụ n'ụzọ zuru ezu, ọ ga-edo anya na koodu a anaghị akpata nsogbu. Agbanyeghị, ha nwere ike ibilite n'ọdịniihu: otu mgbanwe na-akpachapụghị anya na anyị ga-enweta oke njupụta - sprint na-ejedebeghị ihe ọ bụla, otú mgbe concatenating ụzọ anyị nwere ike ịgafe ókè nke n'usoro. A na-atụ aro ka ị hụ oku a snprintf (ụzọ zuru oke, PATH_MAX,….).
Ọnọdụ ejighi ya
Akụkụ nke okwu ọnọdụ bụ eziokwu mgbe niile: tinye> 0. scard.c 507
static void
inRepos(STREAM in, unsigned int read)
{
SERVER_DWORD add = 4 - read % 4;
if (add < 4 && add > 0)
{
....
}
}nnyocha tinye > 0 ọ dịghị mkpa ebe a: mgbanwe ga-adị ukwuu karịa efu, n'ihi na gụọ% 4 ga-eweghachi nke fọdụrụ nke nkewa, ma ọ gaghị abụ otu 4.
Nkeji
- mmejuputa ihe nkesa RDP nwere koodu isi mmalite. E kewara ihe omume ahụ ụzọ abụọ:
- xrdp - mmejuputa protocol. Ekesara n'okpuru ikike Apache 2.0.
- xorgxrdp - Ntọala nke ndị ọkwọ ụgbọ ala Xorg maka iji xrdp. Ikikere - X11 (dị ka MIT, mana amachibidoro iji na mgbasa ozi)
Mmepe nke oru ngo a dabere na nsonaazụ rdesktop na FreeRDP. Na mbido, iji eserese eserese rụọ ọrụ, ị ga-eji sava VNC dị iche, ma ọ bụ sava X11 pụrụ iche nwere nkwado RDP - X11rdp, mana na ọbịbịa nke xorgxrdp, mkpa maka ha kwụsịrị.
N'isiokwu a anyị agaghị ekpuchi xorgxrdp.
Ọrụ xrdp, dị ka nke gara aga, dị obere ma nwee ihe dị ka ahịrị 80 puku.

Ụdị typos ndị ọzọ
Koodu ahụ nwere nchịkọta nke ngọngọ ndị yiri ya. Lelee ihe 'r', 'g', 'r' na ahịrị 87, 88, 89. 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++;
}
....
}
....
}Ewepụtara koodu a n'ọbá akwụkwọ librfxcodec, nke na-emejuputa codec jpeg2000 maka RemoteFX. N'ebe a, o doro anya, a na-agwakọta ọwa data eserese - kama agba "acha anụnụ anụnụ", a na-edekọ "red". O yikarịrị ka njehie a pụtara n'ihi nnomi-paste.
Otu nsogbu ahụ mere na ọrụ yiri ya rfx_encode_format_argb, nke onye nyocha gwakwara anyị:
Koodu ahụ nwere nchịkọta nke ngọngọ ndị yiri ya. Lelee ihe 'a', 'r', 'g', 'r' na ahị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++;
}Nkwuwapụta n'usoro
Enwere ike imebiga ihe n'usoro. Uru 'i — 8' index nwere ike iru 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];
....
}
....
}Nkwupụta na nkọwa nke nhazi na faịlụ abụọ a adabaghị - nha dị iche site na 1. Otú ọ dị, ọ dịghị njehie ọ bụla na-eme - kpọmkwem nha ziri ezi na faịlụ evdev-map.c, n'ihi ya, ọ dịghị ihe ọ bụla. Yabụ na nke a bụ naanị ahụhụ nwere ike idozi ngwa ngwa.
Ntụnyere ezighi ezi
Akụkụ nke okwu ọnọdụ bụ ụgha mgbe niile: (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))
{
....
}
....
}Ọrụ na-agụ ụdị mgbanwe edebanye aha dị mkpụmkpụ n'ime mgbanwe dị ka Int. Achọghị ịlele ebe a n'ihi na anyị na-agụ mgbanwe na-edeghị ede ma na-ekenye nsonaazụ ya na nnukwu mgbanwe, ya mere mgbanwe ahụ enweghị ike iwere uru na-adịghị mma.
Nyocha na-enweghị isi
Akụkụ nke okwu ọnọdụ bụ eziokwu mgbe niile: (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;
}
....
}Ntụle ahaghị nhata enweghị isi ebe a ebe anyị nwere ntụnyere na mbido. O yikarịrị ka nke a bụ typo na onye nrụpụta chọrọ iji onye ọrụ || ikpochapụ arụmụka na-ezighi ezi.
nkwubi
N'oge nyocha ahụ, ọ nweghị nnukwu njehie achọpụtara, mana achọpụtara ọtụtụ adịghị ike. Otú ọ dị, a na-eji usoro ndị a eme ihe n'ọtụtụ usoro, ọ bụ ezie na ọ dị ntakịrị. A obere oru ngo na-adịghị nwere ọtụtụ njehie, n'ihi ya, ị na-ekwesịghị na-ekpe ikpe nke analyzer naanị na obere oru ngo. Ị nwere ike ịgụkwu banyere nke a n'isiokwu "".
Ị nwere ike ibudata ụdị nnwale nke PVS-Studio n'aka anyị .
Ọ bụrụ na ịchọrọ ịkọrọ ndị na-ege ntị na-asụ Bekee akụkọ a, biko jiri njikọ ntụgharị asụsụ: Sergey Larin.
isi: www.habr.com
