📄 registry.c
字号:
return TRUE; } return FALSE;}void usb_registry_stop_libusb_devices(void){ HDEVINFO dev_info; SP_DEVINFO_DATA dev_info_data; int dev_index = 0; dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA); dev_index = 0; dev_info = SetupDiGetClassDevs(NULL, "USB", NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT); if(dev_info == INVALID_HANDLE_VALUE) { usb_error("usb_registry_stop_libusb_devices(): getting " "device info set failed"); return; } while(SetupDiEnumDeviceInfo(dev_info, dev_index, &dev_info_data)) { if(usb_registry_is_service_libusb(dev_info, &dev_info_data)) { usb_registry_stop_device(dev_info, &dev_info_data); } dev_index++; } SetupDiDestroyDeviceInfoList(dev_info);}void usb_registry_start_libusb_devices(void){ HDEVINFO dev_info; SP_DEVINFO_DATA dev_info_data; int dev_index = 0; dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA); dev_index = 0; dev_info = SetupDiGetClassDevs(NULL, "USB", NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT); if(dev_info == INVALID_HANDLE_VALUE) { usb_error("usb_registry_stop_libusb_devices(): getting " "device info set failed"); return; } while(SetupDiEnumDeviceInfo(dev_info, dev_index, &dev_info_data)) { if(usb_registry_is_service_libusb(dev_info, &dev_info_data)) { usb_registry_start_device(dev_info, &dev_info_data); } dev_index++; } SetupDiDestroyDeviceInfoList(dev_info);}bool_t usb_registry_match(HDEVINFO dev_info, SP_DEVINFO_DATA *dev_info_data){ char tmp[MAX_PATH]; if(!usb_registry_get_property(SPDRP_HARDWAREID, dev_info, dev_info_data, tmp, sizeof(tmp))) { usb_error("usb_registry_match_no_hubs(): getting hardware id " "failed"); return FALSE; } usb_registry_mz_string_lower(tmp); /* search for USB devices, skip root hubs and interfaces of composite */ /* devices */ if(usb_registry_mz_string_find_sub(tmp, "&mi_") || usb_registry_mz_string_find_sub(tmp, "root_hub")) { return FALSE; } return TRUE;}bool_t usb_registry_get_mz_value(const char *key, const char *value, char *buf, int size){ HKEY reg_key = NULL; DWORD reg_type; DWORD reg_length = size; bool_t ret = FALSE; char *p; memset(buf, 0, size); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_ALL_ACCESS, ®_key) == ERROR_SUCCESS) { if(RegQueryValueEx(reg_key, value, NULL, ®_type, buf, ®_length) == ERROR_SUCCESS) { if(reg_type == REG_SZ) { p = buf; while(*p) { if(*p == ',') { *p = 0; } p++; } } ret = TRUE; } } if(reg_key) { RegCloseKey(reg_key); } return ret;}bool_t usb_registry_set_mz_value(const char *key, const char *value, char *buf, int size){ HKEY reg_key = NULL; bool_t ret = FALSE; char *p; /* convert REG_MULTI_SZ to REG_SZ */ if(!usb_registry_is_nt()) { p = buf; while(*p && *(p + 1)) { if(*p == 0) { *p = ','; } p++; } } if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_ALL_ACCESS, ®_key) == ERROR_SUCCESS) { if(size > 2) { if(usb_registry_is_nt()) { if(RegSetValueEx(reg_key, value, 0, REG_MULTI_SZ, buf, size) == ERROR_SUCCESS) { ret = TRUE; } } else { if(RegSetValueEx(reg_key, value, 0, REG_SZ, buf, size) == ERROR_SUCCESS) { ret = TRUE; } } } else { if(RegDeleteValue(reg_key, value) == ERROR_SUCCESS) { ret = TRUE; } } } if(reg_key) { RegCloseKey(reg_key); } return ret;}int usb_registry_mz_string_size(const char *src){ char *p = (char *)src; if(!src) { return 0; } while(*p) { p += (strlen(p) + 1); } return (int)(p - src) + 1;}char *usb_registry_mz_string_find_sub(const char *src, const char *str){ while(*src) { if(strstr(src, str)) { return (char *)src; } src += (strlen(src) + 1); } return NULL;}char *usb_registry_mz_string_find(const char *src, const char *str){ while(*src) { if(!strcmp(src, str)) { return (char *)src; } src += strlen(src) + 1; } return NULL;}bool_t usb_registry_mz_string_insert(char *src, const char *str){ while(*src) { src += (strlen(src) + 1); } memcpy(src, str, strlen(str)); src += strlen(str); *src = 0; *(src + 1) = 0; return TRUE;}bool_t usb_registry_mz_string_remove(char *src, const char *str){ char *p; bool_t ret = FALSE; int size; do { src = usb_registry_mz_string_find(src, str); if(!src) { break; } else { ret = TRUE; } p = src; size = 0; while(*p) { p += strlen(p) + 1; size += strlen(p) + 1; } memmove(src, src + strlen(src) + 1, size); } while(1); return TRUE;}void usb_registry_mz_string_lower(char *src){ while(*src) { strlwr(src); src += (strlen(src) + 1); }}bool_t usb_registry_restart_all_devices(void){ HDEVINFO dev_info; SP_DEVINFO_DATA dev_info_data; int dev_index; char id[MAX_PATH]; dev_index = 0; dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA); dev_info = SetupDiGetClassDevs(NULL, "USB", NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT); if(dev_info == INVALID_HANDLE_VALUE) { usb_error("usb_registry_restart_all_devices(): getting " "device info set failed"); return FALSE; } while(SetupDiEnumDeviceInfo(dev_info, dev_index, &dev_info_data)) { if(!usb_registry_get_property(SPDRP_HARDWAREID, dev_info, &dev_info_data, id, sizeof(id))) { usb_error("usb_registry_restart_all_devices(): getting hardware " "id failed"); dev_index++; continue; } usb_registry_mz_string_lower(id); /* restart root hubs */ if(usb_registry_mz_string_find_sub(id, "root_hub")) { usb_registry_restart_device(dev_info, &dev_info_data); } dev_index++; } SetupDiDestroyDeviceInfoList(dev_info); return TRUE;}usb_class_key_t *usb_registry_get_usb_class_keys(void){ HDEVINFO dev_info; SP_DEVINFO_DATA dev_info_data; int dev_index = 0; int i; char class[MAX_PATH]; char tmp[MAX_PATH]; usb_class_key_t *keys = NULL; DWORD class_property; const char *class_path; const char **default_class_keys; if(usb_registry_is_nt()) { class_property = SPDRP_CLASSGUID; class_path = CLASS_KEY_PATH_NT; default_class_keys = default_class_keys_nt; } else { class_property = SPDRP_CLASS; class_path = CLASS_KEY_PATH_9X; default_class_keys = default_class_keys_9x; } i = 0; while(default_class_keys[i]) { if((strlen(class_path) + strlen(default_class_keys[i])) < sizeof(tmp)) { sprintf(tmp, "%s%s", class_path, default_class_keys[i]); usb_registry_add_class_key(&keys, tmp); } i++; } dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA); dev_info = SetupDiGetClassDevs(NULL, "USB", NULL, DIGCF_ALLCLASSES); if(dev_info == INVALID_HANDLE_VALUE) { usb_error("usb_registry_get_class_keys(): getting " "device info set failed"); return NULL; } while(SetupDiEnumDeviceInfo(dev_info, dev_index, &dev_info_data)) { if(!usb_registry_is_service_libusb(dev_info, &dev_info_data)) { if(!usb_registry_get_property(SPDRP_CLASSGUID, dev_info, &dev_info_data, class, sizeof(class))) { usb_error("usb_registry_get_class_keys(): getting " "hardware id failed"); dev_index++; continue; } strlwr(class); if((strlen(class_path) + strlen(class)) < sizeof(tmp)) { sprintf(tmp, "%s%s", class_path, class); usb_registry_add_class_key(&keys, tmp); } } dev_index++; } SetupDiDestroyDeviceInfoList(dev_info); return keys;}static usb_class_key_t *usb_registry_get_all_class_keys(void){ const char *class_path; usb_class_key_t *keys = NULL; HKEY reg_key; char class[MAX_PATH]; char tmp[MAX_PATH]; if(usb_registry_is_nt()) { class_path = CLASS_KEY_PATH_NT; } else { class_path = CLASS_KEY_PATH_9X; } if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, class_path, 0, KEY_ALL_ACCESS, ®_key) == ERROR_SUCCESS) { DWORD i = 0; DWORD size = sizeof(class); FILETIME junk; memset(class, 0, sizeof(class)); while(RegEnumKeyEx(reg_key, i, class, &size, 0, NULL, NULL, &junk) == ERROR_SUCCESS) { strlwr(class); if((strlen(class_path) + strlen(class)) < sizeof(tmp)) { sprintf(tmp, "%s%s", class_path, class); usb_registry_add_class_key(&keys, tmp); } memset(class, 0, sizeof(class)); size = sizeof(class); i++; } RegCloseKey(reg_key); } return keys;}static bool_t usb_registry_add_class_key(usb_class_key_t **head, const char *key){ usb_class_key_t *p = *head; if(key) { if(strlen(key) >= MAX_PATH) return FALSE; while(p) { if(!strcmp(p->name, key)) { return FALSE; } p = p->next; } p = malloc(sizeof(usb_class_key_t)); if(!p) return FALSE; memset(p, 0, sizeof(usb_class_key_t)); strcpy(p->name, key); p->next = *head; *head = p; return TRUE; } return FALSE;}static bool_t usb_registry_free_class_keys(usb_class_key_t **head){ usb_class_key_t *p = *head; usb_class_key_t *q; while(p) { q = p->next; free(p); p = q; } *head = NULL; return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -