{"id":481283,"date":"2026-05-27T15:08:44","date_gmt":"2026-05-27T15:08:44","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=481283"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=481283","title":{"rendered":"VBoxGuest \u0434\u043b\u044f KolibriOS: \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h3>\n<ul>\n<li>\n<p><a href=\"#structure\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#vmmdev\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b VMMDev<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#init\" rel=\"noopener noreferrer nofollow\">\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#irq\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#dispatcher\" rel=\"noopener noreferrer nofollow\">\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#hgcm\" rel=\"noopener noreferrer nofollow\">HGCM \u2014 Host-Guest Communication Manager<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#services\" rel=\"noopener noreferrer nofollow\">\u0421\u0435\u0440\u0432\u0438\u0441\u044b (\u043c\u044b\u0448\u044c, \u0434\u0438\u0441\u043f\u043b\u0435\u0439, heartbeat, timesync, guest properties, shared folders, clipboard, seamless)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ioctl\" rel=\"noopener noreferrer nofollow\">IOCTL-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#numbers\" rel=\"noopener noreferrer nofollow\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0447\u0438\u0441\u043b\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#timer\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#problems\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#upstream\" rel=\"noopener noreferrer nofollow\">\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 upstream-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#summary\" rel=\"noopener noreferrer nofollow\">\u0418\u0442\u043e\u0433<\/a><\/p>\n<\/li>\n<\/ul>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>VBoxGuest \u2014 \u044d\u0442\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 (Guest Additions) \u0434\u043b\u044f KolibriOS, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 VirtualBox. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430 FASM \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438: \u043e\u0442 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c VMMDev (Virtual Machine Monitor Device) \u0434\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014 \u043c\u044b\u0448\u0438, \u043e\u0431\u0449\u0438\u0445 \u043f\u0430\u043f\u043e\u043a, \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430, \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u041a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u2014 \u043e\u043a\u043e\u043b\u043e 11 200 \u0441\u0442\u0440\u043e\u043a \u0432 61 \u0444\u0430\u0439\u043b\u0435 (\u043f\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044e 1.0). \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440, HGCM-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043e\u0431\u0451\u0440\u043d\u0443\u0442 \u0432 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 API \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 PageList-DMA, \u0430 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0436\u0435\u043b\u0435\u0437\u043e\u043c (i8042, BGA, CMOS) \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (mouse, display, timesync).<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0437\u043d\u0443\u0442\u0440\u0438: \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u043a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d \u043f\u0440\u0438\u0451\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0442\u0435 \u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0432\u044b\u0431\u043e\u0440\u044b \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0422\u0435\u043a\u0441\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442 PCI, \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, DMA \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e x86 \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445. \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0432\u0440\u043e\u0434\u0435 \u00ab\u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 IRQ\u00bb \u0438\u043b\u0438 \u00ab\u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d MMIO\u00bb \u044f \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e \u2014 \u0444\u043e\u043a\u0443\u0441 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 VMMDev\/HGCM \u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u0434\u043b\u044f KolibriOS.<\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f<\/h4>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b\u0445 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0434\u043b\u044f KolibriOS \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u2014 \u043d\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u043d\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432.<\/p>\n<p>\u0412 Linux \/ Windows \/ FreeBSD \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c: kernel-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 <code>VBoxGuest<\/code> (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0441\u0442), user-space-\u0434\u0435\u043c\u043e\u043d <code>VBoxService<\/code> (timesync, properties, balloon) \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 <code>VBoxClient<\/code> \u043f\u043e\u0434 X11\/Wayland (display-resize, seamless, clipboard). \u041f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 kernel-\u043c\u043e\u0434\u0443\u043b\u0438 \u2014 <code>vboxsf<\/code>, <code>vboxvideo<\/code>\/DRM, \u0430 \u043d\u0430 Windows \u0435\u0449\u0451 \u0444\u0438\u043b\u044c\u0442\u0440-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043c\u044b\u0448\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443: \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432 \u044f\u0434\u0440\u0435, X-\u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u0412 KolibriOS \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0432 \u0438\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u0435\u0434\u0438\u043d\u044b\u0439 PE DLL, \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 user-space-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u043e\u0434 VFS (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430), \u0432\u0438\u0434\u0435\u043e \u0438 \u043c\u044b\u0448\u044c. \u0420\u044f\u0434 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044f\u0434\u0440\u0430 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443 \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (<code>CreateEvent<\/code> \/ <code>WaitEvent<\/code> \/ <code>WaitEventTimeout<\/code>, \u0441\u043c. [<a href=\"https:\/\/wiki.kolibrios.org\/index.php?title=Kernel_Event\/ru\" rel=\"noopener noreferrer nofollow\">Kernel_Event\/ru<\/a>]), \u043d\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0445 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f spin-loop&#8217;\u043e\u043c \u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u043c. \u042d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u043b\u0433\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0435\u0449\u0451 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u0418\u0442\u043e\u0433\u00bb.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a \u043e\u0442 PCI-\u043f\u0440\u043e\u0431\u044b \u0434\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0438 \u043e\u0431\u0449\u0438\u0445 \u043f\u0430\u043f\u043e\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 FASM. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, compile-time \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0442\u0438\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0430. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043e\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a.<\/p>\n<h3>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<pre><code class=\"assembly\">vboxguest.asm\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430, PE DLL native 0.05config.inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438\u251c\u2500\u2500 core\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u044f\u0434\u0440\u043e: PCI, MMIO, IRQ, \u0442\u0430\u0439\u043c\u0435\u0440, \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u2502\u00a0\u00a0 \u251c\u2500\u2500 pci.inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 PCI-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u0435\u043d\u0438\u0435 BAR\/IRQ\u2502\u00a0\u00a0 \u251c\u2500\u2500 mmio.inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 MMIO, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 VMMDev\u2502\u00a0\u00a0 \u251c\u2500\u2500 ports.inc\u00a0\u00a0\u00a0\u00a0\u00a0 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 I\/O-\u043f\u043e\u0440\u0442\u2502\u00a0\u00a0 \u251c\u2500\u2500 irq.inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439\u2502\u00a0\u00a0 \u251c\u2500\u2500 timer.inc\u00a0\u00a0\u00a0\u00a0\u00a0 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043a (100 \u043c\u0441)\u2502\u00a0\u00a0 \u2514\u2500\u2500 dispatcher\/\u00a0\u00a0\u00a0 \u0440\u0435\u0435\u0441\u0442\u0440 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u251c\u2500\u2500 vmmdev\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b VMMDev: \u043f\u0430\u043a\u0435\u0442\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0444\u0438\u043b\u044c\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u251c\u2500\u2500 hgcm\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HGCM-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442: connect\/disconnect\/call, PageList\u251c\u2500\u2500 sys\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u041e\u0421: init, shutdown, ioctl\u251c\u2500\u2500 services\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 8 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\u2502\u00a0\u00a0 \u251c\u2500\u2500 mouse\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0430\u044f \u043c\u044b\u0448\u044c\u2502\u00a0\u00a0 \u251c\u2500\u2500 display\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0430\u0432\u0442\u043e\u0440\u0435\u0441\u0430\u0439\u0437 \u044d\u043a\u0440\u0430\u043d\u0430\u2502\u00a0\u00a0 \u251c\u2500\u2500 heartbeat\/\u00a0\u00a0\u00a0\u00a0 \u0441\u0438\u0433\u043d\u0430\u043b \"\u0433\u043e\u0441\u0442\u044c \u0436\u0438\u0432\"\u2502\u00a0\u00a0 \u251c\u2500\u2500 timesync\/\u00a0\u00a0\u00a0\u00a0\u00a0 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f RTC \u0441 \u0445\u043e\u0441\u0442\u043e\u043c\u2502\u00a0\u00a0 \u251c\u2500\u2500 guest_props\/\u00a0\u00a0 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u2502\u00a0\u00a0 \u251c\u2500\u2500 shared_folders\/ \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0424\u0421 \u0447\u0435\u0440\u0435\u0437 SHFL\u2502\u00a0\u00a0 \u251c\u2500\u2500 clipboard\/\u00a0\u00a0\u00a0\u00a0 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\u2502\u00a0\u00a0 \u2514\u2500\u2500 seamless\/\u00a0\u00a0\u00a0\u00a0\u00a0 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c\u251c\u2500\u2500 data\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u2514\u2500\u2500 common\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (\u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 UTF-8 &lt;\u2014&gt; CP866)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0430 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u044d\u0442\u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0442\u0435\u043a. \u0421\u0432\u0435\u0440\u0445\u0443 \u2014 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 KolibriOS, \u0441\u043d\u0438\u0437\u0443 \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0436\u0435\u043b\u0435\u0437\u043e VMMDev \u043d\u0430 PCI-\u0448\u0438\u043d\u0435. \u0421\u0442\u0440\u0435\u043b\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (IOCTL \u043e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440); IRQ-\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 DMA-\u043e\u0442\u0432\u0435\u0442\u044b \u0445\u043e\u0441\u0442\u0430 \u0438\u0434\u0443\u0442 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u0441\u0445\u0435\u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0438\u0436\u0435: \u00ab\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b VMMDev\u00bb, \u00ab\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb, \u00ab\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439\u00bb, \u00ab\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\u00bb, \u00abHGCM\u00bb, \u00ab\u0421\u0435\u0440\u0432\u0438\u0441\u044b\u00bb.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fa0\/ba3\/908\/fa0ba390808f1633b2a8e4912d04ecdf.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\" title=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\" width=\"900\" height=\"596\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/fa0\/ba3\/908\/fa0ba390808f1633b2a8e4912d04ecdf.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fa0\/ba3\/908\/fa0ba390808f1633b2a8e4912d04ecdf.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<h4>\u041a\u0430\u043a \u0434\u0443\u043c\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435<\/h4>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0438\u0436\u0435, \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043a\u0430\u043a \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f \u0441 \u0436\u0451\u0441\u0442\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e \u0441\u043b\u043e\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0434 \u0441\u043e\u0431\u043e\u0439.<\/p>\n<ol>\n<li>\n<p><strong>VMMDev<\/strong> \u2014 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442. \u041e\u0434\u0438\u043d \u043f\u043e\u0440\u0442, \u043e\u0434\u0438\u043d \u043a\u0443\u0441\u043e\u043a MMIO, \u043e\u0434\u043d\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435. \u0423\u043c\u0435\u0435\u0442: \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u044c \u043f\u0430\u043a\u0435\u0442\u00bb, \u00ab\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0439 \u0444\u043b\u0430\u0433\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u00bb, \u00ab\u043f\u043e\u043b\u0443\u0447\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u00bb. \u041d\u0435 \u0443\u043c\u0435\u0435\u0442: \u0438\u043c\u0435\u043d\u0430, \u0441\u0435\u0441\u0441\u0438\u0438, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u044b. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u00ab\u0441\u0435\u0440\u0432\u0438\u0441\u044b\u00bb, \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>HGCM<\/strong> \u2014 RPC \u043f\u043e\u0432\u0435\u0440\u0445 VMMDev. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0445\u043e\u0441\u0442\u0430, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u0432\u043a\u043b\u044e\u0447\u0430\u044f PageList \u0434\u043b\u044f DMA), \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b. \u0413\u0440\u0430\u043d\u0438\u0446\u0430: \u0432\u0441\u0451, \u0447\u0442\u043e \u0432\u044b\u0448\u0435 HGCM, \u043f\u0440\u043e VMMDev \u0443\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>Dispatcher<\/strong> \u2014 \u0441\u0432\u043e\u0434\u0438\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u0445\u0443\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0420\u0435\u0448\u0430\u0435\u0442, \u043a\u043e\u043c\u0443 \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0443\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0441\u0443\u043f\u0435\u0440\u0441\u0435\u0442 \u043c\u0430\u0441\u043e\u043a \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0445\u043e\u0441\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Services<\/strong> \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0444\u0438\u0447\u0438: \u043c\u044b\u0448\u044c, \u0434\u0438\u0441\u043f\u043b\u0435\u0439, shared clipboard, shared folders \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0436\u0438\u0432\u0451\u0442 \u0432 \u0441\u0432\u043e\u0451\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0445\u0443\u043a\u043e\u0432 (<code>fn_init<\/code>\/<code>fn_enable<\/code>\/<code>fn_on_event<\/code>\/<code>fn_on_tick<\/code>\/&#8230;) \u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438 \u043f\u0440\u043e PCI, \u043d\u0438 \u043f\u0440\u043e VMMDev-\u043f\u0430\u043a\u0435\u0442\u044b, \u043d\u0438 \u043f\u0440\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 (\u0441\u0442\u0435\u043a \u0441\u043b\u043e\u0451\u0432, \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435) \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 <strong>\u0434\u0432\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u0421\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437<\/strong> \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 IOCTL -&gt; <code>sys\/<\/code> \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 -&gt; \u0441\u0435\u0440\u0432\u0438\u0441 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 HGCM-\u0432\u044b\u0437\u043e\u0432 -&gt; HGCM \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0432 VMMDev-\u043f\u0430\u043a\u0435\u0442 -&gt; <code>out<\/code> \u0432 BAR0.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445<\/strong> \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u043e\u0442\u0432\u0435\u0442\u044b: \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 VMMDev -&gt; <code>core\/irq<\/code> \u0447\u0438\u0442\u0430\u0435\u0442 \u043c\u0430\u0441\u043a\u0443 -&gt; <code>dispatcher_dispatch<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e: \u0445\u043e\u0441\u0442, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0432 HGCM-\u0437\u0430\u043f\u0440\u043e\u0441, DMA-\u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u043b\u0430\u0433 <code>REQ_DONE<\/code> \u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0430\u043a\u0435\u0442\u0430. \u0413\u043e\u0441\u0442\u044c \u0432 spin-loop \u0438\u043b\u0438 \u043f\u043e \u0442\u0438\u043a\u0443 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0432\u0438\u0434\u0438\u0442 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u043e\u0439 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u2014 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0447\u0442\u043e \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435.<\/p>\n<h4>\u0422\u0440\u0438 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 upstream-\u043c\u043e\u0434\u0435\u043b\u0438<\/h4>\n<p>\u0411\u043e\u0301\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u2014 \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u0430 \u0442\u0440\u0438 \u0442\u043e\u0447\u043a\u0438, \u0433\u0434\u0435 \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043d\u0435 \u043e\u0431\u0449\u0430\u044f \u0434\u043b\u044f upstream \u0441\u0445\u0435\u043c\u0430. \u041a \u043d\u0438\u043c \u0441\u0442\u043e\u0438\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043c\u0435\u0440\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<ol>\n<li>\n<p><strong>Shared Folders (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b SHFL).<\/strong> \u0425\u043e\u0441\u0442 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c <code>VERR_INVALID_PARAMETER<\/code> \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f, \u0432 \u043a\u0430\u043a\u043e\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412 upstream \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u043c \u0438 \u043e\u0431\u0449\u0438\u043c\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438. \u0417\u0434\u0435\u0441\u044c, \u0431\u0435\u0437 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0434\u043b\u044f FASM, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u0431\u0430\u0439\u0442\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0448\u043b\u0451\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>Clipboard (\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 listener).<\/strong> <code>MSG_OLD_GET_WAIT<\/code> \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Shared Clipboard (\u0441\u0442\u0430\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f), \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u00ab\u0436\u0434\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430\u00bb, \u043c\u043e\u0436\u0435\u0442 \u0432\u0438\u0441\u0435\u0442\u044c \u043c\u0438\u043d\u0443\u0442\u0430\u043c\u0438, \u043f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0441\u0442\u0430 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442. \u0412 upstream \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f wait-queue: \u043f\u043e\u0442\u043e\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0441\u043f\u0438\u0442, \u0435\u0433\u043e \u0431\u0443\u0434\u044f\u0442 \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e. \u0412 KolibriOS \u0430\u043d\u0430\u043b\u043e\u0433 \u0435\u0441\u0442\u044c \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u044f\u0434\u0440\u0430 (<code>CreateEvent<\/code> + <code>WaitEventTimeout<\/code>), \u2014 \u043d\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0445 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u043b\u0430\u0433\u0430 <code>REQ_DONE<\/code> \u0440\u0430\u0437 \u0432 100 \u043c\u0441 \u0438\u0437 \u0442\u0438\u043a\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u0430, \u043c\u0438\u043c\u043e \u043e\u0431\u0449\u0435\u0433\u043e HGCM-\u0441\u043b\u043e\u0442\u0430 \u0438 \u043c\u0438\u043c\u043e spin-loop. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0434\u043e\u043b\u0433\u043e\u043c: \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0443\u0431\u0435\u0440\u0451\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0442\u0438\u043a\u0430 \u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 (\u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e 100 \u043c\u0441). <\/p>\n<\/li>\n<li>\n<p><strong>Display resize (\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 500 \u043c\u0441).<\/strong> \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 500 \u043c\u0441. \u042d\u0442\u043e \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u043e\u0431\u0438\u043b\u0438\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442 \u0445\u043e\u0441\u0442\u0430 (\u0438\u0445 \u043d\u0435\u043c\u043d\u043e\u0433\u043e), \u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 SetScreen \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043a\u0440\u0430\u0448\u0443 taskbar\u2019\u0430 \u0438\u0437-\u0437\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u044f\u0434\u0440\u0435 KolibriOS (\u043e\u043a\u043d\u0430 \u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u044d\u043a\u0440\u0430\u043d\u0430). \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u2014 \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0441\u0442\u044b\u043b\u044c, \u0441\u043d\u0438\u0436\u0430\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u0440\u0430\u0448\u0430 \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0438 \u043e\u043a\u043d\u0430. <\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u0438 \u0442\u0440\u0438 \u043c\u0435\u0441\u0442\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0437\u0434\u0435\u0441\u044c \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0435\u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f upstream.<\/p>\n<h3>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b VMMDev<\/h3>\n<p>VMMDev \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440. \u0412\u0441\u0451 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0433\u043e\u0441\u0442\u044f \u0441 \u0445\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0451: \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u0445\u043e\u0441\u0442\u0430, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f), \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (\u043c\u044b\u0448\u044c, \u0434\u0438\u0441\u043f\u043b\u0435\u0439, clipboard, heartbeat), RPC-\u0432\u044b\u0437\u043e\u0432\u044b \u043f\u043e\u0432\u0435\u0440\u0445 HGCM. \u041f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043d\u0435\u043b\u044c\u0437\u044f, \u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 \u044d\u0442\u0438\u043c \u0441\u043b\u043e\u0435\u043c \u2014 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0442\u043e\u044f\u0442 \u043d\u0430 \u043d\u0451\u043c.<\/p>\n<p>\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 PCI-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 Vendor ID <code>0x80EE<\/code> \u0438 Device ID <code>0xCAFE<\/code>. \u041d\u0430 \u043d\u0435\u0433\u043e VirtualBox \u0432\u0435\u0448\u0430\u0435\u0442 \u043e\u0434\u0438\u043d I\/O-\u043f\u043e\u0440\u0442, \u043e\u043a\u043d\u043e MMIO \u0438 \u043b\u0438\u043d\u0438\u044e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u2014 \u0442\u0440\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435.<\/p>\n<p>VirtualBox \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443 \u0442\u0440\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430:<\/p>\n<ul>\n<li>\n<p><strong>BAR0 (I\/O-\u043f\u043e\u0440\u0442)<\/strong> \u2014 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0440\u0442\u0430 \u0432 16-\u0431\u0438\u0442\u043d\u043e\u043c I\/O-\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 x86. \u0412 \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 RAM. \u042d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0443:  \u00ab\u0432\u043e\u0437\u044c\u043c\u0438 \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0439\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>BAR1 (MMIO, 4 \u041c\u0411)<\/strong> \u2014 \u043e\u043a\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0447\u0438\u0442\u0430\u0435\u0442 \u0444\u043b\u0430\u0433\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0447\u0435\u0440\u0435\u0437 MMIO \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>IRQ<\/strong> \u2014 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 PCI Configuration Space, \u043f\u043e\u043b\u0435 <code>interrupt_line<\/code> (offset 0x3C \u0432 header type 00). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0438 \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 HGCM-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u0430<\/h4>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a VMMDev \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 24-\u0431\u0430\u0439\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (<code>VMMDEV_HEADER<\/code>) \u2014 \u044d\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 v1_04, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0435 <code>f_requestor<\/code>. \u0412 v1_03 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0431\u044b\u043b 20 \u0431\u0430\u0439\u0442 (\u0431\u0435\u0437 <code>f_requestor<\/code>); \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0441\u0438\u0439 \u2014 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\u00bb.<\/p>\n<pre><code class=\"assembly\">size\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0\u00a0\u00a0 - \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0441\u0435\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430version\u00a0\u00a0\u00a0\u00a0 dd\u00a0\u00a0\u00a0 - 0x00010001 (VMMDEV_REQUEST_HEADER_VERSION)request\u00a0\u00a0\u00a0\u00a0 dd\u00a0\u00a0\u00a0 - \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (VMMDEV_REQ_*)rc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0\u00a0\u00a0 - \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 (\u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0445\u043e\u0441\u0442)reserved\u00a0\u00a0\u00a0 dd\u00a0\u00a0\u00a0 - 0f_requestor dd\u00a0\u00a0\u00a0 - VMMDEV_REQUESTOR_VBOXGUEST | \u0444\u043b\u0430\u0433\u0438 \u0440\u0435\u0436\u0438\u043c\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 \u043f\u043e\u043d\u044f\u043b: \u043a\u0442\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043b \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043a\u0430\u043a\u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u0442. \u041f\u043e\u043b\u0435 <code>f_requestor<\/code> \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043e\u0432\u0435\u0440\u0438\u044f: \u0432 \u044d\u0442\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u0442\u0443\u0434\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f <code>VMMDEV_REQUESTOR_VBOXGUEST<\/code> \u2014 \u043f\u0440\u0438\u0437\u043d\u0430\u043a  \u00ab\u044d\u0442\u043e \u044f\u0434\u0435\u0440\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442 VBoxGuest-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\u00bb. \u0425\u043e\u0441\u0442 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044e \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 (\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440) \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>\u041f\u043e\u043b\u0435 <code>rc<\/code> \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f sentinel-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0433\u043e\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043c \u0443\u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u0445\u043e\u0441\u0442\u043e\u043c. \u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 VMMDev-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u044e\u0434\u0430 \u043f\u0438\u0448\u0443\u0442 \u043d\u043e\u043b\u044c (\u0442\u0430\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f <code>capabilities<\/code>, <code>event_filter<\/code>, <code>timesync<\/code>, <code>mouse<\/code>, <code>display<\/code>, <code>heartbeat<\/code>, <code>seamless<\/code>): \u043d\u043e\u043b\u044c (<code>VINF_SUCCESS<\/code>) \u2014 \u044d\u0442\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 VMMDev-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e <code>rc<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442 \u00ab\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e\u00bb \/ \u00ab\u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e\u00bb, \u0430 \u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c <code>out<\/code>-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0414\u043b\u044f HGCM-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 <code>rc<\/code> \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f <code>VERR_GENERAL_FAILURE<\/code> (\u0441\u043c. <code>hgcm\/hgcm.inc<\/code> \u0438 <code>data\/hgcm\/constants.inc<\/code>) \u2014 \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>\u043d\u0435<\/strong> \u0431\u044b\u043b\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c \u0443\u0441\u043f\u0435\u0445\u043e\u043c, \u0438\u043d\u0430\u0447\u0435 \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0442 \u00ab\u0445\u043e\u0441\u0442 \u0435\u0449\u0451 \u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u00bb \u043e\u0442 \u00ab\u0445\u043e\u0441\u0442 \u043e\u0442\u0432\u0435\u0442\u0438\u043b <code>rc=0<\/code>\u00bb.<\/p>\n<h4>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u2014 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e, \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442<\/h4>\n<p>\u041f\u043e\u0440\u0442 BAR0 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0442\u0440\u0438\u0433\u0433\u0435\u0440: \u0441\u0430\u043c\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043d\u0435\u0433\u043e \u043d\u0435 \u043d\u0435\u0441\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043e\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430. \u041f\u0430\u043a\u0435\u0442 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043b\u0435\u0436\u0438\u0442 \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 RAM, \u0430 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442 \u0443\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 (\u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435) \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e\u0434 VMMDev-\u043f\u0430\u043a\u0435\u0442\u044b, \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432 \u043d\u0435\u0439 \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043f\u0438\u0448\u0435\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432 BAR0:<\/p>\n<pre><code class=\"assembly\">; drivers\/vboxguest\/core\/ports.incproc vmmdev_send_request uses edx, phys_addr:dword\u00a0\u00a0\u00a0 mov eax, [phys_addr] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0; \u0444\u0438\u0437. \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c\u00a0\u00a0\u00a0 mov dx,\u00a0 [vbox_device.port]\u00a0\u00a0 ; BAR0\u00a0\u00a0\u00a0 out dx,\u00a0 eax\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; \u0442\u0440\u0438\u0433\u0433\u0435\u0440: \"\u0437\u0430\u0431\u0435\u0440\u0438 \u043f\u0430\u043a\u0435\u0442 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443\"\u00a0\u00a0\u00a0 mov ecx, 1000000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; \u0437\u0430\u043f\u0430\u0441 \u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.wait:\u00a0\u00a0\u00a0 xor eax, eax\u00a0\u00a0\u00a0 loop .wait\u00a0\u00a0\u00a0 retendp<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/859\/255\/9e2\/8592559e2f59c57ac1b564ba07724e2f.png\" alt=\" \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 VMMDev\" title=\" \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 VMMDev\" width=\"921\" height=\"779\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/859\/255\/9e2\/8592559e2f59c57ac1b564ba07724e2f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/859\/255\/9e2\/8592559e2f59c57ac1b564ba07724e2f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption> \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 VMMDev<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 spin-loop \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 <\/strong><code><strong>rc<\/strong><\/code><strong>.<\/strong> \u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0446\u0438\u043a\u043b <code>.wait<\/code> \u043f\u043e\u0441\u043b\u0435 <code>out<\/code> \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u2014 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442, \u0438 \u044d\u0442\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>out<\/code> \u043a \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 VMEXIT: \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0443, \u0442\u043e\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, <strong>\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0442\u0443 \u0436\u0435 \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443<\/strong> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u043e\u0441\u0442\u044e. \u041a \u043c\u043e\u043c\u0435\u043d\u0442\u0443, \u043a\u043e\u0433\u0434\u0430 <code>out<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0433\u043e\u0441\u0442\u044f, \u043f\u043e\u043b\u0435 <code>rc<\/code> \u0443\u0436\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0444\u043b\u0430\u0433 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0426\u0438\u043a\u043b \u2014 \u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043a\u0430 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438, \u0433\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0430 \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0437\u0430\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f. \u0414\u043b\u044f \u0448\u0442\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u0435\u043d, \u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0434\u0451\u0448\u0435\u0432\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442 VMMDev-\u0432\u044b\u0437\u043e\u0432 \u043e\u0442 HGCM-\u0432\u044b\u0437\u043e\u0432\u0430: \u0443 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442 \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 <code>out<\/code> \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f, \u0443 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u2014 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0436\u0434\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 DMA-\u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u043b\u0430\u0433\u0430 DONE (\u0441\u043c. \u0440\u0430\u0437\u0434\u0435\u043b [\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435](#\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435-\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435)).<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0441\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439) \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u2014 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u0441\u043b\u043e\u044f VMMDev.<\/p>\n<h4>\u041e\u043a\u043d\u043e MMIO \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043b\u0430\u0433\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/h4>\n<p>BAR1 \u2014 \u044d\u0442\u043e 4 \u041c\u0411 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u0443\u0434\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>VMMDEV_MEMORY<\/code>. \u0412 VBoxGuest \u0434\u043b\u044f KolibriOS \u0438\u0437 \u043d\u0435\u0451 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u2014 <code>have_events<\/code> (offset <code>0x08<\/code>): \u0444\u043b\u0430\u0433, \u0435\u0441\u0442\u044c \u043b\u0438 \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u044f \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0442\u0442\u0443\u0434\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442.<\/p>\n<h3>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0448\u0430\u0433\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0436\u0451\u0441\u0442\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041d\u0435\u043b\u044c\u0437\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c IRQ-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0434 \u043f\u0430\u043a\u0435\u0442\u044b (\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435 <code>AttachIntHandler<\/code>, \u0438 \u0435\u043c\u0443 \u0443\u0436\u0435 \u043d\u0443\u0436\u043d\u044b \u0431\u0443\u0444\u0435\u0440\u044b). \u041d\u0435\u043b\u044c\u0437\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043f\u043e\u043a\u0430 \u0445\u043e\u0441\u0442 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e capabilities (\u0445\u043e\u0441\u0442 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0451\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f). \u041d\u0435\u043b\u044c\u0437\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432 \u041e\u0421, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0438 capabilities (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0442\u0443\u0442 \u0436\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c IOCTL \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u0430: \u043b\u0438\u0431\u043e \u0432\u0441\u0435 \u0448\u0430\u0433\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043b\u0438\u0431\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<pre><code>vmmdev_probe\u00a0 pci_find_vmmdev\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vendor=0x80EE, device=0xCAFE\u00a0 pci_init_vmmdev_irq\u00a0\u00a0\u00a0\u00a0\u00a0 PCI cfg space: interrupt_line @ 0x3C\u00a0 pci_init_vmmdev_bar\u00a0\u00a0\u00a0\u00a0\u00a0 BAR0=I\/O-\u043f\u043e\u0440\u0442, BAR1=\u0444\u0438\u0437. \u0430\u0434\u0440\u0435\u0441 MMIOmmio_map_vmmdev\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4 \u041c\u0411 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\u00a0 mmio_check_version\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 magic\/version \u0432 VMMDEV_MEMORYports_init\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f I\/O-\u043f\u043e\u0440\u0442\u0430\u00a0 vmmdev_init_packets\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 (4 \u041a\u0411) \u043f\u043e\u0434 \u0432\u0441\u0435 VMMDev-\u043f\u0430\u043a\u0435\u0442\u044b:\u00a0   +0:\u00a0\u00a0 GET_HOST_VERSION\u00a0   +64:\u00a0 REPORT_GUEST_INFO\u00a0   +128: REPORT_GUEST_INFO2\u00a0   +320: SET_GUEST_CAPABILITIES\u00a0   +384: CTL_GUEST_FILTER_MASK\u00a0   +448: ACKNOWLEDGE_EVENTSvmmdev_check_versionvmmdev_init_protocol\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 handshake: REPORT_GUEST_INFO (VBOXOSTYPE=0x90000)hgcm_init\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (12 \u041a\u0411) \u043f\u043e\u0434 HGCM-\u043f\u0430\u043a\u0435\u0442\u044btimer_init\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TimerHS(10, 10, timer_cb, 0) -&gt; \u0442\u0438\u043a \u043a\u0430\u0436\u0434\u044b\u0435 100 \u043c\u0441vmmdev_irq_install\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AttachIntHandler(irq, vbox_irq_handler, 0)dispatcher_init_all\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fn_init \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430dispatcher_enable_autostart \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441 autostart=1vmmdev_update_event_filter \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0445\u043e\u0441\u0442\u0443 \u043c\u0430\u0441\u043a\u0443 \u043d\u0443\u0436\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439vmmdev_update_capabilities \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0445\u043e\u0441\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0441\u0442\u044fRegService(\"VBOXGUEST\", service_proc)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 PCI probing: \u043d\u0430\u0439\u0442\u0438 VMMDev \u043f\u043e Vendor\/Device ID, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c BAR&#8217;\u044b \u0438 \u043d\u043e\u043c\u0435\u0440 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u043c\u0430\u043f\u043f\u0438\u0442\u0441\u044f MMIO-\u043e\u043a\u043d\u043e \u0438 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f I\/O-\u043f\u043e\u0440\u0442 \u2014 \u044d\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u00ab\u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e VMMDev, \u0430 \u043d\u0435 \u0447\u0442\u043e-\u0442\u043e \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c\u00bb.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u043e\u0434 VMMDev-\u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u0442\u0440\u0438 \u2014 \u043f\u043e\u0434 HGCM. \u041f\u0430\u043a\u0435\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u00ab\u043d\u0430 \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0436\u0438\u0437\u043d\u0438\u00bb \u0438 \u043b\u0435\u0436\u0430\u0442 \u043f\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u043c. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e: \u043f\u043e\u0434 VMMDev \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u0430 \u043f\u043e\u0434 HGCM \u2014 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0434\u0438\u043d HGCM-\u0432\u044b\u0437\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043a\u0435\u0442, \u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0434\u043b\u044f DMA.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u0430\u0439\u043c\u0435\u0440. \u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 <code>fn_init<\/code> \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u0437\u0430\u0442\u0435\u043c \u0442\u0435 \u0438\u0437 \u043d\u0438\u0445, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <code>autostart=1<\/code>, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 enabled.<\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0445\u043e\u0441\u0442\u0443 \u0434\u0432\u0435 \u043c\u0430\u0441\u043a\u0438 \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0433\u043e\u0441\u0442\u044f (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 \u043f\u0440\u043e \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c <code>VBOXGUEST<\/code> \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 IOCTL-\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c KolibriOS.<\/p>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439<\/h3>\n<p>VMMDev \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435. \u0427\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u0443 \u043b\u0438\u043d\u0438\u044e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0432\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u0440\u0430\u0437\u0443: \u043c\u044b\u0448\u044c \u043f\u043e\u0434\u0432\u0438\u043d\u0443\u043b\u0430\u0441\u044c, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, heartbeat \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d, HGCM-\u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f. \u041c\u0430\u0441\u043a\u0430 \u0432 FAST-\u043f\u043e\u0440\u0442\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0442 \u0434\u0432\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0430\u044e\u0442 \u0432\u0441\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0430 \u00ab\u0433\u043e\u0440\u044f\u0447\u0435\u043c\u00bb \u043f\u0443\u0442\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u044f\u0436\u0451\u043b\u043e\u0433\u043e \u2014 \u0438\u043d\u0430\u0447\u0435 \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u043c\u044b\u0448\u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u0441\u044f, \u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f (\u0442\u0430\u0439\u043c\u0435\u0440, IDE) \u043d\u0430\u0447\u043d\u0443\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0440\u043e\u043a\u0438. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0437\u043d\u0430\u044f: \u043e\u0434\u043d\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0445\u043e\u0442\u044f\u0442 \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e (\u043c\u044b\u0448\u044c \u2014 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u0443\u0442 \u0436\u0435), \u0434\u0440\u0443\u0433\u0438\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u043d\u0443\u0442\u044c\u0441\u044f \u0440\u0430\u0437 \u0432 100 \u043c\u0441 (display \u2014 debounce \u0440\u0435\u0441\u0430\u0439\u0437\u0430, clipboard \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u043b\u0430\u0433\u0430). \u042d\u0442\u0438 \u0434\u0432\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043b\u044f\u0433\u0443\u0442 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u2014 \u0442\u043e, \u0447\u0442\u043e \u0432 Linux \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0438 \u043d\u0438\u0436\u043d\u0435\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043e\u0439. \u0417\u0434\u0435\u0441\u044c \u0440\u043e\u043b\u044c \u043d\u0438\u0436\u043d\u0435\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0438\u0433\u0440\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0430\u0439\u043c\u0435\u0440, \u0447\u0442\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0438 \u043e\u0431\u044f\u0437\u0430\u043d:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u2014 \u00ab\u0435\u0433\u043e\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0443 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0430\u0442\u044c ACK \u2014 \u0438\u043d\u0430\u0447\u0435 \u0445\u043e\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e;<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u043e\u0441\u043b\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u044b\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c.<\/p>\n<\/li>\n<\/ol>\n<h4>\u0412\u0435\u0440\u0445\u043d\u044f\u044f \u0438 \u043d\u0438\u0436\u043d\u044f\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430<\/h4>\n<p>\u0422\u0435\u0440\u043c\u0438\u043d \u2014 \u043e\u0442\u0441\u044b\u043b\u043a\u0430 \u043a Linux: \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439; \u043d\u0438\u0436\u043d\u044f\u044f \u2014 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 (\u0432 Linux \u044d\u0442\u043e tasklet, workqueue, threaded IRQ). \u0412 KolibriOS \u0430\u043d\u0430\u043b\u043e\u0433\u0430 tasklet&#8217;\u043e\u0432 \u043d\u0435\u0442 \u2014 \u0440\u043e\u043b\u044c \u043d\u0438\u0436\u043d\u0435\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0438\u0433\u0440\u0430\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0430\u0439\u043c\u0435\u0440. \u041d\u0435 \u0442\u0430\u043a \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0445\u0432\u0430\u0442\u0430\u0435\u0442: \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043a\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437 \u0432 100 \u043c\u0441.<\/p>\n<h4>\u0412\u0435\u0440\u0445\u043d\u044f\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430<\/h4>\n<pre><code class=\"assembly\">; drivers\/vboxguest\/core\/irq.inc; \u0427\u0438\u0442\u0430\u0435\u043c \u043c\u0430\u0441\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 FAST I\/O-\u043f\u043e\u0440\u0442 (offset +8 \u043e\u0442 BAR0)mov dx, [vbox_device.port]add dx, VMMDEV_PORT_OFF_REQUEST_FASTin\u00a0 eax, dxtest eax, eaxjz\u00a0 .not_ours\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; \u043d\u0435 \u043d\u0430\u0448\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435; ACK: \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044fout dx, eax; \u041c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043cstdcall dispatcher_dispatch, eaxmov eax, 1ret<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u2014 \u0434\u0432\u0430 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0432\u0430\u0436\u043d\u044b\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0437\u0434\u0435\u0441\u044c:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043a\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0434\u0440\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0443\u0440\u043e\u0432\u043d\u044f. \u0414\u043b\u0438\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0442\u0430\u0439\u043c\u0435\u0440\u0430, IDE, \u0441\u0435\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>hgcm_wait_async<\/code> (\u043e\u043d \u0434\u0435\u0440\u0436\u0438\u0442 CPU \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c\u0438) \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c. \u0422\u044f\u0436\u0451\u043b\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043d\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u00a0\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0443\u043c: \u0447\u0438\u0442\u0430\u0435\u0442 \u043c\u0430\u0441\u043a\u0443, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0435\u0451 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440. \u0410 \u00ab\u0441\u0430\u043c\u0438\u00bb \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0443\u0436\u0435 \u0432 \u0441\u0432\u043e\u0438\u0445 <code>fn_on_event<\/code> \u2014 \u043d\u043e \u0434\u0430\u0436\u0435 \u0442\u0430\u043c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u043e\u043d \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u044f\u0436\u0451\u043b\u043e\u0435 \u043d\u0430 <code>fn_on_tick<\/code>.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/719\/ca5\/e16\/719ca5e16f24945c2b89ed1ac0e98be3.png\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\" title=\"\u0421\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\" width=\"750\" height=\"1130\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/719\/ca5\/e16\/719ca5e16f24945c2b89ed1ac0e98be3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/719\/ca5\/e16\/719ca5e16f24945c2b89ed1ac0e98be3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<h4>\u041d\u0438\u0436\u043d\u044f\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u2014 \u0442\u0438\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430<\/h4>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e18\/f89\/3eb\/e18f893eb418bb5f8cbe2f8ae04225de.png\" alt=\"\u0422\u0438\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430: \u043d\u0438\u0436\u043d\u044f\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430\" title=\"\u0422\u0438\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430: \u043d\u0438\u0436\u043d\u044f\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430\" width=\"1050\" height=\"601\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e18\/f89\/3eb\/e18f893eb418bb5f8cbe2f8ae04225de.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e18\/f89\/3eb\/e18f893eb418bb5f8cbe2f8ae04225de.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0438\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430: \u043d\u0438\u0436\u043d\u044f\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p><code>display<\/code> \u2014 debounce \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0440\u0435\u0441\u0430\u0439\u0437\u0430;<\/p>\n<\/li>\n<li>\n<p><code>heartbeat<\/code> \u2014 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u00ab\u0433\u043e\u0441\u0442\u044c \u0436\u0438\u0432\u00bb \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443;<\/p>\n<\/li>\n<li>\n<p><code>timesync<\/code> \u2014 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p><code>clipboard<\/code> \u2014 state machine \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430;<\/p>\n<\/li>\n<li>\n<p><code>seamless<\/code> \u2014 debounce \u0441\u043c\u0435\u043d\u044b \u0440\u0435\u0436\u0438\u043c\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435, \u0431\u0435\u0437 runtime-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041d\u0438 VMT, \u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043d\u0438 <code>register_filesystem<\/code>, \u043d\u0438 reflection: \u0442\u043e, \u043d\u0430 \u0447\u0451\u043c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0432 C\/C++\/Rust, \u0432 FASM \u043b\u0438\u0431\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043b\u0438\u0431\u043e \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0440\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. <\/p>\n<p>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u043f\u0443\u0442\u044c \u2014 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e \u0431\u0438\u0442\u0430\u043c \u043c\u0430\u0441\u043a\u0438 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438; \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 switch \u2014 \u0434\u043b\u044f \u0442\u0438\u043a\u0430, \u0434\u043b\u044f IOCTL, \u0434\u043b\u044f capabilities. \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u043b\u043e\u0441\u043a\u0430\u044f, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043f\u043b\u043e\u0445\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f: \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u0430\u0432\u043a\u0438 \u0442\u0440\u0451\u0445-\u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 (irq, timer, ioctl, capabilities), \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e ID \u0434\u043b\u044f IOCTL, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041b\u044e\u0431\u0430\u044f \u0437\u0430\u0431\u044b\u0442\u0430\u044f \u043f\u0440\u0430\u0432\u043a\u0430 \u2014 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u043e\u043b\u043e\u043c\u0430\u043d\u043d\u0430\u044f enable\/disable-\u043b\u043e\u0433\u0438\u043a\u0430. \u0421 \u0432\u043e\u0441\u0435\u043c\u044c\u044e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u044d\u0442\u043e \u0443\u0436\u0435 \u0442\u0440\u0443\u0434\u043d\u043e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0442\u044c, \u0441 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c\u044e \u2014 \u043d\u0435\u0440\u0435\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u2014 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043f\u043b\u044e\u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0445\u0443\u043a\u043e\u0432 \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u043e\u0439 <code>SERVICE_ENTRY<\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 (<code>fn_init<\/code>, <code>fn_enable<\/code>, <code>fn_disable<\/code>, <code>fn_on_event<\/code>, <code>fn_on_tick<\/code>, \u043c\u0430\u0441\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 capabilities). \u042f\u0434\u0440\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u043e\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0437\u043e\u0432\u0451\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0445\u0443\u043a. \u0421\u0435\u0440\u0432\u0438\u0441 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u2014 \u043e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<\/p>\n<p>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043d\u0435 \u0432 runtime. \u041a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 <code>REGISTER_SERVICE<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434\u0430, \u0430 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 compile-time \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 <code>BUILD_SERVICE_TABLE<\/code> \u0432 <code>vboxguest.asm<\/code> \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 <code>dd<\/code>-\u0437\u0430\u043f\u0438\u0441\u0438. \u0412 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u2014 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0442\u043e\u0432\u0430\u044f <code>services_table<\/code>. \u0414\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u043d\u0438\u0436\u0435, \u0432 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u0410\u0432\u0442\u043e\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u043a\u0440\u043e\u0441\u044b\u00bb.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u2014 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>REGISTER_SERVICE<\/code> \u0432 \u043a\u043e\u043d\u0446\u0435 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>include<\/code> \u0432 <code>services\/services.inc<\/code>. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0430\u0432\u043e\u043a \u0432 <code>vboxguest.asm<\/code>, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u00ab\u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0441\u043a\u0443\u00bb. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435: \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0441\u043a\u0438 (\u0440\u0430\u043d\u0442\u0430\u0439\u043c-OR \u0445\u0443\u043a\u043e\u0432), \u043f\u043b\u0430\u0433\u0438\u043d\u043d\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 IRQ-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0442\u0438\u043a-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u2014 \u0432\u0441\u0451 \u043f\u043e\u0434\u0432\u044f\u0437\u0430\u043d\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>SERVICE_ENTRY<\/code> \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f, \u043f\u043e\u0442\u043e\u043c \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043f\u043e\u0442\u043e\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0441\u043a\u0438, \u043f\u043e\u0442\u043e\u043c \u0441\u0430\u043c\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b. \u0412\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 (<code>services\/mouse\/<\/code>, <code>services\/clipboard\/<\/code> \u0438 \u0442.\u0434.), \u0430 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0432\u0435\u0434\u0451\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u043c\u0430\u0441\u043e\u043a, \u0438 \u043f\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u043e\u0433\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u0438\u0442\u044c.\u00a0<\/p>\n<h4>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/h4>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <code>SERVICE_ENTRY<\/code>:<\/p>\n<pre><code class=\"assembly\">id\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0dd\u00a0 - \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 (\u0441 1)name_ptr\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u043c\u0435\u043d\u0438event_mask\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - \u043c\u0430\u0441\u043a\u0430 VMMDev-\u0441\u043e\u0431\u044b\u0442\u0438\u0439caps_mask\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - \u043c\u0430\u0441\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0433\u043e\u0441\u0442\u044fenabled\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - 0\/1autostart\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - 1 = \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435fn_init\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044ffn_enable\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435fn_disable\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435fn_on_event\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a IRQ-\u0441\u043e\u0431\u044b\u0442\u0438\u044ffn_on_tick\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0 - \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0442\u0438\u043a\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c <code>BUILD_SERVICE_TABLE<\/code> (\u0434\u0435\u0442\u0430\u043b\u0438 \u043d\u0438\u0436\u0435, \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 \u043f\u0440\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u044b). \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u2014 \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430:<\/p>\n<pre><code class=\"assembly\">REGISTER_SERVICE svc_my_name, MY_EVENT_MASK, MY_CAPS, \\\u00a0\u00a0\u00a0 my_init, my_enable, AUTOSTART_MY, \\\u00a0\u00a0\u00a0 my_on_event, my_on_tick<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/h4>\n<p>\u041a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u0443\u0437\u043d\u0430\u0451\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u2014 \u0434\u043b\u044f \u043d\u0435\u0433\u043e? \u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0438\u0434\u0451\u0442 \u043f\u043e \u0432\u0441\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 <code>AND<\/code> \u043c\u0430\u0441\u043a\u0438:<\/p>\n<pre><code class=\"assembly\">; drivers\/vboxguest\/core\/dispatcher\/dispatcher.incproc dispatcher_dispatch stdcall, event_mask:dword\u00a0\u00a0\u00a0 mov edx, [event_mask]\u00a0\u00a0\u00a0 mov ecx, [services_count]\u00a0\u00a0\u00a0 mov esi, services_table.loop:\u00a0\u00a0\u00a0 cmp dword [esi + SERVICE_ENTRY.enabled], 0\u00a0\u00a0\u00a0 je .next\u00a0\u00a0\u00a0\u00a0 mov eax, [esi + SERVICE_ENTRY.event_mask]\u00a0\u00a0\u00a0 test eax, edx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; AND: \u0435\u0441\u0442\u044c \u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435?\u00a0\u00a0\u00a0 jz .next    call [esi + SERVICE_ENTRY.fn_on_event].next:\u00a0\u00a0\u00a0 add esi, sizeof.SERVICE_ENTRY\u00a0\u00a0\u00a0 dec ecx\u00a0\u00a0\u00a0 jnz .loopendp<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0431\u0438\u0442\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0441\u0442 \u043f\u043e\u0434\u043d\u044f\u043b \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u2014 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c &#171;\u0441\u0432\u043e\u0438&#187; \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0430\u043c. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0431\u0438\u0442 (\u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e), \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u0435\u043d.<\/p>\n<h4>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0441\u043a\u0438<\/h4>\n<p>\u0425\u043e\u0441\u0442 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u0438\u0432\u0435 \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2014 \u043e\u043d \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>CTL_GUEST_FILTER_MASK<\/code>. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0445\u043e\u0441\u0442 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0441\u0442\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0442 \u043e\u0431\u044a\u044f\u0432\u0438\u043b \u0447\u0435\u0440\u0435\u0437 <code>SET_GUEST_CAPABILITIES<\/code>.<\/p>\n<p>\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0432\u0430 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code class=\"assembly\">dispatcher_active_events - OR \u0432\u0441\u0435\u0445 event_mask \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432dispatcher_active_caps\u00a0\u00a0 - OR \u0432\u0441\u0435\u0445 caps_mask \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u043d\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c <code>enable<\/code>\/<code>disable<\/code> \u0441\u0435\u0440\u0432\u0438\u0441\u0430 (\u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 IOCTL) \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0445\u043e\u0441\u0442\u0443 \u0434\u0432\u0443\u043c\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 VMMDev-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043c\u0430\u0441\u043e\u043a \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438: events \u2014 \u044d\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f, caps \u2014 \u044d\u0442\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f, \u0447\u0442\u043e \u0433\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0443 \u0438\u043b\u0438 \u0438\u043d\u0443\u044e \u0444\u0438\u0447\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u044b\u0448\u0438 \u0438\u043b\u0438 shared folders).<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 IOCTL <code>SVC_ENABLE<\/code> (2) \u0438\u043b\u0438 <code>SVC_DISABLE<\/code> (3): <\/p>\n<ol>\n<li>\n<p>\u00a0\u041f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f <code>dispatcher_active_events<\/code> \u0438 <code>dispatcher_active_caps<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>vmmdev_update_event_filter()<\/code> \u2014 \u0445\u043e\u0441\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><code>vmmdev_update_capabilities()<\/code> \u2014 \u0445\u043e\u0441\u0442 \u0432\u0438\u0434\u0438\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0438\u0447 \u0433\u043e\u0441\u0442\u044f.<\/p>\n<\/li>\n<\/ol>\n<h4>\u0410\u0432\u0442\u043e\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/h4>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u2014 \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044f \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u00ab\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439\u00bb \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0412 \u044f\u0437\u044b\u043a\u0430\u0445 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f reflection \u0438\u043b\u0438 registration-on-include. \u0412 FASM \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c compile-time \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 <code>services.inc<\/code> \u2014 \u043e\u0448\u0438\u0431\u043a\u043e\u0451\u043c\u043e\u043a: \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0441\u0435\u0440\u0432\u0438\u0441, \u043d\u0430\u0434\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043f\u0440\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043f\u0440\u043e include. \u042d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430, \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u2014 \u043b\u0435\u0433\u043a\u043e.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 FASM \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u0430 \u043f\u0440\u0438\u0451\u043c\u0430: \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0447\u0435\u0440\u0435\u0437 <code>equ<\/code> \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0447\u0435\u0440\u0435\u0437 <code>match<\/code>.<\/p>\n<p><strong>\u042d\u0442\u0430\u043f 1 <\/strong>\u2014<strong> \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/strong> \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u0442\u043e\u0438\u0442 \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 <code>REGISTER_SERVICE<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0431\u0430\u0439\u0442 \u0432 \u043a\u043e\u0434\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 compile-time \u0441\u0442\u0440\u043e\u043a\u0443 <code>__SERVICES_LIST__<\/code>:<\/p>\n<pre><code class=\"assembly\">macro REGISTER_SERVICE svc_name, event_mask, caps_mask, \\\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fn_init, fn_enable, fn_disable, \\\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fn_on_event, fn_on_tick, autostart{\u00a0\u00a0\u00a0 ; \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0436\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442 - \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e\u00a0\u00a0\u00a0 match any, __SERVICES_LIST__ \\{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 __SERVICES_LIST__ equ __SERVICES_LIST__,\\\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 svc_name|event_mask|caps_mask|fn_init|fn_enable|\\\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fn_disable|fn_on_event|fn_on_tick|autostart\u00a0\u00a0\u00a0 \\}    ; \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442 - \u043f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u043e\u0439\u00a0\u00a0\u00a0 match , __SERVICES_LIST__ \\{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 __SERVICES_LIST__ equ \\\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 svc_name|event_mask|caps_mask|fn_init|fn_enable|\\\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fn_disable|fn_on_event|fn_on_tick|autostart\\\u00a0\u00a0\u00a0 }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u042d\u0442\u0430\u043f 2 <\/strong>\u2014<strong> \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/strong> \u0412 \u043a\u043e\u043d\u0446\u0435 <code>vboxguest.asm<\/code> \u0441\u0442\u043e\u0438\u0442 <code>BUILD_SERVICE_TABLE<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"assembly\">macro BUILD_SERVICE_TABLE{\u00a0\u00a0\u00a0 align 4\u00a0\u00a0\u00a0 services_table:\u00a0\u00a0\u00a0 match list, __SERVICES_LIST__ \\{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 __BUILD_ENTRIES__ list\u00a0\u00a0\u00a0 \\}\u00a0\u00a0\u00a0 services_table_end:\u00a0\u00a0\u00a0 services_count dd __BUILD_ID__}__BUILD_ID__ = 0macro __BUILD_ENTRIES__ [entry]{\u00a0\u00a0\u00a0 forward\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 __BUILD_ID__ = __BUILD_ID__ + 1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 match name|ev|_cap|_init|_en|_dis|_onevent|_tick|_auto, entry \\{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd __BUILD_ID__\u00a0\u00a0\u00a0\u00a0 ; id (1, 2, 3, ...)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; nameptr\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd ev\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; eventmask\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd cap\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; capsmask\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; enabled = 0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0dd _auto\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; autostart\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd init\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; fninit\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd en\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; fnenable\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd dis\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; fndisable\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd onevent\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; fnon_event\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd tick\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; fnon_tick\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\}}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 <code>forward<\/code> \u0432 <code>__BUILD_ENTRIES__<\/code>. \u041e\u043d \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 FASM \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0430\u0440\u0438\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>[entry]<\/code> \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e, \u0438 <code>__BUILD_ID__<\/code> \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435. \u0422\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 ID 1, 2, 3, &#8230; \u0441\u0442\u0440\u043e\u0433\u043e \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u2014 \u044d\u0442\u043e<\/p>\n<ol>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043a\u043e\u043d\u0446\u0435 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>REGISTER_SERVICE ...<\/code>,<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>include<\/code> \u0432 <code>services\/services.inc<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 <code>vboxguest.asm<\/code>, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438 ID, \u043d\u0438\u043a\u0430\u043a\u0438\u0445  \u00ab\u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u00bb.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/348\/70d\/4a5\/34870d4a54a252da22ff8c18c911f563.png\" alt=\"\u0421\u0431\u043e\u0440\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438\" title=\"\u0421\u0431\u043e\u0440\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438\" width=\"900\" height=\"333\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/348\/70d\/4a5\/34870d4a54a252da22ff8c18c911f563.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/348\/70d\/4a5\/34870d4a54a252da22ff8c18c911f563.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0431\u043e\u0440\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u00a0\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u0451\u043c \u2014 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <code>equ<\/code> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0441\u043e\u043a. \u0412 <code>data\/core\/constants.inc<\/code> \u043c\u0430\u0441\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u043d\u0443\u043b\u044f:<\/p>\n<pre><code>VBOXGUEST_EVENTS_OR_MASK equ 0VBOXGUEST_GUEST_CAPS_OR_MASK equ 0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 <code>data\/&lt;svc&gt;\/constants.inc<\/code> \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0451:<\/p>\n<pre><code>; data\/mouse\/constants.incVBOXGUEST_EVENTS_OR_MASK equ (VBOXGUEST_EVENTS_OR_MASK or MOUSE_EVENT_MASK)VBOXGUEST_GUEST_CAPS_OR_MASK equ (VBOXGUEST_GUEST_CAPS_OR_MASK or VMMDEV_GUEST_SUPPORTS_MOUSE)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d, \u043d\u043e \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043d \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 (OR \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u0435\u043d). \u041a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>VBOXGUEST_EVENTS_OR_MASK<\/code> (\u0441\u0443\u043f\u0435\u0440\u0441\u0435\u0442 \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443) \u0443\u0436\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043e \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c \u2014 \u043e\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>or_mask<\/code> \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0430\u043a\u0435\u0442\u0430 <code>VMMDEV_CTL_GUEST_FILTER_MASK<\/code>. \u042d\u0442\u043e \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 runtime-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>dispatcher_active_events<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c enable\/disable \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>vmmdev_update_event_filter<\/code>: compile-time \u043c\u0430\u0441\u043a\u0430 \u2014 \u044d\u0442\u043e \u00ab\u0432\u0441\u0451, \u0447\u0442\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u043e\u043e\u0431\u0449\u0435 \u0443\u043c\u0435\u0435\u0442\u00bb, \u0430 runtime \u2014 \u00ab\u0447\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441\u00bb.<\/p>\n<h3>HGCM \u2014 Host-Guest Communication Manager<\/h3>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 HGCM \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0440\u0438 \u0432\u0435\u0449\u0438 \u043f\u043e\u0432\u0435\u0440\u0445 VMMDev: \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 RPC-\u0441\u0435\u0440\u0432\u0438\u0441\u044b (\u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043d\u043e\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b), DMA \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (\u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446), \u0438 lifecycle \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (<code>connect<\/code> \u2192 \u0441\u0435\u0440\u0438\u044f <code>call<\/code> \u2192 <code>disconnect<\/code>, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432).<\/p>\n<p>VMMDev \u2014 \u044d\u0442\u043e \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0431\u0435\u0437 \u0438\u043c\u0451\u043d: \u0442\u0443\u0434\u0430 \u0443\u0445\u043e\u0434\u044f\u0442 \u043f\u0430\u043a\u0435\u0442\u044b, \u043e\u0442\u0442\u0443\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0444\u043b\u0430\u0433\u0438. \u042d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 (capabilities, event filter, mouse, display), \u043d\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u2014 shared folders, clipboard, guest properties. \u0423 \u044d\u0442\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f: \u0438\u043c \u043d\u0443\u0436\u043d\u044b \u0438\u043c\u0435\u043d\u0430, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 (\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \/ \u0434\u043e\u043b\u0433\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \/ fire-and-forget) \u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 DMA. HGCM \u2014 \u044d\u0442\u043e \u0441\u043b\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0451 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0440\u0445 VMMDev.<\/p>\n<p>\u0413\u0440\u0430\u043d\u0438\u0446\u0430 HGCM-\u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u0433\u0430\u044f: \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432\u044b\u0448\u0435 HGCM \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u043f\u0440\u043e VMMDev. \u041e\u043d\u0438 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0442\u0440\u0435\u043c\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438: <code>client_id<\/code> (\u0445\u0435\u043d\u0434\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f), \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0430\u043a\u0435\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u0445\u043e\u0441\u0442, \u043a\u0430\u043a \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0432\u0435\u0442, \u043a\u0430\u043a \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 HGCM-\u043e\u0431\u0451\u0440\u0442\u043a\u0438. \u0422\u043e\u0442 \u0436\u0435 <code>shared_folders<\/code> \u0438\u043b\u0438 <code>clipboard<\/code> \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442, \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u2014 \u043e\u043d\u0430 \u043f\u0440\u043e SHFL (Shared Folders) \u0438 SHCL (Shared Clipboard), \u043d\u0435 \u043f\u0440\u043e PCI \u0438 \u043f\u043e\u0440\u0442\u044b.<\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0445\u043e\u0441\u0442\u0430 HGCM-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u2014 \u044d\u0442\u043e <code>VBoxSharedFolders<\/code>, <code>VBoxSharedClipboard<\/code>, <code>VBoxGuestPropSvc<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435: \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 RPC-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0433\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u0438 \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0447\u0435\u0440\u0435\u0437 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 <code>client_id<\/code>.\u00a0<\/p>\n<h4>\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f<\/h4>\n<pre><code>hgcm_connect(\"VBoxSharedFolders\")\u00a0\u00a0\u00a0\u00a0\u00a0 -&gt; client_id (32-\u0431\u0438\u0442\u043d\u044b\u0439 handle)hgcm_call32_pagelist(client_id, fn, params, ...)\u00a0\u00a0\u00a0 1. \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c HGCM_CALL \u0432 pre-allocated \u0431\u0443\u0444\u0435\u0440\u0435\u00a0\u00a0\u00a0 2. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e LINADDR-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c PAGE_LIST\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u0443\u0444\u0435\u0440\u0430)\u00a0\u00a0\u00a0 3. vmmdev_send_request(phys_addr)\u00a0\u00a0\u00a0 4. hgcm_wait_async()\u00a0\u00a0\u00a0 &lt;- \u0436\u0434\u0451\u043c VBOX_HGCM_REQ_DONEhgcm_disconnect(client_id)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u2014 <code>connect<\/code>. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 VMMDev-\u0437\u0430\u043f\u0440\u043e\u0441 <code>VMMDEV_REQ_HGCM_CONNECT<\/code> \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>HGCM_SERVICE_LOCATION<\/code>. \u0425\u043e\u0441\u0442 \u0438\u0449\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e \u0438\u043c\u0435\u043d\u0438, \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>client_id<\/code> \u2014 32-\u0431\u0438\u0442\u043d\u044b\u0439 handle, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u0422\u0430\u043a\u043e\u0439 handle \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0432\u043d\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f: \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u044e\u0447 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0445\u043e\u0441\u0442\u0430<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u2014 <code>call<\/code>: \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e RPC-\u0432\u044b\u0437\u043e\u0432. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (<code>fn<\/code>), \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0439 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f SharedFolders \u044d\u0442\u043e <code>SHFL_FN_READ<\/code>, <code>SHFL_FN_WRITE<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435), \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u2014 <code>disconnect<\/code>: \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0445\u043e\u0441\u0442\u0430. \u0412\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441: \u0435\u0441\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0436\u0434\u0451\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 (\u043a\u0430\u043a clipboard \u0441 <code>MSG_OLD_GET_WAIT<\/code>), \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>disconnect<\/code> \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. Clipboard \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 fire-and-forget \u2014 \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435.<\/p>\n<p>\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 HGCM-\u0432\u044b\u0437\u043e\u0432\u0430:\u00a0<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/19f\/e64\/2bd\/19fe642bda65990c6a797b8ed11b65ea.png\" alt=\"HGCM-\u0432\u044b\u0437\u043e\u0432: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0448\u0430\u0433\u043e\u0432\" title=\"HGCM-\u0432\u044b\u0437\u043e\u0432: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0448\u0430\u0433\u043e\u0432\" width=\"918\" height=\"944\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/19f\/e64\/2bd\/19fe642bda65990c6a797b8ed11b65ea.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/19f\/e64\/2bd\/19fe642bda65990c6a797b8ed11b65ea.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>HGCM-\u0432\u044b\u0437\u043e\u0432: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0448\u0430\u0433\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<h4>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438<\/h4>\n<p>\u00a0\u0413\u043e\u0441\u0442\u0435\u0432\u044b\u0445 HGCM-\u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0438 \u043d\u0430 \u0432\u0435\u0441\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 (\u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 <code>hgcm_init_packets<\/code>, <code>hgcm\/hgcm.inc<\/code>):<\/p>\n<pre><code>core:\u00a0\u00a0 +-------------------+\u00a0\u00a0 | hgcm_connect_virt |\u00a0 4 \u041a\u0411\u00a0 - connect \/ disconnect\u00a0\u00a0 +-------------------+\u00a0\u00a0 | hgcm_call_virt\u00a0\u00a0\u00a0 |\u00a0 4 \u041a\u0411\u00a0 - \u043e\u0431\u044b\u0447\u043d\u044b\u0435 HGCM_CALL\u00a0\u00a0 +-------------------+\u00a0\u00a0 | hgcm_call_pl_virt |\u00a0 4 \u041a\u0411\u00a0 - HGCM_CALL \u0441 PageList\u00a0\u00a0 +-------------------+\u00a0\u00a0\u00a0\u00a0\u00a0 ^\u00a0\u00a0\u00a0\u00a0\u00a0 | \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e:\u00a0\u00a0\u00a0\u00a0\u00a0 | shared_folders, guest_props, write-\u043f\u0443\u0442\u044c clipboard\u00a0\u00a0 clipboard (\u0441\u0432\u043e\u0439 \u043f\u0430\u043a\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e listener \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u2014\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043e\u043d \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0430\u043c\u0438):\u00a0\u00a0 +---------------------------+\u00a0\u00a0 | clip_state.listen_pkt_virt |\u00a0 4 \u041a\u0411 - MSG_OLD_GET_WAIT\u00a0\u00a0 +---------------------------+\u00a0\u00a0\u00a0\u00a0\u00a0 ^\u00a0\u00a0\u00a0\u00a0\u00a0 | \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 100 \u043c\u0441 \u0432 clipboard_tick<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0448\u0451\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u043c\u0443? \u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u0438\u0434\u0451\u0442 <strong>\u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u043f\u0430\u043a\u0435\u0442\u0430<\/strong>, \u0430 \u043d\u0435 \u043f\u043e IRQ-\u043c\u0430\u0441\u043a\u0435. Shared folders \u0438 guest_props \u0434\u0435\u043b\u0430\u044e\u0442 \u0432\u044b\u0437\u043e\u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e: <code>hgcm_wait_async<\/code> \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 DONE \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0442\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d, \u2014 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043d\u0435\u043c\u0443. \u0413\u043e\u043d\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u043d\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u043e\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u2014 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439. Clipboard listener, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043d\u0438\u0445, \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 <strong>\u0441\u0432\u043e\u044e<\/strong> \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u2014 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0439 HGCM-\u0441\u043b\u043e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u043a\u0430 \u0445\u043e\u0441\u0442 \u0436\u0434\u0451\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430.<\/p>\n<p>\u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 <code>VMMDEV_EVENT_HGCM<\/code> \u0432 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u0430\u0435\u0442 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u043e\u043b\u044c: DMA-\u0437\u0430\u043f\u0438\u0441\u044c \u0444\u043b\u0430\u0433\u0430 DONE \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430, \u0447\u0442\u043e\u0431\u044b spin-loop \u0438\u043b\u0438 \u0442\u0438\u043a \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u043e\u0442\u0432\u0435\u0442. \u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \u043c\u0430\u0441\u043a\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u2014 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0445\u043e\u0441\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0435\u0451 \u0434\u043b\u044f HGCM-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0431\u0435\u0437 \u043d\u0435\u0451 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0432 \u043d\u0435\u0448\u0442\u0430\u0442\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438, \u2014 \u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b -&gt; \u0434\u043e\u0436\u0434\u0430\u043b\u0441\u044f DONE\u00bb \u043e\u043d\u0430 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442.<\/p>\n<h4>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a HGCM<\/h4>\n<pre><code>[VMMDev header 24B]flags\u00a0\u00a0 dd\u00a0 - VBOX_HGCM_REQ_DONE, VBOX_HGCM_REQ_CANCELLEDresult\u00a0 dd\u00a0 - \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>flags<\/code> \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043f\u043e\u043b\u0435. \u041a\u043e\u0433\u0434\u0430 \u0433\u043e\u0441\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, <code>flags<\/code> = 0; \u043a\u043e\u0433\u0434\u0430 \u0445\u043e\u0441\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u043d DMA-\u043f\u0438\u0448\u0435\u0442 <code>VBOX_HGCM_REQ_DONE<\/code>. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u043e\u0442\u043c\u0435\u043d\u0451\u043d (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 shutdown&#8217;\u0435 \u0445\u043e\u0441\u0442\u0430) \u2014 <code>VBOX_HGCM_REQ_CANCELLED<\/code>. \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044e \u0433\u043e\u0441\u0442\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u0433\u043e\u0442\u043e\u0432.<\/p>\n<h4>\u0422\u0438\u043f\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/h4>\n<p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u043a\u043e\u0434\u0435 \u0442\u0438\u043f\u044b:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0422\u0438\u043f <\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p><code>HGCM_PARM_TYPE_32BIT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u0430\u043b\u044f\u0440 <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>HGCM_PARM_TYPE_64BIT<\/code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">64-\u0431\u0438\u0442\u043d\u044b\u0439 \u0441\u043a\u0430\u043b\u044f\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>HGCM_PARM_TYPE_LINADDR<\/code>\u00a0 <\/p>\n<\/td>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>HGCM_PARM_TYPE_LINADDR_IN<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 (\u0433\u043e\u0441\u0442\u044c -&gt; \u0445\u043e\u0441\u0442)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>HGCM_PARM_TYPE_LINADDR_OUT<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">6<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 (\u0445\u043e\u0441\u0442 -&gt; \u0433\u043e\u0441\u0442\u044c)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>HGCM_PARM_TYPE_PAGELIST<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (DMA)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>PageList \u0438 DMA<\/h4>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (\u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u041a\u0411, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430) \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e: \u0445\u043e\u0441\u0442 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 <code>PAGE_LIST<\/code>: \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u0443\u0444\u0435\u0440\u0430.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440: \u0431\u0443\u0444\u0435\u0440 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 8 \u041a\u0411 \u043f\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 <code>0x12345678<\/code>:<\/p>\n<pre><code class=\"assembly\">cPages\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = 3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; \u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 3 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e-\u0441\u043c\u0435\u0436\u043d\u044b\u0435\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: 0x12345000..0x12347FFF\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u0430\u0439\u0442 \u0431\u0443\u0444\u0435\u0440\u0430 - 0x12347677)aPages[0]\u00a0\u00a0\u00a0 = GetPhysAddr(0x12345000)\u00a0 ; \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0433\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044caPages[1]\u00a0\u00a0\u00a0 = GetPhysAddr(0x12346000)\u00a0 ; \u0432 \u043b\u044e\u0431\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 RAM -aPages[2]\u00a0\u00a0\u00a0 = GetPhysAddr(0x12347000)\u00a0 ; \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u043e\u0441\u0442\u0443 \u043d\u0443\u0436\u0435\u043d PageList<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0425\u043e\u0441\u0442 \u043f\u0438\u0448\u0435\u0442 \u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b DMA \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442, \u0430 \u0433\u043e\u0441\u0442\u044c \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u044b.<\/p>\n<h4>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435<\/h4>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 HGCM-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442\u0432\u0435\u0442 \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u2014 \u0445\u043e\u0441\u0442 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434 (\u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432\u0440\u043e\u0434\u0435 guest properties), \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e \u0434\u043e\u043b\u0433\u043e (clipboard listener, \u0436\u0434\u0443\u0449\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043e\u0431\u043c\u0435\u043d\u0430 \u0445\u043e\u0441\u0442\u0430). \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c spin-loop \u0441 <code>pause<\/code>:<\/p>\n<pre><code class=\"assembly\">; drivers\/vboxguest\/hgcm\/async.incproc hgcm_wait_async uses ebx ecx edx esi, request_ptr:dword\u00a0\u00a0\u00a0 mov ecx, HGCM_TIMEOUT_ITERS\u00a0\u00a0 ; = 500000.wait_loop:\u00a0\u00a0\u00a0 mov eax, [esi + HGCM_HEADER.flags]\u00a0\u00a0\u00a0 test eax, VBOX_HGCM_REQ_DONE\u00a0\u00a0\u00a0 jnz .completed\u00a0\u00a0\u00a0 test eax, VBOX_HGCM_REQ_CANCELLED\u00a0\u00a0\u00a0 jnz .cancelled\u00a0\u00a0\u00a0 dec ecx\u00a0\u00a0\u00a0 jz .timeout\u00a0\u00a0\u00a0 ; PAUSE-based delay (\u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a ecx \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c)\u00a0\u00a0\u00a0 push ecx\u00a0\u00a0\u00a0 mov ecx, 1000.delay:\u00a0\u00a0\u00a0 pause\u00a0\u00a0\u00a0 loop .delay\u00a0\u00a0\u00a0 pop ecx\u00a0\u00a0\u00a0 jmp .wait_loopendp<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0442\u043e\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 <code>VBOX_HGCM_REQ_DONE<\/code> \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u043a\u0430 \u0445\u043e\u0441\u0442 \u043d\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442 \u0435\u0433\u043e DMA-\u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0438\u0437 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430. \u041f\u043b\u044e\u0441 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u044f\u0434\u0440\u0430. \u041c\u0438\u043d\u0443\u0441 \u2014 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 CPU.<\/p>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 spin-loop \u0438 \u0442\u0430\u0439\u043c\u0435\u0440, \u0430 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435?<\/strong><\/p>\n<p>\u0412 KolibriOS \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u044f\u0434\u0440\u0430 \u2014 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c <code>hgcm_wait_async<\/code> \u043a\u0430\u043a \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0435 \u0438\u0437 IRQ-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u044d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430: \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 clipboard-listener&#8217;\u0435 \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043f\u043e \u0442\u0438\u043a\u0443, \u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c HGCM-\u0432\u044b\u0437\u043e\u0432\u0430\u043c spin-loop&#8217;\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u042d\u0442\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433 \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0443\u0431\u0435\u0440\u0451\u0442 \u0437\u0430\u0442\u0440\u0430\u0442\u044b CPU \u043f\u0440\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 clipboard-listener \u043c\u0435\u043d\u0435\u0435 \u00ab\u0442\u0430\u0439\u043c\u0435\u0440\u043d\u044b\u043c\u00bb.<\/p>\n<p>\u0412 upstream \u0442\u0430 \u0436\u0435 \u0440\u0430\u0437\u0432\u0438\u043b\u043a\u0430 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0448\u0442\u0430\u0442\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b: wait-queue \u043d\u0430 Linux, <code>KEVENT<\/code> \u043d\u0430 Windows, <code>RTSemEventMulti<\/code> \u043d\u0430 FreeBSD (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u2014 \u0432 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438).<\/p>\n<h4>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439: \u0447\u0442\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043a\u0432\u043e\u0437\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0438<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f \u0441\u043b\u043e\u0436\u0438\u043b\u0438\u0441\u044c \u0432 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u2014 <code>CLIP_READ<\/code> \u0447\u0435\u0440\u0435\u0437 IOCTL. \u042d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c: \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u0441\u043b\u043e\u0438, \u0435\u0441\u0442\u044c \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f (read), \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f (listener) \u0447\u0430\u0441\u0442\u0438 HGCM.<\/p>\n<pre><code>1. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 KolibriOS:\u00a0\u00a0 delegate_io(VBOXGUEST, IOCTL_CLIP_READ, in_buf, in_size, ...)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0v2. sys\/ioctl.inc:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [sys\/]\u00a0\u00a0 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u043a\u043e\u0434\u0443 11 -&gt; clip_ioctl_read\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0v3. services\/clipboard\/clipboard_io.inc:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [\u0421\u0435\u0440\u0432\u0438\u0441 clipboard]\u00a0\u00a0 - \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442 kernel-\u0431\u0443\u0444\u0435\u0440 (max(in_size, CLIP_INITIAL_BUF_SIZE))\u00a0\u00a0 - \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 HGCM_CALL: fn = MSG_OLD_DATA_READ\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 parm0 = format_id (32BIT)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 parm1 = LINADDR_OUT(buf, size)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 v4. hgcm\/call.inc:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [HGCM]\u00a0\u00a0 - hgcm_call32_pagelist():\u00a0\u00a0\u00a0\u00a0 -&gt; \u0434\u043b\u044f LINADDR-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0441\u0442\u0440\u043e\u0438\u0442 PAGE_LIST \u0441 \u0444\u0438\u0437. \u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438\u00a0\u00a0\u00a0\u00a0 -&gt; \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 HGCM_CALL header (client_id, fn, parm_count)\u00a0\u00a0\u00a0\u00a0 -&gt; rc = VERR_GENERAL_FAILURE (sentinel)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0v5. core\/ports.inc -&gt; vmmdev_send_request(phys):\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [VMMDev]\u00a0\u00a0 - out dx, eax (eax = phys_addr \u043f\u0430\u043a\u0435\u0442\u0430 HGCM_CALL)\u00a0\u00a0 - ============= VMEXIT =============\u00a0\u00a0 - \u0445\u043e\u0441\u0442: \u0432\u0438\u0434\u0438\u0442 VMMDEV_REQ_HGCM_CALL,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 PAGE_LIST \u0432 \u0444\u0438\u0437. \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0433\u043e\u0441\u0442\u044f,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 clipboard service \u043d\u0430 \u0445\u043e\u0441\u0442\u0435,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0442\u043e\u0442 \u043f\u0438\u0448\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0433\u043e\u0441\u0442\u044f \u0447\u0435\u0440\u0435\u0437 DMA,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0441\u0442\u0430\u0432\u0438\u0442 HGCM_HEADER.flags |= REQ_DONE\u00a0\u00a0 - ===========================\u00a0\u00a0 - \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u0441\u0442\u044e\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 v6. hgcm\/async.inc -&gt; hgcm_wait_async():\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0[HGCM]\u00a0\u00a0 - \u0434\u043b\u044f clip read - \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0432\u044b\u0437\u043e\u0432, \u0444\u043b\u0430\u0433 DONE \u0443\u0436\u0435 \u0441\u0442\u043e\u0438\u0442\u00a0\u00a0\u00a0\u00a0 (\u0445\u043e\u0441\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u043e\u0433\u043e \u0436\u0435 VMEXIT)\u00a0\u00a0 - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 result \u0438\u0437 HGCM_HEADER.result\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0v7. clip_ioctl_read:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [\u0421\u0435\u0440\u0432\u0438\u0441 clipboard]\u00a0\u00a0 - \u0435\u0441\u043b\u0438 result == ERR_BUF_TOO_SMALL \u0438 actual_size &gt; kern_size:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043f\u0435\u0440\u0435\u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0431\u0443\u0444\u0435\u0440, \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0441 \u0448\u0430\u0433\u0430 3\u00a0\u00a0 - \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 kernel-\u0431\u0443\u0444\u0435\u0440 \u0432 user-\u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 v8. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 <code>clipboard_enable<\/code>, \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u0443\u0436\u0435 \u0432\u0438\u0441\u0438\u0442 <code>MSG_OLD_GET_WAIT<\/code> \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0435\u0437 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f. \u0425\u043e\u0441\u0442 \u0432 \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0445\u043e\u0441\u0442\u0430. \u041a\u0430\u0436\u0434\u044b\u0435 100 \u043c\u0441 \u0442\u0438\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0437\u043e\u0432\u0451\u0442 <code>clipboard_tick<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043b\u0430\u0433 DONE \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u2014 \u043c\u0438\u043c\u043e <code>hgcm_wait_async<\/code> \u0438 \u043c\u0438\u043c\u043e \u043e\u0431\u0449\u0435\u0433\u043e HGCM-\u0441\u043b\u043e\u0442\u0430. \u041a\u043e\u0433\u0434\u0430 \u0444\u043b\u0430\u0433 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u0434\u043d\u044f\u0442, listener \u0434\u0451\u0440\u0433\u0430\u0435\u0442 <code>clip_status<\/code> (\u0444\u043e\u0440\u043c\u0430\u0442\u044b \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c), \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 <code>CLIP_READ<\/code> \u043e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u043f\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044e \u0432\u044b\u0448\u0435.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0436\u0438\u0432\u0443\u0442 \u043e\u0431\u0430 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435: \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>hgcm_wait_async<\/code> (read\/write \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443) \u0438 \u0434\u043e\u043b\u0433\u0438\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 + \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0438\u043a\u043e\u043c (listener). \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0449\u0438\u0439 HGCM-\u0441\u043b\u043e\u0442 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u0421\u0435\u0440\u0432\u0438\u0441\u044b<\/h3>\n<h4>\u041c\u044b\u0448\u044c<\/h4>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <strong>\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439<\/strong> \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b (\u043f\u0430\u043a\u0435\u0442 \u0442\u0438\u043f\u0430 223, 48 \u0431\u0430\u0439\u0442): \u0445\u043e\u0441\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u043e\u0431\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0430 (\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 + \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439). PS\/2-\u043c\u044b\u0448\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 VirtualBox \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>\u041d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0445\u043e\u0441\u0442 \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u0438\u043b <code>VMMDEV_MOUSE_HOST_SUPPORTS_FULL_STATE_PROTOCOL<\/code>, \u0432 \u043a\u043e\u0434\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0444\u043e\u043b\u0431\u044d\u043a \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b (\u043f\u0430\u043a\u0435\u0442 \u0442\u0438\u043f\u0430 1, 36 \u0431\u0430\u0439\u0442) \u2014 \u0445\u043e\u0441\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (0-65535), \u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u0441\u043a\u0440\u043e\u043b\u043b \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0441 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e PS\/2 \u0447\u0435\u0440\u0435\u0437 IRQ12 (\u0432 \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u0444\u043e\u043b\u0431\u044d\u043a-\u0440\u0435\u0436\u0438\u043c\u0435, \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u0441\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 VirtualBox \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443). \u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 VirtualBox \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u043d\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430 2, \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0445\u043e\u0441\u0442\u0430 0-65535 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d KolibriOS 0-32767. \u0414\u0435\u043b\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 \u0441\u0434\u0432\u0438\u0433, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0446\u0435\u043d\u0442\u0440 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u044f\u0434\u0440\u043e \u0447\u0435\u0440\u0435\u0437 <code>SetMouseData(flags=0xC0000000|buttons, x, y, scroll_z, scroll_w)<\/code>.<\/p>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/strong> \u041a\u043e\u0433\u0434\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437 VMMDev, \u044f\u0434\u0440\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043e\u0442 PS\/2-\u043c\u044b\u0448\u0438 \u0447\u0435\u0440\u0435\u0437 IRQ12. \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442: \u0445\u043e\u0441\u0442 \u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u043a\u0443\u0440\u0441\u043e\u0440 \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0430 PS\/2 \u0442\u0443\u0442 \u0436\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0434\u0435\u043b\u044c\u0442\u0443 \u00ab\u0432 \u043d\u0438\u043a\u0443\u0434\u0430\u00bb. \u041a\u0443\u0440\u0441\u043e\u0440 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0440\u044b\u0432\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c IRQ12 \u0441\u0431\u0440\u043e\u0441\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u0438\u0442\u0430 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u043c \u0431\u0430\u0439\u0442\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 i8042:<\/p>\n<pre><code>; i8042_mouse_control(enable):;\u00a0\u00a0 \u0416\u0434\u0451\u043c \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438: \u043e\u043f\u0440\u043e\u0441 0x64;\u00a0\u00a0 \u0417\u0430\u043f\u0440\u043e\u0441 command byte: 0x20 -&gt; 0x64;\u00a0\u00a0 \u0427\u0438\u0442\u0430\u0435\u043c 0x60 -&gt; \u0442\u0435\u043a\u0443\u0449\u0438\u0439 command byte;\u00a0\u00a0 \u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0431\u0438\u0442 1 (IRQ12 enable);\u00a0\u00a0 \u041f\u0438\u0448\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e: 0x60 -&gt; 0x64, \u0437\u0430\u0442\u0435\u043c command byte -&gt; 0x60<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0411\u0435\u0437 \u044d\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u044b\u0432\u043a\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u044b: PS\/2-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043a\u0430\u0436\u0434\u044b\u043c \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0432 \u044f\u0434\u0440\u043e \u0434\u0435\u043b\u044c\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0441\u043e\u0431\u044c\u0451\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0443\u044e VMMDev. \u0411\u0435\u0437 \u0441\u0431\u0440\u043e\u0441\u0430 IRQ12 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d.<\/p>\n<p>\u041c\u0430\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439: <code>VMMDEV_EVENT_MOUSE_POSITION_CHANGED | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED<\/code>. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c: <code>VMMDEV_GUEST_SUPPORTS_MOUSE<\/code>.<\/p>\n<h4>\u0414\u0438\u0441\u043f\u043b\u0435\u0439 \u2014 \u0430\u0432\u0442\u043e\u0440\u0435\u0441\u0430\u0439\u0437<\/h4>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 <code>display\/<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u043e\u0441\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430 VirtualBox \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<pre><code>Event:\u00a0 GetTimerTicks() -&gt; vbox_display_event_time\u00a0 vbox_display_pending = 1Tick (\u043d\u0430\u0448 TimerHS-callback, \u043a\u0430\u0436\u0434\u044b\u0435 100 \u043c\u0441):\u00a0 ; \u00ab\u0442\u0438\u043a\u0438\u00bb \u043d\u0438\u0436\u0435 - \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 GetTimerTicks (\u0448\u0430\u0433 10 \u043c\u0441),\u00a0 ; \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u043c callback'\u0430\u00a0 if pending &amp;&amp; (now - event_time &gt;= 50 \u0435\u0434. = 500 \u043c\u0441):\u00a0\u00a0\u00a0 pending = 0\u00a0\u00a0\u00a0 display_change()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>display_change()<\/code> \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ol>\n<li>\n<p>\u00a0\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <code>VMMDEV_REQ_GET_DISPLAY_CHANGE_REQUEST2<\/code> \u2014 \u0445\u043e\u0441\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0446\u0432\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u043c\u0438\u043d\/\u043c\u0430\u043a\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435, bpp\u00a0in {8, 16, 24, 32}).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u0442 BGA (Bochs Graphics Adapter) \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442\u044b <code>0x01CE<\/code>\/<code>0x01CF<\/code>: \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 -&gt; \u043c\u0435\u043d\u044f\u0435\u0442 XRES\/YRES\/BPP -&gt; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c LFB.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>DISPLAY<\/code> \u0432 \u044f\u0434\u0440\u0435 KolibriOS (width, height, bpp, pitch).<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>SetScreen(width-1, height-1)<\/code>.\u00a0<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u0417\u0430\u0447\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 500 \u043c\u0441.<\/strong> \u041f\u0440\u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430 \u0445\u043e\u0441\u0442\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 SetScreen \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0440\u0430\u0448 taskbar&#8217;\u0430 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u043e\u043a\u043d\u0430 \u0437\u0430 \u043d\u043e\u0432\u044b\u043c\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u044d\u043a\u0440\u0430\u043d\u0430. \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432 500 \u043c\u0441 \u2014 \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0441\u0442\u044b\u043b\u044c: \u043e\u043d\u0430 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0441\u0442\u0430\u043d\u0435\u0442 \u043a\u0440\u0430\u0448 \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0438. \u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044f\u0434\u0440\u0430, \u0430 \u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. <\/p>\n<p><strong>\u041a\u0440\u0430\u0448 taskbar \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043e\u043a\u043d\u0430.<\/strong> \u041f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043e\u043a\u043d\u0430 VirtualBox \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c taskbar&#8217;\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0431\u043e\u0439 \u044f\u0434\u0440\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430:<\/p>\n<ol>\n<li>\n<p>\u042f\u0434\u0440\u043e KolibriOS \u0445\u0440\u0430\u043d\u0438\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. <code>SetScreen<\/code> \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b, \u043d\u043e \u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u0443\u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043e\u043a\u043d\u0430, \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430 \u043d\u043e\u0432\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>Taskbar \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u0439 \u0448\u0438\u0440\u0438\u043d\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0443 \u0448\u0438\u0440\u0438\u043d\u0443 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f, \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440 \u0441\u0436\u0438\u043c\u0430\u0435\u0442\u0441\u044f, \u043d\u043e taskbar \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0441\u0442\u0430\u0440\u043e\u043c\u0443 pitch. \u0417\u0430\u043f\u0438\u0441\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 out-of-bounds \u2014 \u043a\u0440\u0430\u0448.<\/p>\n<\/li>\n<\/ol>\n<pre><code>\u0411\u044b\u043b\u043e:\u00a0 \u0448\u0438\u0440\u0438\u043d\u0430 1280 px, pitch = 5120 \u0431\u0430\u0439\u0442\u0421\u0442\u0430\u043b\u043e: \u0448\u0438\u0440\u0438\u043d\u0430 800\u00a0 px, pitch = 3200 \u0431\u0430\u0439\u0442\u00a0 (BGA \u0438 DISPLAY \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b)Taskbar \u0440\u0438\u0441\u0443\u0435\u0442 1280 px -&gt; \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 3200-\u0431\u0430\u0439\u0442\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 -&gt; \u043a\u0440\u0430\u0448<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bec\/b65\/cab\/becb65cab14a61715abc85130f5267b0.png\" alt=\"\u041a\u0440\u0430\u0448 taskbar \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043e\u043a\u043d\u0430 VirtualBox.\" title=\"\u041a\u0440\u0430\u0448 taskbar \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043e\u043a\u043d\u0430 VirtualBox.\" width=\"1005\" height=\"285\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bec\/b65\/cab\/becb65cab14a61715abc85130f5267b0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bec\/b65\/cab\/becb65cab14a61715abc85130f5267b0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041a\u0440\u0430\u0448 taskbar \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043e\u043a\u043d\u0430 VirtualBox.<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u044f\u0434\u0440\u0430: <code>SetScreen<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0442\u044c \u043e\u043a\u043d\u0430 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0438 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c \u0442\u0435, \u0447\u0442\u043e \u0432\u044b\u0448\u043b\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u0414\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u044f\u0434\u0440\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 VirtualBox \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c taskbar \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c. \u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u2014 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u043e\u043a\u043e\u043d.<\/p>\n<p>\u041c\u0430\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439: <code>VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST<\/code>. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c: <code>VMMDEV_GUEST_SUPPORTS_GRAPHICS<\/code>.<\/p>\n<h4>Heartbeat<\/h4>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441: \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <code>VMMDEV_REQ_GUEST_HEARTBEAT<\/code> \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u0425\u043e\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u043e \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u00ab\u0436\u0438\u0432\u043e\u0441\u0442\u0438\u00bb \u0433\u043e\u0441\u0442\u044f \u2014 \u0435\u0441\u043b\u0438 heartbeat&#8217;\u044b \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043b\u044c\u0448\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0433\u0430, \u0445\u043e\u0441\u0442 \u043c\u043e\u0436\u0435\u0442 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0433\u043e\u0441\u0442\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u0445\u043e\u0441\u0442\u0430 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b (<code>VMMDEV_REQ_HEARTBEAT_CONFIGURE<\/code>) \u0432 \u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0432 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 <code>GetTimerTicks<\/code> (\u0448\u0430\u0433 10 \u043c\u0441 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a KolibriOS, \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u043c \u043d\u0430\u0448\u0435\u0433\u043e <code>TimerHS<\/code>-callback&#8217;\u0430 \u0432 100 \u043c\u0441). \u0415\u0441\u043b\u0438 \u0445\u043e\u0441\u0442 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432 100 \u0435\u0434\u0438\u043d\u0438\u0446 <code>GetTimerTicks<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430.<\/p>\n<p>\u00a0\u0421\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0438 HGCM \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0438 \u043f\u0440\u044f\u043c\u044b\u0435 VMMDev-\u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<h4>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (timesync)<\/h4>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0447\u0430\u0441\u044b \u0433\u043e\u0441\u0442\u044f \u0441 \u0447\u0430\u0441\u0430\u043c\u0438 \u0445\u043e\u0441\u0442\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u044f\u0434\u0440\u0430, \u0433\u0434\u0435 <code>int 0x40<\/code> (\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 API \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439) \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>\u00a0\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u043f\u0440\u044f\u043c\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 CMOS RTC \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442\u044b <code>0x70<\/code>\/<code>0x71<\/code>.<\/p>\n<pre><code>timesync_do_sync():\u00a0 1. VMMDEV_REQ_GET_HOST_TIME -&gt; 64-\u0431\u0438\u0442 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 Unix epoch\u00a0 2. \/ 1000 -&gt; unix_timestamp (\u0441\u0435\u043a\u0443\u043d\u0434\u044b)\u00a0 3. timesync_set_cmos():\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c civil_from_days (Howard Hinnant) \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 timestamp \u0432 \u0433\u043e\u0434\/\u043c\u0435\u0441\u044f\u0446\/\u0434\u0435\u043d\u044c\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - \u0416\u0434\u0451\u043c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f CMOS (\u0431\u0438\u0442 7 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 A)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0431\u0438\u0442 SET \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 B (\u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - \u041f\u0438\u0448\u0435\u043c \u0432\u0441\u0435 CMOS-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b (0x00-0x09, 0x32) \u0432 BCD\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - \u0421\u043d\u0438\u043c\u0430\u0435\u043c \u0431\u0438\u0442 SET -&gt; CMOS \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0445\u043e\u0434<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u00a0 BCD-\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f (binary-coded decimal):<\/p>\n<pre><code>; value 0-99 -&gt; BCDxor edx, edxmov ecx, 10div ecx\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; eax=\u0434\u0435\u0441\u044f\u0442\u043a\u0438, edx=\u0435\u0434\u0438\u043d\u0438\u0446\u044bshl eax, 4or\u00a0 eax, edx<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c <code>civil_from_days<\/code> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0437 \u0440\u0430\u0431\u043e\u0442\u044b Howard Hinnant \u00abchrono-Compatible Low-Level Date Algorithms\u00bb (howardhinnant.github.io\/date_algorithms.html). \u041a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u00ab\u0434\u043d\u0438 \u043e\u0442 \u044d\u043f\u043e\u0445\u0438\u00bb \u0432 (\u0433\u043e\u0434, \u043c\u0435\u0441\u044f\u0446, \u0434\u0435\u043d\u044c) \u0431\u0435\u0437 \u0442\u0430\u0431\u043b\u0438\u0446 \u0432\u0438\u0441\u043e\u043a\u043e\u0441\u043d\u044b\u0445 \u043b\u0435\u0442. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u2014 \u043d\u0430 C++, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u0438\u0448\u0435\u0442 CMOS-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0432 BCD-\u0440\u0435\u0436\u0438\u043c\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0438\u0442\u0430 DM (Data Mode) \u0432 Status Register B \u2014 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e RTC \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 binary-\u0440\u0435\u0436\u0438\u043c, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u0431\u0438\u0442. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 VirtualBox-RTC \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 BCD (\u044d\u0442\u043e \u0434\u0435\u0444\u043e\u043b\u0442 PC-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e RTC), \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f; \u043d\u043e \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0441\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c DM \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0443\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e RTC.<\/p>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 ~1 \u043c\u0438\u043d\u0443\u0442\u0443. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 (<code>AUTOSTART_TIMESYNC = 0<\/code>) \u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0447\u0435\u0440\u0435\u0437 IOCTL. \u041f\u0440\u0438\u0447\u0438\u043d\u044b \u0434\u0432\u0435. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0437\u0430\u043f\u0438\u0441\u044c \u0432 CMOS \u2014 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 RTC, \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0451 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0442\u0430\u0440\u0442\u0435 VM \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0443\u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u0432\u0448\u0438\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0435 \u0443\u0432\u0438\u0434\u044f\u0442: \u044f\u0434\u0435\u0440\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>int 0x40 fn=3<\/code> \u0438 <code>fn=29<\/code> \u0447\u0438\u0442\u0430\u044e\u0442 CMOS \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 (<a href=\"https:\/\/git.kolibrios.org\/KolibriOS\/kolibrios\/src\/branch\/main\/kernel\/trunk\/hid\/set_dtc.inc\" rel=\"noopener noreferrer nofollow\"><code>kernel\/trunk\/hid\/set_dtc.inc<\/code><\/a>), \u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<h4>Guest Properties<\/h4>\n<p>\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u043e\u0441\u0442\u0430 \u0438 \u0433\u043e\u0441\u0442\u044f (\u0441\u0435\u0440\u0432\u0438\u0441 <code>VBoxGuestPropSvc<\/code>).<\/p>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f HGCM \u0441 <code>PAGELIST<\/code>-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0442\u0440\u043e\u043a \u0438\u043c\u0451\u043d \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0445\u043e\u0441\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>VBoxManage guestproperty get &lt;vm&gt; \/VirtualBox\/GuestInfo\/OS\/Product<\/code> \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 VM, \u0431\u0435\u0437 \u0437\u0430\u0445\u043e\u0434\u0430 \u0432 \u043d\u0435\u0451.<\/p>\n<pre><code>$ VBoxManage guestproperty get KolibriOS \/VirtualBox\/GuestInfo\/OS\/ProductValue: KolibriOS<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 (Shared Folders)<\/h4>\n<p>\u0421\u0430\u043c\u044b\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441. \u041c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043f\u043a\u0438, \u0440\u0430\u0441\u0448\u0430\u0440\u0435\u043d\u043d\u044b\u0435 \u0445\u043e\u0441\u0442\u043e\u043c, \u043a\u0430\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b KolibriOS.<\/p>\n<p><strong>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/strong><\/p>\n<pre><code>hgcm_connect(\"VBoxSharedFolders\")\u00a0\u00a0 -&gt; client_idSHFL_FN_SET_UTF8\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -&gt; \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c UTF-8 \u0440\u0435\u0436\u0438\u043cSHFL_FN_GET_LIST\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -&gt; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043f\u043e\u043a \u0445\u043e\u0441\u0442\u0430for each folder:\u00a0\u00a0\u00a0 vboxsf_add_folder(root_handle, name)vboxsf_register_disk()\u00a0\u00a0\u00a0 DiskAdd(vboxsf_disk_functions, \"vboxsf\", ...)\u00a0\u00a0\u00a0 DiskMediaChanged(disk, 1)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -&gt; \u044f\u0434\u0440\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u00a0\u00a0\u00a0 partition.FSUserFunctions = vboxsf_user_functions\u00a0\u00a0 &lt;- workaround!<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ol>\n<li>\n<p><code><strong>SHFL_FN_SET_UTF8<\/strong><\/code> \u2014 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0445\u043e\u0441\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 UTF-8 (KolibriOS \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 CP866, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0438\u0437 <code>common\/<\/code>).<\/p>\n<\/li>\n<li>\n<p><code><strong>SHFL_FN_GET_LIST<\/strong><\/code> \u2014 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0430\u043f\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0441\u0442 \u043f\u043e\u043c\u0435\u0442\u0438\u043b \u043a\u0430\u043a shared. \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 PAGELIST-\u0431\u0443\u0444\u0435\u0440\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>vboxsf_add_folder<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u0442 \u0435\u0439 \u0441\u043b\u043e\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 root-handle.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u00ab\u0434\u0438\u0441\u043a\u0430\u00bb \u0432 \u044f\u0434\u0440\u0435. \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u043d\u0451\u0432\u0440.<\/p>\n<\/li>\n<\/ol>\n<p><strong>Workaround \u0441 <\/strong><code><strong>FSUserFunctions<\/strong><\/code><strong>.<\/strong> \u0428\u0442\u0430\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u2014 <code>FsAdd<\/code> \u044f\u0434\u0440\u0430 \u2014 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442: \u043f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u0438\u0441\u043a\u043e\u0432 \u044f\u0434\u0440\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 <code>NumPartitions<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 CD-ROM \u0431\u0435\u0437 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430), \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 GPF \u0432 \u0447\u0443\u0436\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>FsAdd<\/code> \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>\u041e\u0431\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0443\u0442\u044c: <code>DiskAdd<\/code> + <code>DiskMediaChanged(disk, 1)<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u00abraw\u00bb-\u0440\u0430\u0437\u0434\u0435\u043b, \u0434\u0430\u043b\u044c\u0448\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 <strong>\u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u0430\u0432\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c <\/strong><code><strong>FSUserFunctions<\/strong><\/code><strong> \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u044f\u0434\u0440\u0430<\/strong> \u2014 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u0442\u0443\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u043e. \u042d\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e API: \u044d\u0442\u043e \u043f\u0440\u044f\u043c\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0447\u0443\u0436\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u0438\u043d\u0443\u044f <code>FsAdd<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0451 \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442. \u041e\u043f\u0430\u0441\u043d\u043e (\u043b\u043e\u043c\u0430\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044f\u0434\u0440\u0430 \u043e \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439), \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u044f\u0434\u0440\u0430. \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u2014 \u043f\u0430\u0442\u0447 <code>FsAdd<\/code> \u0432 \u044f\u0434\u0440\u0435 KolibriOS \u2014 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430 \u0431\u044b upstream-PR \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0441\u0442\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0446\u0435\u043d\u043e\u0439 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f7\/8cc\/208\/7f78cc2088cae7713fc2ec70d347510e.png\" alt=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0438 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439\" title=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0438 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439\" width=\"849\" height=\"533\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7f7\/8cc\/208\/7f78cc2088cae7713fc2ec70d347510e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f7\/8cc\/208\/7f78cc2088cae7713fc2ec70d347510e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0438 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/53a\/580\/9a0\/53a5809a016a24102816a7ee461785d0.png\" alt=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\" title=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\" width=\"874\" height=\"786\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/53a\/580\/9a0\/53a5809a016a24102816a7ee461785d0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/53a\/580\/9a0\/53a5809a016a24102816a7ee461785d0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/def\/0da\/4ce\/def0da4ce4e8e163418b1e76d482d615.png\" alt=\"\u041b\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439\" title=\"\u041b\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439\" width=\"1006\" height=\"712\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/def\/0da\/4ce\/def0da4ce4e8e163418b1e76d482d615.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/def\/0da\/4ce\/def0da4ce4e8e163418b1e76d482d615.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041b\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u0424\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/strong> (<code>Read<\/code>, <code>ReadFolder<\/code>, <code>GetFileInfo<\/code>) \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 HGCM-\u0432\u044b\u0437\u043e\u0432\u044b \u0441 <code>PAGELIST<\/code>-\u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438: \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f DMA \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0433\u043e\u0441\u0442\u044f \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0431\u044b\u043b\u0430 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c SHFL. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (\u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435, \u0447\u0442\u0435\u043d\u0438\u0435, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b) \u2014 \u044d\u0442\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0438 \u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b \u0434\u043e \u0431\u0430\u0439\u0442\u0430. \u0425\u043e\u0441\u0442 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u2014 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 PageList, \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0432 <code>SHFL_FSOBJINFO<\/code>, \u043d\u0435 \u0442\u0430 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0434\u044b\u0440\u043a\u0430 \u2014 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c <code>VERR_INVALID_PARAMETER<\/code> \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0432 \u043a\u0430\u043a\u043e\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041d\u0438 \u0441\u0442\u0440\u043e\u043a, \u043d\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439, \u043d\u0438 \u0438\u043c\u0435\u043d\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0434 \u00ab\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d\u00bb.<\/p>\n<p>\u0412 \u0442\u0430\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u2014 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442-\u0432-\u0431\u0430\u0439\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <strong>\u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 Windows-\u0432\u0435\u0440\u0441\u0438\u0438 VBoxGuest \u0441\u0442\u0430\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043e\u0442\u043b\u0430\u0434\u043a\u0438<\/strong> \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041f\u0443\u0442\u044c \u043e\u0442 \u00ab\u0445\u043e\u0441\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443\u00bb \u0434\u043e \u00ab\u0444\u0430\u0439\u043b \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u00bb \u0437\u0430\u043d\u044f\u043b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0431\u0435\u0437 \u044d\u0442\u043e\u0439 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u043b\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u0441\u043b\u0435\u043f\u0443\u044e.<\/p>\n<p>\u041c\u0430\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439: 0 (\u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0435\u0440\u0435\u0437 HGCM-\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b). \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c: <code>VMMDEV_GUEST_SUPPORTS_SHARED_FOLDERS<\/code>.<\/p>\n<h4>\u0411\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 (Clipboard)<\/h4>\n<p>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f state machine \u0434\u043b\u044f \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 clipboard.<\/p>\n<p><strong>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:<\/strong><\/p>\n<pre><code>submit MSG_OLD_GET_WAIT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (async HGCM call)\u00a0\u00a0\u00a0\u00a0 +-----+\u00a0 ----------&gt;\u00a0 +-----------+\u00a0\u00a0\u00a0\u00a0 |IDLE |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | SUBMITTED |\u00a0\u00a0\u00a0\u00a0 +-----+\u00a0 &lt;----------\u00a0 +-----------+\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ^\u00a0\u00a0 \u00a0\u00a0\u00a0reset state\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0 after handled\u00a0\u00a0\u00a0\u00a0 | tick (100 \u043c\u0441):\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | flag DONE \u0432 \u043f\u0430\u043a\u0435\u0442\u0435?\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 no --+\u00a0\u00a0\u00a0 +-- yes\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 v\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 v\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (\u0436\u0434\u0451\u043c\u00a0\u00a0\u00a0\u00a0 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0435\u0449\u0451)\u00a0\u00a0\u00a0\u00a0 + submit \u043d\u043e\u0432\u043e\u0433\u043e\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +----------- \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e &lt;-+ GET_WAIT<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>MSG_OLD_GET_WAIT<\/code> \u2014 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 HGCM-\u0432\u044b\u0437\u043e\u0432: \u0445\u043e\u0441\u0442 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043e\u0431\u043c\u0435\u043d\u0430 \u0445\u043e\u0441\u0442\u0430 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u043e\u043b\u043b\u0438\u043d\u0433\u0430.<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0435 100 \u043c\u0441 <code>clipboard_tick<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043b\u0430\u0433 <code>VBOX_HGCM_REQ_DONE<\/code> \u0432 \u043f\u0430\u043a\u0435\u0442\u0435. \u0425\u043e\u0441\u0442 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 \u0435\u0433\u043e DMA-\u0437\u0430\u043f\u0438\u0441\u044c\u044e, \u043a\u043e\u0433\u0434\u0430 \u0432 clipboard&#8217;\u0435 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 \u043f\u043e\u0434\u043d\u044f\u0442 \u2014 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 <code>IDLE<\/code>, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 <code>GET_WAIT<\/code>.<\/p>\n<p><strong>Fire-and-forget \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438.<\/strong> \u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u043a\u0430 <code>MSG_OLD_GET_WAIT<\/code> \u0435\u0449\u0451 \u0436\u0434\u0451\u0442 \u043e\u0442\u0432\u0435\u0442\u0430, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>hgcm_disconnect<\/code> \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0431\u044b \u0434\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u2014 \u0430 \u044d\u0442\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u043b\u0438 \u043c\u0438\u043d\u0443\u0442\u044b, \u043f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0441\u0442\u0430 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442. \u041f\u043e\u0434\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: <code>HGCM_DISCONNECT<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043d\u043e <code>hgcm_wait_async()<\/code> \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e <strong>\u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/strong>. \u0425\u043e\u0441\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0441\u0430\u043c \u0437\u0430\u043a\u0440\u043e\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0436\u0435. \u041f\u0430\u043a\u0435\u0442 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c <strong>\u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f<\/strong> \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 disable: \u0445\u043e\u0441\u0442 \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u0442 DMA-\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e, \u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043e\u0442\u0434\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u044f\u0434\u0440\u0443 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u043b\u0430 \u0431\u044b \u0447\u0443\u0436\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u0422\u043e\u0442 \u0436\u0435 \u0431\u0443\u0444\u0435\u0440 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>\u0412 upstream <code>hgcm_disconnect<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 wait-queue \u0434\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u0417\u0434\u0435\u0441\u044c, \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 <code>WaitEventTimeout<\/code> \u044f\u0434\u0440\u0430 KolibriOS \u043a HGCM-\u043f\u0443\u0442\u0438, \u043c\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u043a\u0435\u0442 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0445\u043e\u0441\u0442\u0430 \u0434\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433: \u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 fire-and-forget \u043e\u0442\u043f\u0430\u0434\u0451\u0442.<\/p>\n<p>IOCTL-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (<code>VBOX_IOCTL_CLIP_READ<\/code>\/<code>WRITE<\/code>\/<code>STATUS<\/code>) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u0434\u0440\u0430\u0439\u0432\u0435\u0440. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f &#171;\u0441\u0442\u0430\u0440\u043e\u0433\u043e&#187; \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f: <code>MSG_OLD_GET_WAIT<\/code> \u0434\u043b\u044f listener&#8217;\u0430, <code>DATA_WRITE<\/code> \u0441 <code>CPARMS_DATA_WRITE_OLD<\/code> \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c. \u0427\u0430\u043d\u043a\u0438\u043d\u0433 (\u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438, \u043a\u0430\u043a \u0432 <code>MSG_NEW_PEEK_WAIT<\/code> + <code>MSG_GET<\/code> + \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 <code>DATA_READ<\/code>) \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043e\u0434\u043d\u0438\u043c HGCM-\u0432\u044b\u0437\u043e\u0432\u043e\u043c.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u043b\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430, \u0432 <code>clip_ioctl_read<\/code> \u0432\u0441\u0442\u0440\u043e\u0435\u043d retry \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c: \u043f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0445\u043e\u0434\u0438\u0442 \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c <code>max(\u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, CLIP_INITIAL_BUF_SIZE)<\/code> (<code>CLIP_INITIAL_BUF_SIZE = 65536<\/code>, 64 \u041a\u0411), \u043e\u043a\u0440\u0443\u0433\u043b\u0451\u043d\u043d\u044b\u043c \u0434\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u0445\u043e\u0441\u0442 \u0432\u0435\u0440\u043d\u0443\u043b \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u0441\u043e\u043e\u0431\u0449\u0438\u043b <code>actual_size &gt; kern_size<\/code> (\u0437\u043d\u0430\u0447\u0438\u0442, \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u043e\u0441\u044c), \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0431\u0443\u0444\u0435\u0440, \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c <code>actual_size<\/code>, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 <code>DATA_READ<\/code>. \u0422\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u044b, \u043b\u0438\u0448\u044c \u0431\u044b \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 kernel-\u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041c\u0430\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439: <code>VMMDEV_EVENT_HGCM<\/code>. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c: <code>VMMDEV_GUEST_SUPPORTS_SHCL<\/code>.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/824\/6a4\/f8b\/8246a4f8b4400a75a621d188996174e4.png\" alt=\"\u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b CLIP_READ: out_size=65540 (initial buffer), \u0445\u043e\u0441\u0442 \u043e\u0442\u0432\u0435\u0442\u0438\u043b 66 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 UTF-16 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 0x01 (CF_TEXT), Iconv \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0432 CP866 (32 \u0431\u0430\u0439\u0442\u0430), VBoxCtrl \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 \u0433\u043e\u0441\u0442\u044f. \u0422\u0435\u043a\u0441\u0442 L:\\projects\\KolibriOS\\\u0421\u0442\u0430\u0442\u044c\u044f VBG \u2014 \u043f\u0443\u0442\u044c \u0441\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 \u0444\u0430\u0439\u043b\u0430. \" title=\"\u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b CLIP_READ: out_size=65540 (initial buffer), \u0445\u043e\u0441\u0442 \u043e\u0442\u0432\u0435\u0442\u0438\u043b 66 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 UTF-16 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 0x01 (CF_TEXT), Iconv \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0432 CP866 (32 \u0431\u0430\u0439\u0442\u0430), VBoxCtrl \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 \u0433\u043e\u0441\u0442\u044f. \u0422\u0435\u043a\u0441\u0442 L:\\projects\\KolibriOS\\\u0421\u0442\u0430\u0442\u044c\u044f VBG \u2014 \u043f\u0443\u0442\u044c \u0441\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 \u0444\u0430\u0439\u043b\u0430. \" width=\"1000\" height=\"232\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/824\/6a4\/f8b\/8246a4f8b4400a75a621d188996174e4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/824\/6a4\/f8b\/8246a4f8b4400a75a621d188996174e4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b <code>CLIP_READ<\/code>: <code>out_size=65540<\/code> (initial buffer), \u0445\u043e\u0441\u0442 \u043e\u0442\u0432\u0435\u0442\u0438\u043b 66 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 UTF-16 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>0x01<\/code> (CF_TEXT), <code>Iconv<\/code> \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0432 CP866 (32 \u0431\u0430\u0439\u0442\u0430), <code>VBoxCtrl<\/code> \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 \u0433\u043e\u0441\u0442\u044f. \u0422\u0435\u043a\u0441\u0442 <code>L:\\projects\\KolibriOS\\\u0421\u0442\u0430\u0442\u044c\u044f VBG<\/code> \u2014 \u043f\u0443\u0442\u044c \u0441\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 \u0444\u0430\u0439\u043b\u0430. <\/figcaption><\/div>\n<\/figure>\n<h4>\u0411\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c (Seamless)<\/h4>\n<p>\u0420\u0435\u0436\u0438\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043a\u043d\u0430 \u0433\u043e\u0441\u0442\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u041e\u0421 \u0431\u0435\u0437 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u0440\u0430\u043c\u043a\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e: \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u043c\u0435\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\/\u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0445\u043e\u0441\u0442\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c  \u00ab\u0432\u0438\u0434\u0438\u043c\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u00bb (visible region). \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u043e\u043a\u043e\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f <strong>\u043e\u0434\u0438\u043d \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a <\/strong>\u2014<strong> \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d<\/strong>:<\/p>\n<pre><code>; services\/seamless\/seamless.incvmmdev_visible_region_s VMMDEV_VIDEO_SET_VISIBLE_REGION\u00a0\u00a0\u00a0 &lt;sizeof.VMMDEV_VIDEO_SET_VISIBLE_REGION, ...&gt;,\u00a0\u00a0\u00a0 1,\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 = 1\u00a0\u00a0\u00a0 &lt;0, 0, 0, 0&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; rect0: \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432\u0441\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u044f\u0434\u0440\u043e\u043c KolibriOS: \u043e\u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 API \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043e\u043a\u043e\u043d \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u042f\u0434\u0440\u043e \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u043e\u043a\u043d\u0430 (\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u043a\u043e\u043d, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f WM), \u043d\u043e \u0435\u0451 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0411\u0435\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 seamless \u043d\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c.<\/p>\n<p>\u041a\u0430\u043a \u0438 display, seamless \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 debounce 500 \u043c\u0441 \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0440\u0435\u0436\u0438\u043c\u0430.<\/p>\n<p>\u041c\u0430\u0441\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439: <code>VMMDEV_EVENT_SEAMLESS_MODE_CHANGE<\/code>. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c: <code>VMMDEV_GUEST_SUPPORTS_SEAMLESS<\/code>.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dff\/06e\/89f\/dff06e89f2c6120f28a99597870c98b8.png\" alt=\"\u0411\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0445\u043e\u0441\u0442\u0430: \u043e\u043a\u043d\u0430 KolibriOS \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u0432\u0435\u0440\u0445 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Windows \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u2014 \u0440\u0430\u043c\u043a\u0430 \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a VirtualBox \u043d\u0435 \u0432\u0438\u0434\u043d\u044b.\" title=\"\u0411\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0445\u043e\u0441\u0442\u0430: \u043e\u043a\u043d\u0430 KolibriOS \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u0432\u0435\u0440\u0445 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Windows \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u2014 \u0440\u0430\u043c\u043a\u0430 \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a VirtualBox \u043d\u0435 \u0432\u0438\u0434\u043d\u044b.\" width=\"2559\" height=\"1599\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/dff\/06e\/89f\/dff06e89f2c6120f28a99597870c98b8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dff\/06e\/89f\/dff06e89f2c6120f28a99597870c98b8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0411\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0445\u043e\u0441\u0442\u0430: \u043e\u043a\u043d\u0430 KolibriOS \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u044b \u043f\u043e\u0432\u0435\u0440\u0445 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0430 Windows \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u2014 \u0440\u0430\u043c\u043a\u0430 \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a VirtualBox \u043d\u0435 \u0432\u0438\u0434\u043d\u044b.<\/figcaption><\/div>\n<\/figure>\n<h3>IOCTL-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u00a0<\/h3>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u041e\u0421 \u043a\u0430\u043a <code>VBOXGUEST<\/code> \u0447\u0435\u0440\u0435\u0437 <code>RegService(name, handler)<\/code>. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e SF 68.17 (<code>CallService<\/code>): \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043a\u043e\u0434 IOCTL \u0438 \u0431\u0443\u0444\u0435\u0440\u044b \u0432\u0445\u043e\u0434\/\u0432\u044b\u0445\u043e\u0434. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u2014 <code>sys\/ioctl.inc<\/code>, \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 <code>service_proc<\/code>.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u041a\u043e\u0434 <\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043c\u044f <\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>GET_VERSION<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0435\u0440\u0441\u0438\u044f API (\u0441\u0435\u0439\u0447\u0430\u0441 1)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>GET_SERVICES<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>SVC_ENABLE<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e ID<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>SVC_DISABLE<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e ID<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>CLIP_STATUS<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">11<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>CLIP_READ<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 clipboard<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">12<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>CLIP_WRITE<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 clipboard<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d1b\/faf\/948\/d1bfaf948b1fdbb93c79570019e43bde.png\" alt=\"\u0423\u0442\u0438\u043b\u0438\u0442\u0430 VBoxCtrl: \u043a\u043b\u0438\u0435\u043d\u0442 IOCTL-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u0412\u0441\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u044b \u043a\u043e\u0434\u043e\u0432 1\u20133, 10\u201312 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0448\u0435.\" title=\"\u0423\u0442\u0438\u043b\u0438\u0442\u0430 VBoxCtrl: \u043a\u043b\u0438\u0435\u043d\u0442 IOCTL-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u0412\u0441\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u044b \u043a\u043e\u0434\u043e\u0432 1\u20133, 10\u201312 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0448\u0435.\" width=\"632\" height=\"692\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d1b\/faf\/948\/d1bfaf948b1fdbb93c79570019e43bde.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d1b\/faf\/948\/d1bfaf948b1fdbb93c79570019e43bde.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0423\u0442\u0438\u043b\u0438\u0442\u0430 <code>VBoxCtrl<\/code>: \u043a\u043b\u0438\u0435\u043d\u0442 IOCTL-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u0412\u0441\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u044b \u043a\u043e\u0434\u043e\u0432 1\u20133, 10\u201312 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0448\u0435.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0434\u044b 2 \u0438 3 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u0441\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 VMMDev.<\/p>\n<h3>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0447\u0438\u0441\u043b\u0430<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Vendor ID<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0x80EE<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Device ID<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0xCAFE<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">MMIO \u0440\u0430\u0437\u043c\u0435\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\">4 \u041c\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">VMMDev \u043f\u0430\u043a\u0435\u0442\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">1 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 (4 \u041a\u0411)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">HGCM \u0431\u0443\u0444\u0435\u0440\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">3 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (12 \u041a\u0411)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0438\u043e\u0434 TimerHS-callback<\/p>\n<\/td>\n<td>\n<p align=\"left\">100\u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Debounce display\/seamless<\/p>\n<\/td>\n<td>\n<p align=\"left\">500\u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">HGCM timeout<\/p>\n<\/td>\n<td>\n<p align=\"left\">500 000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 spin (\u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0430\u0443\u0442), ~5-50 \u043c\u0441 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u044b CPU<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Heartbeat \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\">1\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Timesync \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\">~60\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u0430\u043a\u0441. \u043e\u0431\u0449\u0438\u0445 \u043f\u0430\u043f\u043e\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u0430\u043a\u0441. HGCM-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">32<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443\u00a0<\/h3>\n<p>\u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f VMMDev \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043a\u0446\u0438\u0435\u0439: \u043c\u044b\u0448\u044c \u0434\u0432\u0438\u043d\u0443\u043b\u0430\u0441\u044c -&gt; \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e -&gt; \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430. \u041d\u043e \u0440\u044f\u0434 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u0441\u0432\u043e\u0435\u0439 \u043d\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u043d\u044b\u0439:<\/p>\n<ul>\n<li>\n<p>Heartbeat \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0442\u0443\u0447\u0430\u0442\u044c \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0443\u0436\u043d\u0430 \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0441\u0430\u0439\u0437 \u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u2014 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u0443\u0437\u044b \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>Clipboard \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e async-\u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441 \u0442\u0438\u043a\u043e\u043c 100 \u043c\u0441.<\/p>\n<h4>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<pre><code>proc timer_init\u00a0\u00a0\u00a0 invoke TimerHS, TIMER_DELAY_START, TIMER_INTERVAL, timer_cb, 0\u00a0\u00a0\u00a0 ;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ^10 (100 \u043c\u0441 \u0434\u043e \u0441\u0442\u0430\u0440\u0442\u0430)\u00a0 ^10 (100 \u043c\u0441 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b)\u00a0\u00a0\u00a0 mov [vbox_timer_handle], eaxendpproc timer_cb stdcall, userdata:dword\u00a0\u00a0\u00a0 stdcall dispatcher_tick_all\u00a0\u00a0\u00a0 retendp<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>TimerHS<\/code> \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 KolibriOS, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0435\u0440. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 10 \u043c\u0441: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 10 = 100 \u043c\u0441. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 handle, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u0442\u043c\u0435\u043d\u044b \u0447\u0435\u0440\u0435\u0437 <code>CancelTimerHS<\/code> \u043f\u0440\u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430.<\/p>\n<h4>\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0438\u043a\u043e\u0432<\/h4>\n<p><code>dispatcher_tick_all<\/code> \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>fn_on_tick<\/code> \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d \u043d\u0435 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e:<\/p>\n<pre><code>proc dispatcher_tick_all uses eax ecx esi\u00a0\u00a0\u00a0 mov ecx, [services_count]\u00a0\u00a0\u00a0 mov esi, services_table.loop:\u00a0\u00a0\u00a0 cmp dword [esi + SERVICE_ENTRY.enabled], 0\u00a0\u00a0\u00a0 je .next\u00a0\u00a0\u00a0 mov eax, [esi + SERVICE_ENTRY.fn_on_tick]\u00a0\u00a0\u00a0 test eax, eax\u00a0\u00a0\u00a0 jz .next\u00a0\u00a0\u00a0 push ecx esi\u00a0\u00a0\u00a0 call eax\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ; fn_on_tick()\u00a0\u00a0\u00a0 pop esi ecx.next:\u00a0\u00a0\u00a0 add esi, sizeof.SERVICE_ENTRY\u00a0\u00a0\u00a0 dec ecx\u00a0\u00a0\u00a0 jnz .loopendp<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0442\u0438\u043a \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u043b\u0435\u0442\u0443 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<h4>\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0442\u0430\u0439\u043c\u0435\u0440\u0430<\/h4>\n<p><strong>Debounce<\/strong> (display, seamless). \u041e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0434\u043e\u0440\u043e\u0433\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0435 &#171;\u0443\u0441\u043f\u043e\u043a\u043e\u044f\u0442\u0441\u044f&#187;. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0441\u0431\u0440\u043e\u0441 \u0444\u043b\u0430\u0433\u0430 <code>pending<\/code> <strong>\u0434\u043e<\/strong> \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430: \u0435\u0441\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u043b\u0433\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0434\u0451\u0442 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438\u0437 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u043e\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442 <code>pending = 1<\/code> \u0441\u043d\u043e\u0432\u0430, \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043a \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p><strong>\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/strong> (heartbeat, timesync). \u0421\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0442\u0438\u043a\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043d\u0435 \u043f\u043e\u0440\u0430 \u043b\u0438 \u0441\u043d\u043e\u0432\u0430:<\/p>\n<pre><code>Event:\u00a0 GetTimerTicks() -&gt; vbox_display_event_time\u00a0 vbox_display_pending = 1Tick (\u043d\u0430\u0448 TimerHS-callback, \u043a\u0430\u0436\u0434\u044b\u0435 100 \u043c\u0441):\u00a0 ; \u00ab\u0442\u0438\u043a\u0438\u00bb \u043d\u0438\u0436\u0435 \u2014 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 GetTimerTicks (\u0448\u0430\u0433 10 \u043c\u0441),\u00a0 ; \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u043c callback'\u0430\u00a0 if pending &amp;&amp; (now \u2014 event_time &gt;= 50 \u0435\u0434. = 500 \u043c\u0441):\u00a0\u00a0\u00a0 pending = 0\u00a0\u00a0\u00a0 display_change()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>State machine<\/strong> (clipboard). \u0422\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430: \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043a \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u043b\u0430\u0433\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0425\u043e\u0441\u0442 \u0441\u0430\u043c \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 \u0444\u043b\u0430\u0433 \u0447\u0435\u0440\u0435\u0437 DMA \u0438 (\u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438) \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435.<\/p>\n<h4>\u0421\u0432\u043e\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043a\u0430<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0435\u0440\u0432\u0438\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>fn_on_tick<\/code><\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">\u041f\u0430\u0442\u0442\u0435\u0440\u043d<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Display<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>display_tick<\/code><\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">debounce<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0447\u0435\u0440\u0435\u0437 500 \u043c\u0441 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Seamless<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>seamless_tick<\/code><\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">debounce<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0447\u0435\u0440\u0435\u0437 500 \u043c\u0441 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Heartbeat<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>heartbeat_tick<\/code><\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">\u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437 \u0432 ~1\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Timesync<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>timesync_tick<\/code><\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">\u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437 \u0432 ~60\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clipboard<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>clipboard_tick<\/code><\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">state machine<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e \u043e\u0442\u0432\u0435\u0442\u0443 \u0445\u043e\u0441\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f<\/h3>\n<h4>1. \u041d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 v1_03 \/ v1_04<\/h4>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b VMMDev \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u043b\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u2014 \u0432\u0441\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c VirtualBox \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e. \u041c\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 v1_03 \u0438 v1_04 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0440\u044f\u0434\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440: \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c <code>VMMDEV_HEADER<\/code> (\u043f\u043e\u043b\u0435 <code>f_requestor<\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0435 \u0441\u0440\u0430\u0437\u0443), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b HGCM-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u0432\u0430\u043b\u043e \u043b\u0438\u0431\u043e \u043e\u0442\u043a\u0430\u0437 \u0445\u043e\u0441\u0442\u0430 (<code>VERR_INVALID_PARAMETER<\/code>), \u043b\u0438\u0431\u043e \u043c\u043e\u043b\u0447\u0430\u043b\u0438\u0432\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0435 \u0432 \u0442\u043e \u043f\u043e\u043b\u0435 \u2014 \u043e\u0431\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b \u043f\u0440\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u0431\u0435\u0437 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0441\u0442\u0440\u043e\u0433\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 (<code>; +0:<\/code>, <code>; +4:<\/code>, &#8230;) \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c Windows-\u0432\u0435\u0440\u0441\u0438\u0438 VBoxGuest.<\/p>\n<h4>2. \u0414\u0432\u043e\u0439\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u044b\u0448\u044c\u044e (PS\/2 + VMMDev)<\/h4>\n<p>\u0421\u043c. \u0440\u0430\u0437\u0434\u0435\u043b &#171;\u041c\u044b\u0448\u044c&#187;. \u041a\u0440\u0430\u0442\u043a\u043e: \u0431\u0435\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f IRQ12 \u043d\u0430 i8042 PS\/2-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0441 VMMDev-\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u0434\u0451\u0440\u0433\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h4>3. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u0438\u0434\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0447\u0442\u0435\u043d\u0438\u0438<\/h4>\n<p>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u0438\u0448\u0435\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 CMOS RTC \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442\u044b <code>0x70<\/code>\/<code>0x71<\/code>. \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 KolibriOS <code>int 0x40 fn=3<\/code> (GetTime) \u0438 <code>fn=29<\/code> (GetDate) \u0447\u0438\u0442\u0430\u044e\u0442 CMOS \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 (<code>kernel\/trunk\/hid\/set_dtc.inc<\/code> \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 KolibriOS) \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0432\u0440\u0435\u043c\u044f, \u0443\u0432\u0438\u0434\u044f\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0437\u0443. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0447\u0438\u0442\u0430\u0432\u0448\u0438\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435 \u0435\u0433\u043e \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435 \u0443\u0432\u0438\u0434\u044f\u0442, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, CMOS-\u0437\u0430\u043f\u0438\u0441\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f RTC (\u0431\u0438\u0442 7 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 A), \u0438\u043d\u0430\u0447\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u044b. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 Unix timestamp \u0432 BCD-\u0434\u0430\u0442\u0443 (Howard Hinnant civil_from_days) \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u041f\u043e \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u0438 <code>AUTOSTART_TIMESYNC = 0<\/code> \u2014 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<h4>4. \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 Shared Folders<\/h4>\n<p>\u0421\u043c. \u0440\u0430\u0437\u0434\u0435\u043b &#171;\u041e\u0431\u0449\u0438\u0435 \u043f\u0430\u043f\u043a\u0438&#187;. \u041a\u0440\u0430\u0442\u043a\u043e: \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0445\u043e\u0441\u0442 \u0434\u0430\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <code>VERR_INVALID_PARAMETER<\/code> \u0431\u0435\u0437 \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0441 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 Windows-\u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0438 <code>DEBUGF<\/code> \u043f\u043e\u0434 \u0444\u043b\u0430\u0433\u043e\u043c <code>__DEBUG_SF__ = 1<\/code>. <\/p>\n<h4>5. Clipboard: \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b listener&#8217;\u0430<\/h4>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 <code>MSG_OLD_GET_WAIT<\/code>, \u0437\u0430\u043f\u0438\u0441\u044c \u2014 \u0447\u0435\u0440\u0435\u0437 <code>DATA_WRITE<\/code> \u0441\u043e &#171;\u0441\u0442\u0430\u0440\u043e\u0439&#187; \u0444\u043e\u0440\u043c\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (<code>CPARMS_DATA_WRITE_OLD<\/code>). \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 (<code>MSG_NEW_PEEK_WAIT<\/code> + <code>MSG_GET<\/code> + \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 <code>DATA_READ<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c \u0431\u0435\u0437 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435.<\/p>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0430\u043d\u043a\u0438\u043d\u0433\u0430 \u043d\u0435\u0442: \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043e\u0434\u043d\u0438\u043c HGCM-\u0432\u044b\u0437\u043e\u0432\u043e\u043c. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u043b\u043e \u0440\u0430\u0437\u043c\u0435\u0440, \u043d\u0430 read-\u043f\u0443\u0442\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d retry \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0444\u0435\u0440\u0430 \u2014 \u0435\u0441\u043b\u0438 \u0445\u043e\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0438\u043b, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442 \u0431\u0443\u0444\u0435\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441. \u042d\u0442\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u044b\u0442\u043e\u0432\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u043d\u043e \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u0443\u0441\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 kernel-\u043f\u0430\u043c\u044f\u0442\u0438 \u0435\u0434\u0438\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 <code>MSG_NEW_*<\/code> \u2014 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430.<\/p>\n<h4>6. \u041e\u0442\u043b\u0430\u0434\u043a\u0430 \u0431\u0435\u0437 \u0436\u0438\u0432\u043e\u0439 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438<\/h4>\n<p>\u0412 KolibriOS \u043d\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430 \u044f\u0434\u0440\u0430 \u0443\u0440\u043e\u0432\u043d\u044f kgdb \u0438\u043b\u0438 WinDbg, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u043e\u0435 \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0434\u043e\u0441\u043a\u0430 KolibriOS \u0438 \u043f\u0438\u0448\u0443\u0449\u0438\u0435 \u0432 \u043d\u0435\u0451 <code>DEBUGF <\/code>\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0426\u0438\u043a\u043b: \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043b -&gt; \u0441\u043e\u0431\u0440\u0430\u043b -&gt; \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b -&gt; \u0437\u0430\u0432\u0438\u0441\u043b\u043e -&gt; \u0441\u0431\u0440\u043e\u0441\u0438\u043b, \u0431\u044b\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c. \u0414\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043f\u0443\u0442\u0435\u0439, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439, \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0448\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 COM-\u043f\u043e\u0440\u0442 \u0441 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0442\u043e\u043f\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0432 \u0448\u0443\u043c\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/833\/a20\/d8f\/833a20d8f075c7c0d160bd042bd3b11b.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SharedFolder\" title=\"\u0412\u044b\u0432\u043e\u0434 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SharedFolder\" width=\"1007\" height=\"809\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/833\/a20\/d8f\/833a20d8f075c7c0d160bd042bd3b11b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/833\/a20\/d8f\/833a20d8f075c7c0d160bd042bd3b11b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u044b\u0432\u043e\u0434 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SharedFolder<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0442\u043b\u0430\u0434\u043a\u0430 <code>SHFL_FN_READ<\/code> \u2014 \u0441\u0430\u043c\u044b\u0439 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439. \u0425\u043e\u0441\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u043b <code>VERR_INVALID_PARAMETER<\/code>, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u0435\u0440\u0435\u0431\u0440\u0430\u043b \u0432\u0441\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 <code>SHFL_FSOBJINFO<\/code>, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u0440\u0430\u0437\u043c\u0435\u0440\u044b PageList, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043d\u0438\u0447\u0435\u0433\u043e. \u041f\u043e\u043c\u043e\u0433 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043c\u043f \u043f\u0430\u043a\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Windows-\u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438: \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u0431\u0430\u0439\u0442\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e.<\/p>\n<h3>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 upstream-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 VBoxGuest<\/h3>\n<p>VirtualBox \u2014 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 upstream-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 VBoxGuest \u043f\u043e\u0434 Linux, Windows, FreeBSD, Solaris, OS\/2 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0437\u0434\u0435\u0441\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f KolibriOS \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0441 \u043d\u0443\u043b\u044f \u2014 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 upstream-\u043a\u043e\u0434\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e\u0441\u044c. \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: \u0433\u0434\u0435 \u0436\u0438\u0432\u0451\u0442 \u043a\u0430\u0436\u0434\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0435\u0440\u0435\u0437 \u0447\u0442\u043e \u0438\u0434\u0451\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u041e\u0421.<\/p>\n<h4>\u0413\u0434\u0435 \u0436\u0438\u0432\u0451\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h4>\n<p>\u0412 upstream VBoxGuest \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ol>\n<li>\n<p><strong>Kernel-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 <\/strong><code><strong>VBoxGuest<\/strong><\/code> \u2014 PCI probing, ISR, \u043e\u0431\u0449\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, IOCTL-\u043c\u043e\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0445\u043e\u0441\u0442\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p><code><strong>VBoxService<\/strong><\/code> \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441: timesync, guest properties, memory balloon, VMInfo, guest control, \u0430\u0432\u0442\u043e\u043c\u0430\u0443\u043d\u0442 shared folders.<\/p>\n<\/li>\n<li>\n<p><code><strong>VBoxClient<\/strong><\/code> (X11\/Wayland) \u2014 display auto-resize, seamless, drag&amp;drop, clipboard.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 kernel-\u043c\u043e\u0434\u0443\u043b\u0438: <code>vboxsf<\/code> (shared folders), <code>vboxvideo<\/code>\/DRM (\u0432\u0438\u0434\u0435\u043e \u0438 resize). \u041d\u0430 Windows \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 <code>VBoxMouse.sys<\/code> (\u0444\u0438\u043b\u044c\u0442\u0440-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043c\u044b\u0448\u0438), <code>VBoxDisplay<\/code> (WDDM-\u0434\u0440\u0430\u0439\u0432\u0435\u0440), <code>VBoxSF.sys<\/code> (mini-redirector).<\/p>\n<p>\u0412 KolibriOS \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0438\u043d\u0430\u0447\u0435 \u2014 \u0435\u0434\u0438\u043d\u044b\u0439 PE DLL <code>vboxguest.sys<\/code>, \u0432\u0441\u0451 \u0432 \u043e\u0434\u043d\u043e\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0435, \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e \u0444\u0438\u0447\u0430\u043c:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0424\u0438\u0447\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">VBoxGuest \u0434\u043b\u044f KolibriOS<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">upstream Linux<\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">upstream Windows<\/p>\n<\/td>\n<td>\n<p align=\"left\">upstream FreeBSD<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">PCI probe + VMMDev<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><code>vboxguest<\/code><\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\"><code>VBoxGuest.sys<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>vboxguest.ko<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">IRQ \/ event dispatch<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><code>vboxguest<\/code><\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\"><code>VBoxGuest.sys<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>vboxguest.ko<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Mouse integration<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435<\/strong> (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 i8042)<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><code>vboxguest<\/code> + X-\u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">\u043e\u0442\u0434. <code>VBoxMouse.sys<\/code> (filter)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>vboxguest<\/code> + X-\u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Display auto-resize<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435<\/strong> (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 BGA)<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><code>vboxvideo<\/code> (DRM) + <code>VBoxClient<\/code><\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">\u043e\u0442\u0434. <code>VBoxDisplay<\/code> (WDDM)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>vboxvideo<\/code> + VBoxVideo Xorg<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clipboard<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435<\/strong> + IOCTL<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><code>VBoxClient<\/code> (X11)<\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">user-space service<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>VBoxClient<\/code> (X11)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>Seamless<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e, \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><code>VBoxClient<\/code><\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">user-space<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>VBoxClient<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Shared folders<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435<\/strong> (DiskAdd + FSUserFunctions)<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">\u043e\u0442\u0434. <code>vboxsf.ko<\/code><\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\">\u043e\u0442\u0434. <code>VBoxSF.sys<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0442\u0434. <code>vboxvfs.ko<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Time sync<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435<\/strong> (\u0437\u0430\u043f\u0438\u0441\u044c \u0432 CMOS)<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><code>VBoxService<\/code><\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\"><code>VBoxService<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>VBoxService<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Guest Properties<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0440\u0430\u0439\u0432\u0435\u0440 (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e)<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><code>VBoxService<\/code><\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\"><code>VBoxService<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>VBoxService<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Heartbeat<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">common-\u044f\u0434\u0440\u043e <code>vboxguest<\/code><\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\"><code>VBoxGuest.sys<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>vboxguest.ko<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Memory balloon<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\"><code>VBoxService<\/code> + <code>vboxguest<\/code><\/p>\n<\/td>\n<td data-colwidth=\"139\" width=\"139\">\n<p align=\"left\"><code>VBoxService<\/code> + <code>VBoxGuest<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>VBoxService<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u2014 \u0444\u0438\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 upstream \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b (<code>VBoxService<\/code>\/<code>VBoxClient<\/code>), \u0437\u0434\u0435\u0441\u044c \u0436\u0438\u0432\u0443\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 kernel-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430. \u0427\u0430\u0441\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0436\u0435\u043b\u0435\u0437\u0443: BGA \u0447\u0435\u0440\u0435\u0437 <code>0x01CE<\/code>\/<code>0x01CF<\/code> \u0434\u043b\u044f display-resize, CMOS \u0447\u0435\u0440\u0435\u0437 <code>0x70<\/code>\/<code>0x71<\/code> \u0434\u043b\u044f timesync, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 i8042 \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f IRQ12 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0439 \u043c\u044b\u0448\u044c\u044e. \u0412 upstream \u044d\u0442\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0435\u0448\u0430\u044e\u0442 \u0448\u0442\u0430\u0442\u043d\u044b\u0435 DRM-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u0438\u0434\u0435\u043e, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043c\u044b\u0448\u0438 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 timesync \u0447\u0435\u0440\u0435\u0437 \u044f\u0434\u0435\u0440\u043d\u044b\u0439 API.<\/p>\n<h4>HGCM async wait<\/h4>\n<p>\u0412 upstream HGCM-\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u0445 \u041e\u0421: wait-queue (<code>init_waitqueue_head<\/code> \/ <code>wake_up_interruptible<\/code>) \u043d\u0430 Linux, <code>KEVENT<\/code> + <code>KeWaitForSingleObject<\/code> \u043d\u0430 Windows, <code>RTSemEventMulti<\/code> \u0438\u0437 IPRT \u043d\u0430 FreeBSD\/Solaris. \u041f\u043e\u0442\u043e\u043a \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f, IRQ-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0435\u0433\u043e \u0431\u0443\u0434\u0438\u0442 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>\u0412 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u0434\u043b\u044f KolibriOS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f spin-loop \u0441 <code>pause<\/code>, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c \u0432 500 000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. \u0414\u043b\u0438\u043d\u043d\u044b\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (clipboard listener) \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043f\u043e \u0442\u0438\u043a\u0443 \u0442\u0430\u0439\u043c\u0435\u0440\u0430. \u041f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0432 \u044f\u0434\u0440\u0435 KolibriOS \u0435\u0441\u0442\u044c (\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u044f\u0434\u0440\u0430), \u043d\u043e \u043a HGCM-\u043f\u0443\u0442\u0438 \u043e\u043d\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b. \u042d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433; \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<h4>Shared folders<\/h4>\n<p>\u0412 upstream \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 kernel-\u043c\u043e\u0434\u0443\u043b\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b: \u043d\u0430 Linux <code>vboxsf.ko<\/code> \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>register_filesystem(&amp;g_vboxsf_fs_type)<\/code> \u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>VbglR0Sf*<\/code>-API \u0438\u0437 common-\u0443\u0440\u043e\u0432\u043d\u044f; \u043d\u0430 Windows \u2014 mini-redirector <code>VBoxSF.sys<\/code>; \u043d\u0430 FreeBSD \u2014 <code>vboxvfs<\/code>.<\/p>\n<p>\u0412 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u0434\u043b\u044f KolibriOS VFS-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 \u0442\u043e\u0442 \u0436\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u0447\u0442\u043e \u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432 \u044f\u0434\u0440\u0435 \u0438\u0434\u0451\u0442 \u043e\u0431\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c: <code>DiskAdd<\/code> + <code>DiskMediaChanged<\/code> \u0441\u043e\u0437\u0434\u0430\u044e\u0442 raw-\u0440\u0430\u0437\u0434\u0435\u043b, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u0440\u044f\u043c\u043e \u0432 <code>partition.FSUserFunctions<\/code> \u044f\u0434\u0435\u0440\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u2014 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u0440\u043e \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<h4>Trade-offs \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438<\/h4>\n<p>\u0427\u0442\u043e \u0434\u0430\u0451\u0442 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0433\u043e \u0432 \u043e\u0434\u0438\u043d \u0434\u0440\u0430\u0439\u0432\u0435\u0440:<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0434\u0438\u043d \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438.<\/strong> \u041e\u0434\u0438\u043d \u0444\u0430\u0439\u043b, \u043e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0434\u0438\u043d \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442, \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/strong> \u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0431\u0449\u0438\u0435 HGCM-\u0431\u0443\u0444\u0435\u0440\u044b, \u043e\u0431\u0449\u0438\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440, \u043e\u0431\u0449\u0438\u0439 \u0446\u0438\u043a\u043b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0442 \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043d\u043e\u0439 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/strong> \u0412 upstream <code>VBoxClient<\/code>\/<code>VBoxService<\/code> \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441 kernel-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u043c \u0447\u0435\u0440\u0435\u0437 ioctl \u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b; \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 upstream-\u043c\u043e\u0434\u0435\u043b\u044c\u044e:<\/p>\n<ul>\n<li>\n<p><strong>\u041d\u0435\u0442 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0438\u0447\u0438.<\/strong> \u0412\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 = \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u043a\u0430\u0437 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412 upstream \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <code>VBoxClient<\/code> \u0431\u0435\u0437 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u044b\u0448\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0442 user-space sandbox \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0447\u0443\u0436\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440.<\/strong> \u041f\u0430\u0440\u0441\u0435\u0440\u044b SHFL-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 clipboard \u0438 guest properties \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 kernel mode. \u0411\u0430\u0433 \u0432 \u043d\u0438\u0445 \u2014 \u043d\u0435 \u00ab\u0443\u043f\u0430\u043b \u0434\u0435\u043c\u043e\u043d\u00bb, \u0430 \u0434\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044f\u0434\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0442 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0433\u043e upgrade-\u0446\u0438\u043a\u043b\u0430.<\/strong> \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 clipboard, \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p><strong>Spin-loop \/ \u0442\u0430\u0439\u043c\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043a \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f.<\/strong> \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433; \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043d\u0430 <code>WaitEventTimeout<\/code> \u044f\u0434\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 upstream-\u043c\u043e\u0434\u0435\u043b\u044f\u0445 \u0442\u0435 \u0436\u0435 trade-offs \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0438\u043d\u0430\u0447\u0435: kernel-\u0447\u0430\u0441\u0442\u044c \u0442\u043e\u043d\u043a\u0430\u044f, \u0440\u0438\u0441\u043a\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u2014 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0446\u0435\u043d\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438.<\/p>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p>VBoxGuest \u0434\u043b\u044f KolibriOS \u2014 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u043e\u0434\u0438\u043d PE DLL. \u0415\u0441\u043b\u0438 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u043e, \u0431\u0435\u0437 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0439:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b11\/2c6\/b86\/b112c6b86ebe248f0a4d73aa8b59a54d.png\" alt=\"KolibriOS \u0432 VirtualBox \u0441 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c VBoxGuest: \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0434\u043e\u0441\u043a\u0430, \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043d\u0430 shared folder, VBoxCtrl \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\" title=\"KolibriOS \u0432 VirtualBox \u0441 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c VBoxGuest: \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0434\u043e\u0441\u043a\u0430, \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043d\u0430 shared folder, VBoxCtrl \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\" width=\"2504\" height=\"1488\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b11\/2c6\/b86\/b112c6b86ebe248f0a4d73aa8b59a54d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b11\/2c6\/b86\/b112c6b86ebe248f0a4d73aa8b59a54d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>KolibriOS \u0432 VirtualBox \u0441 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c VBoxGuest: \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0434\u043e\u0441\u043a\u0430, \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043d\u0430 shared folder, VBoxCtrl \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u0427\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.<\/strong> \u041c\u044b\u0448\u044c \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438, \u043e\u0431\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0430, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 IRQ12 \u043d\u0430 i8042 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0433\u043e\u043d\u043a\u0438 \u0441 PS\/2. Shared folders \u2014 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0424\u0421: \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043f\u043e\u043a \u0445\u043e\u0441\u0442\u0430, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 HGCM, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 DMA \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 PageList. Heartbeat \u2014 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b, watchdog \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0445\u043e\u0441\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0448\u0442\u0430\u0442\u043d\u043e. Guest Properties \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b, \u0434\u043e\u0441\u0442\u0443\u043f \u0447\u0435\u0440\u0435\u0437 <code>VBoxManage<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0444\u0438\u0447\u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c\u044b \u0441 upstream-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p><strong>\u0427\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430\u043c\u0438.<\/strong><\/p>\n<ul>\n<li>\n<p><strong>Display auto-resize<\/strong> \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 BGA \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0448\u0442\u0430\u0442\u043d\u043e, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u041d\u043e \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043e\u043a\u043d\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c taskbar \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043a\u0440\u0430\u0448 \u2014 <code>SetScreen<\/code> \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u044d\u043a\u0440\u0430\u043d\u0430, \u043d\u043e \u043d\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043e\u043a\u043d\u0430 \u043e\u0431 \u0443\u0441\u0435\u0447\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446, \u0438 taskbar \u043f\u0438\u0448\u0435\u0442 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u043e \u0441\u0442\u0430\u0440\u043e\u043c\u0443 pitch. \u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u044f\u0434\u0440\u0430, \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u0435\u0451 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>Clipboard<\/strong> \u2014 \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, listener \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>MSG_OLD_GET_WAIT<\/code>, fire-and-forget \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a. \u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u00ab\u0441\u0442\u0430\u0440\u043e\u0433\u043e\u00bb \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u0447\u0430\u043d\u043a\u0438\u043d\u0433\u0430 \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043e\u0434\u043d\u0438\u043c HGCM-\u0432\u044b\u0437\u043e\u0432\u043e\u043c. \u0414\u043b\u044f \u0431\u044b\u0442\u043e\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 (\u0435\u0441\u0442\u044c retry-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438), \u0434\u043b\u044f \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0447 \u0431\u0443\u0444\u0435\u0440 \u0436\u0438\u0432\u0451\u0442 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 kernel-\u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0451\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>Timesync<\/strong> \u2014 \u043f\u0438\u0448\u0435\u0442 \u0432 CMOS RTC \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442\u044b <code>0x70<\/code>\/<code>0x71<\/code>. \u0423\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0443\u0432\u0438\u0434\u044f\u0442: <code>int 0x40<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0432\u0435\u0436\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u044f\u0432\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0427\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u0432 \u044f\u0434\u0440\u0435 KolibriOS.<\/strong> \u042d\u0442\u0438 \u043f\u0443\u043d\u043a\u0442\u044b \u0432 <code>vboxguest.sys<\/code> \u043f\u043e\u0447\u0438\u043d\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u2014 \u043d\u0443\u0436\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u044f\u0434\u0440\u0435:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 seamless.<\/strong> \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u043c\u0435\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c visible region, \u043d\u043e \u0432 \u044f\u0434\u0440\u0435 KolibriOS \u043d\u0435\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e API \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043e\u043a\u043e\u043d \u0438\u0437 kernel-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d \u2014 \u0447\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0445\u043e\u0441\u0442\u0430, \u043d\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u043d\u0435 \u0434\u0430\u0451\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0440\u0430\u0448 \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043e\u043a\u043d\u0430 VirtualBox \u0441 taskbar.<\/strong> \u041e\u043f\u0438\u0441\u0430\u043d \u0432\u044b\u0448\u0435. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0447\u0430\u0441\u0442\u044c \u2014 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>DISPLAY<\/code> \u0438 \u0437\u043e\u0432\u0451\u0442 <code>SetScreen<\/code>. \u0427\u0442\u043e\u0431\u044b \u0441\u043d\u044f\u0442\u044c \u043a\u0440\u0430\u0448, <code>SetScreen<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c \u043e\u043a\u043d\u0430, \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430 \u043d\u043e\u0432\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0427\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/strong> \u042d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435, \u0431\u0435\u0437 \u043f\u0440\u0430\u0432\u043e\u043a \u044f\u0434\u0440\u0430:<\/p>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 <code>MSG_NEW_PEEK_WAIT<\/code> + <code>MSG_GET<\/code> + <code>DATA_READ<\/code> \u0432 clipboard \u2014 \u0434\u0430\u0441\u0442 \u0447\u0430\u043d\u043a\u0438\u043d\u0433 \u0438 \u0441\u043d\u0438\u043c\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 kernel-\u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0451\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 <code>hgcm_wait_async<\/code> \u0441\u043e spin-loop&#8217;\u0430 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u044f\u0434\u0440\u0430 KolibriOS. \u0422\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u0451\u043c \u2014 \u0434\u043b\u044f clipboard listener&#8217;\u0430: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0438\u043a\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0435 \u0438\u0437 IRQ-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0430\u0441\u0442\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 \u044d\u0442\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f upstream-\u043c\u043e\u0434\u0435\u043b\u0435\u0439 VBoxGuest \u2014 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u0430\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 kernel + user-space, \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a BGA \/ CMOS \/ i8042 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 DRM\/RTC\/filter-\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432, spin-loop \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f. \u0427\u0430\u0441\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u2014 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433, \u0441\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0439 \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 (\u0441\u043c. \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u044b\u0448\u0435). \u0427\u0430\u0441\u0442\u044c \u2014 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043e\u0434\u043d\u043e\u0433\u043e PE DLL: \u0443 \u043d\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0435\u043c \u0443 \u0442\u0440\u0451\u0445\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u043e\u0439 upstream-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u043b\u044e\u0441\u0430\u043c\u0438 \u0438 \u043c\u0438\u043d\u0443\u0441\u0430\u043c\u0438, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u0435\u0440\u0441\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430: 1.0<\/p>\n<blockquote>\n<p>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f: <a href=\"https:\/\/git.kolibrios.org\/lex_coder\/VBoxGuest\/src\/branch\/main\/LICENSE.txt\" rel=\"noopener noreferrer nofollow\">GPLv2<\/a> (\u043a\u0430\u043a \u0438 \u0441\u0430\u043c\u0430 <a href=\"https:\/\/kolibrios.org\/\" rel=\"noopener noreferrer nofollow\">KolibriOS<\/a>)<\/p>\n<p><a href=\"https:\/\/git.kolibrios.org\/lex_coder\/VBoxGuest\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430<\/a><\/p>\n<\/blockquote>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1040248\/\">https:\/\/habr.com\/ru\/articles\/1040248\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b VMMDev\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432HGCM \u2014 Host-Guest Communication Manager\u0421\u0435\u0440\u0432\u0438\u0441\u044b (\u043c\u044b\u0448\u044c, \u0434\u0438\u0441\u043f\u043b\u0435\u0439, heartbeat, timesync, guest properties, shared folders, clipboard, seamless)IOCTL-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0447\u0438\u0441\u043b\u0430\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 upstream-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438\u0418\u0442\u043e\u0433\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435VBoxGuest \u2014 \u044d\u0442\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 (Guest Additions) \u0434\u043b\u044f KolibriOS, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 VirtualBox. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430 FASM \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438: \u043e\u0442 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c VMMDev (Virtual Machine Monitor Device) \u0434\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014 \u043c\u044b\u0448\u0438, \u043e\u0431\u0449\u0438\u0445 \u043f\u0430\u043f\u043e\u043a, \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430, \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\u041a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u2014 \u043e\u043a\u043e\u043b\u043e 11 200 \u0441\u0442\u0440\u043e\u043a \u0432 61 \u0444\u0430\u0439\u043b\u0435 (\u043f\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044e 1.0). \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440, HGCM-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043e\u0431\u0451\u0440\u043d\u0443\u0442 \u0432 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 API \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 PageList-DMA, \u0430 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0436\u0435\u043b\u0435\u0437\u043e\u043c (i8042, BGA, CMOS) \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (mouse, display, timesync).\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0437\u043d\u0443\u0442\u0440\u0438: \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u043a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d \u043f\u0440\u0438\u0451\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0442\u0435 \u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0432\u044b\u0431\u043e\u0440\u044b \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f.\u0422\u0435\u043a\u0441\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442 PCI, \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, DMA \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e x86 \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445. \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0432\u0440\u043e\u0434\u0435 \u00ab\u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 IRQ\u00bb \u0438\u043b\u0438 \u00ab\u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d MMIO\u00bb \u044f \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e \u2014 \u0444\u043e\u043a\u0443\u0441 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 VMMDev\/HGCM \u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u0434\u043b\u044f KolibriOS.\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f\u0413\u043e\u0442\u043e\u0432\u044b\u0445 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0434\u043b\u044f KolibriOS \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u2014 \u043d\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430, \u043d\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432.\u0412 Linux \/ Windows \/ FreeBSD \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c: kernel-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 VBoxGuest (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0441\u0442), user-space-\u0434\u0435\u043c\u043e\u043d VBoxService (timesync, properties, balloon) \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 VBoxClient \u043f\u043e\u0434 X11\/Wayland (display-resize, seamless, clipboard). \u041f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 kernel-\u043c\u043e\u0434\u0443\u043b\u0438 \u2014 vboxsf, vboxvideo\/DRM, \u0430 \u043d\u0430 Windows \u0435\u0449\u0451 \u0444\u0438\u043b\u044c\u0442\u0440-\u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043c\u044b\u0448\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443: \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432 \u044f\u0434\u0440\u0435, X-\u0441\u0435\u0440\u0432\u0435\u0440.\u0412 KolibriOS \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0432 \u0438\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u0435\u0434\u0438\u043d\u044b\u0439 PE DLL, \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 user-space-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u043e\u0434 VFS (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430), \u0432\u0438\u0434\u0435\u043e \u0438 \u043c\u044b\u0448\u044c. \u0420\u044f\u0434 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044f\u0434\u0440\u0430 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443 \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (CreateEvent \/ WaitEvent \/ WaitEventTimeout, \u0441\u043c. [Kernel_Event\/ru]), \u043d\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0445 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f spin-loop&#8217;\u043e\u043c \u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u043c. \u042d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u043b\u0433\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0435\u0449\u0451 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u0418\u0442\u043e\u0433\u00bb.\u0422\u0430\u043a \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u0441\u0442\u0435\u043a \u043e\u0442 PCI-\u043f\u0440\u043e\u0431\u044b \u0434\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430 \u0438 \u043e\u0431\u0449\u0438\u0445 \u043f\u0430\u043f\u043e\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 FASM. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, compile-time \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0442\u0438\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0430. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043e\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a.\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430vboxguest.asm\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430, PE DLL native 0.05config.inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438\u251c\u2500\u2500 core\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u044f\u0434\u0440\u043e: PCI, MMIO, IRQ, \u0442\u0430\u0439\u043c\u0435\u0440, \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u2502\u00a0\u00a0 \u251c\u2500\u2500 pci.inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 PCI-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u0435\u043d\u0438\u0435 BAR\/IRQ\u2502\u00a0\u00a0 \u251c\u2500\u2500 mmio.inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 MMIO, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 VMMDev\u2502\u00a0\u00a0 \u251c\u2500\u2500 ports.inc\u00a0\u00a0\u00a0\u00a0\u00a0 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 I\/O-\u043f\u043e\u0440\u0442\u2502\u00a0\u00a0 \u251c\u2500\u2500 irq.inc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439\u2502\u00a0\u00a0 \u251c\u2500\u2500 timer.inc\u00a0\u00a0\u00a0\u00a0\u00a0 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043a (100 \u043c\u0441)\u2502\u00a0\u00a0 \u2514\u2500\u2500 dispatcher\/\u00a0\u00a0\u00a0 \u0440\u0435\u0435\u0441\u0442\u0440 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u251c\u2500\u2500 vmmdev\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b VMMDev: \u043f\u0430\u043a\u0435\u0442\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0444\u0438\u043b\u044c\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u251c\u2500\u2500 hgcm\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HGCM-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442: connect\/disconnect\/call, PageList\u251c\u2500\u2500 sys\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u041e\u0421: init, shutdown, ioctl\u251c\u2500\u2500 services\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 8 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\u2502\u00a0\u00a0 \u251c\u2500\u2500 mouse\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0430\u044f \u043c\u044b\u0448\u044c\u2502\u00a0\u00a0 \u251c\u2500\u2500 display\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0430\u0432\u0442\u043e\u0440\u0435\u0441\u0430\u0439\u0437 \u044d\u043a\u0440\u0430\u043d\u0430\u2502\u00a0\u00a0 \u251c\u2500\u2500 heartbeat\/\u00a0\u00a0\u00a0\u00a0 \u0441\u0438\u0433\u043d\u0430\u043b &#171;\u0433\u043e\u0441\u0442\u044c \u0436\u0438\u0432&#187;\u2502\u00a0\u00a0 \u251c\u2500\u2500 timesync\/\u00a0\u00a0\u00a0\u00a0\u00a0 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f RTC \u0441 \u0445\u043e\u0441\u0442\u043e\u043c\u2502\u00a0\u00a0 \u251c\u2500\u2500 guest_props\/\u00a0\u00a0 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u2502\u00a0\u00a0 \u251c\u2500\u2500 shared_folders\/ \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0424\u0421 \u0447\u0435\u0440\u0435\u0437 SHFL\u2502\u00a0\u00a0 \u251c\u2500\u2500 clipboard\/\u00a0\u00a0\u00a0\u00a0 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430\u2502\u00a0\u00a0 \u2514\u2500\u2500 seamless\/\u00a0\u00a0\u00a0\u00a0\u00a0 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c\u251c\u2500\u2500 data\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u2514\u2500\u2500 common\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u0443\u0442\u0438\u043b\u0438\u0442\u044b (\u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 UTF-8 &lt;\u2014&gt; CP866)\u0415\u0441\u043b\u0438 \u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0430 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u044d\u0442\u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0442\u0435\u043a. \u0421\u0432\u0435\u0440\u0445\u0443 \u2014 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 KolibriOS, \u0441\u043d\u0438\u0437\u0443 \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0436\u0435\u043b\u0435\u0437\u043e VMMDev \u043d\u0430 PCI-\u0448\u0438\u043d\u0435. \u0421\u0442\u0440\u0435\u043b\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u2014 \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (IOCTL \u043e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440); IRQ-\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 DMA-\u043e\u0442\u0432\u0435\u0442\u044b \u0445\u043e\u0441\u0442\u0430 \u0438\u0434\u0443\u0442 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u0441\u0445\u0435\u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0438\u0436\u0435: \u00ab\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b VMMDev\u00bb, \u00ab\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00bb, \u00ab\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439\u00bb, \u00ab\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\u00bb, \u00abHGCM\u00bb, \u00ab\u0421\u0435\u0440\u0432\u0438\u0441\u044b\u00bb.\u00a0\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\u041a\u0430\u043a \u0434\u0443\u043c\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435\u0412\u0441\u0451, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0438\u0436\u0435, \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043a\u0430\u043a \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f \u0441 \u0436\u0451\u0441\u0442\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e \u0441\u043b\u043e\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0434 \u0441\u043e\u0431\u043e\u0439.VMMDev \u2014 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442. \u041e\u0434\u0438\u043d \u043f\u043e\u0440\u0442, \u043e\u0434\u0438\u043d \u043a\u0443\u0441\u043e\u043a MMIO, \u043e\u0434\u043d\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435. \u0423\u043c\u0435\u0435\u0442: \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u044c \u043f\u0430\u043a\u0435\u0442\u00bb, \u00ab\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0439 \u0444\u043b\u0430\u0433\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\u00bb, \u00ab\u043f\u043e\u043b\u0443\u0447\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435\u00bb. \u041d\u0435 \u0443\u043c\u0435\u0435\u0442: \u0438\u043c\u0435\u043d\u0430, \u0441\u0435\u0441\u0441\u0438\u0438, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u044b. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u00ab\u0441\u0435\u0440\u0432\u0438\u0441\u044b\u00bb, \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432.HGCM \u2014 RPC \u043f\u043e\u0432\u0435\u0440\u0445 VMMDev. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0445\u043e\u0441\u0442\u0430, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u0432\u043a\u043b\u044e\u0447\u0430\u044f PageList \u0434\u043b\u044f DMA), \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b. \u0413\u0440\u0430\u043d\u0438\u0446\u0430: \u0432\u0441\u0451, \u0447\u0442\u043e \u0432\u044b\u0448\u0435 HGCM, \u043f\u0440\u043e VMMDev \u0443\u0436\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442.Dispatcher \u2014 \u0441\u0432\u043e\u0434\u0438\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u0445\u0443\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0420\u0435\u0448\u0430\u0435\u0442, \u043a\u043e\u043c\u0443 \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0443\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0441\u0443\u043f\u0435\u0440\u0441\u0435\u0442 \u043c\u0430\u0441\u043e\u043a \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0445\u043e\u0441\u0442\u0443.Services \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0444\u0438\u0447\u0438: \u043c\u044b\u0448\u044c, \u0434\u0438\u0441\u043f\u043b\u0435\u0439, shared clipboard, shared folders \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0436\u0438\u0432\u0451\u0442 \u0432 \u0441\u0432\u043e\u0451\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0445\u0443\u043a\u043e\u0432 (fn_init\/fn_enable\/fn_on_event\/fn_on_tick\/&#8230;) \u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438 \u043f\u0440\u043e PCI, \u043d\u0438 \u043f\u0440\u043e VMMDev-\u043f\u0430\u043a\u0435\u0442\u044b, \u043d\u0438 \u043f\u0440\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439.\u0412 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 (\u0441\u0442\u0435\u043a \u0441\u043b\u043e\u0451\u0432, \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435) \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u0432\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430:\u0421\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 IOCTL -&gt; sys\/ \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 -&gt; \u0441\u0435\u0440\u0432\u0438\u0441 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 HGCM-\u0432\u044b\u0437\u043e\u0432 -&gt; HGCM \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0432 VMMDev-\u043f\u0430\u043a\u0435\u0442 -&gt; out \u0432 BAR0.\u0421\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u043e\u0442\u0432\u0435\u0442\u044b: \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 VMMDev -&gt; core\/irq \u0447\u0438\u0442\u0430\u0435\u0442 \u043c\u0430\u0441\u043a\u0443 -&gt; dispatcher_dispatch \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e: \u0445\u043e\u0441\u0442, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0432 HGCM-\u0437\u0430\u043f\u0440\u043e\u0441, DMA-\u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u043b\u0430\u0433 REQ_DONE \u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0430\u043a\u0435\u0442\u0430. \u0413\u043e\u0441\u0442\u044c \u0432 spin-loop \u0438\u043b\u0438 \u043f\u043e \u0442\u0438\u043a\u0443 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0432\u0438\u0434\u0438\u0442 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435.\u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u043e\u0439 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u2014 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0447\u0442\u043e \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435.\u0422\u0440\u0438 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 upstream-\u043c\u043e\u0434\u0435\u043b\u0438\u0411\u043e\u0301\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0435 \u2014 \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u0430 \u0442\u0440\u0438 \u0442\u043e\u0447\u043a\u0438, \u0433\u0434\u0435 \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043d\u0435 \u043e\u0431\u0449\u0430\u044f \u0434\u043b\u044f upstream \u0441\u0445\u0435\u043c\u0430. \u041a \u043d\u0438\u043c \u0441\u0442\u043e\u0438\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043c\u0435\u0440\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438:Shared Folders (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b SHFL). \u0425\u043e\u0441\u0442 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c VERR_INVALID_PARAMETER \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f, \u0432 \u043a\u0430\u043a\u043e\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412 upstream \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u043c \u0438 \u043e\u0431\u0449\u0438\u043c\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438. \u0417\u0434\u0435\u0441\u044c, \u0431\u0435\u0437 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0434\u043b\u044f FASM, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u0431\u0430\u0439\u0442\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0448\u043b\u0451\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.Clipboard (\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 listener). MSG_OLD_GET_WAIT \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Shared Clipboard (\u0441\u0442\u0430\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f), \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u00ab\u0436\u0434\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430\u00bb, \u043c\u043e\u0436\u0435\u0442 \u0432\u0438\u0441\u0435\u0442\u044c \u043c\u0438\u043d\u0443\u0442\u0430\u043c\u0438, \u043f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0441\u0442\u0430 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442. \u0412 upstream \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f wait-queue: \u043f\u043e\u0442\u043e\u043a \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0441\u043f\u0438\u0442, \u0435\u0433\u043e \u0431\u0443\u0434\u044f\u0442 \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e. \u0412 KolibriOS \u0430\u043d\u0430\u043b\u043e\u0433 \u0435\u0441\u0442\u044c \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u044f\u0434\u0440\u0430 (CreateEvent + WaitEventTimeout), \u2014 \u043d\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0445 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u043b\u0430\u0433\u0430 REQ_DONE \u0440\u0430\u0437 \u0432 100 \u043c\u0441 \u0438\u0437 \u0442\u0438\u043a\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u0430, \u043c\u0438\u043c\u043e \u043e\u0431\u0449\u0435\u0433\u043e HGCM-\u0441\u043b\u043e\u0442\u0430 \u0438 \u043c\u0438\u043c\u043e spin-loop. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0434\u043e\u043b\u0433\u043e\u043c: \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0443\u0431\u0435\u0440\u0451\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0442\u0438\u043a\u0430 \u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 (\u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e 100 \u043c\u0441). Display resize (\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 500 \u043c\u0441). \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 500 \u043c\u0441. \u042d\u0442\u043e \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u043e\u0431\u0438\u043b\u0438\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442 \u0445\u043e\u0441\u0442\u0430 (\u0438\u0445 \u043d\u0435\u043c\u043d\u043e\u0433\u043e), \u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 SetScreen \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043a\u0440\u0430\u0448\u0443 taskbar\u2019\u0430 \u0438\u0437-\u0437\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u044f\u0434\u0440\u0435 KolibriOS (\u043e\u043a\u043d\u0430 \u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u044d\u043a\u0440\u0430\u043d\u0430). \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u2014 \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0441\u0442\u044b\u043b\u044c, \u0441\u043d\u0438\u0436\u0430\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u0440\u0430\u0448\u0430 \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0438 \u043e\u043a\u043d\u0430. \u042d\u0442\u0438 \u0442\u0440\u0438 \u043c\u0435\u0441\u0442\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0437\u0434\u0435\u0441\u044c \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0435\u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f upstream.\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b VMMDevVMMDev \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440. \u0412\u0441\u0451 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0433\u043e\u0441\u0442\u044f \u0441 \u0445\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0451: \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u0445\u043e\u0441\u0442\u0430, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f), \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (\u043c\u044b\u0448\u044c, \u0434\u0438\u0441\u043f\u043b\u0435\u0439, clipboard, heartbeat), RPC-\u0432\u044b\u0437\u043e\u0432\u044b \u043f\u043e\u0432\u0435\u0440\u0445 HGCM. \u041f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0434\u0440\u0430\u0439\u0432\u0435\u0440, \u043d\u0435\u043b\u044c\u0437\u044f, \u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 \u044d\u0442\u0438\u043c \u0441\u043b\u043e\u0435\u043c \u2014 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0442\u043e\u044f\u0442 \u043d\u0430 \u043d\u0451\u043c.\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 PCI-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 Vendor ID 0x80EE \u0438 Device ID 0xCAFE. \u041d\u0430 \u043d\u0435\u0433\u043e VirtualBox \u0432\u0435\u0448\u0430\u0435\u0442 \u043e\u0434\u0438\u043d I\/O-\u043f\u043e\u0440\u0442, \u043e\u043a\u043d\u043e MMIO \u0438 \u043b\u0438\u043d\u0438\u044e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u2014 \u0442\u0440\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435.VirtualBox \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0443 \u0442\u0440\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430:BAR0 (I\/O-\u043f\u043e\u0440\u0442) \u2014 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0440\u0442\u0430 \u0432 16-\u0431\u0438\u0442\u043d\u043e\u043c I\/O-\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 x86. \u0412 \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 RAM. \u042d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0443:  \u00ab\u0432\u043e\u0437\u044c\u043c\u0438 \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0439\u00bb.BAR1 (MMIO, 4 \u041c\u0411) \u2014 \u043e\u043a\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0447\u0438\u0442\u0430\u0435\u0442 \u0444\u043b\u0430\u0433\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0447\u0435\u0440\u0435\u0437 MMIO \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442.IRQ \u2014 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 PCI Configuration Space, \u043f\u043e\u043b\u0435 interrupt_line (offset 0x3C \u0432 header type 00). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0438 \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 HGCM-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0430\u043a\u0435\u0442\u0430\u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a VMMDev \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 24-\u0431\u0430\u0439\u0442\u043d\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (VMMDEV_HEADER) \u2014 \u044d\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 v1_04, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0435 f_requestor. \u0412 v1_03 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0431\u044b\u043b 20 \u0431\u0430\u0439\u0442 (\u0431\u0435\u0437 f_requestor); \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0441\u0438\u0439 \u2014 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\u00bb.size\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dd\u00a0\u00a0\u00a0 &#8212; \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0441\u0435\u0433\u043e&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-481283","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=481283"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481283\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}