📄 registry.c
字号:
/* LIBUSB-WIN32, Generic Windows USB Library * Copyright (c) 2002-2005 Stephan Meyer <ste_meyer@web.de> * * 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 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <windows.h>#include <ctype.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#ifdef __GNUC__#include <ddk/cfgmgr32.h>#else#include <cfgmgr32.h>#define strlwr(p) _strlwr(p)#endif#include "registry.h"#include "error.h"#define CLASS_KEY_PATH_NT "SYSTEM\\CurrentControlSet\\Control\\Class\\"#define CLASS_KEY_PATH_9X "SYSTEM\\CurrentControlSet\\Services\\Class\\"#define USB_GET_DRIVER_NAME() \ usb_registry_is_nt() ? driver_name_nt : driver_name_9x;typedef struct _usb_class_key usb_class_key_t;struct _usb_class_key { usb_class_key_t *next; char name[MAX_PATH];};static const char *driver_name_nt = "libusb0";static const char *driver_name_9x = "libusb0.sys";static const char *default_class_keys_nt[] = { /* USB devices */ "{36fc9e60-c465-11cf-8056-444553540000}", /* HID devices */ "{745a17a0-74d3-11d0-b6fe-00a0c90f57da}", /* Network devices */ "{4d36e972-e325-11ce-bfc1-08002be10318}", /* Image devices */ "{6bdd1fc6-810f-11d0-bec7-08002be2092f}", /* Media devices */ "{4d36e96c-e325-11ce-bfc1-08002be10318}", /* Modem devices */ "{4d36e96d-e325-11ce-bfc1-08002be10318}", /* SmartCardReader devices*/ "{50dd5230-ba8a-11d1-bf5d-0000f805f530}", NULL };static const char *default_class_keys_9x[] = { /* USB devices */ "usb", /* HID devices */ "hid", /* Network devices */ "net", /* Image devices */ "image", /* Media devices */ "media", /* Modem devices */ "modem", NULL };static bool_t usb_registry_set_device_state(DWORD state, HDEVINFO dev_info, SP_DEVINFO_DATA *dev_info_data);static usb_class_key_t *usb_registry_get_usb_class_keys(void);static usb_class_key_t *usb_registry_get_all_class_keys(void);static bool_t usb_registry_add_class_key(usb_class_key_t **head, const char *key);static bool_t usb_registry_free_class_keys(usb_class_key_t **head);bool_t usb_registry_is_nt(void){ return GetVersion() < 0x80000000 ? TRUE : FALSE;}bool_t usb_registry_get_property(DWORD which, HDEVINFO dev_info, SP_DEVINFO_DATA *dev_info_data, char *buf, int size){ DWORD reg_type; DWORD key_type; DWORD length = size; char *p = NULL; char *val_name = NULL; HKEY reg_key = NULL; memset(buf, 0, size); switch(which) { case SPDRP_LOWERFILTERS: val_name = "LowerFilters"; key_type = DIREG_DEV; break; case SPDRP_UPPERFILTERS: val_name = "UpperFilters"; key_type = DIREG_DEV; break; case SPDRP_SERVICE: val_name = "NTMPDriver"; key_type = DIREG_DRV; break; case SPDRP_CLASSGUID: val_name = "ClassGUID"; key_type = DIREG_DEV; case SPDRP_CLASS: val_name = "Class"; key_type = DIREG_DEV; break; case SPDRP_HARDWAREID: val_name = "HardwareID"; key_type = DIREG_DEV; break; case SPDRP_DEVICEDESC: val_name = "DeviceDesc"; key_type = DIREG_DEV; break; case SPDRP_MFG: val_name = "Mfg"; key_type = DIREG_DEV; break; default: return FALSE; } if(usb_registry_is_nt()) { if(!SetupDiGetDeviceRegistryProperty(dev_info, dev_info_data, which, ®_type, (BYTE *)buf, size, &length)) { return FALSE; } if(length <= 2) { return FALSE; } } else /* Win9x */ { reg_key = SetupDiOpenDevRegKey(dev_info, dev_info_data, DICS_FLAG_GLOBAL, 0, key_type, KEY_ALL_ACCESS); if(reg_key == INVALID_HANDLE_VALUE) { usb_error("usb_registry_get_property(): reading " "registry key failed"); return FALSE; } if(RegQueryValueEx(reg_key, val_name, NULL, ®_type, (BYTE *)buf, &length) != ERROR_SUCCESS || length <= 2) { RegCloseKey(reg_key); return FALSE; } RegCloseKey(reg_key); if(reg_type == REG_MULTI_SZ) { p = buf; while(*p) { if(*p == ',') { *p = 0; } p++; } } } return TRUE;}bool_t usb_registry_set_property(DWORD which, HDEVINFO dev_info, SP_DEVINFO_DATA *dev_info_data, char *buf, int size){ char *val_name = NULL; char *p = NULL; HKEY reg_key; DWORD reg_type; switch(which) { case SPDRP_LOWERFILTERS: reg_type = usb_registry_is_nt() ? REG_MULTI_SZ : REG_SZ; val_name = "LowerFilters"; break; case SPDRP_UPPERFILTERS: reg_type = usb_registry_is_nt() ? REG_MULTI_SZ : REG_SZ; val_name = "UpperFilters"; break; default: return 0; } if(usb_registry_is_nt()) { if(size > 2) { if(!SetupDiSetDeviceRegistryProperty(dev_info, dev_info_data, which, (BYTE *)buf, size)) { usb_error("usb_registry_set_property(): setting " "property '%s' failed", val_name); return FALSE; } } else { if(!SetupDiSetDeviceRegistryProperty(dev_info, dev_info_data, which, NULL, 0)) { usb_error("usb_registry_set_property(): deleting " "property '%s' failed", val_name); return FALSE; } } } else { p = buf; while(*p) { if(*p == ',') { *p = 0; } p += (strlen(p) + 1); } reg_key = SetupDiOpenDevRegKey(dev_info, dev_info_data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_ALL_ACCESS); if(reg_key == INVALID_HANDLE_VALUE) { usb_error("usb_registry_set_property(): reading " "registry key failed"); return FALSE; } if(size > 3) { if(RegSetValueEx(reg_key, val_name, 0, reg_type, (BYTE *)buf, size) != ERROR_SUCCESS) { usb_error("usb_registry_set_property(): setting " "property '%s' failed", val_name); RegCloseKey(reg_key); return FALSE; } } else { if(RegDeleteValue(reg_key, val_name) != ERROR_SUCCESS) { usb_error("usb_registry_set_property(): deleting " "property '%s' failed", val_name); RegCloseKey(reg_key); return FALSE; } } RegCloseKey(reg_key); } return TRUE;}bool_t usb_registry_insert_class_filter(void){ const char *driver_name; usb_class_key_t *keys; usb_class_key_t *key; char buf[MAX_PATH]; driver_name = USB_GET_DRIVER_NAME(); keys = usb_registry_get_usb_class_keys(); if(!keys) { usb_error("usb_registry_insert_filter: unable to retrieve class keys\n"); return FALSE; } key = keys; while(key) { if(usb_registry_get_mz_value(key->name, "UpperFilters", buf, sizeof(buf))) { usb_registry_mz_string_lower(buf); if(usb_registry_mz_string_find(buf, driver_name)) { key = key->next; continue; } } usb_registry_mz_string_insert(buf, driver_name); if(!usb_registry_set_mz_value(key->name, "UpperFilters", buf, usb_registry_mz_string_size(buf))) { usb_error("usb_registry_insert_filter: unable to " "set registry value\n"); } key = key->next; } usb_registry_free_class_keys(&keys); return TRUE;}bool_t usb_registry_remove_class_filter(void){ const char *driver_name; usb_class_key_t *keys; usb_class_key_t *key; char buf[MAX_PATH]; driver_name = USB_GET_DRIVER_NAME(); keys = usb_registry_get_all_class_keys(); if(!keys) { usb_error("usb_registry_remove_filter: unable to retrieve class keys\n"); return FALSE; } key = keys; while(key) { if(usb_registry_get_mz_value(key->name, "UpperFilters", buf, sizeof(buf))) { usb_registry_mz_string_lower(buf); if(usb_registry_mz_string_find(buf, driver_name)) { usb_registry_mz_string_remove(buf, driver_name); usb_registry_set_mz_value(key->name, "UpperFilters", buf, usb_registry_mz_string_size(buf)); } } key = key->next; } usb_registry_free_class_keys(&keys); return TRUE;}bool_t usb_registry_remove_device_filter(void){ HDEVINFO dev_info; SP_DEVINFO_DATA dev_info_data; int dev_index = 0; char filters[MAX_PATH]; const char *driver_name; driver_name = USB_GET_DRIVER_NAME(); dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA); dev_index = 0; dev_info = SetupDiGetClassDevs(NULL, "USB", NULL, DIGCF_ALLCLASSES); if(dev_info == INVALID_HANDLE_VALUE) { usb_error("usb_registry_remove_device_filter(): getting " "device info set failed"); return FALSE; } while(SetupDiEnumDeviceInfo(dev_info, dev_index, &dev_info_data)) { /* remove libusb as a device upper filter */ if(usb_registry_get_property(SPDRP_UPPERFILTERS, dev_info, &dev_info_data, filters, sizeof(filters))) { usb_registry_mz_string_lower(filters); if(usb_registry_mz_string_find(filters, driver_name)) { int size; usb_registry_mz_string_remove(filters, driver_name); size = usb_registry_mz_string_size(filters); usb_registry_set_property(SPDRP_UPPERFILTERS, dev_info, &dev_info_data, filters, size); } } /* remove libusb as a device lower filter */ if(usb_registry_get_property(SPDRP_LOWERFILTERS, dev_info, &dev_info_data, filters, sizeof(filters))) { usb_registry_mz_string_lower(filters); if(usb_registry_mz_string_find(filters, driver_name)) { int size; usb_registry_mz_string_remove(filters, driver_name); size = usb_registry_mz_string_size(filters); usb_registry_set_property(SPDRP_LOWERFILTERS, dev_info, &dev_info_data, filters, size); } } dev_index++; } SetupDiDestroyDeviceInfoList(dev_info); return TRUE;}static bool_t usb_registry_set_device_state(DWORD state, HDEVINFO dev_info, SP_DEVINFO_DATA *dev_info_data){ SP_PROPCHANGE_PARAMS prop_params; memset(&prop_params, 0, sizeof(SP_PROPCHANGE_PARAMS)); prop_params.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); prop_params.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; prop_params.StateChange = state; prop_params.Scope = DICS_FLAG_CONFIGSPECIFIC;//DICS_FLAG_GLOBAL; prop_params.HwProfile = 0; if(!SetupDiSetClassInstallParams(dev_info, dev_info_data, (SP_CLASSINSTALL_HEADER *)&prop_params, sizeof(SP_PROPCHANGE_PARAMS))) { usb_error("usb_registry_set_device_state(): setting class " "install parameters failed"); return FALSE; } if(!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, dev_info, dev_info_data)) { usb_error("usb_registry_set_device_state(): calling class " "installer failed"); return FALSE; } return TRUE;}bool_t usb_registry_restart_device(HDEVINFO dev_info, SP_DEVINFO_DATA *dev_info_data){ return usb_registry_set_device_state(DICS_PROPCHANGE, dev_info, dev_info_data);}bool_t usb_registry_stop_device(HDEVINFO dev_info, SP_DEVINFO_DATA *dev_info_data){ return usb_registry_set_device_state(DICS_DISABLE, dev_info, dev_info_data);}bool_t usb_registry_start_device(HDEVINFO dev_info, SP_DEVINFO_DATA *dev_info_data){ return usb_registry_set_device_state(DICS_ENABLE, dev_info, dev_info_data);}bool_t usb_registry_is_service_libusb(HDEVINFO dev_info, SP_DEVINFO_DATA *dev_info_data){ char service_name[MAX_PATH]; if(!usb_registry_get_property(SPDRP_SERVICE, dev_info, dev_info_data, service_name, sizeof(service_name))) { return FALSE; } usb_registry_mz_string_lower(service_name); if(usb_registry_mz_string_find_sub(service_name, "libusb")) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -