本文中,我们将重点讨论为什么 iphone 没有像我们期望的使用 MTP 协议的设备那样提供一整套存储操作,还将研究 USB 接口类 / 子类和 WPD_DEVICE_PROTOCOL 属性之间不匹配的原因。为了回答这些问题,我们将了解如何创建 WPD 设备、如何 挂载 存储以及如何设置 WPD 属性。
考虑到 iPhone 中的 WPD 协议属性,我们期望有一组更丰富的选项来与设备交互,可以通过查看设备的接口描述符来快速回答为什么 iPhone 表现为 PTP 设备。
iPhone 和小米在 PTP 和 MTP 模式下的描述如下:iPhone 有多种配置,但无论选择哪一种,创建 WPD 的接口 PDO 总是包含类 6 和子类 1 的接口。
尽管已经回答了最大的问题,但仍然有一些细节,比如为什么 iPhone 不允许创建或复制任何东西到它,而另一方面,小米即使使用 PTP 也允许创建对象,所以对于喜欢深入了解事物的人来说,仅仅浏览界面描述是不够的。
从上面提到的三个二进制文件中,WpdMtpDr 是将在 WUDFHost 中运行的主要 WPD MTP 驱动程序。这是一个 UMDFv1 驱动程序,它将基于 COM 并用 C++ 编写,基于 WpdWudfSampleDriver,几乎就不需要逆转,但该驱动程序没有更新为使用 UMDFv2,因为 UMDFv1 几乎已经被弃用,并且几乎不支持新功能。
如上所述,入口点是 OnDeviceAdd 例程。在这个函数中,创建了 CDevice 对象,它将我们带到 CDevice::OnPrepareHardware 例程,在该例程中国内苹果id怎么改美国,通过调用 WpdBaseDriver::Initialize 来初始化 WpdBaseDriver。不幸的是,这是 Sample 代码和 WpdMtpDr 开始出现差异的部分。示例代码没有真正的设备可以通信,但在本文的示例中,WpdMtp.dll 的作用所在,充当 WpdMtpDr 和真正设备之间的粘合剂。MTP 核心库包含 CMtpDevice 类,它表示真实的设备。在 WpdBaseDriver 初始化期间,加载 MTP 核心库,并打开与设备的会话,如以下简化代码片段所示:
加载 MTP 核心模块后,触发初始化例程来检索 MTP DeviceInfo Dataset。这是发送到设备的初始 MTP 请求之一,DeviceInfo 结构在其返回时填充。值得注意的是,该结构包含关键信息,如模型、制造商和各种 MTP 版本标识符。这些信息在稍后设置 WPD 属性时起着至关重要的作用苹果美国id充值限购怎么解封。
MTP 核心发送请求并将响应解析为 CDeviceInfo 结构,而 WpdMtpDr 利用缓存系统存储指向 WpdMtp 返回的类的 COM 指针。这种方法可以防止频繁地向设备重新发出 PTP/MTP 请求,从而优化 I/O 操作。
在 UM 中,WPD 应用程序通常使用 WPD API 构建 WPD 命令,WPD API 将序列化该 WPD 命令并将其打包到 IOCTL 请求中,这将到达驱动程序,驱动程序将反序列化命令并相应地采取行动。
当 WPD 驱动程序第一次尝试获取设备的 StorageInfo 时,该请求将通过 MTP 核心模块。该模块向设备发送 PTP/MTP 操作请求,并将结果 StorageInfo 数据集返回给驱动程序。
因此,如果看一下 iPhone 是如何响应这个请求的,将能够根据上面提到的三个字段来确定 Storage 对象的行为。
我们可以从上图得到以下信息:存储类型 == 固定 RAM,这是相当标准的移动设备。文件系统类型 == DCF, DCF 代表 Camera FS 的设计规则,你可以会从著名的 DCIM 根目录中认出它。DCF 标准定义了在目录和文件上设置只读属性的选项。访问能力 == 只读,不能删除对象,这是致命的。这将定义对 Storage 对象的访问限制,操作系统将遵守这些限制。例如,这将影响 iPhone 的上下文菜单中显示的选项。
这就是为什么 iPhone 上的文件选项如此有限。为了便于比较,下图显示了使用 PTP 插入小米设备时的 StorageInfo 数据集。
事实证明,这就是为什么即使使用 PTP 协议连接,也能够在小米设备上创建对象的原因。然而,值得注意的是小米的 MTP 响应器似乎有问题,无论在设备上选择 PTP 还是 MTP,在响应 GetStorageInfo 请求时都会返回相同的 Dataset,至少在红米 Note 8 模型上是这样。
这样,我们就可以更清楚地理解 Apple 设备的运行方式,以及如何为设备配置 WPD 属性。
接下来总结一下,当我们在主机上安装 iTunes 时会发生什么,以及它是如何实现诸如从设备复制文件之类的操作的。
如上所述,由于 Storage 对象中的限制,WPD API 将仅在 iPhone 上提供有限的操作子集,然而,当安装 iTunes 后,它增加了一个不同的层,可以更全面地访问设备。
正如我们在 AppleLowerFilter 中看到的,一旦 iTunes 被安装,它将允许设备选择一个不同的 USB 配置描述符。没有 iTunes,我们被限制在配置 1,另一方面,一旦 iTunes 被默认安装,选择的配置将是 3。以下是这两种配置及其接口:
这两个驱动程序将成为被苹果公司称为 苹果移动设备 USB 设备 设备的一部分,该设备使用专有协议而不是 MTP 或 PTP 与 iPhone 进行通信苹果美国id充值限购怎么解封,可以通过查看 libimobiledevice 的源代码来了解有关该协议的更多信息。一旦驱动程序安装并运行,iTunes 本身就会使用标准 WPD API 调用和定制的苹果特定命令的组合与 iPhone 进行通信。这使得 iTunes 能够提供从设备中复制文件、管理应用程序和备份以及更新设备固件等功能。
下图提供了 iPhone 的整个设备堆栈的简化概述,包括安装 iTunes 和创建 AppleUsbMux 设备的场景:
在本文中,我们探讨了苹果的 USB 低级过滤器是如何在 Windows 设备上工作的,以及它在提供不同体验方面的作用,还深入研究了 Windows 便携式设备 ( WPD ) 和用户模式驱动程序框架 ( UMDF ) 等主题,以更好地理解苹果设备堆栈的内部工作原理。
我们谈到 WPD 设备是如何初始化和设置的,这帮助我们了解了为什么 WPD 设备协议属性和 Apple 设备中接口描述符定义的类之间存在不匹配。我们还研究了 WPD 设备的 Storage 对象是如何设置的,以及它如何在不使用第三方软件的情况下在 iPhone 上操作的限制中发挥作用。最后,我们简要讨论了安装 iTunes 对苹果移动设备栈的影响,以及 iTunes 如何妥善管理设备内容。
苹果希望保护某些信息,限制与 iPhone 存储交互的现成选项,但如果有一个更混合的解决方案,用户可以在一定的限制下拥有更大的灵活性。虽然 iTunes 为管理 iPhone 内容提供了一个强大的解决方案,但有时安装第三方软件可能不是一个选择。然而,随着 iTunes 最近作为微软商店应用程序的发布,这种限制可能会减少。国内苹果id怎苹果美国id充值限购怎么解封么改美国