diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libirecovery.c | 58 |
1 files changed, 47 insertions, 11 deletions
diff --git a/src/libirecovery.c b/src/libirecovery.c index 7ddb2b5..5d9d6fa 100644 --- a/src/libirecovery.c +++ b/src/libirecovery.c | |||
@@ -777,6 +777,11 @@ static void irecv_load_device_info_from_iboot_string(irecv_client_t client, cons | |||
777 | } | 777 | } |
778 | client->device_info.srtg = strdup(tmp); | 778 | client->device_info.srtg = strdup(tmp); |
779 | } | 779 | } |
780 | |||
781 | client->device_info.pid = client->mode; | ||
782 | if (client->isKIS) { | ||
783 | client->device_info.pid = KIS_PRODUCT_ID; | ||
784 | } | ||
780 | } | 785 | } |
781 | 786 | ||
782 | static void irecv_copy_nonce_with_tag_from_buffer(const char* tag, unsigned char** nonce, unsigned int* nonce_size, const char *buf) | 787 | static void irecv_copy_nonce_with_tag_from_buffer(const char* tag, unsigned char** nonce, unsigned int* nonce_size, const char *buf) |
@@ -2185,6 +2190,8 @@ static void* _irecv_handle_device_add(void *userdata) | |||
2185 | char serial_str[256]; | 2190 | char serial_str[256]; |
2186 | uint32_t location = 0; | 2191 | uint32_t location = 0; |
2187 | uint16_t product_id = 0; | 2192 | uint16_t product_id = 0; |
2193 | irecv_error_t error = 0; | ||
2194 | irecv_client_t client = NULL; | ||
2188 | 2195 | ||
2189 | memset(serial_str, 0, 256); | 2196 | memset(serial_str, 0, 256); |
2190 | #ifdef WIN32 | 2197 | #ifdef WIN32 |
@@ -2263,18 +2270,14 @@ static void* _irecv_handle_device_add(void *userdata) | |||
2263 | 2270 | ||
2264 | if (product_id == KIS_PRODUCT_ID) { | 2271 | if (product_id == KIS_PRODUCT_ID) { |
2265 | IOObjectRetain(device); | 2272 | IOObjectRetain(device); |
2266 | irecv_client_t client; | ||
2267 | 2273 | ||
2268 | irecv_error_t error = iokit_usb_open_service(&client, device); | 2274 | error = iokit_usb_open_service(&client, device); |
2269 | if (error != IRECV_E_SUCCESS) { | 2275 | if (error != IRECV_E_SUCCESS) { |
2270 | debug("%s: ERROR: could not open KIS device!\n", __func__); | 2276 | debug("%s: ERROR: could not open KIS device!\n", __func__); |
2271 | return NULL; | 2277 | return NULL; |
2272 | } | 2278 | } |
2273 | 2279 | ||
2274 | strcpy(serial_str, client->device_info.serial_string); | ||
2275 | product_id = client->mode; | 2280 | product_id = client->mode; |
2276 | |||
2277 | irecv_close(client); | ||
2278 | } else { | 2281 | } else { |
2279 | CFStringRef serialString = (CFStringRef)IORegistryEntryCreateCFProperty(device, CFSTR(kUSBSerialNumberString), kCFAllocatorDefault, 0); | 2282 | CFStringRef serialString = (CFStringRef)IORegistryEntryCreateCFProperty(device, CFSTR(kUSBSerialNumberString), kCFAllocatorDefault, 0); |
2280 | if (serialString) { | 2283 | if (serialString) { |
@@ -2307,17 +2310,13 @@ static void* _irecv_handle_device_add(void *userdata) | |||
2307 | } | 2310 | } |
2308 | 2311 | ||
2309 | if (product_id == KIS_PRODUCT_ID) { | 2312 | if (product_id == KIS_PRODUCT_ID) { |
2310 | irecv_client_t client; | 2313 | error = libusb_usb_open_handle_with_descriptor_and_ecid(&client, usb_handle, &devdesc, 0); |
2311 | irecv_error_t error = libusb_usb_open_handle_with_descriptor_and_ecid(&client, usb_handle, &devdesc, 0); | ||
2312 | if (error != IRECV_E_SUCCESS) { | 2314 | if (error != IRECV_E_SUCCESS) { |
2313 | debug("%s: ERROR: could not open KIS device!\n", __func__); | 2315 | debug("%s: ERROR: could not open KIS device!\n", __func__); |
2314 | return NULL; | 2316 | return NULL; |
2315 | } | 2317 | } |
2316 | 2318 | ||
2317 | strcpy(serial_str, client->device_info.serial_string); | ||
2318 | product_id = client->mode; | 2319 | product_id = client->mode; |
2319 | |||
2320 | irecv_close(client); | ||
2321 | } else { | 2320 | } else { |
2322 | libusb_error = libusb_get_string_descriptor_ascii(usb_handle, devdesc.iSerialNumber, (unsigned char*)serial_str, 255); | 2321 | libusb_error = libusb_get_string_descriptor_ascii(usb_handle, devdesc.iSerialNumber, (unsigned char*)serial_str, 255); |
2323 | if (libusb_error < 0) { | 2322 | if (libusb_error < 0) { |
@@ -2329,8 +2328,45 @@ static void* _irecv_handle_device_add(void *userdata) | |||
2329 | #endif /* !HAVE_IOKIT */ | 2328 | #endif /* !HAVE_IOKIT */ |
2330 | #endif /* !WIN32 */ | 2329 | #endif /* !WIN32 */ |
2331 | memset(&client_loc, '\0', sizeof(client_loc)); | 2330 | memset(&client_loc, '\0', sizeof(client_loc)); |
2332 | irecv_load_device_info_from_iboot_string(&client_loc, serial_str); | 2331 | if (product_id == KIS_PRODUCT_ID) { |
2332 | error = irecv_usb_set_configuration(client, 1); | ||
2333 | if (error != IRECV_E_SUCCESS) { | ||
2334 | debug("Failed to set configuration, error %d\n", error); | ||
2335 | irecv_close(client); | ||
2336 | return NULL; | ||
2337 | } | ||
2338 | |||
2339 | error = irecv_usb_set_interface(client, 0, 0); | ||
2340 | if (error != IRECV_E_SUCCESS) { | ||
2341 | debug("Failed to set interface, error %d\n", error); | ||
2342 | irecv_close(client); | ||
2343 | return NULL; | ||
2344 | } | ||
2345 | |||
2346 | error = irecv_kis_init(client); | ||
2347 | if (error != IRECV_E_SUCCESS) { | ||
2348 | debug("irecv_kis_init failed, error %d\n", error); | ||
2349 | irecv_close(client); | ||
2350 | return NULL; | ||
2351 | } | ||
2352 | |||
2353 | error = irecv_kis_load_device_info(client); | ||
2354 | if (error != IRECV_E_SUCCESS) { | ||
2355 | debug("irecv_kis_load_device_info failed, error %d\n", error); | ||
2356 | irecv_close(client); | ||
2357 | return NULL; | ||
2358 | } | ||
2359 | debug("found device with ECID %016" PRIx64 "\n", (uint64_t)client->device_info.ecid); | ||
2360 | strncpy(serial_str, client->device_info.serial_string, 256); | ||
2361 | product_id = client->mode; | ||
2362 | client_loc.isKIS = 1; | ||
2363 | } | ||
2364 | if (client) { | ||
2365 | irecv_close(client); | ||
2366 | } | ||
2367 | |||
2333 | client_loc.mode = product_id; | 2368 | client_loc.mode = product_id; |
2369 | irecv_load_device_info_from_iboot_string(&client_loc, serial_str); | ||
2334 | 2370 | ||
2335 | struct irecv_usb_device_info *usb_dev_info = (struct irecv_usb_device_info*)malloc(sizeof(struct irecv_usb_device_info)); | 2371 | struct irecv_usb_device_info *usb_dev_info = (struct irecv_usb_device_info*)malloc(sizeof(struct irecv_usb_device_info)); |
2336 | memcpy(&(usb_dev_info->device_info), &(client_loc.device_info), sizeof(struct irecv_device_info)); | 2372 | memcpy(&(usb_dev_info->device_info), &(client_loc.device_info), sizeof(struct irecv_device_info)); |