<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.theiphonewiki.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Codebar</id>
	<title>The iPhone Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.theiphonewiki.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Codebar"/>
	<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/wiki/Special:Contributions/Codebar"/>
	<updated>2026-05-13T09:35:47Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=1716</id>
		<title>MobileDevice Library</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=1716"/>
		<updated>2008-08-13T02:25:07Z</updated>

		<summary type="html">&lt;p&gt;Codebar: /* How to find address of privates functions in iTunesMobileDevice.dll or MobileDevice.framework ? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MobileDevice Library is used by itunes to transfer data betwen iPhone and computer, connexion over the USB port.&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===MobileDevice Header (mobiledevice.h)===&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AFC Connection===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
===Private Functions===&lt;br /&gt;
&lt;br /&gt;
====How to find address of privates functions in iTunesMobileDevice.dll or MobileDevice.framework ?====&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/iphuc/ iPhuc (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/iphucwin32/ iPhuc Win32 (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/manzana/ manzana (.Net Library)]&lt;br /&gt;
* [http://code.google.com/p/independence/source/browse/trunk/libPhoneInteraction/ libPhoneInteraction (C Library)]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=1715</id>
		<title>MobileDevice Library</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=1715"/>
		<updated>2008-08-13T02:24:13Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MobileDevice Library is used by itunes to transfer data betwen iPhone and computer, connexion over the USB port.&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===MobileDevice Header (mobiledevice.h)===&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AFC Connection===&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
===Private Functions===&lt;br /&gt;
&lt;br /&gt;
==How to find address of privates functions in iTunesMobileDevice.dll or MobileDevice.framework ?==&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/iphuc/ iPhuc (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/iphucwin32/ iPhuc Win32 (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/manzana/ manzana (.Net Library)]&lt;br /&gt;
* [http://code.google.com/p/independence/source/browse/trunk/libPhoneInteraction/ libPhoneInteraction (C Library)]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Main_Page&amp;diff=1714</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Main_Page&amp;diff=1714"/>
		<updated>2008-08-13T02:10:31Z</updated>

		<summary type="html">&lt;p&gt;Codebar: /* Application Development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table border=1 width=100%&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td bgcolor=#64ff64 width=50%&amp;gt;&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;[[PwnageTool|Jailbreak]]&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td bgcolor=#ff6464 width=50%&amp;gt;&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;[[Unlock 2.0|Unlock]]&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td colspan=2&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;[[Disclaimer]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Just a try to make the layout more comfortable -caique2001 --&amp;gt;&lt;br /&gt;
{| cellspacing=&amp;quot;3&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;20%&amp;quot; class=&amp;quot;MainPageBG&amp;quot; style=&amp;quot;border: 1px #999999; color: #000; background-color: rgb(255,255,255)&amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: .3em .7em .7em&amp;quot;&amp;gt; &amp;lt;BR&amp;gt; &amp;lt;BR&amp;gt; __TOC__ &amp;lt;/div&amp;gt;&lt;br /&gt;
|width=&amp;quot;80%&amp;quot; class=&amp;quot;MainPageBG&amp;quot; style=&amp;quot;border: 1px #c6c9ff; color: #000; background-color: #f0f0ff&amp;quot;|&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: .3em .7em .7em&amp;quot;&amp;gt; {{Welcome}} &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
* [[m68ap|iPhone (m68ap)]]&lt;br /&gt;
* [[n82ap|iPhone 3G (n82ap)]]&lt;br /&gt;
* [[n45ap|iPod Touch (n45ap)]]&lt;br /&gt;
&lt;br /&gt;
==App Processor (Jailbreak)==&lt;br /&gt;
The iPhone makes use of the [[S5L8900]] platform as application processor. Here is where the [[Jailbreak|jailbreak]] applies.&lt;br /&gt;
&lt;br /&gt;
==Baseband (Unlock)==&lt;br /&gt;
&lt;br /&gt;
The [[Baseband Device]] is where the [[unlock]] applies.&lt;br /&gt;
&lt;br /&gt;
==File formats==&lt;br /&gt;
* [[8900 File Format]]&lt;br /&gt;
* [[IMG2 File Format]]&lt;br /&gt;
* [[IMG3 File Format]]&lt;br /&gt;
* [[secpack]]&lt;br /&gt;
* [[secpack 2.0]]&lt;br /&gt;
* [[seczone]]&lt;br /&gt;
&lt;br /&gt;
==Protocols==&lt;br /&gt;
* [[Recovery Mode 0x1280]]&lt;br /&gt;
* [[Recovery Mode 0x1281]]&lt;br /&gt;
* [[DFU 0x1222]]&lt;br /&gt;
* [[WTF 0x1227]]&lt;br /&gt;
* [[Normal Mode 0x1290]]&lt;br /&gt;
* [[Restore Mode]]&lt;br /&gt;
* [[Baseband Bootrom Protocol]]&lt;br /&gt;
* [[Interactive Mode|Baseband Bootloader Protocol]]&lt;br /&gt;
&lt;br /&gt;
==Keys==&lt;br /&gt;
* [[AES Keys]]&lt;br /&gt;
* [[Apple Certificate]]&lt;br /&gt;
* [[Baseband RSA Keys]]&lt;br /&gt;
* [[Baseband TEA Keys]]&lt;br /&gt;
* [[IMG3 Keys / IVs]]&lt;br /&gt;
* [[NCK]]&lt;br /&gt;
* [[VFDecrypt Keys|Root Filesystem DMG Keys]]&lt;br /&gt;
&lt;br /&gt;
==Application Development==&lt;br /&gt;
* [[Toolchain]] (Includes tutorials)&lt;br /&gt;
* [[Toolchain 2.0]] (Includes tutorials)&lt;br /&gt;
* [[Frameworks]]&lt;br /&gt;
* [[MobileDevice Library]]&lt;br /&gt;
* [[Apple Certification Process]]&lt;br /&gt;
* [[Bypassing iPhone Code Signatures]]&lt;br /&gt;
* [[Distribution Methods]]&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
see [[Tutorials|here]]&lt;br /&gt;
&lt;br /&gt;
==Useful Links==&lt;br /&gt;
see [[Useful Links|here]]&lt;br /&gt;
&lt;br /&gt;
==Definitions==&lt;br /&gt;
* [[jailbreak]]&lt;br /&gt;
* [[activation]]&lt;br /&gt;
* [[unlock]]&lt;br /&gt;
* [[Baseband Device|baseband]]&lt;br /&gt;
* [[Baseband Bootloader|bootloader]]&lt;br /&gt;
* [[DFU]]&lt;br /&gt;
* [[NORID]]&lt;br /&gt;
* [[CHIPID]]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=1713</id>
		<title>MobileDevice Library</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=1713"/>
		<updated>2008-08-13T02:09:08Z</updated>

		<summary type="html">&lt;p&gt;Codebar: New page: ===PC Windows : iTunesMobileDevice.dll===  * Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll * Export : itunesmobiledevice.dll  ===Mac O...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===MobileDevice Header (mobiledevice.h)===&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/iphuc/ iPhuc (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/iphucwin32/ iPhuc Win32 (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/manzana/ manzana (.Net Library)]&lt;br /&gt;
* [http://code.google.com/p/independence/source/browse/trunk/libPhoneInteraction/ libPhoneInteraction (C Library)]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1712</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1712"/>
		<updated>2008-08-13T02:08:22Z</updated>

		<summary type="html">&lt;p&gt;Codebar: /* Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
* [[MobileDevice Library]]&lt;br /&gt;
* [http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation Protocol Documentation]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1711</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1711"/>
		<updated>2008-08-13T02:07:03Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
* [http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation Protocol Documentation]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1710</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1710"/>
		<updated>2008-08-13T01:58:46Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===MobileDevice Header (mobiledevice.h)===&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/iphuc/ iPhuc (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/iphucwin32/ iPhuc Win32 (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/manzana/ manzana (.Net Library)]&lt;br /&gt;
* [http://code.google.com/p/independence/source/browse/trunk/libPhoneInteraction/ libPhoneInteraction (C Library)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
* [http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation Protocol Documentation]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1709</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1709"/>
		<updated>2008-08-13T01:57:57Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/iphuc/ iPhuc (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/iphucwin32/ iPhuc Win32 (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/manzana/ manzana (.Net Library)]&lt;br /&gt;
* [http://code.google.com/p/independence/source/browse/trunk/libPhoneInteraction/ libPhoneInteraction (C Library)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
* [http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation Protocol Documentation]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1708</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1708"/>
		<updated>2008-08-13T01:57:32Z</updated>

		<summary type="html">&lt;p&gt;Codebar: /* Libraries Implementations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/iphuc/ iPhuc (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/iphucwin32/ iPhuc Win32 (Command line utility)]&lt;br /&gt;
* [http://code.google.com/p/manzana/ manzana (.Net Library)]&lt;br /&gt;
* [http://code.google.com/p/independence/source/browse/trunk/libPhoneInteraction/ libPhoneInteraction (C Library)]&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
* [http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation Protocol Documentation]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1707</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1707"/>
		<updated>2008-08-13T01:57:13Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/iphuc/ iPhuc (Command line utility)]&lt;br /&gt;
[http://code.google.com/p/iphucwin32/ iPhuc Win32 (Command line utility)]&lt;br /&gt;
[http://code.google.com/p/manzana/ manzana (.Net Library)]&lt;br /&gt;
[http://code.google.com/p/independence/source/browse/trunk/libPhoneInteraction/ libPhoneInteraction (C Library)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
* [http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation Protocol Documentation]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1706</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1706"/>
		<updated>2008-08-13T01:56:06Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/iphuc/ iPhuc (Command line utility)]&lt;br /&gt;
[http://code.google.com/p/iphucwin32/ iPhuc Win32 (Command line utility)]&lt;br /&gt;
[http://code.google.com/p/manzana/ manzana (.Net Library)]&lt;br /&gt;
[http://code.google.com/p/independence/source/browse/trunk/libPhoneInteraction/ libPhoneInteraction (C Library)]&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
* [http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation Protocol Documentation]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1705</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1705"/>
		<updated>2008-08-13T01:44:11Z</updated>

		<summary type="html">&lt;p&gt;Codebar: /* Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementations Libraries===&lt;br /&gt;
&lt;br /&gt;
Need to be writed...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
* [http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation Protocol Documentation]&lt;br /&gt;
* [http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1704</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1704"/>
		<updated>2008-08-13T01:43:38Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementations Libraries===&lt;br /&gt;
&lt;br /&gt;
Need to be writed...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation | Protocol Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page | iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1703</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1703"/>
		<updated>2008-08-13T01:42:00Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementations Libraries===&lt;br /&gt;
&lt;br /&gt;
Need to be writed...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1702</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1702"/>
		<updated>2008-08-13T01:41:17Z</updated>

		<summary type="html">&lt;p&gt;Codebar: /* MobileDevice Header (mobiledevice.h) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementations Libraries===&lt;br /&gt;
&lt;br /&gt;
Need to be writed...&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1701</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1701"/>
		<updated>2008-08-13T01:37:48Z</updated>

		<summary type="html">&lt;p&gt;Codebar: /* MobileDevice Header (mobiledevice.h) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering : C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	#pragma once&lt;br /&gt;
	&lt;br /&gt;
	#ifndef MOBILEDEVICE_H&lt;br /&gt;
	#define MOBILEDEVICE_H&lt;br /&gt;
	&lt;br /&gt;
	#ifdef __cplusplus&lt;br /&gt;
	extern &amp;quot;C&amp;quot; {&lt;br /&gt;
	#endif&lt;br /&gt;
		&lt;br /&gt;
	#ifndef __GCC__&lt;br /&gt;
	#pragma pack&lt;br /&gt;
	#define __PACK&lt;br /&gt;
	#else&lt;br /&gt;
	#define __PACK __attribute__((__packed__))&lt;br /&gt;
	#endif&lt;br /&gt;
	&lt;br /&gt;
	#if defined(WIN32)&lt;br /&gt;
	#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
		using namespace System::Runtime::InteropServices;&lt;br /&gt;
	#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
		typedef unsigned int mach_error_t;&lt;br /&gt;
	#elif defined(__APPLE__)&lt;br /&gt;
	#define __DLLIMPORT&lt;br /&gt;
	#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
	#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
	#endif	&lt;br /&gt;
		&lt;br /&gt;
		/* Error codes */&lt;br /&gt;
	#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
	#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
		&lt;br /&gt;
		/* Apple Mobile (AM*) errors */&lt;br /&gt;
	#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
	#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
	#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
	#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
	#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
	#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
		&lt;br /&gt;
		/* Apple File Connection (AFC*) errors */&lt;br /&gt;
	#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
		&lt;br /&gt;
		/* USBMux errors */&lt;br /&gt;
	#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
	#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
		&lt;br /&gt;
		/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
		 * am_device_notification_callback_info. */&lt;br /&gt;
	#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
	#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
	#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
		&lt;br /&gt;
	#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
		//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
	#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
	#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
	#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
	#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
	#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
	#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
	#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
	#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
	#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
	#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
	#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		typedef unsigned int afc_error_t;&lt;br /&gt;
		typedef unsigned int usbmux_error_t;&lt;br /&gt;
		&lt;br /&gt;
		struct am_recovery_device;&lt;br /&gt;
		&lt;br /&gt;
		struct am_device_notification_callback_info {&lt;br /&gt;
			struct am_device *dev;  /* 0    device */ &lt;br /&gt;
			unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		/* The type of the device restore notification callback functions.&lt;br /&gt;
		 * TODO: change to correct type. */&lt;br /&gt;
		typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
																am_recovery_device *);&lt;br /&gt;
		&lt;br /&gt;
		/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
		struct am_recovery_device {&lt;br /&gt;
			unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
			am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
			void *user_info;                                    /* 12 */&lt;br /&gt;
			unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
			unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
			unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
			unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
			unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
			unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
			unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
		struct am_restore_device {&lt;br /&gt;
			unsigned char unknown[32];&lt;br /&gt;
			int port;&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		/* The type of the device notification callback function. */&lt;br /&gt;
		typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
													   am_device_notification_callback_info *);&lt;br /&gt;
		&lt;br /&gt;
		/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
		 * TODO: change to correct type. */&lt;br /&gt;
		typedef void *amd_device_attached_callback;&lt;br /&gt;
		&lt;br /&gt;
		/* The type of the device restore notification callback functions.&lt;br /&gt;
		 * TODO: change to correct type. */&lt;br /&gt;
		typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
																am_recovery_device *);&lt;br /&gt;
		&lt;br /&gt;
		struct am_device {&lt;br /&gt;
			unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
			unsigned int device_id;     /* 16 */&lt;br /&gt;
			unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
			char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
			unsigned int unknown1;      /* 28 */&lt;br /&gt;
			unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
			unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
			unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		struct am_device_notification {&lt;br /&gt;
			unsigned int unknown0;                      /* 0 */&lt;br /&gt;
			unsigned int unknown1;                      /* 4 */&lt;br /&gt;
			unsigned int unknown2;                      /* 8 */&lt;br /&gt;
			am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
			unsigned int unknown3;                      /* 16 */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		struct afc_connection {&lt;br /&gt;
			unsigned int handle;            /* 0 */&lt;br /&gt;
			unsigned int unknown0;          /* 4 */&lt;br /&gt;
			unsigned char unknown1;         /* 8 */&lt;br /&gt;
			unsigned char padding[3];       /* 9 */&lt;br /&gt;
			unsigned int unknown2;          /* 12 */&lt;br /&gt;
			unsigned int unknown3;          /* 16 */&lt;br /&gt;
			unsigned int unknown4;          /* 20 */&lt;br /&gt;
			unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
			unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
			unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
			void *afc_lock;                 /* 36 */&lt;br /&gt;
			unsigned int context;           /* 40 */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	&lt;br /&gt;
		struct afc_device_info {&lt;br /&gt;
			unsigned char unknown[12];  /* 0 */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
	&lt;br /&gt;
		struct afc_directory {&lt;br /&gt;
			unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
	&lt;br /&gt;
		struct afc_dictionary {&lt;br /&gt;
			unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		typedef unsigned long long afc_file_ref;&lt;br /&gt;
		&lt;br /&gt;
		struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
			unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
			unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
			amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
			unsigned int unknown3;                  /* 12 */&lt;br /&gt;
			unsigned int unknown4;                  /* 16 */&lt;br /&gt;
			unsigned int unknown5;                  /* 20 */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		struct usbmux_listener_2 {&lt;br /&gt;
			unsigned char unknown0[4144];&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		struct am_bootloader_control_packet {&lt;br /&gt;
			unsigned char opcode;       /* 0 */&lt;br /&gt;
			unsigned char length;       /* 1 */&lt;br /&gt;
			unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
			unsigned char payload[0];   /* 4 */&lt;br /&gt;
		} __PACK;&lt;br /&gt;
		&lt;br /&gt;
		/* ----------------------------------------------------------------------------&lt;br /&gt;
		 *   Public routines&lt;br /&gt;
		 * ------------------------------------------------------------------------- */&lt;br /&gt;
		&lt;br /&gt;
		/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
		 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
		 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
		 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
		 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
		 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
		 *&lt;br /&gt;
		 *  Returns:&lt;br /&gt;
		 *      MDERR_OK            if successful&lt;br /&gt;
		 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
		 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
												   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
												   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
		&lt;br /&gt;
		/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
		 *  notification callback will give to you.&lt;br /&gt;
		 *&lt;br /&gt;
		 *  Returns:&lt;br /&gt;
		 *      MDERR_OK                if successfully connected&lt;br /&gt;
		 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
		 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
		 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
		&lt;br /&gt;
		/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
		 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
		 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
		 *&lt;br /&gt;
		 *  Returns:&lt;br /&gt;
		 *      0   if the path did not exist&lt;br /&gt;
		 *      1   if it did&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
		&lt;br /&gt;
		/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
		 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
		 *&lt;br /&gt;
		 *  Returns:&lt;br /&gt;
		 *      MDERR_OK                if successful&lt;br /&gt;
		 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
		 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
		&lt;br /&gt;
		/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
		 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
		 *  after validating pairing.&lt;br /&gt;
		 *&lt;br /&gt;
		 *  Returns:&lt;br /&gt;
		 *      MDERR_OK                if successful&lt;br /&gt;
		 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
		 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
		&lt;br /&gt;
		/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
		 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
		 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
		 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
		 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
		 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
		 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
		 * that will be used for further AFC* calls.&lt;br /&gt;
		 *&lt;br /&gt;
		 * Returns:&lt;br /&gt;
		 *      MDERR_OK                if successful&lt;br /&gt;
		 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
		 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
										  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
										  unknown);&lt;br /&gt;
		&lt;br /&gt;
		/* Stops a session. You should do this before accessing services.&lt;br /&gt;
		 *&lt;br /&gt;
		 * Returns:&lt;br /&gt;
		 *      MDERR_OK                if successful&lt;br /&gt;
		 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
		&lt;br /&gt;
		/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
		 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
		 *&lt;br /&gt;
		 * Returns:&lt;br /&gt;
		 *      MDERR_OK                if successful&lt;br /&gt;
		 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
									  struct afc_connection **conn);&lt;br /&gt;
		&lt;br /&gt;
		/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
									  afc_dictionary **info);&lt;br /&gt;
		&lt;br /&gt;
		/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
		 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
	#if defined(__APPLE__)&lt;br /&gt;
		void AFCPlatformInit();&lt;br /&gt;
	#endif&lt;br /&gt;
		&lt;br /&gt;
		/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
		 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
		 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
		 * as in Unix style.&lt;br /&gt;
		 *&lt;br /&gt;
		 * Returns:&lt;br /&gt;
		 *      MDERR_OK                if successful&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
									 afc_directory **dir);&lt;br /&gt;
		&lt;br /&gt;
		/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
		 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
		 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
		 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
		 * over them.&lt;br /&gt;
		 *&lt;br /&gt;
		 * Returns:&lt;br /&gt;
		 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
									 char **dirent);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
		&lt;br /&gt;
		/* Returns the context field of the given AFC connection. */&lt;br /&gt;
		__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
		&lt;br /&gt;
		/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
		__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
		&lt;br /&gt;
		/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
		 * 0. */&lt;br /&gt;
		__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
		&lt;br /&gt;
		/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
		__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
		&lt;br /&gt;
		/* Closes the given AFC connection. */&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
		&lt;br /&gt;
		/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
		 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
		 * the callbacks are located at:&lt;br /&gt;
		 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
		 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
		 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
		 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
															 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
															 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
															 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
															 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
															 unsigned int unknown0,&lt;br /&gt;
															 void *user_info);&lt;br /&gt;
		&lt;br /&gt;
		/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
		 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
		 * restoring with a path of&lt;br /&gt;
		 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
		 * unused number.&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
		&lt;br /&gt;
		/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
		 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
		 * follows:&lt;br /&gt;
		 * {&lt;br /&gt;
		 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
		 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
		 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
		 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
		 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
		 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
		 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
		 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
		 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
		 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
		 *  }&lt;br /&gt;
		 *&lt;br /&gt;
		 * Returns:&lt;br /&gt;
		 *      the option dictionary   if successful&lt;br /&gt;
		 *      NULL                    if out of memory&lt;br /&gt;
		 */ &lt;br /&gt;
		__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
		&lt;br /&gt;
		/* ----------------------------------------------------------------------------&lt;br /&gt;
		 *   Less-documented public routines&lt;br /&gt;
		 * ------------------------------------------------------------------------- */&lt;br /&gt;
		&lt;br /&gt;
		/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
								   long long int mode, afc_file_ref *ref);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								   void *buf, unsigned int *len);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
									void *buf, unsigned int len);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
									afc_dictionary **info);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
									val);&lt;br /&gt;
		__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
		__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
														 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
		__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
														rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
		__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
															unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
		__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
												   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
												   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
												   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
												   ramdisk_path);&lt;br /&gt;
		__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
		__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
		__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
		__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
		&lt;br /&gt;
		/*edits by geohot*/&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
		__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
		&lt;br /&gt;
		/* ----------------------------------------------------------------------------&lt;br /&gt;
		 *   Semi-private routines&lt;br /&gt;
		 * ------------------------------------------------------------------------- */&lt;br /&gt;
		&lt;br /&gt;
		/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
		 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
		 *&lt;br /&gt;
		 *  Returns:&lt;br /&gt;
		 *      MDERR_OK                if completed successfully&lt;br /&gt;
		 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
		 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
		 */&lt;br /&gt;
		__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
											usbmux_listener_2 **eax_fp12);&lt;br /&gt;
		&lt;br /&gt;
		/* ----------------------------------------------------------------------------&lt;br /&gt;
		 *   Less-documented semi-private routines&lt;br /&gt;
		 * ------------------------------------------------------------------------- */&lt;br /&gt;
		__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
		&lt;br /&gt;
		/* ----------------------------------------------------------------------------&lt;br /&gt;
		 *   Private routines - here be dragons&lt;br /&gt;
		 * ------------------------------------------------------------------------- */&lt;br /&gt;
		&lt;br /&gt;
		/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
		 * in order to perform certain special restore operations&lt;br /&gt;
		 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
		 * significant access to the phone. */&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
		 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
		 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
		 */ &lt;br /&gt;
		&lt;br /&gt;
		/* ----------------------------------------------------------------------------&lt;br /&gt;
		 *   Less-documented private routines&lt;br /&gt;
		 * ------------------------------------------------------------------------- */&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
		 __attribute__ ((regparm(2)));&lt;br /&gt;
		 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
		 &lt;br /&gt;
		 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
		 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
		 &lt;br /&gt;
		 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
		 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
		 &lt;br /&gt;
		 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
		 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
		 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
		 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
		 &lt;br /&gt;
		 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
		 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
		 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
		 &lt;br /&gt;
		 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
		 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
		 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
		 &lt;br /&gt;
		 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
		 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
		 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
		 */&lt;br /&gt;
		&lt;br /&gt;
		int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
		int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
		int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
		int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
		&lt;br /&gt;
	&lt;br /&gt;
	#ifdef __cplusplus&lt;br /&gt;
	}&lt;br /&gt;
	#endif&lt;br /&gt;
	&lt;br /&gt;
	#endif&lt;br /&gt;
	&lt;br /&gt;
	/* -*- mode:c; indent-tabs-mode:nil; c-basic-offset:2; tab-width:2; */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
Need to be writed...&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1700</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1700"/>
		<updated>2008-08-13T01:36:51Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering : C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
 /* ----------------------------------------------------------------------------&lt;br /&gt;
  *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
  * ------------------------------------------------------------------------- */&lt;br /&gt;
 #pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
Need to be writed...&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1699</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1699"/>
		<updated>2008-08-13T01:35:32Z</updated>

		<summary type="html">&lt;p&gt;Codebar: /* MobileDevice Header (mobiledevice.h) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering : C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
Need to be writed...&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1698</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1698"/>
		<updated>2008-08-13T01:34:33Z</updated>

		<summary type="html">&lt;p&gt;Codebar: /* =MobileDevice Header (mobiledevice.h) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
Need to be writed...&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1697</id>
		<title>Normal Mode</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=Normal_Mode&amp;diff=1697"/>
		<updated>2008-08-13T01:33:58Z</updated>

		<summary type="html">&lt;p&gt;Codebar: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the protocol iTunes uses to talk to the booted iPhone. It uses usbmux to provide TCP like connectivity over a USB port using SSL. There is a pairing process iTunes uses to establish the secure channel.&lt;br /&gt;
&lt;br /&gt;
==MobileDevice Library==&lt;br /&gt;
&lt;br /&gt;
===PC Windows : iTunesMobileDevice.dll===&lt;br /&gt;
&lt;br /&gt;
* Location : C:\Program Files\Common Files\Apple\Mobile Device Support\bin\iTunesMobileDevice.dll&lt;br /&gt;
* Export : [[itunesmobiledevice.dll]]&lt;br /&gt;
&lt;br /&gt;
===Mac OSX : MobileDevice.framework===&lt;br /&gt;
&lt;br /&gt;
* Location : /System/Library/PrivateFrameworks/MobileDevice.framework&lt;br /&gt;
* Export command : &amp;quot;nm /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===MobileDevice Header (mobiledevice.h)==&lt;br /&gt;
&lt;br /&gt;
Reversed engineering C header for MobileDevice Library.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
/* ----------------------------------------------------------------------------&lt;br /&gt;
 *   MobileDevice.h - interface to MobileDevice.framework &lt;br /&gt;
 * ------------------------------------------------------------------------- */&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
#ifndef MOBILEDEVICE_H&lt;br /&gt;
#define MOBILEDEVICE_H&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
extern &amp;quot;C&amp;quot; {&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
#ifndef __GCC__&lt;br /&gt;
#pragma pack&lt;br /&gt;
#define __PACK&lt;br /&gt;
#else&lt;br /&gt;
#define __PACK __attribute__((__packed__))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#if defined(WIN32)&lt;br /&gt;
#define __DLLIMPORT [DllImport(&amp;quot;iTunesMobileDevice.dll&amp;quot;)]&lt;br /&gt;
	using namespace System::Runtime::InteropServices;&lt;br /&gt;
#include &amp;lt;CoreFoundation.h&amp;gt;&lt;br /&gt;
	typedef unsigned int mach_error_t;&lt;br /&gt;
#elif defined(__APPLE__)&lt;br /&gt;
#define __DLLIMPORT&lt;br /&gt;
#include &amp;lt;CoreFoundation/CoreFoundation.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mach/error.h&amp;gt;&lt;br /&gt;
#endif	&lt;br /&gt;
	&lt;br /&gt;
	/* Error codes */&lt;br /&gt;
#define MDERR_APPLE_MOBILE  (err_system(0x3a))&lt;br /&gt;
#define MDERR_IPHONE        (err_sub(0))&lt;br /&gt;
	&lt;br /&gt;
	/* Apple Mobile (AM*) errors */&lt;br /&gt;
#define MDERR_OK                ERR_SUCCESS&lt;br /&gt;
#define MDERR_SYSCALL           (ERR_MOBILE_DEVICE | 0x01)&lt;br /&gt;
#define MDERR_OUT_OF_MEMORY     (ERR_MOBILE_DEVICE | 0x03)&lt;br /&gt;
#define MDERR_QUERY_FAILED      (ERR_MOBILE_DEVICE | 0x04) &lt;br /&gt;
#define MDERR_INVALID_ARGUMENT  (ERR_MOBILE_DEVICE | 0x0b)&lt;br /&gt;
#define MDERR_DICT_NOT_LOADED   (ERR_MOBILE_DEVICE | 0x25)&lt;br /&gt;
	&lt;br /&gt;
	/* Apple File Connection (AFC*) errors */&lt;br /&gt;
#define MDERR_AFC_OUT_OF_MEMORY 0x03&lt;br /&gt;
	&lt;br /&gt;
	/* USBMux errors */&lt;br /&gt;
#define MDERR_USBMUX_ARG_NULL   0x16&lt;br /&gt;
#define MDERR_USBMUX_FAILED     0xffffffff&lt;br /&gt;
	&lt;br /&gt;
	/* Messages passed to device notification callbacks: passed as part of&lt;br /&gt;
	 * am_device_notification_callback_info. */&lt;br /&gt;
#define ADNCI_MSG_CONNECTED     1&lt;br /&gt;
#define ADNCI_MSG_DISCONNECTED  2&lt;br /&gt;
#define ADNCI_MSG_UNKNOWN       3&lt;br /&gt;
	&lt;br /&gt;
#define AMD_IPHONE_PRODUCT_ID   0x1290&lt;br /&gt;
	//#define AMD_IPHONE_SERIAL       &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	/* Services, found in /System/Library/Lockdown/Services.plist */&lt;br /&gt;
#define AMSVC_AFC                   CFSTR(&amp;quot;com.apple.afc&amp;quot;)&lt;br /&gt;
#define AMSVC_BACKUP                CFSTR(&amp;quot;com.apple.mobilebackup&amp;quot;)&lt;br /&gt;
#define AMSVC_CRASH_REPORT_COPY     CFSTR(&amp;quot;com.apple.crashreportcopy&amp;quot;)&lt;br /&gt;
#define AMSVC_DEBUG_IMAGE_MOUNT     CFSTR(&amp;quot;com.apple.mobile.debug_image_mount&amp;quot;)&lt;br /&gt;
#define AMSVC_NOTIFICATION_PROXY    CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;)&lt;br /&gt;
#define AMSVC_PURPLE_TEST           CFSTR(&amp;quot;com.apple.purpletestr&amp;quot;)&lt;br /&gt;
#define AMSVC_SOFTWARE_UPDATE       CFSTR(&amp;quot;com.apple.mobile.software_update&amp;quot;)&lt;br /&gt;
#define AMSVC_SYNC                  CFSTR(&amp;quot;com.apple.mobilesync&amp;quot;)&lt;br /&gt;
#define AMSVC_SCREENSHOT            CFSTR(&amp;quot;com.apple.screenshotr&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSLOG_RELAY          CFSTR(&amp;quot;com.apple.syslog_relay&amp;quot;)&lt;br /&gt;
#define AMSVC_SYSTEM_PROFILER       CFSTR(&amp;quot;com.apple.mobile.system_profiler&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned int afc_error_t;&lt;br /&gt;
	typedef unsigned int usbmux_error_t;&lt;br /&gt;
	&lt;br /&gt;
	struct am_recovery_device;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification_callback_info {&lt;br /&gt;
		struct am_device *dev;  /* 0    device */ &lt;br /&gt;
		unsigned int msg;       /* 4    one of ADNCI_MSG_* */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	/* This is a CoreFoundation object of class AMRecoveryModeDevice. */&lt;br /&gt;
	struct am_recovery_device {&lt;br /&gt;
		unsigned char unknown0[8];                          /* 0 */&lt;br /&gt;
		am_restore_device_notification_callback callback;   /* 8 */&lt;br /&gt;
		void *user_info;                                    /* 12 */&lt;br /&gt;
		unsigned char unknown1[12];                         /* 16 */&lt;br /&gt;
		unsigned int readwrite_pipe;                        /* 28 */&lt;br /&gt;
		unsigned char read_pipe;                            /* 32 */&lt;br /&gt;
		unsigned char write_ctrl_pipe;                      /* 33 */&lt;br /&gt;
		unsigned char read_unknown_pipe;                    /* 34 */&lt;br /&gt;
		unsigned char write_file_pipe;                      /* 35 */&lt;br /&gt;
		unsigned char write_input_pipe;                     /* 36 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* A CoreFoundation object of class AMRestoreModeDevice. */&lt;br /&gt;
	struct am_restore_device {&lt;br /&gt;
		unsigned char unknown[32];&lt;br /&gt;
		int port;&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device notification callback function. */&lt;br /&gt;
	typedef void(*am_device_notification_callback)(struct&lt;br /&gt;
												   am_device_notification_callback_info *);&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the _AMDDeviceAttached function.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void *amd_device_attached_callback;&lt;br /&gt;
	&lt;br /&gt;
	/* The type of the device restore notification callback functions.&lt;br /&gt;
	 * TODO: change to correct type. */&lt;br /&gt;
	typedef void (*am_restore_device_notification_callback)(struct&lt;br /&gt;
															am_recovery_device *);&lt;br /&gt;
	&lt;br /&gt;
	struct am_device {&lt;br /&gt;
		unsigned char unknown0[16]; /* 0 - zero */&lt;br /&gt;
		unsigned int device_id;     /* 16 */&lt;br /&gt;
		unsigned int product_id;    /* 20 - set to AMD_IPHONE_PRODUCT_ID */&lt;br /&gt;
		char *serial;               /* 24 - set to AMD_IPHONE_SERIAL */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned char unknown2[4];  /* 32 */&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_device_notification {&lt;br /&gt;
		unsigned int unknown0;                      /* 0 */&lt;br /&gt;
		unsigned int unknown1;                      /* 4 */&lt;br /&gt;
		unsigned int unknown2;                      /* 8 */&lt;br /&gt;
		am_device_notification_callback callback;   /* 12 */ &lt;br /&gt;
		unsigned int unknown3;                      /* 16 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct afc_connection {&lt;br /&gt;
		unsigned int handle;            /* 0 */&lt;br /&gt;
		unsigned int unknown0;          /* 4 */&lt;br /&gt;
		unsigned char unknown1;         /* 8 */&lt;br /&gt;
		unsigned char padding[3];       /* 9 */&lt;br /&gt;
		unsigned int unknown2;          /* 12 */&lt;br /&gt;
		unsigned int unknown3;          /* 16 */&lt;br /&gt;
		unsigned int unknown4;          /* 20 */&lt;br /&gt;
		unsigned int fs_block_size;     /* 24 */&lt;br /&gt;
		unsigned int sock_block_size;   /* 28: always 0x3c */&lt;br /&gt;
		unsigned int io_timeout;        /* 32: from AFCConnectionOpen, usu. 0 */&lt;br /&gt;
		void *afc_lock;                 /* 36 */&lt;br /&gt;
		unsigned int context;           /* 40 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	struct afc_device_info {&lt;br /&gt;
		unsigned char unknown[12];  /* 0 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_directory {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
&lt;br /&gt;
	struct afc_dictionary {&lt;br /&gt;
		unsigned char unknown[0];   /* size unknown */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	typedef unsigned long long afc_file_ref;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_1 {                  /* offset   value in iTunes */&lt;br /&gt;
		unsigned int unknown0;                  /* 0        1 */&lt;br /&gt;
		unsigned char *unknown1;                /* 4        ptr, maybe device? */&lt;br /&gt;
		amd_device_attached_callback callback;  /* 8        _AMDDeviceAttached */&lt;br /&gt;
		unsigned int unknown3;                  /* 12 */&lt;br /&gt;
		unsigned int unknown4;                  /* 16 */&lt;br /&gt;
		unsigned int unknown5;                  /* 20 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct usbmux_listener_2 {&lt;br /&gt;
		unsigned char unknown0[4144];&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	struct am_bootloader_control_packet {&lt;br /&gt;
		unsigned char opcode;       /* 0 */&lt;br /&gt;
		unsigned char length;       /* 1 */&lt;br /&gt;
		unsigned char magic[2];     /* 2: 0x34, 0x12 */&lt;br /&gt;
		unsigned char payload[0];   /* 4 */&lt;br /&gt;
	} __PACK;&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Registers a notification with the current run loop. The callback gets&lt;br /&gt;
	 *  copied into the notification struct, as well as being registered with the&lt;br /&gt;
	 *  current run loop. dn_unknown3 gets copied into unknown3 in the same.&lt;br /&gt;
	 *  (Maybe dn_unknown3 is a user info parameter that gets passed as an arg to&lt;br /&gt;
	 *  the callback?) unused0 and unused1 are both 0 when iTunes calls this.&lt;br /&gt;
	 *  In iTunes the callback is located from $3db78e-$3dbbaf.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK            if successful&lt;br /&gt;
	 *      MDERR_SYSCALL       if CFRunLoopAddSource() failed&lt;br /&gt;
	 *      MDERR_OUT_OF_MEMORY if we ran out of memory&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceNotificationSubscribe(am_device_notification_callback&lt;br /&gt;
											   callback, unsigned int unused0, unsigned int unused1, unsigned int&lt;br /&gt;
											   dn_unknown3, struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Connects to the iPhone. Pass in the am_device structure that the&lt;br /&gt;
	 *  notification callback will give to you.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successfully connected&lt;br /&gt;
	 *      MDERR_SYSCALL           if setsockopt() failed&lt;br /&gt;
	 *      MDERR_QUERY_FAILED      if the daemon query failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if USBMuxConnectByPort returned 0xffffffff&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceConnect(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Calls PairingRecordPath() on the given device, than tests whether the path&lt;br /&gt;
	 *  which that function returns exists. During the initial connect, the path&lt;br /&gt;
	 *  returned by that function is '/', and so this returns 1.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      0   if the path did not exist&lt;br /&gt;
	 *      1   if it did&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceIsPaired(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDevicePair(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  iTunes calls this function immediately after testing whether the device is&lt;br /&gt;
	 *  paired. It creates a pairing file and establishes a Lockdown connection.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the supplied device is null&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceValidatePairing(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/*  Creates a Lockdown session and adjusts the device structure appropriately&lt;br /&gt;
	 *  to indicate that the session has been started. iTunes calls this function&lt;br /&gt;
	 *  after validating pairing.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 *      MDERR_DICT_NOT_LOADED   if the load_dict() call failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Starts a service and returns a handle that can be used in order to further&lt;br /&gt;
	 * access the service. You should stop the session and disconnect before using&lt;br /&gt;
	 * the service. iTunes calls this function after starting a session. It starts &lt;br /&gt;
	 * the service and the SSL connection. unknown may safely be&lt;br /&gt;
	 * NULL (it is when iTunes calls this), but if it is not, then it will be&lt;br /&gt;
	 * filled upon function exit. service_name should be one of the AMSVC_*&lt;br /&gt;
	 * constants. If the service is AFC (AMSVC_AFC), then the handle is the handle&lt;br /&gt;
	 * that will be used for further AFC* calls.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_SYSCALL           if the setsockopt() call failed&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStartService(struct am_device *device, CFStringRef &lt;br /&gt;
									  service_name, afc_connection **handle, unsigned int *&lt;br /&gt;
									  unknown);&lt;br /&gt;
	&lt;br /&gt;
	/* Stops a session. You should do this before accessing services.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_INVALID_ARGUMENT  if the Lockdown conn has not been established&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceStopSession(struct am_device *device);&lt;br /&gt;
	&lt;br /&gt;
	/* Opens an Apple File Connection. You must start the appropriate service&lt;br /&gt;
	 * first with AMDeviceStartService(). In iTunes, io_timeout is 0.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 *      MDERR_AFC_OUT_OF_MEMORY if malloc() failed&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionOpen(afc_connection *handle, unsigned int io_timeout,&lt;br /&gt;
								  struct afc_connection **conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Pass in a pointer to an afc_device_info structure. It will be filled. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDeviceInfoOpen(struct afc_connection *conn, struct&lt;br /&gt;
								  afc_dictionary **info);&lt;br /&gt;
	&lt;br /&gt;
	/* Turns debug mode on if the environment variable AFCDEBUG is set to a numeric&lt;br /&gt;
	 * value, or if the file '/AFCDEBUG' is present and contains a value. */&lt;br /&gt;
#if defined(__APPLE__)&lt;br /&gt;
	void AFCPlatformInit();&lt;br /&gt;
#endif&lt;br /&gt;
	&lt;br /&gt;
	/* Opens a directory on the iPhone. Pass in a pointer in dir to be filled in.&lt;br /&gt;
	 * Note that this normally only accesses the iTunes sandbox/partition as the&lt;br /&gt;
	 * root, which is /var/root/Media. Pathnames are specified with '/' delimiters&lt;br /&gt;
	 * as in Unix style.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								 afc_directory **dir);&lt;br /&gt;
	&lt;br /&gt;
	/* Acquires the next entry in a directory previously opened with&lt;br /&gt;
	 * AFCDirectoryOpen(). When dirent is filled with a NULL value, then the end&lt;br /&gt;
	 * of the directory has been reached. '.' and '..' will be returned as the&lt;br /&gt;
	 * first two entries in each directory except the root; you may want to skip&lt;br /&gt;
	 * over them.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      MDERR_OK                if successful, even if no entries remain&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryRead(struct afc_connection *conn/*unsigned int unused*/, struct afc_directory *dir,&lt;br /&gt;
								 char **dirent);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryClose(afc_connection *conn, struct afc_directory *dir);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCDirectoryCreate(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRemovePath(afc_connection *conn, char *dirname);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCRenamePath(afc_connection *conn, char *oldpath, char *newpath);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the context field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetContext(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the fs_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetFSBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the io_timeout field of the given AFC connection. In iTunes this is&lt;br /&gt;
	 * 0. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetIOTimeout(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Returns the sock_block_size field of the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT unsigned int AFCConnectionGetSocketBlockSize(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Closes the given AFC connection. */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCConnectionClose(struct afc_connection *conn);&lt;br /&gt;
	&lt;br /&gt;
	/* Registers for device notifications related to the restore process. unknown0&lt;br /&gt;
	 * is zero when iTunes calls this. In iTunes,&lt;br /&gt;
	 * the callbacks are located at:&lt;br /&gt;
	 *      1: $3ac68e-$3ac6b1, calls $3ac542(unknown1, arg, 0)&lt;br /&gt;
	 *      2: $3ac66a-$3ac68d, calls $3ac542(unknown1, 0, arg)&lt;br /&gt;
	 *      3: $3ac762-$3ac785, calls $3ac6b2(unknown1, arg, 0)&lt;br /&gt;
	 *      4: $3ac73e-$3ac761, calls $3ac6b2(unknown1, 0, arg)&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreRegisterForDeviceNotifications(&lt;br /&gt;
														 am_restore_device_notification_callback dfu_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_connect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback dfu_disconnect_callback,&lt;br /&gt;
														 am_restore_device_notification_callback recovery_disconnect_callback,&lt;br /&gt;
														 unsigned int unknown0,&lt;br /&gt;
														 void *user_info);&lt;br /&gt;
	&lt;br /&gt;
	/* Causes the restore functions to spit out (unhelpful) progress messages to&lt;br /&gt;
	 * the file specified by the given path. iTunes always calls this right before&lt;br /&gt;
	 * restoring with a path of&lt;br /&gt;
	 * &amp;quot;$HOME/Library/Logs/iPhone Updater Logs/iPhoneUpdater X.log&amp;quot;, where X is an&lt;br /&gt;
	 * unused number.&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreEnableFileLogging(char *path);&lt;br /&gt;
	&lt;br /&gt;
	/* Initializes a new option dictionary to default values. Pass the constant&lt;br /&gt;
	 * kCFAllocatorDefault as the allocator. The option dictionary looks as&lt;br /&gt;
	 * follows:&lt;br /&gt;
	 * {&lt;br /&gt;
	 *      NORImageType =&amp;gt; 'production',&lt;br /&gt;
	 *      AutoBootDelay =&amp;gt; 0,&lt;br /&gt;
	 *      KernelCacheType =&amp;gt; 'Release',&lt;br /&gt;
	 *      UpdateBaseband =&amp;gt; true,&lt;br /&gt;
	 *      DFUFileType =&amp;gt; 'RELEASE',&lt;br /&gt;
	 *      SystemImageType =&amp;gt; 'User',&lt;br /&gt;
	 *      CreateFilesystemPartitions =&amp;gt; true,&lt;br /&gt;
	 *      FlashNOR =&amp;gt; true,&lt;br /&gt;
	 *      RestoreBootArgs =&amp;gt; 'rd=md0 nand-enable-reformat=1 -progress'&lt;br /&gt;
	 *      BootImageType =&amp;gt; 'User'&lt;br /&gt;
	 *  }&lt;br /&gt;
	 *&lt;br /&gt;
	 * Returns:&lt;br /&gt;
	 *      the option dictionary   if successful&lt;br /&gt;
	 *      NULL                    if out of memory&lt;br /&gt;
	 */ &lt;br /&gt;
	__DLLIMPORT CFMutableDictionaryRef AMRestoreCreateDefaultOptions(CFAllocatorRef allocator);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented public routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* mode 2 = read, mode 3 = write; unknown = 0 */&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefOpen(struct afc_connection *conn, char *path, unsigned&lt;br /&gt;
							   long long int mode, afc_file_ref *ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefRead(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   void *buf, unsigned int *len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefWrite(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
								void *buf, unsigned int len);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefSeek(struct afc_connection *conn, afc_file_ref ref,&lt;br /&gt;
							   unsigned long long offset1, unsigned long long offset2);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefClose(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileInfoOpen(struct afc_connection *conn, char *path, struct&lt;br /&gt;
								afc_dictionary **info);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueRead(struct afc_dictionary *dict, char **key, char **&lt;br /&gt;
								val);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCKeyValueClose(struct afc_dictionary *dict);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRecoveryModeRestore(struct am_recovery_device *&lt;br /&gt;
													 rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestorePerformRestoreModeRestore(struct am_restore_device *&lt;br /&gt;
													rdev, CFDictionaryRef opts, void *callback, void *user_info);&lt;br /&gt;
	__DLLIMPORT struct am_restore_device *AMRestoreModeDeviceCreate(unsigned int unknown0,&lt;br /&gt;
														unsigned int connection_id, unsigned int unknown1);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreCreatePathsForBundle(CFStringRef restore_bundle_path,&lt;br /&gt;
											   CFStringRef kernel_cache_type, CFStringRef boot_image_type, unsigned int&lt;br /&gt;
											   unknown0, CFStringRef *firmware_dir_path, CFStringRef *&lt;br /&gt;
											   kernelcache_restore_path, unsigned int unknown1, CFStringRef *&lt;br /&gt;
											   ramdisk_path);&lt;br /&gt;
	__DLLIMPORT unsigned int AMRestoreModeDeviceReboot(struct am_restore_device *rdev);	// Added by JB 30.07.2008&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRetain(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRelease(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(void *);&lt;br /&gt;
	&lt;br /&gt;
	/*edits by geohot*/&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDeactivate(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceActivate(struct am_device *device, CFDictionaryRef dict);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceRemoveValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/*  Pass in a usbmux_listener_1 structure and a usbmux_listener_2 structure&lt;br /&gt;
	 *  pointer, which will be filled with the resulting usbmux_listener_2.&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Returns:&lt;br /&gt;
	 *      MDERR_OK                if completed successfully&lt;br /&gt;
	 *      MDERR_USBMUX_ARG_NULL   if one of the arguments was NULL&lt;br /&gt;
	 *      MDERR_USBMUX_FAILED     if the listener was not created successfully&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerCreate(struct usbmux_listener_1 *esi_fp8, struct&lt;br /&gt;
										usbmux_listener_2 **eax_fp12);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented semi-private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	__DLLIMPORT usbmux_error_t USBMuxListenerHandleData(void *);&lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Private routines - here be dragons&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	/* AMRestorePerformRestoreModeRestore() calls this function with a dictionary&lt;br /&gt;
	 * in order to perform certain special restore operations&lt;br /&gt;
	 * (RESTORED_OPERATION_*). It is thought that this function might enable&lt;br /&gt;
	 * significant access to the phone. */&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef unsigned int (*t_performOperation)(struct am_restore_device *rdev,&lt;br /&gt;
	 CFDictionaryRef op) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_performOperation _performOperation = (t_performOperation)0x3c39fa4b;&lt;br /&gt;
	 */ &lt;br /&gt;
	&lt;br /&gt;
	/* ----------------------------------------------------------------------------&lt;br /&gt;
	 *   Less-documented private routines&lt;br /&gt;
	 * ------------------------------------------------------------------------- */&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 typedef int (*t_socketForPort)(struct am_restore_device *rdev, unsigned int port)&lt;br /&gt;
	 __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_socketForPort _socketForPort = (t_socketForPort)(void *)0x3c39f36c;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef void (*t_restored_send_message)(int port, CFDictionaryRef msg);&lt;br /&gt;
	 t_restored_send_message _restored_send_message = (t_restored_send_message)0x3c3a4e40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef CFDictionaryRef (*t_restored_receive_message)(int port);&lt;br /&gt;
	 t_restored_receive_message _restored_receive_message = (t_restored_receive_message)0x3c3a4d40;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendControlPacket)(struct am_recovery_device *rdev, unsigned&lt;br /&gt;
	 int msg1, unsigned int msg2, unsigned int unknown0, unsigned int *unknown1,&lt;br /&gt;
	 unsigned char *unknown2) __attribute__ ((regparm(3)));&lt;br /&gt;
	 t_sendControlPacket _sendControlPacket = (t_sendControlPacket)0x3c3a3da3;;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_sendCommandToDevice)(struct am_recovery_device *rdev,&lt;br /&gt;
	 CFStringRef cmd) __attribute__ ((regparm(2)));&lt;br /&gt;
	 t_sendCommandToDevice _sendCommandToDevice = (t_sendCommandToDevice)0x3c3a3e3b;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceReadPipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int read_pipe, unsigned char *data, unsigned int *len);&lt;br /&gt;
	 t_AMRUSBInterfaceReadPipe _AMRUSBInterfaceReadPipe = (t_AMRUSBInterfaceReadPipe)0x3c3a27e8;&lt;br /&gt;
	 &lt;br /&gt;
	 typedef unsigned int (*t_AMRUSBInterfaceWritePipe)(unsigned int readwrite_pipe, unsigned&lt;br /&gt;
	 int write_pipe, void *data, unsigned int len);&lt;br /&gt;
	 t_AMRUSBInterfaceWritePipe _AMRUSBInterfaceWritePipe = (t_AMRUSBInterfaceWritePipe)0x3c3a27cb;&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	int performOperation(am_restore_device *rdev, CFMutableDictionaryRef message);&lt;br /&gt;
	int socketForPort(am_restore_device *rdev, unsigned int portnum);&lt;br /&gt;
	int sendCommandToDevice(am_recovery_device *rdev, CFStringRef cfs, int block);&lt;br /&gt;
	int sendFileToDevice(am_recovery_device *rdev, CFStringRef filename); &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
#ifdef __cplusplus&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Libraries Implementations===&lt;br /&gt;
&lt;br /&gt;
Need to be writed...&lt;br /&gt;
&lt;br /&gt;
==USBMux Protocol==&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
[http://wikee.iphwn.org/usb:usbmux The dev team's page on the topic]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Protocol_Documentation]&lt;br /&gt;
[http://matt.colyer.name/projects/iphone-linux/index.php?title=Main_Page iFuse]&lt;/div&gt;</summary>
		<author><name>Codebar</name></author>
		
	</entry>
</feed>