diff options
-rw-r--r-- | src/libirecovery.c | 118 |
1 files changed, 57 insertions, 61 deletions
diff --git a/src/libirecovery.c b/src/libirecovery.c index dc55c95..046c8ec 100644 --- a/src/libirecovery.c +++ b/src/libirecovery.c @@ -1089,11 +1089,52 @@ typedef struct usb_control_request { char data[]; } usb_control_request; -irecv_error_t mobiledevice_openpipes(irecv_client_t client); -void mobiledevice_closepipes(irecv_client_t client); -irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid); +static irecv_error_t win32_openpipes(irecv_client_t client) +{ + if (client->iBootPath && !(client->hIB = CreateFileA(client->iBootPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL))) { + irecv_close(client); + return IRECV_E_UNABLE_TO_CONNECT; + } -irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid) + if (client->DfuPath && !(client->hDFU = CreateFileA(client->DfuPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL))) { + irecv_close(client); + return IRECV_E_UNABLE_TO_CONNECT; + } + + client->mode = 0; + if (client->iBootPath == NULL) { + if (strncmp(client->DfuPath, "\\\\?\\usb#vid_05ac&pid_", 21) == 0) { + sscanf(client->DfuPath+21, "%x#", &client->mode); + } + client->handle = client->hDFU; + } else { + if (strncmp(client->iBootPath, "\\\\?\\usb#vid_05ac&pid_", 21) == 0) { + sscanf(client->iBootPath+21, "%x#", &client->mode); + } + client->handle = client->hIB; + } + + if (client->mode == 0) { + irecv_close(client); + return IRECV_E_UNABLE_TO_CONNECT; + } + + return IRECV_E_SUCCESS; +} + +static void win32_closepipes(irecv_client_t client) +{ + if (client->hDFU!=NULL) { + CloseHandle(client->hDFU); + client->hDFU = NULL; + } + if (client->hIB!=NULL) { + CloseHandle(client->hIB); + client->hIB = NULL; + } +} + +static irecv_error_t win32_open_with_ecid(irecv_client_t* client, uint64_t ecid) { int found = 0; SP_DEVICE_INTERFACE_DATA currentInterface; @@ -1124,8 +1165,8 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid) free(details); _client->DfuPath = result; - if (mobiledevice_openpipes(_client) != IRECV_E_SUCCESS) { - mobiledevice_closepipes(_client); + if (win32_openpipes(_client) != IRECV_E_SUCCESS) { + win32_closepipes(_client); continue; } @@ -1140,7 +1181,7 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid) if ((ecid != 0) && (_client->mode == IRECV_K_WTF_MODE)) { /* we can't get ecid in WTF mode */ - mobiledevice_closepipes(_client); + win32_closepipes(_client); continue; } @@ -1155,7 +1196,7 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid) } if (serial_str[0] == '\0') { - mobiledevice_closepipes(_client); + win32_closepipes(_client); continue; } @@ -1177,7 +1218,7 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid) if (ecid != 0) { if (_client->device_info.ecid != ecid) { - mobiledevice_closepipes(_client); + win32_closepipes(_client); continue; } debug("found device with ECID %016" PRIx64 "\n", (uint64_t)ecid); @@ -1215,14 +1256,14 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid) free(details); _client->iBootPath = result; - if (mobiledevice_openpipes(_client) != IRECV_E_SUCCESS) { - mobiledevice_closepipes(_client); + if (win32_openpipes(_client) != IRECV_E_SUCCESS) { + win32_closepipes(_client); continue; } if ((ecid != 0) && (_client->mode == IRECV_K_WTF_MODE)) { /* we can't get ecid in WTF mode */ - mobiledevice_closepipes(_client); + win32_closepipes(_client); continue; } @@ -1237,7 +1278,7 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid) } if (serial_str[0] == '\0') { - mobiledevice_closepipes(_client); + win32_closepipes(_client); continue; } @@ -1259,7 +1300,7 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid) if (ecid != 0) { if (_client->device_info.ecid != ecid) { - mobiledevice_closepipes(_client); + win32_closepipes(_client); continue; } debug("found device with ECID %016" PRIx64 "\n", (uint64_t)ecid); @@ -1279,51 +1320,6 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid) return IRECV_E_SUCCESS; } - -irecv_error_t mobiledevice_openpipes(irecv_client_t client) -{ - if (client->iBootPath && !(client->hIB = CreateFileA(client->iBootPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL))) { - irecv_close(client); - return IRECV_E_UNABLE_TO_CONNECT; - } - - if (client->DfuPath && !(client->hDFU = CreateFileA(client->DfuPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL))) { - irecv_close(client); - return IRECV_E_UNABLE_TO_CONNECT; - } - - client->mode = 0; - if (client->iBootPath == NULL) { - if (strncmp(client->DfuPath, "\\\\?\\usb#vid_05ac&pid_", 21) == 0) { - sscanf(client->DfuPath+21, "%x#", &client->mode); - } - client->handle = client->hDFU; - } else { - if (strncmp(client->iBootPath, "\\\\?\\usb#vid_05ac&pid_", 21) == 0) { - sscanf(client->iBootPath+21, "%x#", &client->mode); - } - client->handle = client->hIB; - } - - if (client->mode == 0) { - irecv_close(client); - return IRECV_E_UNABLE_TO_CONNECT; - } - - return IRECV_E_SUCCESS; -} - -void mobiledevice_closepipes(irecv_client_t client) -{ - if (client->hDFU!=NULL) { - CloseHandle(client->hDFU); - client->hDFU = NULL; - } - if (client->hIB!=NULL) { - CloseHandle(client->hIB); - client->hIB = NULL; - } -} #endif #ifdef HAVE_IOKIT @@ -1856,7 +1852,7 @@ irecv_error_t irecv_open_with_ecid(irecv_client_t* pclient, uint64_t ecid) error = libusb_open_with_ecid(pclient, ecid); #endif #else - error = mobiledevice_connect(pclient, ecid); + error = win32_open_with_ecid(pclient, ecid); #endif irecv_client_t client = *pclient; if (error != IRECV_E_SUCCESS) { @@ -2987,7 +2983,7 @@ irecv_error_t irecv_close(irecv_client_t client) client->iBootPath = NULL; free(client->DfuPath); client->DfuPath = NULL; - mobiledevice_closepipes(client); + win32_closepipes(client); #endif free(client->device_info.srnm); free(client->device_info.imei); |