<?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=Willfisher</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=Willfisher"/>
	<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/wiki/Special:Contributions/Willfisher"/>
	<updated>2026-04-14T11:01:35Z</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=2547</id>
		<title>MobileDevice Library</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=2547"/>
		<updated>2009-01-02T22:50:03Z</updated>

		<summary type="html">&lt;p&gt;Willfisher: /* Locking the Device for Sync */ added small note&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 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 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 am_recovery_device *);&lt;br /&gt;
&lt;br /&gt;
	/* Structure that contains internal data used by AMDevice... functions. Never try &lt;br /&gt;
         * to access its members directly! Use AMDeviceCopyDeviceIdentifier, &lt;br /&gt;
         * AMDeviceGetConnectionID, AMDeviceRetain, AMDeviceRelease instead. */&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 UDID, Unique Device Identifier */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned int unknown2;      /* 32 - reference counter, increased by AMDeviceRetain, decreased by AMDeviceRelease*/&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
#if (__ITUNES_VER &amp;gt; 740)&lt;br /&gt;
		unsigned int unknown4;      /* 48 - used to store CriticalSection Handle*/&lt;br /&gt;
#endif&lt;br /&gt;
#if (__ITUNES_VER &amp;gt;= 800)&lt;br /&gt;
		unsigned char unknown5[24];  /* 52 */&lt;br /&gt;
#endif&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;
	 *  Never try to acces directly or copy contents of dev field &lt;br /&gt;
	 *  in am_device_notification_callback_info. Treat it as abstract handle. &lt;br /&gt;
	 *  When done with connection use AMDeviceRelease to free resources allocated for am_device.&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 callback, &lt;br /&gt;
								unsigned int unused0, unsigned int unused1, &lt;br /&gt;
								unsigned int dn_unknown3, &lt;br /&gt;
								struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Returns device_id field of am_device structure&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
&lt;br /&gt;
	/*  Returns serial field of am_device structure&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&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;
	/* Decrements reference counter and, if nothing left, releases resources hold &lt;br /&gt;
	 * by connection, invalidates  pointer to device&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT void AMDeviceRelease(struct am_device *device);&lt;br /&gt;
&lt;br /&gt;
	/* Increments reference counter&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT void AMDeviceRetain(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 AFCFileRefLock(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefUnlock(struct afc_connection *conn, afc_file_ref ref);&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 mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring)&lt;br /&gt;
	/* to use this, start the service &amp;quot;com.apple.mobile.notification_proxy&amp;quot;, handle will be the socket to use */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDPostNotification(SOCKET socket, CFStringRef  notification, CFStringRef userinfo);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(SOCKET socket);&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;
===Locking the Device for Sync===&lt;br /&gt;
When iTunes sends a new song to the device, the device shows a &amp;quot;Sync in progress&amp;quot; screen and when complete, the Music app on the device re-reads the iTunesDB file so it picks up the new song.&lt;br /&gt;
&lt;br /&gt;
To get this behaviour, first start the notification service:&lt;br /&gt;
&amp;lt;pre&amp;gt;SOCKET socket;&lt;br /&gt;
AMDeviceStartService(dev, CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;), &amp;amp;socket, NULL);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we post a notificaton message to signal that we are going to start a sync:&lt;br /&gt;
&amp;lt;pre&amp;gt;AMDPostNotification(socket, CFSTR(&amp;quot;com.apple.itunes-mobdev.syncWillStart&amp;quot;), NULL);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next we open the itunes lock file:&lt;br /&gt;
&amp;lt;pre&amp;gt;afc_file_ref lockref;&lt;br /&gt;
AFCFileRefOpen(conn, &amp;quot;/com.apple.itunes.lock_sync&amp;quot;, 2, &amp;amp;lockref);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now post a notification to say we are going to lock this file, and try and lock it.&lt;br /&gt;
If the AFCFileRefLock call fails, pause and repeat.&lt;br /&gt;
&amp;lt;pre&amp;gt;AMDPostNotification(socket, CFSTR(&amp;quot;com.apple.itunes-mobdev.syncLockRequest&amp;quot;), NULL);&lt;br /&gt;
mach_error_t error = AFCFileRefLock(conn, lockref);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the file is successfully locked, post another notification, and stop the notification service.&lt;br /&gt;
&amp;lt;pre&amp;gt;AMDPostNotification(socket,CFSTR(&amp;quot;com.apple.itunes-mobdev.syncDidStart&amp;quot;), NULL);&lt;br /&gt;
AMDShutdownNotificationProxy(socket);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the sync can proceed, so copy your files across and make the changes to the iTunesDB.&lt;br /&gt;
&lt;br /&gt;
To release the lock, start the notification system again, unlock and close the lock file, and send a sync finished notification message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;AFCFileRefUnlock(conn, lockref);&lt;br /&gt;
AFCFileRefClose(conn, lockref);&lt;br /&gt;
AMDeviceStartService(dev, CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;), &amp;amp;socket, NULL);&lt;br /&gt;
AMDPostNotification(socket, &amp;amp;CFSTR(&amp;quot;com.apple.itunes-mobdev.syncDidFinish&amp;quot;), NULL);&lt;br /&gt;
AMDShutdownNotificationProxy(socket);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: You may find that starting the notification_proxy service once and once only at the start of your app and using the same socket in calls to AMDPostNotification works better. iTunes opens and closes the notification_proxy regularly, but it appears to be a bit flakey when you open/close it all the time.&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>Willfisher</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=2546</id>
		<title>MobileDevice Library</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=2546"/>
		<updated>2009-01-02T22:22:49Z</updated>

		<summary type="html">&lt;p&gt;Willfisher: info on how to lock the device for sync&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 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 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 am_recovery_device *);&lt;br /&gt;
&lt;br /&gt;
	/* Structure that contains internal data used by AMDevice... functions. Never try &lt;br /&gt;
         * to access its members directly! Use AMDeviceCopyDeviceIdentifier, &lt;br /&gt;
         * AMDeviceGetConnectionID, AMDeviceRetain, AMDeviceRelease instead. */&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 UDID, Unique Device Identifier */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned int unknown2;      /* 32 - reference counter, increased by AMDeviceRetain, decreased by AMDeviceRelease*/&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
#if (__ITUNES_VER &amp;gt; 740)&lt;br /&gt;
		unsigned int unknown4;      /* 48 - used to store CriticalSection Handle*/&lt;br /&gt;
#endif&lt;br /&gt;
#if (__ITUNES_VER &amp;gt;= 800)&lt;br /&gt;
		unsigned char unknown5[24];  /* 52 */&lt;br /&gt;
#endif&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;
	 *  Never try to acces directly or copy contents of dev field &lt;br /&gt;
	 *  in am_device_notification_callback_info. Treat it as abstract handle. &lt;br /&gt;
	 *  When done with connection use AMDeviceRelease to free resources allocated for am_device.&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 callback, &lt;br /&gt;
								unsigned int unused0, unsigned int unused1, &lt;br /&gt;
								unsigned int dn_unknown3, &lt;br /&gt;
								struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Returns device_id field of am_device structure&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
&lt;br /&gt;
	/*  Returns serial field of am_device structure&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&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;
	/* Decrements reference counter and, if nothing left, releases resources hold &lt;br /&gt;
	 * by connection, invalidates  pointer to device&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT void AMDeviceRelease(struct am_device *device);&lt;br /&gt;
&lt;br /&gt;
	/* Increments reference counter&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT void AMDeviceRetain(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 AFCFileRefLock(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefUnlock(struct afc_connection *conn, afc_file_ref ref);&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 mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring)&lt;br /&gt;
	/* to use this, start the service &amp;quot;com.apple.mobile.notification_proxy&amp;quot;, handle will be the socket to use */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDPostNotification(SOCKET socket, CFStringRef  notification, CFStringRef userinfo);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(SOCKET socket);&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;
===Locking the Device for Sync===&lt;br /&gt;
When iTunes sends a new song to the device, the device shows a &amp;quot;Sync in progress&amp;quot; screen and when complete, the Music app on the device re-reads the iTunesDB file so it picks up the new song.&lt;br /&gt;
&lt;br /&gt;
To get this behaviour, first start the notification service:&lt;br /&gt;
&amp;lt;pre&amp;gt;SOCKET socket;&lt;br /&gt;
AMDeviceStartService(dev, CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;), &amp;amp;socket, NULL);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we post a notificaton message to signal that we are going to start a sync:&lt;br /&gt;
&amp;lt;pre&amp;gt;AMDPostNotification(socket, CFSTR(&amp;quot;com.apple.itunes-mobdev.syncWillStart&amp;quot;), NULL);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next we open the itunes lock file:&lt;br /&gt;
&amp;lt;pre&amp;gt;afc_file_ref lockref;&lt;br /&gt;
AFCFileRefOpen(conn, &amp;quot;/com.apple.itunes.lock_sync&amp;quot;, 2, &amp;amp;lockref);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now post a notification to say we are going to lock this file, and try and lock it.&lt;br /&gt;
If the AFCFileRefLock call fails, pause and repeat.&lt;br /&gt;
&amp;lt;pre&amp;gt;AMDPostNotification(socket, CFSTR(&amp;quot;com.apple.itunes-mobdev.syncLockRequest&amp;quot;), NULL);&lt;br /&gt;
mach_error_t error = AFCFileRefLock(conn, lockref);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When the file is successfully locked, post another notification, and stop the notification service.&lt;br /&gt;
&amp;lt;pre&amp;gt;AMDPostNotification(socket,CFSTR(&amp;quot;com.apple.itunes-mobdev.syncDidStart&amp;quot;), NULL);&lt;br /&gt;
AMDShutdownNotificationProxy(socket);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the sync can proceed, so copy your files across and make the changes to the iTunesDB.&lt;br /&gt;
&lt;br /&gt;
To release the lock, start the notification system again, unlock and close the lock file, and send a sync finished notification message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;AFCFileRefUnlock(conn, lockref);&lt;br /&gt;
AFCFileRefClose(conn, lockref);&lt;br /&gt;
AMDeviceStartService(dev, CFSTR(&amp;quot;com.apple.mobile.notification_proxy&amp;quot;), &amp;amp;socket, NULL);&lt;br /&gt;
AMDPostNotification(socket, &amp;amp;CFSTR(&amp;quot;com.apple.itunes-mobdev.syncDidFinish&amp;quot;), NULL);&lt;br /&gt;
AMDShutdownNotificationProxy(socket);&amp;lt;/pre&amp;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>Willfisher</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=2545</id>
		<title>MobileDevice Library</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=2545"/>
		<updated>2009-01-02T22:06:52Z</updated>

		<summary type="html">&lt;p&gt;Willfisher: /* MobileDevice Header (mobiledevice.h) */  added AMDPostNotification&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 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 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 am_recovery_device *);&lt;br /&gt;
&lt;br /&gt;
	/* Structure that contains internal data used by AMDevice... functions. Never try &lt;br /&gt;
         * to access its members directly! Use AMDeviceCopyDeviceIdentifier, &lt;br /&gt;
         * AMDeviceGetConnectionID, AMDeviceRetain, AMDeviceRelease instead. */&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 UDID, Unique Device Identifier */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned int unknown2;      /* 32 - reference counter, increased by AMDeviceRetain, decreased by AMDeviceRelease*/&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
#if (__ITUNES_VER &amp;gt; 740)&lt;br /&gt;
		unsigned int unknown4;      /* 48 - used to store CriticalSection Handle*/&lt;br /&gt;
#endif&lt;br /&gt;
#if (__ITUNES_VER &amp;gt;= 800)&lt;br /&gt;
		unsigned char unknown5[24];  /* 52 */&lt;br /&gt;
#endif&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;
	 *  Never try to acces directly or copy contents of dev field &lt;br /&gt;
	 *  in am_device_notification_callback_info. Treat it as abstract handle. &lt;br /&gt;
	 *  When done with connection use AMDeviceRelease to free resources allocated for am_device.&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 callback, &lt;br /&gt;
								unsigned int unused0, unsigned int unused1, &lt;br /&gt;
								unsigned int dn_unknown3, &lt;br /&gt;
								struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Returns device_id field of am_device structure&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
&lt;br /&gt;
	/*  Returns serial field of am_device structure&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&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;
	/* Decrements reference counter and, if nothing left, releases resources hold &lt;br /&gt;
	 * by connection, invalidates  pointer to device&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT void AMDeviceRelease(struct am_device *device);&lt;br /&gt;
&lt;br /&gt;
	/* Increments reference counter&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT void AMDeviceRetain(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 AFCFileRefLock(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefUnlock(struct afc_connection *conn, afc_file_ref ref);&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 mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring)&lt;br /&gt;
	/* to use this, start the service &amp;quot;com.apple.mobile.notification_proxy&amp;quot;, handle will be the socket to use */&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDPostNotification(SOCKET socket, CFStringRef  notification, CFStringRef userinfo);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(SOCKET socket);&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>Willfisher</name></author>
		
	</entry>
	<entry>
		<id>https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=2544</id>
		<title>MobileDevice Library</title>
		<link rel="alternate" type="text/html" href="https://www.theiphonewiki.com/w/index.php?title=MobileDevice_Library&amp;diff=2544"/>
		<updated>2009-01-02T22:02:54Z</updated>

		<summary type="html">&lt;p&gt;Willfisher: /* MobileDevice Header (mobiledevice.h) */ Added info for getting Sync in progress screen working&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 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 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 am_recovery_device *);&lt;br /&gt;
&lt;br /&gt;
	/* Structure that contains internal data used by AMDevice... functions. Never try &lt;br /&gt;
         * to access its members directly! Use AMDeviceCopyDeviceIdentifier, &lt;br /&gt;
         * AMDeviceGetConnectionID, AMDeviceRetain, AMDeviceRelease instead. */&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 UDID, Unique Device Identifier */&lt;br /&gt;
		unsigned int unknown1;      /* 28 */&lt;br /&gt;
		unsigned int unknown2;      /* 32 - reference counter, increased by AMDeviceRetain, decreased by AMDeviceRelease*/&lt;br /&gt;
		unsigned int lockdown_conn; /* 36 */&lt;br /&gt;
		unsigned char unknown3[8];  /* 40 */&lt;br /&gt;
#if (__ITUNES_VER &amp;gt; 740)&lt;br /&gt;
		unsigned int unknown4;      /* 48 - used to store CriticalSection Handle*/&lt;br /&gt;
#endif&lt;br /&gt;
#if (__ITUNES_VER &amp;gt;= 800)&lt;br /&gt;
		unsigned char unknown5[24];  /* 52 */&lt;br /&gt;
#endif&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;
	 *  Never try to acces directly or copy contents of dev field &lt;br /&gt;
	 *  in am_device_notification_callback_info. Treat it as abstract handle. &lt;br /&gt;
	 *  When done with connection use AMDeviceRelease to free resources allocated for am_device.&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 callback, &lt;br /&gt;
								unsigned int unused0, unsigned int unused1, &lt;br /&gt;
								unsigned int dn_unknown3, &lt;br /&gt;
								struct am_device_notification **notification);&lt;br /&gt;
	&lt;br /&gt;
	/*  Returns device_id field of am_device structure&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT unsigned int AMDeviceGetConnectionID(struct am_device *device);&lt;br /&gt;
&lt;br /&gt;
	/*  Returns serial field of am_device structure&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyDeviceIdentifier(struct am_device *device);&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;
	/* Decrements reference counter and, if nothing left, releases resources hold &lt;br /&gt;
	 * by connection, invalidates  pointer to device&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT void AMDeviceRelease(struct am_device *device);&lt;br /&gt;
&lt;br /&gt;
	/* Increments reference counter&lt;br /&gt;
	 */&lt;br /&gt;
	__DLLIMPORT void AMDeviceRetain(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 AFCFileRefLock(struct afc_connection *conn, afc_file_ref ref);&lt;br /&gt;
	__DLLIMPORT afc_error_t AFCFileRefUnlock(struct afc_connection *conn, afc_file_ref ref);&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 mach_error_t AMDeviceEnterRecovery(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDeviceDisconnect(struct am_device *device);&lt;br /&gt;
	__DLLIMPORT CFStringRef AMDeviceCopyValue(struct am_device *device, unsigned int, CFStringRef cfstring);&lt;br /&gt;
	__DLLIMPORT mach_error_t AMDShutdownNotificationProxy(SOCKET socket);&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>Willfisher</name></author>
		
	</entry>
</feed>