vbox: enable USB (OHCI) pass-through support
The information about connected devices is obtained from a ROM file named 'usb_devices', which is supposed to contain a device list as in the device report generated by the USB driver (see issue #1506). A policy for 'report_rom' would look like: <policy label="vbox -> usb_devices" report="usb_drv -> devices"/> If the 'usb_devices' ROM file is not available, a warning message gets printed and VirtualBox continues without USB pass-through support. The devices to be passed-through need to have a matching device filter in the '.vbox' file. Example: <USB> <DeviceFilters> <DeviceFilter name="USB Scanner" active="true" vendorId="04a9" productId="2220" remote="0"/> </DeviceFilters> </USB> The feature was tested with HID devices (mouse, keyboard) and a flatbed scanner. Mass storage devices didn't work correctly (they also didn't work with VirtualBox on Linux without the closed-source extension pack). It should be made sure that the USB driver does not try to control the devices to be passed-through itself, for example, when passing-through a HID device, the '<hid/>' config option should not be set. Fixes #1507
This commit is contained in:
parent
2d869dd15e
commit
88034ef836
|
@ -30,6 +30,7 @@ SRC_CC += Main/src-client/MouseImpl.cpp
|
||||||
SRC_CC += Main/src-client/VBoxDriversRegister.cpp
|
SRC_CC += Main/src-client/VBoxDriversRegister.cpp
|
||||||
SRC_CC += Main/src-client/VMMDevInterface.cpp
|
SRC_CC += Main/src-client/VMMDevInterface.cpp
|
||||||
SRC_CC += Main/src-client/SessionImpl.cpp
|
SRC_CC += Main/src-client/SessionImpl.cpp
|
||||||
|
SRC_CC += Main/src-client/USBDeviceImpl.cpp
|
||||||
|
|
||||||
SRC_CC += Main/src-server/AudioAdapterImpl.cpp
|
SRC_CC += Main/src-server/AudioAdapterImpl.cpp
|
||||||
SRC_CC += Main/src-server/BandwidthControlImpl.cpp
|
SRC_CC += Main/src-server/BandwidthControlImpl.cpp
|
||||||
|
@ -38,6 +39,7 @@ SRC_CC += Main/src-server/BIOSSettingsImpl.cpp
|
||||||
SRC_CC += Main/src-server/ClientToken.cpp
|
SRC_CC += Main/src-server/ClientToken.cpp
|
||||||
SRC_CC += Main/src-server/DHCPServerImpl.cpp
|
SRC_CC += Main/src-server/DHCPServerImpl.cpp
|
||||||
SRC_CC += Main/src-server/GuestOSTypeImpl.cpp
|
SRC_CC += Main/src-server/GuestOSTypeImpl.cpp
|
||||||
|
SRC_CC += Main/src-server/HostUSBDeviceImpl.cpp
|
||||||
SRC_CC += Main/src-server/MachineImpl.cpp
|
SRC_CC += Main/src-server/MachineImpl.cpp
|
||||||
SRC_CC += Main/src-server/MachineImplCloneVM.cpp
|
SRC_CC += Main/src-server/MachineImplCloneVM.cpp
|
||||||
SRC_CC += Main/src-server/Matching.cpp
|
SRC_CC += Main/src-server/Matching.cpp
|
||||||
|
@ -57,6 +59,7 @@ SRC_CC += Main/src-server/TokenImpl.cpp
|
||||||
SRC_CC += Main/src-server/USBControllerImpl.cpp
|
SRC_CC += Main/src-server/USBControllerImpl.cpp
|
||||||
SRC_CC += Main/src-server/USBDeviceFilterImpl.cpp
|
SRC_CC += Main/src-server/USBDeviceFilterImpl.cpp
|
||||||
SRC_CC += Main/src-server/USBDeviceFiltersImpl.cpp
|
SRC_CC += Main/src-server/USBDeviceFiltersImpl.cpp
|
||||||
|
SRC_CC += Main/src-server/USBProxyService.cpp
|
||||||
SRC_CC += Main/src-server/VirtualBoxImpl.cpp
|
SRC_CC += Main/src-server/VirtualBoxImpl.cpp
|
||||||
SRC_CC += Main/src-server/VRDEServerImpl.cpp
|
SRC_CC += Main/src-server/VRDEServerImpl.cpp
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ SRC_CC += Runtime/common/log/logrel.cpp \
|
||||||
$(addprefix Runtime/generic/,$(filter-out $(FILTERED_OUT_SRC_CC), $(GENERIC_SRC_CC)))
|
$(addprefix Runtime/generic/,$(filter-out $(FILTERED_OUT_SRC_CC), $(GENERIC_SRC_CC)))
|
||||||
|
|
||||||
SRC_CC += Runtime/common/err/RTErrConvertFromErrno.cpp
|
SRC_CC += Runtime/common/err/RTErrConvertFromErrno.cpp
|
||||||
|
SRC_CC += Runtime/common/alloc/alloc.cpp
|
||||||
SRC_CC += Runtime/common/alloc/memcache.cpp
|
SRC_CC += Runtime/common/alloc/memcache.cpp
|
||||||
SRC_CC += Runtime/common/alloc/heapoffset.cpp
|
SRC_CC += Runtime/common/alloc/heapoffset.cpp
|
||||||
SRC_CC += Runtime/common/checksum/alt-md5.cpp
|
SRC_CC += Runtime/common/checksum/alt-md5.cpp
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
43d2aa6fa21dcf782a5c2539d6056575602bc545
|
1722a638eb0095d736afffa29431c9c4da8f1d9b
|
||||||
|
|
|
@ -28,17 +28,18 @@ VBOX_MAIN_ALL += VirtualBoxBase
|
||||||
VBOX_MAIN_CLI := AdditionsFacilityImpl ConsoleImpl2 DisplayImpl HGCM HGCMThread
|
VBOX_MAIN_CLI := AdditionsFacilityImpl ConsoleImpl2 DisplayImpl HGCM HGCMThread
|
||||||
VBOX_MAIN_CLI += HGCMObjects
|
VBOX_MAIN_CLI += HGCMObjects
|
||||||
VBOX_MAIN_CLI += KeyboardImpl SessionImpl VMMDevInterface BusAssignmentManager
|
VBOX_MAIN_CLI += KeyboardImpl SessionImpl VMMDevInterface BusAssignmentManager
|
||||||
VBOX_MAIN_CLI += ConsoleImpl GuestImpl MouseImpl VBoxDriversRegister
|
VBOX_MAIN_CLI += ConsoleImpl GuestImpl MouseImpl USBDeviceImpl VBoxDriversRegister
|
||||||
|
|
||||||
VBOX_MAIN_SRV := AudioAdapterImpl ClientToken DHCPServerImpl Matching MediumAttachmentImpl
|
VBOX_MAIN_SRV := AudioAdapterImpl ClientToken DHCPServerImpl Matching
|
||||||
VBOX_MAIN_SRV += NATEngineImpl SerialPortImpl
|
VBOX_MAIN_SRV += MediumAttachmentImpl NATEngineImpl SerialPortImpl
|
||||||
VBOX_MAIN_SRV += BandwidthControlImpl GuestOSTypeImpl MediumFormatImpl
|
VBOX_MAIN_SRV += BandwidthControlImpl GuestOSTypeImpl HostUSBDeviceImpl
|
||||||
VBOX_MAIN_SRV += NetworkAdapterImpl SnapshotImpl
|
VBOX_MAIN_SRV += MediumFormatImpl NetworkAdapterImpl SnapshotImpl
|
||||||
VBOX_MAIN_SRV += BandwidthGroupImpl MachineImplCloneVM MediumImpl
|
VBOX_MAIN_SRV += BandwidthGroupImpl MachineImplCloneVM MediumImpl
|
||||||
VBOX_MAIN_SRV += NetworkServiceRunner StorageControllerImpl VirtualBoxImpl
|
VBOX_MAIN_SRV += NetworkServiceRunner StorageControllerImpl VirtualBoxImpl
|
||||||
VBOX_MAIN_SRV += BIOSSettingsImpl MachineImpl MediumLock ParallelPortImpl
|
VBOX_MAIN_SRV += BIOSSettingsImpl MachineImpl MediumLock ParallelPortImpl
|
||||||
VBOX_MAIN_SRV += SystemPropertiesImpl VRDEServerImpl TokenImpl
|
VBOX_MAIN_SRV += SystemPropertiesImpl VRDEServerImpl TokenImpl
|
||||||
VBOX_MAIN_SRV += USBControllerImpl USBDeviceFilterImpl USBDeviceFiltersImpl
|
VBOX_MAIN_SRV += USBControllerImpl USBDeviceFilterImpl USBDeviceFiltersImpl
|
||||||
|
VBOX_MAIN_SRV += USBProxyService
|
||||||
|
|
||||||
VBOX_MAIN_INC := AdditionsFacilityImpl AudioAdapterImpl AudioSnifferInterface
|
VBOX_MAIN_INC := AdditionsFacilityImpl AudioAdapterImpl AudioSnifferInterface
|
||||||
VBOX_MAIN_INC += AutoCaller AutostartDb AutoStateDep BandwidthControlImpl
|
VBOX_MAIN_INC += AutoCaller AutostartDb AutoStateDep BandwidthControlImpl
|
||||||
|
@ -60,6 +61,7 @@ VBOX_MAIN_INC += USBProxyService VirtualBoxImpl VRDEServerImpl GuestProcessImpl
|
||||||
VBOX_MAIN_INC += USBDeviceImpl HostUSBDeviceImpl Matching Wrapper
|
VBOX_MAIN_INC += USBDeviceImpl HostUSBDeviceImpl Matching Wrapper
|
||||||
|
|
||||||
VBOX_SRC_VBOX := VMM Devices Runtime GuestHost/HGSMI Storage Disassembler
|
VBOX_SRC_VBOX := VMM Devices Runtime GuestHost/HGSMI Storage Disassembler
|
||||||
|
VBOX_SRC_VBOX += HostDrivers/VBoxUSB/USBFilter.cpp
|
||||||
VBOX_SRC_VBOX += HostServices/SharedFolders Main/xml/Settings.cpp
|
VBOX_SRC_VBOX += HostServices/SharedFolders Main/xml/Settings.cpp
|
||||||
VBOX_SRC_VBOX += Main/xml/VirtualBox-settings.xsd Main/xml/SchemaDefs.xsl
|
VBOX_SRC_VBOX += Main/xml/VirtualBox-settings.xsd Main/xml/SchemaDefs.xsl
|
||||||
VBOX_SRC_VBOX += $(addsuffix .h, $(addprefix Main/include/, $(VBOX_MAIN_INC)))
|
VBOX_SRC_VBOX += $(addsuffix .h, $(addprefix Main/include/, $(VBOX_MAIN_INC)))
|
||||||
|
|
|
@ -75,6 +75,7 @@ append config_of_app {
|
||||||
<policy label="vbox_pointer -> hover" report="nitpicker -> hover"/>
|
<policy label="vbox_pointer -> hover" report="nitpicker -> hover"/>
|
||||||
<policy label="vbox_pointer -> xray" report="nitpicker -> xray"/>
|
<policy label="vbox_pointer -> xray" report="nitpicker -> xray"/>
|
||||||
<policy label="vbox_pointer -> shape" report="vbox -> shape"/>
|
<policy label="vbox_pointer -> shape" report="vbox -> shape"/>
|
||||||
|
<policy label="vbox -> usb_devices" report="usb_drv -> devices"/>
|
||||||
</rom>
|
</rom>
|
||||||
</config>
|
</config>
|
||||||
</start>
|
</start>
|
||||||
|
@ -156,6 +157,9 @@ append config_of_app {
|
||||||
<service name="File_system"> <child name="rump_fs"/> </service>
|
<service name="File_system"> <child name="rump_fs"/> </service>
|
||||||
<service name="Framebuffer"> <child name="nit_fb" /> </service>
|
<service name="Framebuffer"> <child name="nit_fb" /> </service>
|
||||||
<service name="Input"> <child name="nit_fb" /> </service>
|
<service name="Input"> <child name="nit_fb" /> </service>
|
||||||
|
<service name="ROM">
|
||||||
|
<if-arg key="label" value="usb_devices"/> <child name="report_rom"/>
|
||||||
|
</service>
|
||||||
<any-service> <parent/> <any-child /> </any-service>
|
<any-service> <parent/> <any-child /> </any-service>
|
||||||
</route>
|
</route>
|
||||||
</start>
|
</start>
|
||||||
|
|
|
@ -141,10 +141,16 @@ append_if [expr $use_ps2] config {
|
||||||
|
|
||||||
append_if [expr $use_usb] config {
|
append_if [expr $use_usb] config {
|
||||||
<start name="usb_drv" priority="-1">
|
<start name="usb_drv" priority="-1">
|
||||||
<resource name="RAM" quantum="7M"/>
|
<resource name="RAM" quantum="8M"/>
|
||||||
<provides><service name="Input"/></provides>
|
<provides>
|
||||||
|
<service name="Input"/>
|
||||||
|
<service name="Usb" />
|
||||||
|
</provides>
|
||||||
<config uhci="yes" ehci="yes" xhci="yes">
|
<config uhci="yes" ehci="yes" xhci="yes">
|
||||||
<hid/>
|
<hid/>
|
||||||
|
<raw>
|
||||||
|
<report devices="yes"/>
|
||||||
|
</raw>
|
||||||
</config>
|
</config>
|
||||||
<route>
|
<route>
|
||||||
<service name="IRQ"><child name="acpi" /></service>
|
<service name="IRQ"><child name="acpi" /></service>
|
||||||
|
|
480
repos/ports/src/virtualbox/frontend/USBProxyDevice-genode.cpp
Normal file
480
repos/ports/src/virtualbox/frontend/USBProxyDevice-genode.cpp
Normal file
|
@ -0,0 +1,480 @@
|
||||||
|
/*
|
||||||
|
* \brief USBProxyDevice implementation for Genode
|
||||||
|
* \author Christian Prochaska
|
||||||
|
* \date 2015-04-13
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is distributed under the terms of the GNU General Public License
|
||||||
|
* version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <base/allocator_avl.h>
|
||||||
|
#include <base/printf.h>
|
||||||
|
#include <timer_session/connection.h>
|
||||||
|
#include <usb_session/connection.h>
|
||||||
|
#include <util/construct_at.h>
|
||||||
|
|
||||||
|
#include <VBox/vmm/pdm.h>
|
||||||
|
|
||||||
|
#include "USBProxyDevice.h"
|
||||||
|
|
||||||
|
namespace Usb_proxy_device_genode {
|
||||||
|
|
||||||
|
static constexpr bool debug = false;
|
||||||
|
|
||||||
|
struct State_change_signal_context : Genode::Signal_context { };
|
||||||
|
struct Ack_avail_signal_context : Genode::Signal_context { };
|
||||||
|
struct Timeout_signal_context : Genode::Signal_context { };
|
||||||
|
struct Wakeup_signal_context : Genode::Signal_context { };
|
||||||
|
|
||||||
|
class Data
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
Genode::Allocator_avl _alloc;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Usb::Connection usb_connection;
|
||||||
|
Timer::Connection timer;
|
||||||
|
|
||||||
|
State_change_signal_context state_change_signal_context;
|
||||||
|
Ack_avail_signal_context ack_avail_signal_context;
|
||||||
|
Timeout_signal_context timeout_signal_context;
|
||||||
|
Wakeup_signal_context wakeup_signal_context;
|
||||||
|
Genode::Signal_context_capability wakeup_signal_context_cap;
|
||||||
|
|
||||||
|
Genode::Signal_receiver signal_receiver;
|
||||||
|
|
||||||
|
Data(unsigned int vendor_id, unsigned int product_id)
|
||||||
|
: _alloc(Genode::env()->heap()),
|
||||||
|
usb_connection(&_alloc, vendor_id, product_id)
|
||||||
|
{
|
||||||
|
/* wait until device and server are ready */
|
||||||
|
|
||||||
|
Genode::Signal_context_capability state_change_signal_context_cap =
|
||||||
|
signal_receiver.manage(&state_change_signal_context);
|
||||||
|
|
||||||
|
usb_connection.sigh_state_change(state_change_signal_context_cap);
|
||||||
|
|
||||||
|
signal_receiver.wait_for_signal();
|
||||||
|
|
||||||
|
/* register the other signal handlers */
|
||||||
|
|
||||||
|
Genode::Signal_context_capability ack_avail_signal_context_cap =
|
||||||
|
signal_receiver.manage(&ack_avail_signal_context);
|
||||||
|
usb_connection.tx_channel()->sigh_ack_avail(ack_avail_signal_context_cap);
|
||||||
|
|
||||||
|
Genode::Signal_context_capability timeout_signal_context_cap =
|
||||||
|
signal_receiver.manage(&timeout_signal_context);
|
||||||
|
timer.sigh(timeout_signal_context_cap);
|
||||||
|
|
||||||
|
wakeup_signal_context_cap = signal_receiver.manage(&wakeup_signal_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/* keep a reference to the VirtualBox URB in a packet descriptor */
|
||||||
|
struct Urb_preserve_completion : Usb::Completion
|
||||||
|
{
|
||||||
|
PVUSBURB pUrb;
|
||||||
|
|
||||||
|
void complete(Usb::Packet_descriptor &p) { }
|
||||||
|
|
||||||
|
Urb_preserve_completion(PVUSBURB pUrb) : pUrb(pUrb) { }
|
||||||
|
virtual ~Urb_preserve_completion() { }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int open(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend);
|
||||||
|
static int init(PUSBPROXYDEV pProxyDev);
|
||||||
|
static void close(PUSBPROXYDEV pProxyDev);
|
||||||
|
static int reset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux);
|
||||||
|
static int set_config(PUSBPROXYDEV pProxyDev, int iCfg);
|
||||||
|
static int claim_interface(PUSBPROXYDEV pProxyDev, int iIf);
|
||||||
|
static int release_interface(PUSBPROXYDEV pProxyDev, int iIf);
|
||||||
|
static int set_interface(PUSBPROXYDEV pProxyDev, int iIf, int iSetting);
|
||||||
|
static int clear_halted_endpoint(PUSBPROXYDEV pDev, unsigned int iEp);
|
||||||
|
static int urb_queue(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb);
|
||||||
|
static int urb_cancel(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb);
|
||||||
|
static PVUSBURB urb_reap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies);
|
||||||
|
static int wakeup(PUSBPROXYDEV pProxyDev);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::open(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
|
||||||
|
{
|
||||||
|
char vendor_id_hex_str[7] = "0x";
|
||||||
|
char product_id_hex_str[7] = "0x";
|
||||||
|
const char *separator = strchr(pszAddress, ':');
|
||||||
|
|
||||||
|
Genode::strncpy(&vendor_id_hex_str[2], pszAddress, 5);
|
||||||
|
Genode::strncpy(&product_id_hex_str[2], separator + 1, 5);
|
||||||
|
|
||||||
|
unsigned int vendor_id;
|
||||||
|
unsigned int product_id;
|
||||||
|
|
||||||
|
Genode::ascii_to(vendor_id_hex_str, vendor_id);
|
||||||
|
Genode::ascii_to(product_id_hex_str, product_id);
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("vendor_id: %x, product_id: %x", vendor_id, product_id);
|
||||||
|
|
||||||
|
Usb_proxy_device_genode::Data *data =
|
||||||
|
USBPROXYDEV_2_DATA(pProxyDev, Usb_proxy_device_genode::Data*);
|
||||||
|
|
||||||
|
Genode::construct_at<Usb_proxy_device_genode::Data>(data, vendor_id, product_id);
|
||||||
|
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::init(PUSBPROXYDEV pProxyDev)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented, returning VINF_SUCCESS anyway");
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Usb_proxy_device_genode::close(PUSBPROXYDEV pProxyDev)
|
||||||
|
{
|
||||||
|
Usb_proxy_device_genode::Data *data =
|
||||||
|
USBPROXYDEV_2_DATA(pProxyDev, Usb_proxy_device_genode::Data*);
|
||||||
|
|
||||||
|
data->~Data();
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::reset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented, returning VINF_SUCCESS anyway");
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::set_config(PUSBPROXYDEV pProxyDev, int iCfg)
|
||||||
|
{
|
||||||
|
if (iCfg == 1) {
|
||||||
|
/* default configuration */
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented, returning VINF_SUCCESS anyway");
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
} else {
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented and iCfg != 1");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::claim_interface(PUSBPROXYDEV pProxyDev, int iIf)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented, returning VINF_SUCCESS anyway");
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::release_interface(PUSBPROXYDEV pProxyDev, int iIf)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::set_interface(PUSBPROXYDEV pProxyDev, int iIf, int iSetting)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::clear_halted_endpoint(PUSBPROXYDEV pDev, unsigned int iEp)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented, returning VINF_SUCCESS anyway");
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::urb_queue(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("EndPt = %u, enmType = %d, enmDir = %d, cbData = %u",
|
||||||
|
pUrb->EndPt, pUrb->enmType, pUrb->enmDir, pUrb->cbData);
|
||||||
|
|
||||||
|
static int count = 0;
|
||||||
|
|
||||||
|
const char *dir_str = (pUrb->enmDir == VUSBDIRECTION_OUT) ? "OUT" : "IN";
|
||||||
|
|
||||||
|
Usb_proxy_device_genode::Data *data =
|
||||||
|
USBPROXYDEV_2_DATA(pProxyDev, Usb_proxy_device_genode::Data*);
|
||||||
|
|
||||||
|
if (!data->usb_connection.source()->ready_to_submit()) {
|
||||||
|
PERR("%s: not ready to submit", __PRETTY_FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (pUrb->enmType == VUSBXFERTYPE_MSG) {
|
||||||
|
|
||||||
|
if (pUrb->cbData < sizeof(VUSBSETUP))
|
||||||
|
return VERR_BUFFER_UNDERFLOW;
|
||||||
|
|
||||||
|
PVUSBSETUP pSetup = (PVUSBSETUP)pUrb->abData;
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("control %s transfer: request_type = 0x%x, request = 0x%x,"
|
||||||
|
"value = 0x%x, index = 0x%x, length = %u, cbData = %u",
|
||||||
|
dir_str, pSetup->bmRequestType, pSetup->bRequest,
|
||||||
|
pSetup->wValue, pSetup->wIndex, pSetup->wLength, pUrb->cbData);
|
||||||
|
|
||||||
|
Usb::Packet_descriptor p = data->usb_connection.source()->alloc_packet(pSetup->wLength);
|
||||||
|
|
||||||
|
p.type = Usb::Packet_descriptor::CTRL;
|
||||||
|
p.succeded = false;
|
||||||
|
p.control.request = pSetup->bRequest;
|
||||||
|
p.control.request_type = pSetup->bmRequestType;
|
||||||
|
p.control.value = pSetup->wValue;
|
||||||
|
p.control.index = pSetup->wIndex;
|
||||||
|
p.control.timeout = 1000;
|
||||||
|
p.completion = new Urb_preserve_completion(pUrb);
|
||||||
|
|
||||||
|
if ((pUrb->enmDir == VUSBDIRECTION_OUT) && (pSetup->wLength > 0)) {
|
||||||
|
char *packet_content = data->usb_connection.source()->packet_content(p);
|
||||||
|
Genode::memcpy(packet_content, (pSetup + 1), pSetup->wLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("submitting packet: %d", ++count);
|
||||||
|
|
||||||
|
data->usb_connection.source()->submit_packet(p);
|
||||||
|
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
|
||||||
|
} else if ((pUrb->enmType == VUSBXFERTYPE_INTR) ||
|
||||||
|
(pUrb->enmType == VUSBXFERTYPE_BULK)) {
|
||||||
|
|
||||||
|
Usb::Packet_descriptor p = data->usb_connection.source()->alloc_packet(pUrb->cbData);
|
||||||
|
|
||||||
|
if (pUrb->enmType == VUSBXFERTYPE_INTR) {
|
||||||
|
if (debug)
|
||||||
|
PDBG("interrupt %s transfer", dir_str);
|
||||||
|
p.type = Usb::Packet_descriptor::IRQ;
|
||||||
|
} else {
|
||||||
|
if (debug)
|
||||||
|
PDBG("bulk %s transfer", dir_str);
|
||||||
|
p.type = Usb::Packet_descriptor::BULK;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.succeded = false;
|
||||||
|
p.transfer.ep = pUrb->EndPt | (pUrb->enmDir == VUSBDIRECTION_IN ?
|
||||||
|
Usb::ENDPOINT_IN :
|
||||||
|
Usb::ENDPOINT_OUT);
|
||||||
|
p.transfer.timeout = 100;
|
||||||
|
p.completion = new Urb_preserve_completion(pUrb);
|
||||||
|
|
||||||
|
if ((pUrb->enmDir == VUSBDIRECTION_OUT) && (pUrb->cbData > 0)) {
|
||||||
|
char *packet_content = data->usb_connection.source()->packet_content(p);
|
||||||
|
Genode::memcpy(packet_content, pUrb->abData, pUrb->cbData);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("submitting packet: %d", ++count);
|
||||||
|
|
||||||
|
data->usb_connection.source()->submit_packet(p);
|
||||||
|
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
|
||||||
|
} else
|
||||||
|
PERR("%s: unsupported transfer type %d", __PRETTY_FUNCTION__, (int)pUrb->enmType);
|
||||||
|
|
||||||
|
} catch (Usb::Session::Tx::Source::Packet_alloc_failed) {
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("packet allocation failed");
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
} catch (...) {
|
||||||
|
|
||||||
|
PWRN("%s: an unhandled exception occured", __PRETTY_FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::urb_cancel(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("not implemented, returning VINF_SUCCESS anyway");
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVUSBURB Usb_proxy_device_genode::urb_reap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("cMillies = %u", cMillies);
|
||||||
|
|
||||||
|
Usb_proxy_device_genode::Data *data =
|
||||||
|
USBPROXYDEV_2_DATA(pProxyDev, Usb_proxy_device_genode::Data*);
|
||||||
|
|
||||||
|
if (!data->usb_connection.source()->ack_avail()) {
|
||||||
|
|
||||||
|
unsigned long elapsed_ms_start = data->timer.elapsed_ms();
|
||||||
|
|
||||||
|
if (cMillies != RT_INDEFINITE_WAIT)
|
||||||
|
data->timer.trigger_once(cMillies * 1000);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("waiting for signal");
|
||||||
|
|
||||||
|
Genode::Signal signal = data->signal_receiver.wait_for_signal();
|
||||||
|
|
||||||
|
Genode::Signal_context *context = signal.context();
|
||||||
|
|
||||||
|
if (dynamic_cast<Timeout_signal_context*>(context)) {
|
||||||
|
|
||||||
|
if (cMillies == RT_INDEFINITE_WAIT) {
|
||||||
|
/* received an old signal */
|
||||||
|
if (debug)
|
||||||
|
PDBG("old timeout signal received");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long elapsed_ms_now = data->timer.elapsed_ms();
|
||||||
|
|
||||||
|
if (elapsed_ms_now - elapsed_ms_start < cMillies) {
|
||||||
|
/* received an old signal */
|
||||||
|
if (debug)
|
||||||
|
PDBG("old timeout signal received");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("timeout signal received");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} else if (dynamic_cast<Wakeup_signal_context*>(context)) {
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("wakeup signal received");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} else if (dynamic_cast<Ack_avail_signal_context*>(context)) {
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("ack avail signal received");
|
||||||
|
|
||||||
|
if (data->usb_connection.source()->ack_avail())
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (dynamic_cast<State_change_signal_context*>(context)) {
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("state change signal received");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Usb::Packet_descriptor p = data->usb_connection.source()->get_acked_packet();
|
||||||
|
|
||||||
|
static int count = 0;
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("got packet: %d, succeded = %d", ++count, p.succeded);
|
||||||
|
|
||||||
|
Urb_preserve_completion *completion = static_cast<Urb_preserve_completion*>(p.completion);
|
||||||
|
PVUSBURB pUrb = completion->pUrb;
|
||||||
|
delete completion;
|
||||||
|
|
||||||
|
if (!p.succeded) {
|
||||||
|
pUrb->enmStatus = VUSBSTATUS_DNR;
|
||||||
|
return pUrb;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pUrb->enmType == VUSBXFERTYPE_MSG) {
|
||||||
|
|
||||||
|
PVUSBSETUP pSetup = (PVUSBSETUP)pUrb->abData;
|
||||||
|
|
||||||
|
pSetup->wLength = p.control.actual_size;
|
||||||
|
pUrb->cbData = sizeof(VUSBSETUP) + pSetup->wLength;
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("pSetup->wLength = %u, pUrb->cbData = %u",
|
||||||
|
pSetup->wLength, pUrb->cbData);
|
||||||
|
|
||||||
|
if ((pUrb->enmDir == VUSBDIRECTION_IN) && (pSetup->wLength > 0)) {
|
||||||
|
char *packet_content = data->usb_connection.source()->packet_content(p);
|
||||||
|
Genode::memcpy((pSetup + 1), packet_content, pSetup->wLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
data->usb_connection.source()->release_packet(p);
|
||||||
|
|
||||||
|
pUrb->enmStatus = VUSBSTATUS_OK;
|
||||||
|
|
||||||
|
} else if ((pUrb->enmType == VUSBXFERTYPE_INTR) ||
|
||||||
|
(pUrb->enmType == VUSBXFERTYPE_BULK)) {
|
||||||
|
|
||||||
|
pUrb->cbData = p.transfer.actual_size;
|
||||||
|
|
||||||
|
if ((pUrb->enmDir == VUSBDIRECTION_IN) && (pUrb->cbData > 0)) {
|
||||||
|
char *packet_content = data->usb_connection.source()->packet_content(p);
|
||||||
|
Genode::memcpy(pUrb->abData, packet_content, pUrb->cbData);
|
||||||
|
}
|
||||||
|
|
||||||
|
data->usb_connection.source()->release_packet(p);
|
||||||
|
|
||||||
|
pUrb->enmStatus = VUSBSTATUS_OK;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
PERR("%s: unsupported transfer type %d", __PRETTY_FUNCTION__, (int)pUrb->enmType);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pUrb;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int Usb_proxy_device_genode::wakeup(PUSBPROXYDEV pProxyDev)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
PDBG("wakeup()");
|
||||||
|
|
||||||
|
Usb_proxy_device_genode::Data *data =
|
||||||
|
USBPROXYDEV_2_DATA(pProxyDev, Usb_proxy_device_genode::Data*);
|
||||||
|
|
||||||
|
Genode::Signal_transmitter(data->wakeup_signal_context_cap).submit();
|
||||||
|
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern const USBPROXYBACK g_USBProxyDeviceHost =
|
||||||
|
{
|
||||||
|
"host",
|
||||||
|
sizeof(Usb_proxy_device_genode::Data),
|
||||||
|
Usb_proxy_device_genode::open,
|
||||||
|
Usb_proxy_device_genode::init,
|
||||||
|
Usb_proxy_device_genode::close,
|
||||||
|
Usb_proxy_device_genode::reset,
|
||||||
|
Usb_proxy_device_genode::set_config,
|
||||||
|
Usb_proxy_device_genode::claim_interface,
|
||||||
|
Usb_proxy_device_genode::release_interface,
|
||||||
|
Usb_proxy_device_genode::set_interface,
|
||||||
|
Usb_proxy_device_genode::clear_halted_endpoint,
|
||||||
|
Usb_proxy_device_genode::urb_queue,
|
||||||
|
Usb_proxy_device_genode::urb_cancel,
|
||||||
|
Usb_proxy_device_genode::urb_reap,
|
||||||
|
Usb_proxy_device_genode::wakeup,
|
||||||
|
0
|
||||||
|
};
|
262
repos/ports/src/virtualbox/frontend/USBProxyServiceGenode.h
Normal file
262
repos/ports/src/virtualbox/frontend/USBProxyServiceGenode.h
Normal file
|
@ -0,0 +1,262 @@
|
||||||
|
/*
|
||||||
|
* \brief USBProxyService implementation for Genode
|
||||||
|
* \author Christian Prochaska
|
||||||
|
* \date 2015-04-13
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is distributed under the terms of the GNU General Public License
|
||||||
|
* version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ____H_USBPROXYSERVICEGENODE
|
||||||
|
#define ____H_USBPROXYSERVICEGENODE
|
||||||
|
|
||||||
|
#include <os/attached_rom_dataspace.h>
|
||||||
|
#include <os/timed_semaphore.h>
|
||||||
|
#include <timer_session/connection.h>
|
||||||
|
#include <util/xml_node.h>
|
||||||
|
|
||||||
|
#include <USBProxyService.h>
|
||||||
|
|
||||||
|
class USBProxyServiceGenode : public USBProxyService
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
static constexpr bool debug = false;
|
||||||
|
|
||||||
|
struct Device_list_change_signal_context : Genode::Signal_context { };
|
||||||
|
struct Timeout_signal_context : Genode::Signal_context { };
|
||||||
|
struct Wakeup_signal_context : Genode::Signal_context { };
|
||||||
|
|
||||||
|
Timer::Connection _timer;
|
||||||
|
Genode::Signal_receiver _signal_receiver;
|
||||||
|
Device_list_change_signal_context _device_list_change_signal_context;
|
||||||
|
Timeout_signal_context _timeout_signal_context;
|
||||||
|
Wakeup_signal_context _wakeup_signal_context;
|
||||||
|
Genode::Signal_context_capability _wakeup_signal_context_cap;
|
||||||
|
|
||||||
|
Genode::Attached_rom_dataspace *_usb_devices_ds = 0;
|
||||||
|
|
||||||
|
Genode::Timed_semaphore _wait_sem;
|
||||||
|
|
||||||
|
PUSBDEVICE _create_usb_device(Genode::Xml_node &device_node)
|
||||||
|
{
|
||||||
|
unsigned int vendor_id = 0;
|
||||||
|
unsigned int product_id = 0;
|
||||||
|
|
||||||
|
device_node.attribute("vendor_id").value(&vendor_id);
|
||||||
|
device_node.attribute("product_id").value(&product_id);
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("vendor_id: %4x, product_id: %4x", vendor_id, product_id);
|
||||||
|
|
||||||
|
char address_buf[10];
|
||||||
|
Genode::snprintf(address_buf, sizeof(address_buf),
|
||||||
|
"%4x:%4x", vendor_id, product_id);
|
||||||
|
|
||||||
|
PUSBDEVICE dev = (PUSBDEVICE)RTMemAllocZ(sizeof(USBDEVICE));
|
||||||
|
|
||||||
|
dev->idVendor = vendor_id;
|
||||||
|
dev->idProduct = product_id;
|
||||||
|
dev->pszAddress = RTStrDup(address_buf);
|
||||||
|
|
||||||
|
dev->pNext = 0;
|
||||||
|
dev->pPrev = 0;
|
||||||
|
dev->pszManufacturer = 0;
|
||||||
|
dev->pszSerialNumber = 0;
|
||||||
|
dev->pszProduct = "";
|
||||||
|
dev->bcdDevice = 0;
|
||||||
|
dev->bcdUSB = 0;
|
||||||
|
dev->bDeviceClass = 0x0;
|
||||||
|
dev->bDeviceSubClass = 0x0;
|
||||||
|
dev->bDeviceProtocol = 0x0;
|
||||||
|
dev->bNumConfigurations = 1;
|
||||||
|
dev->enmState = USBDEVICESTATE_UNUSED;
|
||||||
|
dev->enmSpeed = USBDEVICESPEED_LOW;
|
||||||
|
dev->u64SerialHash = 0;
|
||||||
|
dev->bBus = 1;
|
||||||
|
dev->bPort = 1;
|
||||||
|
dev->bDevNum = 3;
|
||||||
|
|
||||||
|
return dev;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
USBProxyServiceGenode(Host *aHost) : USBProxyService(aHost)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
_usb_devices_ds = new Genode::Attached_rom_dataspace("usb_devices");
|
||||||
|
|
||||||
|
Genode::Signal_context_capability device_list_change_signal_context_cap =
|
||||||
|
_signal_receiver.manage(&_device_list_change_signal_context);
|
||||||
|
_usb_devices_ds->sigh(device_list_change_signal_context_cap);
|
||||||
|
|
||||||
|
} catch (...) {
|
||||||
|
PWRN("Could not retrieve the \"usb_devices\" ROM file."
|
||||||
|
"USB device pass-through unavailable.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Genode::Signal_context_capability timeout_signal_context_cap =
|
||||||
|
_signal_receiver.manage(&_timeout_signal_context);
|
||||||
|
_timer.sigh(timeout_signal_context_cap);
|
||||||
|
|
||||||
|
_wakeup_signal_context_cap = _signal_receiver.manage(&_wakeup_signal_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
~USBProxyServiceGenode()
|
||||||
|
{
|
||||||
|
delete _usb_devices_ds;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT init()
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
RTLogPrintf("USBProxyServiceGenode::init()\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start the poller thread.
|
||||||
|
*/
|
||||||
|
return (HRESULT)start();
|
||||||
|
}
|
||||||
|
|
||||||
|
PUSBDEVICE getDevices()
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
RTLogPrintf("USBProxyServiceGenode::getDevices()\n");
|
||||||
|
|
||||||
|
PUSBDEVICE first_dev = 0;
|
||||||
|
|
||||||
|
if (!_usb_devices_ds)
|
||||||
|
return first_dev;
|
||||||
|
|
||||||
|
_usb_devices_ds->update();
|
||||||
|
|
||||||
|
if (!_usb_devices_ds->is_valid())
|
||||||
|
return first_dev;
|
||||||
|
|
||||||
|
try {
|
||||||
|
char *content = _usb_devices_ds->local_addr<char>();
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("content: %s", content);
|
||||||
|
|
||||||
|
Genode::Xml_node devices_node(_usb_devices_ds->local_addr<char>());
|
||||||
|
|
||||||
|
Genode::Xml_node device_node = devices_node.sub_node("device");
|
||||||
|
|
||||||
|
first_dev = _create_usb_device(device_node);
|
||||||
|
|
||||||
|
PUSBDEVICE prev_dev = first_dev;
|
||||||
|
for (;;) {
|
||||||
|
device_node = device_node.next("device");
|
||||||
|
PUSBDEVICE dev = _create_usb_device(device_node);
|
||||||
|
prev_dev->pNext = dev;
|
||||||
|
dev->pPrev = prev_dev;
|
||||||
|
prev_dev = dev;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (...) { }
|
||||||
|
|
||||||
|
return first_dev;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wait(RTMSINTERVAL aMillies)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
RTLogPrintf("USBProxyServiceGenode::wait(): aMillies = %u\n",
|
||||||
|
aMillies);
|
||||||
|
|
||||||
|
unsigned long elapsed_ms_start = _timer.elapsed_ms();
|
||||||
|
|
||||||
|
if (aMillies != RT_INDEFINITE_WAIT)
|
||||||
|
_timer.trigger_once(aMillies * 1000);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("waiting for signal");
|
||||||
|
|
||||||
|
Genode::Signal signal = _signal_receiver.wait_for_signal();
|
||||||
|
|
||||||
|
Genode::Signal_context *context = signal.context();
|
||||||
|
|
||||||
|
if (dynamic_cast<Timeout_signal_context*>(context)) {
|
||||||
|
|
||||||
|
if (aMillies == RT_INDEFINITE_WAIT) {
|
||||||
|
/* received an old signal */
|
||||||
|
if (debug)
|
||||||
|
PDBG("old timeout signal received");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long elapsed_ms_now = _timer.elapsed_ms();
|
||||||
|
|
||||||
|
if (elapsed_ms_now - elapsed_ms_start < aMillies) {
|
||||||
|
/* received an old signal */
|
||||||
|
if (debug)
|
||||||
|
PDBG("old timeout signal received");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("timeout signal received");
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
} else if (dynamic_cast<Wakeup_signal_context*>(context)) {
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("wakeup signal received");
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
} else if (dynamic_cast<Device_list_change_signal_context*>(context)) {
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
PDBG("device list change signal received");
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int interruptWait()
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
RTLogPrintf("USBProxyServiceGenode::interruptWait()\n");
|
||||||
|
|
||||||
|
Genode::Signal_transmitter(_wakeup_signal_context_cap).submit();
|
||||||
|
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int captureDevice(HostUSBDevice *aDevice)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
RTLogPrintf("USBProxyServiceGenode::captureDevice()\n");
|
||||||
|
|
||||||
|
interruptWait();
|
||||||
|
|
||||||
|
return VINF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool updateDeviceState(HostUSBDevice *aDevice,
|
||||||
|
PUSBDEVICE aUSBDevice,
|
||||||
|
bool *aRunFilters,
|
||||||
|
SessionMachine **aIgnoreMachine)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
RTLogPrintf("USBProxyServiceGenode::updateDeviceState()\n");
|
||||||
|
|
||||||
|
return updateDeviceStateFake(aDevice, aUSBDevice, aRunFilters, aIgnoreMachine);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // ____H_USBPROXYSERVICEGENODE
|
|
@ -86,8 +86,10 @@ HRESULT Console::onCPUExecutionCapChange(ULONG aExecutionCap)
|
||||||
HRESULT Console::onStorageControllerChange() DUMMY(E_FAIL)
|
HRESULT Console::onStorageControllerChange() DUMMY(E_FAIL)
|
||||||
HRESULT Console::onMediumChange(IMediumAttachment *aMediumAttachment, BOOL) DUMMY(E_FAIL)
|
HRESULT Console::onMediumChange(IMediumAttachment *aMediumAttachment, BOOL) DUMMY(E_FAIL)
|
||||||
HRESULT Console::onVRDEServerChange(BOOL aRestart) DUMMY(E_FAIL)
|
HRESULT Console::onVRDEServerChange(BOOL aRestart) DUMMY(E_FAIL)
|
||||||
HRESULT Console::onUSBDeviceAttach(IUSBDevice *, IVirtualBoxErrorInfo *, ULONG) DUMMY(E_FAIL)
|
|
||||||
HRESULT Console::onUSBDeviceDetach(IN_BSTR aId, IVirtualBoxErrorInfo *aError) DUMMY(E_FAIL)
|
void Console::onUSBDeviceStateChange(IUSBDevice *aDevice, bool aAttached,
|
||||||
|
IVirtualBoxErrorInfo *aError) TRACE()
|
||||||
|
|
||||||
HRESULT Console::onShowWindow(BOOL aCheck, BOOL *aCanShow, LONG64 *aWinId) DUMMY(E_FAIL)
|
HRESULT Console::onShowWindow(BOOL aCheck, BOOL *aCanShow, LONG64 *aWinId) DUMMY(E_FAIL)
|
||||||
HRESULT Console::onNetworkAdapterChange(INetworkAdapter *, BOOL changeAdapter) DUMMY(E_FAIL)
|
HRESULT Console::onNetworkAdapterChange(INetworkAdapter *, BOOL changeAdapter) DUMMY(E_FAIL)
|
||||||
HRESULT Console::onStorageDeviceChange(IMediumAttachment *, BOOL, BOOL) DUMMY(E_FAIL)
|
HRESULT Console::onStorageDeviceChange(IMediumAttachment *, BOOL, BOOL) DUMMY(E_FAIL)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "VirtualBoxBase.h"
|
#include "VirtualBoxBase.h"
|
||||||
|
|
||||||
#include <VBox/usbfilter.h>
|
#include <VBox/usbfilter.h>
|
||||||
|
#include <USBProxyServiceGenode.h>
|
||||||
|
|
||||||
#include "dummy/macros.h"
|
#include "dummy/macros.h"
|
||||||
|
|
||||||
|
@ -11,6 +12,13 @@
|
||||||
static bool debug = false;
|
static bool debug = false;
|
||||||
|
|
||||||
|
|
||||||
|
struct Host::Data
|
||||||
|
{
|
||||||
|
VirtualBox *pParent;
|
||||||
|
USBDeviceFilterList llUSBDeviceFilters; // USB device filters in use by the USB proxy service
|
||||||
|
USBProxyService *pUSBProxyService;
|
||||||
|
};
|
||||||
|
|
||||||
STDMETHODIMP Host::COMGETTER(DVDDrives)(ComSafeArrayOut(IMedium *, drives)) DUMMY(E_FAIL)
|
STDMETHODIMP Host::COMGETTER(DVDDrives)(ComSafeArrayOut(IMedium *, drives)) DUMMY(E_FAIL)
|
||||||
STDMETHODIMP Host::COMGETTER(FloppyDrives)(ComSafeArrayOut(IMedium *, drives)) DUMMY(E_FAIL)
|
STDMETHODIMP Host::COMGETTER(FloppyDrives)(ComSafeArrayOut(IMedium *, drives)) DUMMY(E_FAIL)
|
||||||
STDMETHODIMP Host::COMGETTER(USBDevices)(ComSafeArrayOut(IHostUSBDevice *, aUSBDevices)) DUMMY(E_FAIL)
|
STDMETHODIMP Host::COMGETTER(USBDevices)(ComSafeArrayOut(IHostUSBDevice *, aUSBDevices)) DUMMY(E_FAIL)
|
||||||
|
@ -61,11 +69,36 @@ HRESULT Host::findHostDriveById(DeviceType_T, com::Guid const&, bool,
|
||||||
|
|
||||||
HRESULT Host::saveSettings(settings::Host&) TRACE(S_OK)
|
HRESULT Host::saveSettings(settings::Host&) TRACE(S_OK)
|
||||||
|
|
||||||
HRESULT Host::init(VirtualBox *aParent) TRACE(S_OK)
|
HRESULT Host::init(VirtualBox *aParent)
|
||||||
|
{
|
||||||
|
HRESULT hrc;
|
||||||
|
|
||||||
|
m = new Data();
|
||||||
|
|
||||||
|
m->pParent = aParent;
|
||||||
|
|
||||||
|
m->pUSBProxyService = new USBProxyServiceGenode(this);
|
||||||
|
|
||||||
|
hrc = m->pUSBProxyService->init();
|
||||||
|
AssertComRCReturn(hrc, hrc);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT Host::loadSettings(const settings::Host &) TRACE(S_OK)
|
HRESULT Host::loadSettings(const settings::Host &) TRACE(S_OK)
|
||||||
HRESULT Host::FinalConstruct() TRACE(S_OK)
|
HRESULT Host::FinalConstruct() TRACE(S_OK)
|
||||||
void Host::FinalRelease() DUMMY()
|
void Host::FinalRelease() DUMMY()
|
||||||
void Host::uninit() DUMMY()
|
|
||||||
|
void Host::uninit()
|
||||||
|
{
|
||||||
|
delete m->pUSBProxyService;
|
||||||
|
m->pUSBProxyService = 0;
|
||||||
|
|
||||||
|
m->llUSBDeviceFilters.clear();
|
||||||
|
|
||||||
|
delete m;
|
||||||
|
m = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void Host::generateMACAddress(Utf8Str &mac)
|
void Host::generateMACAddress(Utf8Str &mac)
|
||||||
{
|
{
|
||||||
|
@ -109,18 +142,24 @@ HRESULT Host::buildFloppyDrivesList(MediaList &list) DUMMY(E_FAIL)
|
||||||
#ifdef VBOX_WITH_USB
|
#ifdef VBOX_WITH_USB
|
||||||
USBProxyService* Host::usbProxyService()
|
USBProxyService* Host::usbProxyService()
|
||||||
{
|
{
|
||||||
TRACE(nullptr)
|
return m->pUSBProxyService;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT Host::addChild(HostUSBDeviceFilter *pChild) DUMMY(E_FAIL)
|
HRESULT Host::addChild(HostUSBDeviceFilter *pChild) DUMMY(E_FAIL)
|
||||||
HRESULT Host::removeChild(HostUSBDeviceFilter *pChild) DUMMY(E_FAIL)
|
HRESULT Host::removeChild(HostUSBDeviceFilter *pChild) DUMMY(E_FAIL)
|
||||||
VirtualBox* Host::parent() DUMMY(nullptr)
|
|
||||||
|
VirtualBox* Host::parent()
|
||||||
|
{
|
||||||
|
return m->pParent;
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT Host::onUSBDeviceFilterChange(HostUSBDeviceFilter *, BOOL) DUMMY(E_FAIL)
|
HRESULT Host::onUSBDeviceFilterChange(HostUSBDeviceFilter *, BOOL) DUMMY(E_FAIL)
|
||||||
|
|
||||||
void Host::getUSBFilters(Host::USBDeviceFilterList *aGlobalFilters) DUMMY()
|
void Host::getUSBFilters(Host::USBDeviceFilterList *aGlobalFilters)
|
||||||
|
{
|
||||||
|
*aGlobalFilters = m->llUSBDeviceFilters;
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT Host::checkUSBProxyService() TRACE(S_OK)
|
HRESULT Host::checkUSBProxyService() TRACE(S_OK)
|
||||||
|
|
||||||
int USBFilterMatchRated(PCUSBFILTER pFilter, PCUSBFILTER pDevice) DUMMY(-1)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -178,36 +178,6 @@ HRESULT SharedFolder::init(Console*, com::Utf8Str const&, com::Utf8Str const&,
|
||||||
bool, bool, bool) DUMMY(E_FAIL)
|
bool, bool, bool) DUMMY(E_FAIL)
|
||||||
|
|
||||||
|
|
||||||
/* USBFilter.cpp */
|
|
||||||
|
|
||||||
#include "VBox/usbfilter.h"
|
|
||||||
|
|
||||||
USBFILTERMATCH USBFilterGetMatchingMethod(PCUSBFILTER, USBFILTERIDX) DUMMY(USBFILTERMATCH_INVALID)
|
|
||||||
int USBFilterGetNum(PCUSBFILTER pFilter, USBFILTERIDX enmFieldIdx) DUMMY(-1)
|
|
||||||
const char * USBFilterGetString(PCUSBFILTER pFilter, USBFILTERIDX enmFieldIdx) DUMMY(nullptr)
|
|
||||||
void USBFilterInit(PUSBFILTER pFilter, USBFILTERTYPE enmType) DUMMY()
|
|
||||||
bool USBFilterIsMethodNumeric(USBFILTERMATCH enmMatchingMethod) DUMMY(false)
|
|
||||||
bool USBFilterIsMethodString(USBFILTERMATCH enmMatchingMethod) DUMMY(false)
|
|
||||||
bool USBFilterIsNumericField(USBFILTERIDX enmFieldIdx) DUMMY(false)
|
|
||||||
bool USBFilterIsStringField(USBFILTERIDX enmFieldIdx) DUMMY(false)
|
|
||||||
bool USBFilterMatch(PCUSBFILTER pFilter, PCUSBFILTER pDevice) DUMMY(false)
|
|
||||||
int USBFilterSetIgnore(PUSBFILTER pFilter, USBFILTERIDX enmFieldIdx) DUMMY(-1)
|
|
||||||
int USBFilterSetNumExact(PUSBFILTER, USBFILTERIDX, uint16_t, bool) DUMMY(-1)
|
|
||||||
int USBFilterSetNumExpression(PUSBFILTER, USBFILTERIDX, const char *, bool) DUMMY(-1)
|
|
||||||
int USBFilterSetStringExact(PUSBFILTER, USBFILTERIDX, const char *, bool) DUMMY(-1)
|
|
||||||
int USBFilterSetStringPattern(PUSBFILTER, USBFILTERIDX, const char *, bool) DUMMY(-1)
|
|
||||||
|
|
||||||
|
|
||||||
/* USBProxyService.cpp */
|
|
||||||
|
|
||||||
#include "USBProxyService.h"
|
|
||||||
|
|
||||||
HRESULT USBProxyService::autoCaptureDevicesForVM(SessionMachine *) DUMMY(E_FAIL)
|
|
||||||
HRESULT USBProxyService::captureDeviceForVM(SessionMachine *, IN_GUID) DUMMY(E_FAIL)
|
|
||||||
HRESULT USBProxyService::detachAllDevicesFromVM(SessionMachine*, bool, bool) DUMMY(E_FAIL)
|
|
||||||
HRESULT USBProxyService::detachDeviceFromVM(SessionMachine*, IN_GUID, bool) DUMMY(E_FAIL)
|
|
||||||
|
|
||||||
|
|
||||||
/* VirtualBoxImpl.cpp */
|
/* VirtualBoxImpl.cpp */
|
||||||
|
|
||||||
#include "VirtualBoxImpl.h"
|
#include "VirtualBoxImpl.h"
|
||||||
|
|
|
@ -1,26 +1,22 @@
|
||||||
usb.patch
|
usb.patch
|
||||||
|
|
||||||
diff --git a/src/app/virtualbox/src/VBox/Devices/USB/USBProxyDevice.cpp b/src/app/virtualbox/src/VBox/Devices/USB/USBProxyDevice.cpp
|
diff --git a/src/app/virtualbox/src/VBox/Devices/USB/USBProxyDevice.cpp b/src/app/virtualbox/src/VBox/Devices/USB/USBProxyDevice.cpp
|
||||||
index a51bc36..bed42e8 100644
|
index a51bc36..d21c6cb 100644
|
||||||
--- a/src/app/virtualbox/src/VBox/Devices/USB/USBProxyDevice.cpp
|
--- a/src/app/virtualbox/src/VBox/Devices/USB/USBProxyDevice.cpp
|
||||||
+++ b/src/app/virtualbox/src/VBox/Devices/USB/USBProxyDevice.cpp
|
+++ b/src/app/virtualbox/src/VBox/Devices/USB/USBProxyDevice.cpp
|
||||||
@@ -843,10 +843,14 @@ static DECLCALLBACK(int) usbProxyConstruct(PPDMUSBINS pUsbIns, int iInstance, PC
|
@@ -845,8 +845,10 @@ static DECLCALLBACK(int) usbProxyConstruct(PPDMUSBINS pUsbIns, int iInstance, PC
|
||||||
/*
|
|
||||||
* Select backend and open the device.
|
|
||||||
*/
|
*/
|
||||||
+
|
|
||||||
+ return PDMUSB_SET_ERROR(pUsbIns, VERR_NOT_SUPPORTED, N_("USBProxy: not supported on Genode"));
|
|
||||||
+#if 0
|
|
||||||
if (!fRemote)
|
if (!fRemote)
|
||||||
pThis->pOps = &g_USBProxyDeviceHost;
|
pThis->pOps = &g_USBProxyDeviceHost;
|
||||||
|
+#if 0
|
||||||
else
|
else
|
||||||
pThis->pOps = &g_USBProxyDeviceVRDP;
|
pThis->pOps = &g_USBProxyDeviceVRDP;
|
||||||
+#endif /* if 0 */
|
+#endif
|
||||||
|
|
||||||
pThis->pvInstanceDataR3 = RTMemAllocZ(pThis->pOps->cbBackend);
|
pThis->pvInstanceDataR3 = RTMemAllocZ(pThis->pOps->cbBackend);
|
||||||
if (!pThis->pvInstanceDataR3)
|
if (!pThis->pvInstanceDataR3)
|
||||||
diff --git a/src/app/virtualbox/src/VBox/Devices/USB/VUSBDevice.cpp b/src/app/virtualbox/src/VBox/Devices/USB/VUSBDevice.cpp
|
diff --git a/src/app/virtualbox/src/VBox/Devices/USB/VUSBDevice.cpp b/src/app/virtualbox/src/VBox/Devices/USB/VUSBDevice.cpp
|
||||||
index 4790fcb..4efa818 100644
|
index 4790fcb..d649ad6 100644
|
||||||
--- a/src/app/virtualbox/src/VBox/Devices/USB/VUSBDevice.cpp
|
--- a/src/app/virtualbox/src/VBox/Devices/USB/VUSBDevice.cpp
|
||||||
+++ b/src/app/virtualbox/src/VBox/Devices/USB/VUSBDevice.cpp
|
+++ b/src/app/virtualbox/src/VBox/Devices/USB/VUSBDevice.cpp
|
||||||
@@ -230,7 +230,14 @@ bool vusbDevDoSelectConfig(PVUSBDEV pDev, PCVUSBDESCCONFIGEX pCfgDesc)
|
@@ -230,7 +230,14 @@ bool vusbDevDoSelectConfig(PVUSBDEV pDev, PCVUSBDESCCONFIGEX pCfgDesc)
|
||||||
|
@ -38,7 +34,18 @@ index 4790fcb..4efa818 100644
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memset(pDev->paIfStates, 0, pCfgDesc->Core.bNumInterfaces * sizeof(pDev->paIfStates[0]));
|
memset(pDev->paIfStates, 0, pCfgDesc->Core.bNumInterfaces * sizeof(pDev->paIfStates[0]));
|
||||||
@@ -1134,7 +1141,7 @@ static DECLCALLBACK(int) vusbDevUrbIoThread(RTTHREAD hThread, void *pvUser)
|
@@ -1089,8 +1096,10 @@ static DECLCALLBACK(int) vusbDevCancelAllUrbsWorker(PVUSBDEV pDev, bool fDetachi
|
||||||
|
PVUSBURB pNext = pUrb->VUsb.pNext;
|
||||||
|
Assert(pUrb->VUsb.pDev == pDev);
|
||||||
|
|
||||||
|
+#if 0
|
||||||
|
AssertMsgFailed(("%s: Leaking left over URB! state=%d pDev=%p[%s]\n",
|
||||||
|
pUrb->pszDesc, pUrb->enmState, pDev, pDev->pUsbIns->pszName));
|
||||||
|
+#endif
|
||||||
|
vusbUrbUnlink(pUrb);
|
||||||
|
/* Unlink isn't enough, because boundary timer and detaching will try to reap it.
|
||||||
|
* It was tested with MSD & iphone attachment to vSMP guest, if
|
||||||
|
@@ -1134,7 +1143,7 @@ static DECLCALLBACK(int) vusbDevUrbIoThread(RTTHREAD hThread, void *pvUser)
|
||||||
vusbUrbDoReapAsyncDev(pDev, RT_INDEFINITE_WAIT);
|
vusbUrbDoReapAsyncDev(pDev, RT_INDEFINITE_WAIT);
|
||||||
|
|
||||||
/* Process any URBs waiting to be cancelled first. */
|
/* Process any URBs waiting to be cancelled first. */
|
||||||
|
@ -84,41 +91,21 @@ index 2f01f69..9b13e37 100644
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
diff --git a/src/app/virtualbox/src/VBox/Main/src-server/MachineImpl.cpp b/src/app/virtualbox/src/VBox/Main/src-server/MachineImpl.cpp
|
diff --git a/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp b/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp
|
||||||
index 5fcb53c..b4016b2 100644
|
index 141bb98..43cedfe 100644
|
||||||
--- a/src/app/virtualbox/src/VBox/Main/src-server/MachineImpl.cpp
|
--- a/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp
|
||||||
+++ b/src/app/virtualbox/src/VBox/Main/src-server/MachineImpl.cpp
|
+++ b/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp
|
||||||
@@ -13582,6 +13582,7 @@ STDMETHODIMP SessionMachine::AutoCaptureUSBDevices()
|
@@ -9136,10 +9136,9 @@ HRESULT Console::captureUSBDevices(PUVM pUVM)
|
||||||
AutoCaller autoCaller(this);
|
* us back from under its lock (e.g. onUSBDeviceAttach()) which would
|
||||||
AssertComRCReturn(autoCaller.rc(), autoCaller.rc());
|
* produce an inter-process dead-lock otherwise. */
|
||||||
|
alock.release();
|
||||||
|
-#if 0
|
||||||
|
+
|
||||||
|
HRESULT hrc = mControl->AutoCaptureUSBDevices();
|
||||||
|
ComAssertComRCRetRC(hrc);
|
||||||
|
-#endif
|
||||||
|
}
|
||||||
|
|
||||||
+#if 0
|
|
||||||
#ifdef VBOX_WITH_USB
|
|
||||||
HRESULT rc = mUSBDeviceFilters->notifyProxy(true /* aInsertFilters */);
|
|
||||||
AssertComRC(rc);
|
|
||||||
@@ -13590,6 +13591,7 @@ STDMETHODIMP SessionMachine::AutoCaptureUSBDevices()
|
|
||||||
USBProxyService *service = mParent->host()->usbProxyService();
|
|
||||||
AssertReturn(service, E_FAIL);
|
|
||||||
return service->autoCaptureDevicesForVM(this);
|
|
||||||
+#endif /* if 0 */
|
|
||||||
#else
|
|
||||||
return S_OK;
|
|
||||||
#endif
|
|
||||||
@@ -13612,6 +13614,7 @@ STDMETHODIMP SessionMachine::DetachAllUSBDevices(BOOL aDone)
|
|
||||||
AutoCaller autoCaller(this);
|
|
||||||
AssertComRCReturn(autoCaller.rc(), autoCaller.rc());
|
|
||||||
|
|
||||||
+#if 0
|
|
||||||
#ifdef VBOX_WITH_USB
|
|
||||||
HRESULT rc = mUSBDeviceFilters->notifyProxy(false /* aInsertFilters */);
|
|
||||||
AssertComRC(rc);
|
|
||||||
@@ -13620,6 +13623,7 @@ STDMETHODIMP SessionMachine::DetachAllUSBDevices(BOOL aDone)
|
|
||||||
USBProxyService *service = mParent->host()->usbProxyService();
|
|
||||||
AssertReturn(service, E_FAIL);
|
|
||||||
return service->detachAllDevicesFromVM(this, !!aDone, false /* aAbnormal */);
|
|
||||||
+#endif /* if 0 */
|
|
||||||
#else
|
|
||||||
NOREF(aDone);
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
diff --git a/src/app/virtualbox/src/VBox/Main/src-server/USBDeviceFiltersImpl.cpp b/src/app/virtualbox/src/VBox/Main/src-server/USBDeviceFiltersImpl.cpp
|
diff --git a/src/app/virtualbox/src/VBox/Main/src-server/USBDeviceFiltersImpl.cpp b/src/app/virtualbox/src/VBox/Main/src-server/USBDeviceFiltersImpl.cpp
|
||||||
index 09b42f5..c179ca6 100644
|
index 09b42f5..c179ca6 100644
|
||||||
|
|
|
@ -325,16 +325,18 @@ index b43f5a6..6aef9df 100644
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
diff --git a/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp b/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp
|
diff --git a/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp b/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp
|
||||||
index 69e3109..9ed6cdd 100644
|
index 69e3109..141bb98 100644
|
||||||
--- a/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp
|
--- a/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp
|
||||||
+++ b/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp
|
+++ b/src/app/virtualbox/src/VBox/Main/src-client/ConsoleImpl.cpp
|
||||||
@@ -51,23 +51,32 @@
|
@@ -51,23 +51,34 @@
|
||||||
#include "KeyboardImpl.h"
|
#include "KeyboardImpl.h"
|
||||||
#include "MouseImpl.h"
|
#include "MouseImpl.h"
|
||||||
#include "DisplayImpl.h"
|
#include "DisplayImpl.h"
|
||||||
+#if 0
|
+#if 0
|
||||||
#include "MachineDebuggerImpl.h"
|
#include "MachineDebuggerImpl.h"
|
||||||
|
+#endif
|
||||||
#include "USBDeviceImpl.h"
|
#include "USBDeviceImpl.h"
|
||||||
|
+#if 0
|
||||||
#include "RemoteUSBDeviceImpl.h"
|
#include "RemoteUSBDeviceImpl.h"
|
||||||
+#endif
|
+#endif
|
||||||
#include "SharedFolderImpl.h"
|
#include "SharedFolderImpl.h"
|
||||||
|
@ -361,7 +363,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
#include "VBoxEvents.h"
|
#include "VBoxEvents.h"
|
||||||
#include "AutoCaller.h"
|
#include "AutoCaller.h"
|
||||||
@@ -75,7 +84,9 @@
|
@@ -75,7 +86,9 @@
|
||||||
|
|
||||||
#include <VBox/com/array.h>
|
#include <VBox/com/array.h>
|
||||||
#include "VBox/com/ErrorInfo.h"
|
#include "VBox/com/ErrorInfo.h"
|
||||||
|
@ -371,7 +373,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
#include <iprt/asm.h>
|
#include <iprt/asm.h>
|
||||||
#include <iprt/buildconfig.h>
|
#include <iprt/buildconfig.h>
|
||||||
@@ -90,6 +101,7 @@
|
@@ -90,14 +103,17 @@
|
||||||
#include <iprt/base64.h>
|
#include <iprt/base64.h>
|
||||||
#include <iprt/memsafer.h>
|
#include <iprt/memsafer.h>
|
||||||
|
|
||||||
|
@ -379,7 +381,17 @@ index 69e3109..9ed6cdd 100644
|
||||||
#include <VBox/vmm/vmapi.h>
|
#include <VBox/vmm/vmapi.h>
|
||||||
#include <VBox/vmm/vmm.h>
|
#include <VBox/vmm/vmm.h>
|
||||||
#include <VBox/vmm/pdmapi.h>
|
#include <VBox/vmm/pdmapi.h>
|
||||||
@@ -109,14 +121,17 @@
|
#include <VBox/vmm/pdmasynccompletion.h>
|
||||||
|
#include <VBox/vmm/pdmnetifs.h>
|
||||||
|
+#endif
|
||||||
|
#ifdef VBOX_WITH_USB
|
||||||
|
# include <VBox/vmm/pdmusb.h>
|
||||||
|
#endif
|
||||||
|
+#if 0
|
||||||
|
#ifdef VBOX_WITH_NETSHAPER
|
||||||
|
# include <VBox/vmm/pdmnetshaper.h>
|
||||||
|
#endif /* VBOX_WITH_NETSHAPER */
|
||||||
|
@@ -109,14 +125,17 @@
|
||||||
#include <VBox/vusb.h>
|
#include <VBox/vusb.h>
|
||||||
|
|
||||||
#include <VBox/VMMDev.h>
|
#include <VBox/VMMDev.h>
|
||||||
|
@ -398,7 +410,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <memory> // for auto_ptr
|
#include <memory> // for auto_ptr
|
||||||
@@ -278,6 +293,8 @@ struct VMSaveTask : public VMTask
|
@@ -278,6 +297,8 @@ struct VMSaveTask : public VMTask
|
||||||
Reason_T mReason;
|
Reason_T mReason;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -407,7 +419,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
// Handler for global events
|
// Handler for global events
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
inline static const char *networkAdapterTypeToName(NetworkAdapterType_T adapterType);
|
inline static const char *networkAdapterTypeToName(NetworkAdapterType_T adapterType);
|
||||||
@@ -383,6 +400,7 @@ typedef ListenerImpl<VmEventListener, Console*> VmEventListenerImpl;
|
@@ -383,6 +404,7 @@ typedef ListenerImpl<VmEventListener, Console*> VmEventListenerImpl;
|
||||||
|
|
||||||
VBOX_LISTENER_DECLARE(VmEventListenerImpl)
|
VBOX_LISTENER_DECLARE(VmEventListenerImpl)
|
||||||
|
|
||||||
|
@ -415,7 +427,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
// constructor / destructor
|
// constructor / destructor
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -530,6 +548,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
@@ -530,6 +552,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
||||||
rc = mDisplay->init(this);
|
rc = mDisplay->init(this);
|
||||||
AssertComRCReturnRC(rc);
|
AssertComRCReturnRC(rc);
|
||||||
|
|
||||||
|
@ -423,7 +435,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
unconst(mVRDEServerInfo).createObject();
|
unconst(mVRDEServerInfo).createObject();
|
||||||
rc = mVRDEServerInfo->init(this);
|
rc = mVRDEServerInfo->init(this);
|
||||||
AssertComRCReturnRC(rc);
|
AssertComRCReturnRC(rc);
|
||||||
@@ -538,6 +557,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
@@ -538,6 +561,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
||||||
rc = mEmulatedUSB->init(this);
|
rc = mEmulatedUSB->init(this);
|
||||||
AssertComRCReturnRC(rc);
|
AssertComRCReturnRC(rc);
|
||||||
|
|
||||||
|
@ -431,7 +443,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/* Grab global and machine shared folder lists */
|
/* Grab global and machine shared folder lists */
|
||||||
|
|
||||||
rc = fetchSharedFolders(true /* aGlobal */);
|
rc = fetchSharedFolders(true /* aGlobal */);
|
||||||
@@ -545,10 +565,12 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
@@ -545,10 +569,12 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
||||||
rc = fetchSharedFolders(false /* aGlobal */);
|
rc = fetchSharedFolders(false /* aGlobal */);
|
||||||
AssertComRCReturnRC(rc);
|
AssertComRCReturnRC(rc);
|
||||||
|
|
||||||
|
@ -444,7 +456,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
/* Figure out size of meAttachmentType vector */
|
/* Figure out size of meAttachmentType vector */
|
||||||
ComPtr<IVirtualBox> pVirtualBox;
|
ComPtr<IVirtualBox> pVirtualBox;
|
||||||
@@ -574,9 +596,11 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
@@ -574,9 +600,11 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
||||||
// unconst(m_pVMMDev) = new VMMDev(this);
|
// unconst(m_pVMMDev) = new VMMDev(this);
|
||||||
// AssertReturn(mVMMDev, E_FAIL);
|
// AssertReturn(mVMMDev, E_FAIL);
|
||||||
|
|
||||||
|
@ -456,7 +468,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
FirmwareType_T enmFirmwareType;
|
FirmwareType_T enmFirmwareType;
|
||||||
mMachine->COMGETTER(FirmwareType)(&enmFirmwareType);
|
mMachine->COMGETTER(FirmwareType)(&enmFirmwareType);
|
||||||
if ( enmFirmwareType == FirmwareType_EFI
|
if ( enmFirmwareType == FirmwareType_EFI
|
||||||
@@ -584,8 +608,10 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
@@ -584,8 +612,10 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
||||||
|| enmFirmwareType == FirmwareType_EFI64
|
|| enmFirmwareType == FirmwareType_EFI64
|
||||||
|| enmFirmwareType == FirmwareType_EFIDUAL)
|
|| enmFirmwareType == FirmwareType_EFIDUAL)
|
||||||
{
|
{
|
||||||
|
@ -467,7 +479,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VBOX_WITH_USB_CARDREADER
|
#ifdef VBOX_WITH_USB_CARDREADER
|
||||||
@@ -593,6 +619,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
@@ -593,6 +623,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
||||||
AssertReturn(mUsbCardReader, E_FAIL);
|
AssertReturn(mUsbCardReader, E_FAIL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -475,7 +487,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/* VirtualBox events registration. */
|
/* VirtualBox events registration. */
|
||||||
{
|
{
|
||||||
ComPtr<IEventSource> pES;
|
ComPtr<IEventSource> pES;
|
||||||
@@ -609,6 +636,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
@@ -609,6 +640,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
||||||
rc = pES->RegisterListener(aVmListener, ComSafeArrayAsInParam(eventTypes), true);
|
rc = pES->RegisterListener(aVmListener, ComSafeArrayAsInParam(eventTypes), true);
|
||||||
AssertComRC(rc);
|
AssertComRC(rc);
|
||||||
}
|
}
|
||||||
|
@ -483,7 +495,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Confirm a successful initialization when it's the case */
|
/* Confirm a successful initialization when it's the case */
|
||||||
@@ -625,6 +653,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
@@ -625,6 +657,7 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,7 +503,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* Uninitializes the Console object.
|
* Uninitializes the Console object.
|
||||||
*/
|
*/
|
||||||
@@ -1035,6 +1064,8 @@ void Console::guestPropertiesVRDPUpdateDisconnect(uint32_t u32ClientId)
|
@@ -1035,6 +1068,8 @@ void Console::guestPropertiesVRDPUpdateDisconnect(uint32_t u32ClientId)
|
||||||
|
|
||||||
#endif /* VBOX_WITH_GUEST_PROPS */
|
#endif /* VBOX_WITH_GUEST_PROPS */
|
||||||
|
|
||||||
|
@ -500,7 +512,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
bool Console::isResetTurnedIntoPowerOff(void)
|
bool Console::isResetTurnedIntoPowerOff(void)
|
||||||
{
|
{
|
||||||
Bstr value;
|
Bstr value;
|
||||||
@@ -1046,6 +1077,8 @@ bool Console::isResetTurnedIntoPowerOff(void)
|
@@ -1046,6 +1081,8 @@ bool Console::isResetTurnedIntoPowerOff(void)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,7 +521,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
#ifdef VBOX_WITH_EXTPACK
|
#ifdef VBOX_WITH_EXTPACK
|
||||||
/**
|
/**
|
||||||
* Used by VRDEServer and others to talke to the extension pack manager.
|
* Used by VRDEServer and others to talke to the extension pack manager.
|
||||||
@@ -1505,6 +1538,7 @@ void Console::VRDPInterceptClipboard(uint32_t u32ClientId)
|
@@ -1505,6 +1542,7 @@ void Console::VRDPInterceptClipboard(uint32_t u32ClientId)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -517,7 +529,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
//static
|
//static
|
||||||
const char *Console::sSSMConsoleUnit = "ConsoleData";
|
const char *Console::sSSMConsoleUnit = "ConsoleData";
|
||||||
@@ -1970,6 +2004,8 @@ STDMETHODIMP Console::COMGETTER(Display)(IDisplay **aDisplay)
|
@@ -1970,6 +2008,8 @@ STDMETHODIMP Console::COMGETTER(Display)(IDisplay **aDisplay)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -526,7 +538,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
STDMETHODIMP Console::COMGETTER(Debugger)(IMachineDebugger **aDebugger)
|
STDMETHODIMP Console::COMGETTER(Debugger)(IMachineDebugger **aDebugger)
|
||||||
{
|
{
|
||||||
CheckComArgOutPointerValid(aDebugger);
|
CheckComArgOutPointerValid(aDebugger);
|
||||||
@@ -2069,6 +2105,7 @@ Console::COMGETTER(SharedFolders)(ComSafeArrayOut(ISharedFolder *, aSharedFolder
|
@@ -2069,6 +2109,7 @@ Console::COMGETTER(SharedFolders)(ComSafeArrayOut(ISharedFolder *, aSharedFolder
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -534,7 +546,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
STDMETHODIMP Console::COMGETTER(EventSource)(IEventSource ** aEventSource)
|
STDMETHODIMP Console::COMGETTER(EventSource)(IEventSource ** aEventSource)
|
||||||
{
|
{
|
||||||
@@ -2085,6 +2122,8 @@ STDMETHODIMP Console::COMGETTER(EventSource)(IEventSource ** aEventSource)
|
@@ -2085,6 +2126,8 @@ STDMETHODIMP Console::COMGETTER(EventSource)(IEventSource ** aEventSource)
|
||||||
return hrc;
|
return hrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -543,7 +555,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
STDMETHODIMP Console::COMGETTER(AttachedPCIDevices)(ComSafeArrayOut(IPCIDeviceAttachment *, aAttachments))
|
STDMETHODIMP Console::COMGETTER(AttachedPCIDevices)(ComSafeArrayOut(IPCIDeviceAttachment *, aAttachments))
|
||||||
{
|
{
|
||||||
CheckComArgOutSafeArrayPointerValid(aAttachments);
|
CheckComArgOutSafeArrayPointerValid(aAttachments);
|
||||||
@@ -2134,6 +2173,7 @@ STDMETHODIMP Console::COMSETTER(UseHostClipboard)(BOOL aUseHostClipboard)
|
@@ -2134,6 +2177,7 @@ STDMETHODIMP Console::COMSETTER(UseHostClipboard)(BOOL aUseHostClipboard)
|
||||||
// IConsole methods
|
// IConsole methods
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -551,7 +563,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
STDMETHODIMP Console::PowerUp(IProgress **aProgress)
|
STDMETHODIMP Console::PowerUp(IProgress **aProgress)
|
||||||
{
|
{
|
||||||
@@ -2291,6 +2331,8 @@ STDMETHODIMP Console::PowerDown(IProgress **aProgress)
|
@@ -2291,6 +2335,8 @@ STDMETHODIMP Console::PowerDown(IProgress **aProgress)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -560,7 +572,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
STDMETHODIMP Console::Reset()
|
STDMETHODIMP Console::Reset()
|
||||||
{
|
{
|
||||||
LogFlowThisFuncEnter();
|
LogFlowThisFuncEnter();
|
||||||
@@ -3451,6 +3493,8 @@ STDMETHODIMP Console::RestoreSnapshot(ISnapshot *aSnapshot, IProgress **aProgres
|
@@ -3451,6 +3497,8 @@ STDMETHODIMP Console::RestoreSnapshot(ISnapshot *aSnapshot, IProgress **aProgres
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -569,7 +581,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
// Non-interface public methods
|
// Non-interface public methods
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -3526,6 +3570,8 @@ HRESULT Console::convertBusPortDeviceToLun(StorageBus_T enmBus, LONG port, LONG
|
@@ -3526,6 +3574,8 @@ HRESULT Console::convertBusPortDeviceToLun(StorageBus_T enmBus, LONG port, LONG
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -578,7 +590,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
// private methods
|
// private methods
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -4388,6 +4434,8 @@ HRESULT Console::onNATRedirectRuleChange(ULONG ulInstance, BOOL aNatRuleRemove,
|
@@ -4388,6 +4438,8 @@ HRESULT Console::onNATRedirectRuleChange(ULONG ulInstance, BOOL aNatRuleRemove,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -587,7 +599,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
VMMDevMouseInterface *Console::getVMMDevMouseInterface()
|
VMMDevMouseInterface *Console::getVMMDevMouseInterface()
|
||||||
{
|
{
|
||||||
return m_pVMMDev;
|
return m_pVMMDev;
|
||||||
@@ -4398,6 +4446,8 @@ DisplayMouseInterface *Console::getDisplayMouseInterface()
|
@@ -4398,6 +4450,8 @@ DisplayMouseInterface *Console::getDisplayMouseInterface()
|
||||||
return mDisplay;
|
return mDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -596,7 +608,25 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* Parses one key value pair.
|
* Parses one key value pair.
|
||||||
*
|
*
|
||||||
@@ -6490,6 +6540,8 @@ void Console::onMouseCapabilityChange(BOOL supportsAbsolute, BOOL supportsRelati
|
@@ -5333,6 +5387,8 @@ HRESULT Console::onSharedFolderChange(BOOL aGlobal)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* Called by IInternalSessionControl::OnUSBDeviceAttach() or locally by
|
||||||
|
* processRemoteUSBDevices() after IInternalMachineControl::RunUSBDeviceFilters()
|
||||||
|
@@ -5499,7 +5555,7 @@ HRESULT Console::onUSBDeviceDetach(IN_BSTR aId,
|
||||||
|
return E_FAIL;
|
||||||
|
#endif /* !VBOX_WITH_USB */
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+#if 0
|
||||||
|
/**
|
||||||
|
* Called by IInternalSessionControl::OnBandwidthGroupChange().
|
||||||
|
*
|
||||||
|
@@ -6490,6 +6546,8 @@ void Console::onMouseCapabilityChange(BOOL supportsAbsolute, BOOL supportsRelati
|
||||||
fireMouseCapabilityChangedEvent(mEventSource, supportsAbsolute, supportsRelative, supportsMT, needsHostCursor);
|
fireMouseCapabilityChangedEvent(mEventSource, supportsAbsolute, supportsRelative, supportsMT, needsHostCursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -605,7 +635,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
void Console::onStateChange(MachineState_T machineState)
|
void Console::onStateChange(MachineState_T machineState)
|
||||||
{
|
{
|
||||||
AutoCaller autoCaller(this);
|
AutoCaller autoCaller(this);
|
||||||
@@ -6497,6 +6549,8 @@ void Console::onStateChange(MachineState_T machineState)
|
@@ -6497,6 +6555,8 @@ void Console::onStateChange(MachineState_T machineState)
|
||||||
fireStateChangedEvent(mEventSource, machineState);
|
fireStateChangedEvent(mEventSource, machineState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -614,7 +644,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
void Console::onAdditionsStateChange()
|
void Console::onAdditionsStateChange()
|
||||||
{
|
{
|
||||||
AutoCaller autoCaller(this);
|
AutoCaller autoCaller(this);
|
||||||
@@ -6555,6 +6609,8 @@ void Console::onUSBDeviceStateChange(IUSBDevice *aDevice, bool aAttached,
|
@@ -6555,6 +6615,8 @@ void Console::onUSBDeviceStateChange(IUSBDevice *aDevice, bool aAttached,
|
||||||
fireUSBDeviceStateChangedEvent(mEventSource, aDevice, aAttached, aError);
|
fireUSBDeviceStateChangedEvent(mEventSource, aDevice, aAttached, aError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -623,7 +653,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
void Console::onRuntimeError(BOOL aFatal, IN_BSTR aErrorID, IN_BSTR aMessage)
|
void Console::onRuntimeError(BOOL aFatal, IN_BSTR aErrorID, IN_BSTR aMessage)
|
||||||
{
|
{
|
||||||
AutoCaller autoCaller(this);
|
AutoCaller autoCaller(this);
|
||||||
@@ -6563,6 +6619,8 @@ void Console::onRuntimeError(BOOL aFatal, IN_BSTR aErrorID, IN_BSTR aMessage)
|
@@ -6563,6 +6625,8 @@ void Console::onRuntimeError(BOOL aFatal, IN_BSTR aErrorID, IN_BSTR aMessage)
|
||||||
fireRuntimeErrorEvent(mEventSource, aFatal, aErrorID, aMessage);
|
fireRuntimeErrorEvent(mEventSource, aFatal, aErrorID, aMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -632,7 +662,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
HRESULT Console::onShowWindow(BOOL aCheck, BOOL *aCanShow, LONG64 *aWinId)
|
HRESULT Console::onShowWindow(BOOL aCheck, BOOL *aCanShow, LONG64 *aWinId)
|
||||||
{
|
{
|
||||||
AssertReturn(aCanShow, E_POINTER);
|
AssertReturn(aCanShow, E_POINTER);
|
||||||
@@ -6626,6 +6684,8 @@ HRESULT Console::onShowWindow(BOOL aCheck, BOOL *aCanShow, LONG64 *aWinId)
|
@@ -6626,6 +6690,8 @@ HRESULT Console::onShowWindow(BOOL aCheck, BOOL *aCanShow, LONG64 *aWinId)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -641,7 +671,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
// private methods
|
// private methods
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -6819,6 +6879,8 @@ HRESULT Console::consoleInitReleaseLog(const ComPtr<IMachine> aMachine)
|
@@ -6819,6 +6885,8 @@ HRESULT Console::consoleInitReleaseLog(const ComPtr<IMachine> aMachine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -650,7 +680,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
char szError[RTPATH_MAX + 128];
|
char szError[RTPATH_MAX + 128];
|
||||||
int vrc = com::VBoxLogRelCreate("VM", logFile.c_str(),
|
int vrc = com::VBoxLogRelCreate("VM", logFile.c_str(),
|
||||||
RTLOGFLAGS_PREFIX_TIME_PROG | RTLOGFLAGS_RESTRICT_GROUPS,
|
RTLOGFLAGS_PREFIX_TIME_PROG | RTLOGFLAGS_RESTRICT_GROUPS,
|
||||||
@@ -6839,6 +6901,8 @@ HRESULT Console::consoleInitReleaseLog(const ComPtr<IMachine> aMachine)
|
@@ -6839,6 +6907,8 @@ HRESULT Console::consoleInitReleaseLog(const ComPtr<IMachine> aMachine)
|
||||||
if (SUCCEEDED(hrc) || cHistoryFiles)
|
if (SUCCEEDED(hrc) || cHistoryFiles)
|
||||||
RTDirFlush(logDir.c_str());
|
RTDirFlush(logDir.c_str());
|
||||||
|
|
||||||
|
@ -659,7 +689,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
return hrc;
|
return hrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7113,6 +7177,10 @@ HRESULT Console::powerUp(IProgress **aProgress, bool aPaused)
|
@@ -7113,6 +7183,10 @@ HRESULT Console::powerUp(IProgress **aProgress, bool aPaused)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -670,7 +700,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
// If there is immutable drive the process that.
|
// If there is immutable drive the process that.
|
||||||
VMPowerUpTask::ProgressList progresses(task->hardDiskProgresses);
|
VMPowerUpTask::ProgressList progresses(task->hardDiskProgresses);
|
||||||
@@ -7123,7 +7191,8 @@ HRESULT Console::powerUp(IProgress **aProgress, bool aPaused)
|
@@ -7123,7 +7197,8 @@ HRESULT Console::powerUp(IProgress **aProgress, bool aPaused)
|
||||||
++cOperations;
|
++cOperations;
|
||||||
ulTotalOperationsWeight += 1;
|
ulTotalOperationsWeight += 1;
|
||||||
}
|
}
|
||||||
|
@ -680,7 +710,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
progressDesc.raw(),
|
progressDesc.raw(),
|
||||||
TRUE, // Cancelable
|
TRUE, // Cancelable
|
||||||
cOperations,
|
cOperations,
|
||||||
@@ -7136,13 +7205,15 @@ HRESULT Console::powerUp(IProgress **aProgress, bool aPaused)
|
@@ -7136,13 +7211,15 @@ HRESULT Console::powerUp(IProgress **aProgress, bool aPaused)
|
||||||
else if ( mMachineState == MachineState_Saved
|
else if ( mMachineState == MachineState_Saved
|
||||||
|| (!fTeleporterEnabled && !fFaultToleranceSyncEnabled))
|
|| (!fTeleporterEnabled && !fFaultToleranceSyncEnabled))
|
||||||
{
|
{
|
||||||
|
@ -698,7 +728,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
progressDesc.raw(),
|
progressDesc.raw(),
|
||||||
TRUE /* aCancelable */,
|
TRUE /* aCancelable */,
|
||||||
3 /* cOperations */,
|
3 /* cOperations */,
|
||||||
@@ -7153,7 +7224,8 @@ HRESULT Console::powerUp(IProgress **aProgress, bool aPaused)
|
@@ -7153,7 +7230,8 @@ HRESULT Console::powerUp(IProgress **aProgress, bool aPaused)
|
||||||
}
|
}
|
||||||
else if (fFaultToleranceSyncEnabled)
|
else if (fFaultToleranceSyncEnabled)
|
||||||
{
|
{
|
||||||
|
@ -708,7 +738,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
progressDesc.raw(),
|
progressDesc.raw(),
|
||||||
TRUE /* aCancelable */,
|
TRUE /* aCancelable */,
|
||||||
3 /* cOperations */,
|
3 /* cOperations */,
|
||||||
@@ -7399,6 +7471,7 @@ HRESULT Console::powerDown(IProgress *aProgress /*= NULL*/)
|
@@ -7399,6 +7477,7 @@ HRESULT Console::powerDown(IProgress *aProgress /*= NULL*/)
|
||||||
* safe to release the object lock now if needed)
|
* safe to release the object lock now if needed)
|
||||||
* ---------------------------------------------------------------------- */
|
* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
@ -716,7 +746,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/* Stop the VRDP server to prevent new clients connection while VM is being
|
/* Stop the VRDP server to prevent new clients connection while VM is being
|
||||||
* powered off. */
|
* powered off. */
|
||||||
if (mConsoleVRDPServer)
|
if (mConsoleVRDPServer)
|
||||||
@@ -7413,6 +7486,7 @@ HRESULT Console::powerDown(IProgress *aProgress /*= NULL*/)
|
@@ -7413,6 +7492,7 @@ HRESULT Console::powerDown(IProgress *aProgress /*= NULL*/)
|
||||||
|
|
||||||
alock.acquire();
|
alock.acquire();
|
||||||
}
|
}
|
||||||
|
@ -724,7 +754,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
/* advance percent count */
|
/* advance percent count */
|
||||||
if (aProgress)
|
if (aProgress)
|
||||||
@@ -7649,6 +7723,8 @@ HRESULT Console::setMachineState(MachineState_T aMachineState,
|
@@ -7649,6 +7729,8 @@ HRESULT Console::setMachineState(MachineState_T aMachineState,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -733,7 +763,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* Searches for a shared folder with the given logical name
|
* Searches for a shared folder with the given logical name
|
||||||
* in the collection of shared folders.
|
* in the collection of shared folders.
|
||||||
@@ -7684,6 +7760,8 @@ HRESULT Console::findSharedFolder(const Utf8Str &strName,
|
@@ -7684,6 +7766,8 @@ HRESULT Console::findSharedFolder(const Utf8Str &strName,
|
||||||
return VBOX_E_FILE_ERROR;
|
return VBOX_E_FILE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -742,7 +772,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* Fetches the list of global or machine shared folders from the server.
|
* Fetches the list of global or machine shared folders from the server.
|
||||||
*
|
*
|
||||||
@@ -8353,6 +8431,8 @@ DECLCALLBACK(void) Console::vmstateChangeCallback(PUVM pUVM, VMSTATE enmState, V
|
@@ -8353,6 +8437,8 @@ DECLCALLBACK(void) Console::vmstateChangeCallback(PUVM pUVM, VMSTATE enmState, V
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -751,7 +781,57 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* Changes the clipboard mode.
|
* Changes the clipboard mode.
|
||||||
*
|
*
|
||||||
@@ -8875,6 +8955,8 @@ HRESULT Console::detachFromTapInterface(INetworkAdapter *networkAdapter)
|
@@ -8426,7 +8512,7 @@ void Console::changeDragAndDropMode(DragAndDropMode_T aDragAndDropMode)
|
||||||
|
|
||||||
|
pVMMDev->hgcmHostCall("VBoxDragAndDropSvc", DragAndDropSvc::HOST_DND_SET_MODE, 1, &parm);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+#endif /* if 0 */
|
||||||
|
#ifdef VBOX_WITH_USB
|
||||||
|
/**
|
||||||
|
* Sends a request to VMM to attach the given host device.
|
||||||
|
@@ -8472,6 +8558,7 @@ HRESULT Console::attachUSBDevice(IUSBDevice *aHostDevice, ULONG aMaskedIfs)
|
||||||
|
Address.c_str(), uuid.raw()));
|
||||||
|
|
||||||
|
void *pvRemoteBackend = NULL;
|
||||||
|
+#if 0
|
||||||
|
if (fRemote)
|
||||||
|
{
|
||||||
|
RemoteUSBDevice *pRemoteUSBDevice = static_cast<RemoteUSBDevice *>(aHostDevice);
|
||||||
|
@@ -8479,7 +8566,7 @@ HRESULT Console::attachUSBDevice(IUSBDevice *aHostDevice, ULONG aMaskedIfs)
|
||||||
|
if (!pvRemoteBackend)
|
||||||
|
return E_INVALIDARG; /* The clientId is invalid then. */
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+#endif
|
||||||
|
USHORT portVersion = 1;
|
||||||
|
hrc = aHostDevice->COMGETTER(PortVersion)(&portVersion);
|
||||||
|
AssertComRCReturnRC(hrc);
|
||||||
|
@@ -8590,12 +8677,13 @@ HRESULT Console::detachUSBDevice(const ComObjPtr<OUSBDevice> &aHostDevice)
|
||||||
|
setErrorStatic(hrc2, "GetRemote() failed");
|
||||||
|
|
||||||
|
PCRTUUID pUuid = aHostDevice->id().raw();
|
||||||
|
+#if 0
|
||||||
|
if (fRemote)
|
||||||
|
{
|
||||||
|
Guid guid(*pUuid);
|
||||||
|
consoleVRDPServer()->USBBackendReleasePointer(&guid);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+#endif
|
||||||
|
alock.release();
|
||||||
|
int vrc = VMR3ReqCallWaitU(ptrVM.rawUVM(), 0 /* idDstCpu (saved state, see #6232) */,
|
||||||
|
(PFNRT)usbDetachCallback, 5,
|
||||||
|
@@ -8639,7 +8727,7 @@ Console::usbDetachCallback(Console *that, PUVM pUVM, PCRTUUID aUuid)
|
||||||
|
return vrc;
|
||||||
|
}
|
||||||
|
#endif /* VBOX_WITH_USB */
|
||||||
|
-
|
||||||
|
+#if 0
|
||||||
|
/* Note: FreeBSD needs this whether netflt is used or not. */
|
||||||
|
#if ((defined(RT_OS_LINUX) && !defined(VBOX_WITH_NETFLT)) || defined(RT_OS_FREEBSD))
|
||||||
|
/**
|
||||||
|
@@ -8875,6 +8963,8 @@ HRESULT Console::detachFromTapInterface(INetworkAdapter *networkAdapter)
|
||||||
}
|
}
|
||||||
#endif /* (RT_OS_LINUX || RT_OS_FREEBSD) && !VBOX_WITH_NETFLT */
|
#endif /* (RT_OS_LINUX || RT_OS_FREEBSD) && !VBOX_WITH_NETFLT */
|
||||||
|
|
||||||
|
@ -760,7 +840,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* Called at power down to terminate host interface networking.
|
* Called at power down to terminate host interface networking.
|
||||||
*
|
*
|
||||||
@@ -9046,9 +9128,10 @@ HRESULT Console::captureUSBDevices(PUVM pUVM)
|
@@ -9046,9 +9136,10 @@ HRESULT Console::captureUSBDevices(PUVM pUVM)
|
||||||
* us back from under its lock (e.g. onUSBDeviceAttach()) which would
|
* us back from under its lock (e.g. onUSBDeviceAttach()) which would
|
||||||
* produce an inter-process dead-lock otherwise. */
|
* produce an inter-process dead-lock otherwise. */
|
||||||
alock.release();
|
alock.release();
|
||||||
|
@ -772,7 +852,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@@ -9077,6 +9160,8 @@ void Console::detachAllUSBDevices(bool aDone)
|
@@ -9077,6 +9168,8 @@ void Console::detachAllUSBDevices(bool aDone)
|
||||||
mControl->DetachAllUSBDevices(aDone);
|
mControl->DetachAllUSBDevices(aDone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -781,7 +861,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* @note Locks this object for writing.
|
* @note Locks this object for writing.
|
||||||
*/
|
*/
|
||||||
@@ -9249,6 +9334,8 @@ void Console::processRemoteUSBDevices(uint32_t u32ClientId, VRDEUSBDEVICEDESC *p
|
@@ -9249,6 +9342,8 @@ void Console::processRemoteUSBDevices(uint32_t u32ClientId, VRDEUSBDEVICEDESC *p
|
||||||
LogFlowThisFuncLeave();
|
LogFlowThisFuncLeave();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -790,7 +870,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* Progress cancelation callback for fault tolerance VM poweron
|
* Progress cancelation callback for fault tolerance VM poweron
|
||||||
*/
|
*/
|
||||||
@@ -9346,6 +9433,7 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
@@ -9346,6 +9441,7 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
||||||
/* Create the VRDP server. In case of headless operation, this will
|
/* Create the VRDP server. In case of headless operation, this will
|
||||||
* also create the framebuffer, required at VM creation.
|
* also create the framebuffer, required at VM creation.
|
||||||
*/
|
*/
|
||||||
|
@ -798,7 +878,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
ConsoleVRDPServer *server = pConsole->consoleVRDPServer();
|
ConsoleVRDPServer *server = pConsole->consoleVRDPServer();
|
||||||
Assert(server);
|
Assert(server);
|
||||||
|
|
||||||
@@ -9392,6 +9480,7 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
@@ -9392,6 +9488,7 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
||||||
vrc, errMsg.c_str()));
|
vrc, errMsg.c_str()));
|
||||||
throw setErrorStatic(E_FAIL, errMsg.c_str());
|
throw setErrorStatic(E_FAIL, errMsg.c_str());
|
||||||
}
|
}
|
||||||
|
@ -806,7 +886,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
ComPtr<IMachine> pMachine = pConsole->machine();
|
ComPtr<IMachine> pMachine = pConsole->machine();
|
||||||
ULONG cCpus = 1;
|
ULONG cCpus = 1;
|
||||||
@@ -9416,8 +9505,10 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
@@ -9416,8 +9513,10 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
||||||
|
|
||||||
alock.acquire();
|
alock.acquire();
|
||||||
|
|
||||||
|
@ -817,7 +897,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
if (RT_SUCCESS(vrc))
|
if (RT_SUCCESS(vrc))
|
||||||
{
|
{
|
||||||
@@ -9441,9 +9532,11 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
@@ -9441,9 +9540,11 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
||||||
/*
|
/*
|
||||||
* Synchronize debugger settings
|
* Synchronize debugger settings
|
||||||
*/
|
*/
|
||||||
|
@ -829,7 +909,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shared Folders
|
* Shared Folders
|
||||||
@@ -9719,6 +9812,7 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
@@ -9719,6 +9820,7 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser)
|
||||||
return VINF_SUCCESS;
|
return VINF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -837,7 +917,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reconfigures a medium attachment (part of taking or deleting an online snapshot).
|
* Reconfigures a medium attachment (part of taking or deleting an online snapshot).
|
||||||
@@ -10209,6 +10303,8 @@ DECLCALLBACK(int) Console::saveStateThread(RTTHREAD Thread, void *pvUser)
|
@@ -10209,6 +10311,8 @@ DECLCALLBACK(int) Console::saveStateThread(RTTHREAD Thread, void *pvUser)
|
||||||
return VINF_SUCCESS;
|
return VINF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -846,7 +926,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* Thread for powering down the Console.
|
* Thread for powering down the Console.
|
||||||
*
|
*
|
||||||
@@ -10367,8 +10463,6 @@ Console::i_pdmIfSecKey_KeyRelease(PPDMISECKEY pInterface, const char *pszId)
|
@@ -10367,8 +10471,6 @@ Console::i_pdmIfSecKey_KeyRelease(PPDMISECKEY pInterface, const char *pszId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -855,7 +935,7 @@ index 69e3109..9ed6cdd 100644
|
||||||
/**
|
/**
|
||||||
* The Main status driver instance data.
|
* The Main status driver instance data.
|
||||||
*/
|
*/
|
||||||
@@ -10461,9 +10555,11 @@ DECLCALLBACK(int) Console::drvStatus_MediumEjected(PPDMIMEDIANOTIFY pInterface,
|
@@ -10461,9 +10563,11 @@ DECLCALLBACK(int) Console::drvStatus_MediumEjected(PPDMIMEDIANOTIFY pInterface,
|
||||||
alock.release();
|
alock.release();
|
||||||
|
|
||||||
ComPtr<IMediumAttachment> pNewMediumAtt;
|
ComPtr<IMediumAttachment> pNewMediumAtt;
|
||||||
|
|
|
@ -10,6 +10,7 @@ SRC_CC = frontend/main.cc frontend/console.cc \
|
||||||
frontend/VBoxAPIWrap/MediumFormatWrap.cpp \
|
frontend/VBoxAPIWrap/MediumFormatWrap.cpp \
|
||||||
frontend/VBoxAPIWrap/TokenWrap.cpp \
|
frontend/VBoxAPIWrap/TokenWrap.cpp \
|
||||||
frontend/VirtualBoxErrorInfoImpl.cpp \
|
frontend/VirtualBoxErrorInfoImpl.cpp \
|
||||||
|
frontend/USBProxyDevice-genode.cpp \
|
||||||
devices.cc drivers.cc dummies.cc libc.cc \
|
devices.cc drivers.cc dummies.cc libc.cc \
|
||||||
logger.cc mm.cc pdm.cc pgm.cc rt.cc sup.cc iommio.cc ioport.cc \
|
logger.cc mm.cc pdm.cc pgm.cc rt.cc sup.cc iommio.cc ioport.cc \
|
||||||
hm.cc thread.cc dynlib.cc unimpl.cc
|
hm.cc thread.cc dynlib.cc unimpl.cc
|
||||||
|
@ -30,6 +31,8 @@ INC_DIR += $(call select_from_repositories,src/lib/pthread)
|
||||||
|
|
||||||
INC_DIR += $(VBOX_DIR)/Runtime/include
|
INC_DIR += $(VBOX_DIR)/Runtime/include
|
||||||
|
|
||||||
|
SRC_CC += HostDrivers/VBoxUSB/USBFilter.cpp
|
||||||
|
|
||||||
SRC_CC += HostServices/SharedFolders/service.cpp
|
SRC_CC += HostServices/SharedFolders/service.cpp
|
||||||
SRC_CC += HostServices/SharedFolders/mappings.cpp
|
SRC_CC += HostServices/SharedFolders/mappings.cpp
|
||||||
SRC_CC += HostServices/SharedFolders/vbsf.cpp
|
SRC_CC += HostServices/SharedFolders/vbsf.cpp
|
||||||
|
@ -46,6 +49,7 @@ INC_DIR += $(REP_DIR)/src/virtualbox/frontend
|
||||||
INC_DIR += $(REP_DIR)/src/virtualbox/frontend/VBoxAPIWrap
|
INC_DIR += $(REP_DIR)/src/virtualbox/frontend/VBoxAPIWrap
|
||||||
|
|
||||||
INC_DIR += $(VBOX_DIR)/Main/xml
|
INC_DIR += $(VBOX_DIR)/Main/xml
|
||||||
|
INC_DIR += $(VBOX_DIR)/Devices/USB
|
||||||
|
|
||||||
# search path to 'scan_code_set_2.h'
|
# search path to 'scan_code_set_2.h'
|
||||||
INC_DIR += $(call select_from_repositories,src/drivers/input/ps2)
|
INC_DIR += $(call select_from_repositories,src/drivers/input/ps2)
|
||||||
|
|
|
@ -123,8 +123,6 @@ DUMMY(RTPathAppend)
|
||||||
DUMMY(RTPathChangeToDosSlashes)
|
DUMMY(RTPathChangeToDosSlashes)
|
||||||
DUMMY(RTSemEventWaitEx)
|
DUMMY(RTSemEventWaitEx)
|
||||||
|
|
||||||
DUMMY(RTMemDupExTag)
|
|
||||||
DUMMY(RTMemDupTag)
|
|
||||||
DUMMY(RTMemExecFree)
|
DUMMY(RTMemExecFree)
|
||||||
|
|
||||||
DUMMY(SELMR3GetSelectorInfo)
|
DUMMY(SELMR3GetSelectorInfo)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user