kern_return_t test_sdm_AFCOperationCreateGetConnectionInfo(SDMMD_AMDeviceRef sdm, CFTypeRef *response) { kern_return_t sdm_return = kAMDUndefinedError; kern_return_t result = SDMMD_AMDeviceConnect(sdm); if (SDM_MD_CallSuccessful(result)) { result = SDMMD_AMDeviceStartSession(sdm); if (SDM_MD_CallSuccessful(result)) { SDMMD_AMConnectionRef test_sdm_afc_conn; if (SDMMD_AMDeviceGetInterfaceType(sdm) == kAMDInterfaceConnectionTypeIndirect) { result = SDMMD_AMDeviceSecureStartService(sdm, CFSTR(AMSVC_AFC), NULL, &test_sdm_afc_conn); } else { result = SDMMD_AMDeviceStartService(sdm, CFSTR(AMSVC_AFC), NULL, &test_sdm_afc_conn); } if (SDM_MD_CallSuccessful(result)) { SDMMD_AFCConnectionRef afc = SDMMD_AFCConnectionCreate(test_sdm_afc_conn); if (afc) { SDMMD_AFCOperationRef conn_info = SDMMD_AFCOperationCreateGetConnectionInfo(); result = SDMMD_AFCProcessOperation(afc, &conn_info); if (SDM_MD_CallSuccessful(result)) { CFTypeRef test = SDMMD_AFCOperationGetPacketResponse(conn_info); if (test) { *response = test; sdm_return = kAMDSuccess; } } CFSafeRelease(afc); } } SDMMD_AMDeviceStopSession(sdm); } SDMMD_AMDeviceDisconnect(sdm); } return sdm_return; }
sdmmd_return_t SDMMD_copy_image(SDMMD_AMDeviceRef device, CFStringRef path) { sdmmd_return_t result = kAMDUndefinedError; if (device) { result = kAMDSuccess; //SDMMD_AMDeviceConnect(device); CheckErrorAndReturn(result); result = SDMMD_AMDeviceStartSession(device); CheckErrorAndReturn(result); SDMMD_AMConnectionRef copyConn = NULL; result = SDMMD_AMDeviceSecureStartService(device, CFSTR(AMSVC_AFC), NULL, ©Conn); CheckErrorAndReturn(result); SDMMD_AFCConnectionRef copyAFCConn = SDMMD_AFCConnectionCreate(copyConn); SDMMD_AFCOperationRef makeStaging = SDMMD_AFCOperationCreateMakeDirectory(CFSTR("PublicStaging")); result = SDMMD_AFCProcessOperation(copyAFCConn, &makeStaging); CheckErrorAndReturn(result); // SDM copy file AFC char *pathString = SDMCFStringGetString(path); result = SDMMD_AMDeviceCopyFile(SDMMD_Default_AFC_CopyFile_Callback, NULL, NULL, copyAFCConn, pathString, "PublicStaging/staging.dimage"); Safe(free, pathString); CFSafeRelease(makeStaging); CFSafeRelease(copyAFCConn); CFSafeRelease(copyConn); } ExitLabelAndReturn(result); }
sdmmd_return_t SDMMD_check_can_touch(SDMMD_AFCConnectionRef conn, CFDataRef *unknown) { SDMMD_AFCOperationRef fileInfo = SDMMD_AFCOperationCreateGetFileInfo((CFStringRef)*unknown); SDMMD_AFCOperationRef reply; SDMMD_AFCProcessOperation(conn, fileInfo, &reply); *unknown = SDMMD_GetDataResponseFromOperation(reply); return kAMDSuccess; }
kern_return_t test_sdm_AFCFileDescriptorCreateReadOperation(SDMMD_AMDeviceRef sdm, CFTypeRef *response) { kern_return_t sdm_return = kAMDUndefinedError; kern_return_t result = SDMMD_AMDeviceConnect(sdm); if (SDM_MD_CallSuccessful(result)) { result = SDMMD_AMDeviceStartSession(sdm); if (SDM_MD_CallSuccessful(result)) { SDMMD_AMConnectionRef test_sdm_afc_conn; if (SDMMD_AMDeviceGetInterfaceType(sdm) == kAMDInterfaceConnectionTypeIndirect) { result = SDMMD_AMDeviceSecureStartService(sdm, CFSTR(AMSVC_AFC), NULL, &test_sdm_afc_conn); } else { result = SDMMD_AMDeviceStartService(sdm, CFSTR(AMSVC_AFC), NULL, &test_sdm_afc_conn); } if (SDM_MD_CallSuccessful(result)) { SDMMD_AFCConnectionRef afc = SDMMD_AFCConnectionCreate(test_sdm_afc_conn); if (afc) { SDMMD_AFCOperationRef file_info = SDMMD_AFCOperationCreateGetFileInfo(CFSTR(kTestCreateFileForAFC)); result = SDMMD_AFCProcessOperation(afc, &file_info); if (SDM_MD_CallSuccessful(result)) { CFTypeRef file_info_response = SDMMD_AFCOperationGetPacketResponse(file_info); int32_t size = CFStringGetIntValue(CFDictionaryGetValue(file_info_response, AFC_File_Info_Keys[AFC_File_Info_Key_size])); SDMMD_AFCOperationRef file_ref = SDMMD_AFCOperationCreateFileRefOpen(CFSTR(kTestCreateFileForAFC), 2); result = SDMMD_AFCProcessOperation(afc, &file_ref); if (SDM_MD_CallSuccessful(result)) { uint64_t fd = 0; CFTypeRef file_ref_response = SDMMD_AFCOperationGetPacketResponse(file_ref); memcpy(&fd, CFDataGetBytePtr(file_ref_response), sizeof(uint64_t)); SDMMD_AFCOperationRef file_ref_read = SDMMD_AFCFileDescriptorCreateReadOperation(fd, size); result = SDMMD_AFCProcessOperation(afc, &file_ref_read); if (SDM_MD_CallSuccessful(result)) { CFTypeRef file_ref_read_response = SDMMD_AFCOperationGetPacketResponse(file_ref_read); if (file_ref_read_response) { *response = file_ref_read_response; sdm_return = kAMDSuccess; } } } } CFSafeRelease(afc); } } SDMMD_AMDeviceStopSession(sdm); } SDMMD_AMDeviceDisconnect(sdm); } return sdm_return; }
kern_return_t test_sdm_AFCFileDescriptorCreateWriteOperation(SDMMD_AMDeviceRef sdm, CFTypeRef *response) { kern_return_t sdm_return = kAMDUndefinedError; kern_return_t result = SDMMD_AMDeviceConnect(sdm); if (SDM_MD_CallSuccessful(result)) { result = SDMMD_AMDeviceStartSession(sdm); if (SDM_MD_CallSuccessful(result)) { SDMMD_AMConnectionRef test_sdm_afc_conn; if (SDMMD_AMDeviceGetInterfaceType(sdm) == kAMDInterfaceConnectionTypeIndirect) { result = SDMMD_AMDeviceSecureStartService(sdm, CFSTR(AMSVC_AFC), NULL, &test_sdm_afc_conn); } else { result = SDMMD_AMDeviceStartService(sdm, CFSTR(AMSVC_AFC), NULL, &test_sdm_afc_conn); } if (SDM_MD_CallSuccessful(result)) { SDMMD_AFCConnectionRef afc = SDMMD_AFCConnectionCreate(test_sdm_afc_conn); if (afc) { SDMMD_AFCOperationRef file_ref = SDMMD_AFCOperationCreateFileRefOpen(CFSTR(kTestCreateFileForAFC), 2); result = SDMMD_AFCProcessOperation(afc, &file_ref); if (SDM_MD_CallSuccessful(result)) { uint64_t fd = 0; CFTypeRef file_ref_response = SDMMD_AFCOperationGetPacketResponse(file_ref); memcpy(&fd, CFDataGetBytePtr(file_ref_response), sizeof(uint64_t)); CFDataRef write_data = CFDataCreate(kCFAllocatorDefault, (const UInt8 *)test_write_bytes, strlen(test_write_bytes)); SDMMD_AFCOperationRef file_ref_read = SDMMD_AFCFileDescriptorCreateWriteOperation(fd, write_data); result = SDMMD_AFCProcessOperation(afc, &file_ref_read); if (SDM_MD_CallSuccessful(result)) { CFTypeRef file_ref_read_response = SDMMD_AFCOperationGetPacketResponse(file_ref_read); if (file_ref_read_response) { *response = file_ref_read_response; sdm_return = kAMDSuccess; } } } CFSafeRelease(afc); } } SDMMD_AMDeviceStopSession(sdm); } SDMMD_AMDeviceDisconnect(sdm); } return sdm_return; }
sdmmd_return_t SDMMD_check_can_touch(SDMMD_AFCConnectionRef conn, void* unknown) { SDMMD_AFCOperationRef fileInfo = SDMMD_AFCOperationCreateGetFileInfo(unknown); SDMMD_AFCOperationRef reply; SDMMD_AFCProcessOperation(conn, fileInfo, &reply); return kAMDSuccess; }