From: Dmitry Fleytman <dmitry@xxxxxxxxxx> add UsbDkDataHider.h UsbDkHelperHider.h usbdk_api.h usbdk_api.c files to allow hide devices according auto redirect rule functionality Signed-off-by: Kirill Moizik <kirill@xxxxxxxxxx> Signed-off-by: Dmitry Fleytman <dmitry@xxxxxxxxxx> --- gtk/Makefile.am | 2 + gtk/UsbDk/UsbDkDataHider.h | 35 +++++++++++++++ gtk/UsbDk/UsbDkHelperHider.h | 105 +++++++++++++++++++++++++++++++++++++++++++ gtk/usbdk_api.c | 77 +++++++++++++++++++++++++++++++ gtk/usbdk_api.h | 42 +++++++++++++++++ 5 files changed, 261 insertions(+) create mode 100644 gtk/UsbDk/UsbDkDataHider.h create mode 100644 gtk/UsbDk/UsbDkHelperHider.h create mode 100644 gtk/usbdk_api.c create mode 100644 gtk/usbdk_api.h diff --git a/gtk/Makefile.am b/gtk/Makefile.am index ed35f47..83473ac 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -369,6 +369,8 @@ WIN_USB_FILES= \ win-usb-clerk.h \ win-usb-driver-install.h \ win-usb-driver-install.c \ + usbdk_api.h \ + usbdk_api.c \ $(NULL) if OS_WIN32 diff --git a/gtk/UsbDk/UsbDkDataHider.h b/gtk/UsbDk/UsbDkDataHider.h new file mode 100644 index 0000000..b2a7e55 --- /dev/null +++ b/gtk/UsbDk/UsbDkDataHider.h @@ -0,0 +1,35 @@ +/********************************************************************** +* Copyright (c) 2013-2014 Red Hat, Inc. +* +* Developed by Daynix Computing LTD. +* +* Authors: +* Dmitry Fleytman <dmitry@xxxxxxxxxx> +* Kirill Moizik <kirill@xxxxxxxxxx> +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +**********************************************************************/ + +#pragma once + +#define USB_DK_HIDE_RULE_MATCH_ALL ((ULONG64)(-1)) + +typedef struct tag_USB_DK_HIDE_RULE +{ + ULONG64 Hide; + ULONG64 Class; + ULONG64 VID; + ULONG64 PID; + ULONG64 BCD; +} USB_DK_HIDE_RULE, *PUSB_DK_HIDE_RULE; diff --git a/gtk/UsbDk/UsbDkHelperHider.h b/gtk/UsbDk/UsbDkHelperHider.h new file mode 100644 index 0000000..309943f --- /dev/null +++ b/gtk/UsbDk/UsbDkHelperHider.h @@ -0,0 +1,105 @@ +/********************************************************************** +* Copyright (c) 2013-2014 Red Hat, Inc. +* +* Developed by Daynix Computing LTD. +* +* Authors: +* Dmitry Fleytman <dmitry@xxxxxxxxxx> +* Kirill Moizik <kirill@xxxxxxxxxx> +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +**********************************************************************/ + +#pragma once + +// UsbDkHelper C-interface + +#ifdef BUILD_DLL +#define DLL __declspec(dllexport) +#else +#ifdef _MSC_VER +#define DLL __declspec(dllimport) +#else +#define DLL +#endif +#endif + +#include "UsbDkDataHider.h" +#ifdef __cplusplus +extern "C" { +#endif + +// UsbDk hider API provides hide device feature that allows to detach USB device from the hosting system. +// It can be useful in various scenarios, for example when there is no drivers for USB device on hosting machine +// and user would like to avoid dealing with "New Hardware" wizard. + + /* Create handle to hider interface of UsbDk driver + * + * @params + * IN - None + * OUT - None + * + * @return + * Handle to hider interface of UsbDk driver + * + * @note + * When this handle closes UsbDk clears all rules set by UsbDk_AddHideRule() + * + */ + DLL HANDLE UsbDk_CreateHiderHandle(void); + + /* Add a rule to determine which USB devices + * to be hidden when plugged in, a rule contains: + * + * class, vendor, product, version, allow + * + * Use -1 for @class/@vendor/@product/@version to accept any value. + * + * @params + * IN - HiderHandle Handle to UsbDk driver + - rule - pointer to hiding rule + * OUT - None + * + * @return + * TRUE if function succeeds + * + */ + DLL BOOL UsbDk_AddHideRule(HANDLE HiderHandle, PUSB_DK_HIDE_RULE Rule); + + /* Clear all hider rules + * + * @params + * IN - HiderHandle Handle to UsbDk driver + * OUT - None + * + * @return + * TRUE if function succeeds + * + */ + DLL BOOL UsbDk_ClearHideRules(HANDLE HiderHandle); + + /* Close Handle to UsbDk hider interface + * + * @params + * IN - HiderHandle Handle to UsbDk driver + * OUT - None + * + * @return + * None + * + */ + DLL void UsbDk_CloseHiderHandle(HANDLE HiderHandle); +#ifdef __cplusplus +} +#endif diff --git a/gtk/usbdk_api.c b/gtk/usbdk_api.c new file mode 100644 index 0000000..c8cd9d4 --- /dev/null +++ b/gtk/usbdk_api.c @@ -0,0 +1,77 @@ +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* +Copyright (C) 2011, 2012 Red Hat, Inc. + +* Authors: +* Dmitry Fleytman <dmitry@xxxxxxxxxx> +* Kirill Moizik <kirill@xxxxxxxxxx> + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ + +#include <windows.h> +#include "usbdk_api.h" +#include "spice-util.h" + +void usbdk_api_unload(usbdk_api_wrapper *usbdk_api) +{ + SPICE_DEBUG("Unloading UsbDk API DLL"); + FreeLibrary(usbdk_api->module); +} + +int usbdk_api_load(usbdk_api_wrapper *usbdk_api) +{ + SPICE_DEBUG("Loading UsbDk API DLL"); + + usbdk_api->module = LoadLibraryA("UsbDkHelper"); + if (usbdk_api->module == NULL) { + DWORD err = GetLastError(); + SPICE_DEBUG("Failed to load UsbDkHelper.dll, error %lu", err); + return -1 ; + } + + usbdk_api->CreateHandle = (USBDK_CREATEHIDERHANDLE) + GetProcAddress(usbdk_api->module, "UsbDk_CreateHiderHandle"); + if (usbdk_api->CreateHandle == NULL) { + SPICE_DEBUG("CreateHandle"); + goto error_unload; + } + + usbdk_api->AddRule = (USBDK_ADDHIDERULE) + GetProcAddress(usbdk_api->module, "UsbDk_AddHideRule"); + if (usbdk_api->AddRule == NULL) { + SPICE_DEBUG("AddRule"); + goto error_unload; + + } + + usbdk_api->ClearRules = (USBDK_CLEARHIDERULES) + GetProcAddress(usbdk_api->module, "UsbDk_ClearHideRules"); + if (usbdk_api->ClearRules == NULL) { + SPICE_DEBUG("ClearRules"); + goto error_unload; + } + + usbdk_api->CloseHiderHandle = (USBDK_CLOSEHIDERHANDLE) + GetProcAddress(usbdk_api->module, "UsbDk_CloseHiderHandle"); + if (usbdk_api->CloseHiderHandle == NULL) { + SPICE_DEBUG("CloseHiderHandle"); + goto error_unload; + } + return 0; + +error_unload: + FreeLibrary(usbdk_api->module); + return -1; +} diff --git a/gtk/usbdk_api.h b/gtk/usbdk_api.h new file mode 100644 index 0000000..d86782a --- /dev/null +++ b/gtk/usbdk_api.h @@ -0,0 +1,42 @@ +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* +Copyright (C) 2011, 2012 Red Hat, Inc. + +* Authors: +* Dmitry Fleytman <dmitry@xxxxxxxxxx> +* Kirill Moizik <kirill@xxxxxxxxxx> + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ + +#pragma once + +#include "UsbDk/UsbDkDataHider.h" + +typedef HANDLE(__cdecl *USBDK_CREATEHIDERHANDLE)(void); +typedef BOOL(__cdecl * USBDK_ADDHIDERULE)(HANDLE HiderHandle, PUSB_DK_HIDE_RULE rule); +typedef BOOL(__cdecl *USBDK_CLEARHIDERULES)(HANDLE HiderHandle); +typedef void(__cdecl *USBDK_CLOSEHIDERHANDLE)(HANDLE HiderHandle); + + +typedef struct tag_usbdk_api_wrapper { + HMODULE module; + USBDK_CREATEHIDERHANDLE CreateHandle; + USBDK_ADDHIDERULE AddRule; + USBDK_CLEARHIDERULES ClearRules; + USBDK_CLOSEHIDERHANDLE CloseHiderHandle; +} usbdk_api_wrapper; + +int usbdk_api_load(usbdk_api_wrapper *usbdk_api); +void usbdk_api_unload(usbdk_api_wrapper *usbdk_api); -- 2.1.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel