On Thu, May 28, 2015 at 01:24:03PM +0300, Kirill Moizik wrote: > From: Dmitry Fleytman <dmitry@xxxxxxxxxx> > > add UsbDkDataHider.h UsbDkHelperHider.h usbdk_api.h usbdk_api.c files s/add/Add > to allow hide devices according auto redirect rule functionality to allow to hide USB devices so that they can be auto-redirected ? > > 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. « provides a 'hide device' feature ... to detach a USB device/USB devices from the OS? » > +// 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. « when the OS has no drivers for a USB device and the user would like to avoid dealing with the "New Hardware" wizard. » > + > + /* Create handle to hider interface of UsbDk driver Create a handle to the hider interface of the UsbDk driver > + * > + * @params > + * IN - None > + * OUT - None > + * > + * @return > + * Handle to hider interface of UsbDk driver of the UsbDk driver > + * > + * @note > + * When this handle closes UsbDk clears all rules set by UsbDk_AddHideRule() > + * When this handle is closed, UsbDk... > + */ > + DLL HANDLE UsbDk_CreateHiderHandle(void); > + > + /* Add a rule to determine which USB devices > + * to be hidden when plugged in, a rule contains: should be hidden? > + * > + * class, vendor, product, version, allow > + * > + * Use -1 for @class/@vendor/@product/@version to accept any value. > + * > + * @params > + * IN - HiderHandle Handle to UsbDk driver to the UsbDk driver ? > + - rule - pointer to hiding rule I'd say 'to a hiding rule' > + * OUT - None > + * > + * @return > + * TRUE if function succeeds if the call succeeds ? > + * > + */ > + DLL BOOL UsbDk_AddHideRule(HANDLE HiderHandle, PUSB_DK_HIDE_RULE Rule); > + > + /* Clear all hider rules > + * > + * @params > + * IN - HiderHandle Handle to UsbDk driver to the UsbDk driver ? > + * OUT - None > + * > + * @return > + * TRUE if function succeeds if the call succeeds ? > + * > + */ > + DLL BOOL UsbDk_ClearHideRules(HANDLE HiderHandle); > + > + /* Close Handle to UsbDk hider interface Close a UsbDk handle? > + * > + * @params > + * IN - HiderHandle Handle to UsbDk driver to the 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); Feels more robust to set all function pointers to NULL so that they are not used by mistake. I'd do that in usbdk_api_unload, and call that from error_unload: > + 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); I'd tend to make usbdk_api_wrapper opaque, and have HANDLE usbdk_api_create_handle(void); usbdk_api_wrapper_add_hide_rule(); and so on. Christophe
Attachment:
pgpaizAtF24Qi.pgp
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel