int check_device(struct idevicerestore_client_t* client) { int device = DEVICE_UNKNOWN; uint32_t bdid = 0; uint32_t cpid = 0; switch (client->mode->index) { case MODE_RESTORE: device = restore_check_device(client->uuid); if (device < 0) { device = DEVICE_UNKNOWN; } break; case MODE_NORMAL: device = normal_check_device(client->uuid); if (device < 0) { device = DEVICE_UNKNOWN; } break; case MODE_DFU: case MODE_RECOVERY: if (get_cpid(client, &cpid) < 0) { error("ERROR: Unable to get device CPID\n"); break; } switch (cpid) { case CPID_IPHONE2G: // iPhone1,1 iPhone1,2 and iPod1,1 all share the same ChipID // so we need to check the BoardID if (get_bdid(client, &bdid) < 0) { error("ERROR: Unable to get device BDID\n"); break; } switch (bdid) { case BDID_IPHONE2G: device = DEVICE_IPHONE2G; break; case BDID_IPHONE3G: device = DEVICE_IPHONE3G; break; case BDID_IPOD1G: device = DEVICE_IPOD1G; break; default: device = DEVICE_UNKNOWN; break; } break; case CPID_IPHONE3GS: device = DEVICE_IPHONE3GS; break; case CPID_IPOD2G: device = DEVICE_IPOD2G; break; case CPID_IPOD3G: device = DEVICE_IPOD3G; break; case CPID_IPAD1G: device = DEVICE_IPAD1G; break; default: device = DEVICE_UNKNOWN; break; } break; default: device = DEVICE_UNKNOWN; break; } client->device = &idevicerestore_devices[device]; return device; }
int check_device(struct idevicerestore_client_t* client) { int device = DEVICE_UNKNOWN; uint32_t bdid = 0; uint32_t cpid = 0; switch (client->mode->index) { case MODE_RESTORE: if (!client->ecid && client->uuid) { device = restore_check_device(client->uuid); if (device < 0) { device = DEVICE_UNKNOWN; } } break; case MODE_NORMAL: device = normal_check_device(client); if (device < 0) { device = DEVICE_UNKNOWN; } break; case MODE_DFU: case MODE_RECOVERY: if (get_cpid(client, &cpid) < 0) { error("ERROR: Unable to get device CPID\n"); break; } switch (cpid) { case CPID_IPHONE2G: // iPhone1,1 iPhone1,2 and iPod1,1 all share the same ChipID // so we need to check the BoardID if (get_bdid(client, &bdid) < 0) { error("ERROR: Unable to get device BDID\n"); break; } switch (bdid) { case BDID_IPHONE2G: device = DEVICE_IPHONE2G; break; case BDID_IPHONE3G: device = DEVICE_IPHONE3G; break; case BDID_IPOD1G: device = DEVICE_IPOD1G; break; default: device = DEVICE_UNKNOWN; break; } break; case CPID_IPHONE3GS: device = DEVICE_IPHONE3GS; break; case CPID_IPOD2G: device = DEVICE_IPOD2G; break; case CPID_IPOD3G: device = DEVICE_IPOD3G; break; case CPID_IPAD1G: // All the A4 devices are the same...BoardID'll solve that problem! if (get_bdid(client, &bdid) < 0) { error("ERROR: Unable to get device BDID\n"); break; } switch (bdid) { case BDID_IPAD1G: device = DEVICE_IPAD1G; break; case BDID_IPHONE4: device = DEVICE_IPHONE4; break; case BDID_IPOD4G: device = DEVICE_IPOD4G; break; case BDID_APPLETV2: device = DEVICE_APPLETV2; break; case BDID_IPHONE42: device = DEVICE_IPHONE42; break; default: device = DEVICE_UNKNOWN; break; } break; case CPID_IPAD21: // All the A5 devices are the same too... if (get_bdid(client, &bdid) < 0) { error("ERROR: Unable to get device BDID\n"); break; } switch (bdid) { case BDID_IPAD21: device = DEVICE_IPAD21; break; case BDID_IPAD22: device = DEVICE_IPAD22; break; case BDID_IPAD23: device = DEVICE_IPAD23; break; case BDID_IPHONE4S: device = DEVICE_IPHONE4S; break; default: device = DEVICE_UNKNOWN; break; } break; default: device = DEVICE_UNKNOWN; break; } break; default: device = DEVICE_UNKNOWN; break; } client->device = &irecv_devices[device]; return device; }