苹果USB低级过滤器,可帮助控制操作系统使用USB配置(下)
2023-11-16 11:54:0 Author: www.4hou.com(查看原文) 阅读量:8 收藏

导语:在本文中,我们探讨了苹果的USB低级过滤器是如何在Windows设备上工作的,以及它在提供不同体验方面的作用。

苹果USB低级过滤器,可帮助控制操作系统使用USB配置(上)

PTP还是MTP?

本文中,我们将重点讨论为什么iphone没有像我们期望的使用MTP协议的设备那样提供一整套存储操作,还将研究USB接口类/子类和WPD_DEVICE_PROTOCOL属性之间不匹配的原因。为了回答这些问题,我们将了解如何创建WPD设备、如何“挂载”存储以及如何设置WPD属性。

首先对比一下使用PTP连接的Android设备和iPhone之间WPD设备协议属性的差异:

9.jpg

考虑到iPhone中的WPD协议属性,我们期望有一组更丰富的选项来与设备交互,可以通过查看设备的接口描述符来快速回答为什么iPhone表现为PTP设备。

iPhone和小米在PTP和MTP模式下的描述如下:iPhone有多种配置,但无论选择哪一种,创建WPD的接口PDO总是包含类6和子类1的接口。

10.png

尽管已经回答了最大的问题,但仍然有一些细节,比如为什么iPhone不允许创建或复制任何东西到它,而另一方面,小米即使使用PTP也允许创建对象,所以对于喜欢深入了解事物的人来说,仅仅浏览界面描述是不够的。

由于此描述符将生成CompatibleId USB\Class_06&SubClass_01&Prot_01,因此寻找与此ID匹配的INF,我们找到wpdmtp.inf。在此INF中,可以获得WPD设备的UMDF部分的以下组件:

WpdMtp.dll:MTP核心协议组件;

WpdMtpUS.dll:Usbscan MTP驱动程序的传输层;

WpdMtpDr.dll:Windows便携式设备媒体传输协议驱动程序;

作为内核方面的一部分,INF将添加WinUSB.sys作为LowerFilter,并添加反射器WUDFRd.sys作为函数驱动程序。

从上面提到的三个二进制文件中,WpdMtpDr是将在WUDFHost中运行的主要WPD MTP驱动程序。这是一个UMDFv1驱动程序,它将基于COM并用C++编写,基于WpdWudfSampleDriver,几乎就不需要逆转,但该驱动程序没有更新为使用UMDFv2,因为UMDFv1几乎已经被弃用,并且几乎不支持新功能。

11.jpg

如上所述,入口点是OnDeviceAdd例程。在这个函数中,创建了CDevice对象,它将我们带到CDevice::OnPrepareHardware例程,在该例程中,通过调用WpdBaseDriver::Initialize来初始化WpdBaseDriver。不幸的是,这是Sample代码和WpdMtpDr开始出现差异的部分。示例代码没有真正的设备可以通信,但在本文的示例中,WpdMtp.dll的作用所在,充当WpdMtpDr和真正设备之间的粘合剂。MTP核心库包含CMtpDevice类,它表示真实的设备。在WpdBaseDriver初始化期间,加载MTP核心库,并打开与设备的会话,如以下简化代码片段所示:

11.png

加载MTP核心模块后,触发初始化例程来检索MTP DeviceInfo Dataset。这是发送到设备的初始MTP请求之一,DeviceInfo结构在其返回时填充。值得注意的是,该结构包含关键信息,如模型、制造商和各种MTP版本标识符。这些信息在稍后设置WPD属性时起着至关重要的作用。

MTP核心发送请求并将响应解析为CDeviceInfo结构,而WpdMtpDr利用缓存系统存储指向WpdMtp返回的类的COM指针。这种方法可以防止频繁地向设备重新发出PTP/MTP请求,从而优化I/O操作。

下面的堆栈显示了这个函数第一次被调用:

12.png

在UM中,WPD应用程序通常使用WPD API构建WPD命令,WPD API将序列化该WPD命令并将其打包到IOCTL请求中,这将到达驱动程序,驱动程序将反序列化命令并相应地采取行动。

一旦设备准备好接收I/O操作,操作系统将尝试检索WPD设备属性,该信息存在于device objectID中(此objectID是预定义的,始终表示device对象)。这个请求将到达WPD驱动程序,它将用CDeviceInfo的信息填充WPD设备属性。对于WPD_DEVICE_PROTOCOL的情况,该值将如何设置:

13.png

现在如果看一下iPhone返回的DeviceInfo Dataset,可以看VendorExtId和VendorExtVersion,可以最终回答为什么WPD_DEVICE_PROTOCOL被设置为MTP 15.20。MICROSOFT_VENDOR_EXT_ID是由MS作为WMDRM协议的一部分定义的,这是MTP响应器需要在DeviceInfo Dataset中设置的值之一,以告诉MTP启动器它支持AAVT,令人惊讶的是,iPhone只添加了这个必需的值,而不是其他值。

14.jpg

该属性将在函数CDevicePropContext::GetDeviceType上检索,该函数将使用SetupAPI获得compatibleid,无论协议是PTP还是MTP,设备中的每个存储对象(由以s开头的storageid表示)都有自己的属性。同样,当设备上开始I/O操作时,操作系统使用两个关键操作从存储对象中检索信息:getstorageid (0x1004)(检索storageid列表)和GetStorageInfo (0x1005)(定义存储对象的行为方式)。我们将重点关注后者,因为它返回一个包含以下三个关键字段的StorageInfo数据集。

存储类型

文件系统类型

访问功能

当WPD驱动程序第一次尝试获取设备的StorageInfo时,该请求将通过MTP核心模块。该模块向设备发送PTP/MTP操作请求,并将结果StorageInfo数据集返回给驱动程序。

15.png

因此,如果看一下iPhone是如何响应这个请求的,将能够根据上面提到的三个字段来确定Storage对象的行为。

16.jpg

我们可以从上图得到以下信息:存储类型==固定RAM,这是相当标准的移动设备。文件系统类型== DCF, DCF代表Camera FS的设计规则,你可以会从著名的DCIM根目录中认出它。DCF标准定义了在目录和文件上设置只读属性的选项。访问能力==只读,不能删除对象,这是致命的。这将定义对Storage对象的访问限制,操作系统将遵守这些限制。例如,这将影响iPhone的上下文菜单中显示的选项。

这就是为什么iPhone上的文件选项如此有限。为了便于比较,下图显示了使用PTP插入小米设备时的StorageInfo数据集。

17.jpg

事实证明,这就是为什么即使使用PTP协议连接,也能够在小米设备上创建对象的原因。然而,值得注意的是小米的MTP响应器似乎有问题,无论在设备上选择PTP还是MTP,在响应GetStorageInfo请求时都会返回相同的Dataset,至少在红米Note 8模型上是这样。

这样,我们就可以更清楚地理解Apple设备的运行方式,以及如何为设备配置WPD属性。

苹果软件对苹果设备栈的影响

接下来总结一下,当我们在主机上安装iTunes时会发生什么,以及它是如何实现诸如从设备复制文件之类的操作的。

如上所述,由于Storage对象中的限制,WPD API将仅在iPhone上提供有限的操作子集,然而,当安装iTunes后,它增加了一个不同的层,可以更全面地访问设备。

正如我们在AppleLowerFilter中看到的,一旦iTunes被安装,它将允许设备选择一个不同的USB配置描述符。没有iTunes,我们被限制在配置1,另一方面,一旦iTunes被默认安装,选择的配置将是3。以下是这两种配置及其接口:

18.png

选择配置3,将使usbccgp生成deviceID USB\VID_xxxx&PID_yyyy&MI_01(01从bInterfaceNumber中提取)。这些deviceid是在appleusb中定义的。它定义了以下文件的副本:

19.png

这两个驱动程序将成为被苹果公司称为“苹果移动设备USB设备”设备的一部分,该设备使用专有协议而不是MTP或PTP与iPhone进行通信,可以通过查看libimobiledevice的源代码来了解有关该协议的更多信息。一旦驱动程序安装并运行,iTunes本身就会使用标准WPD API调用和定制的苹果特定命令的组合与iPhone进行通信。这使得iTunes能够提供从设备中复制文件、管理应用程序和备份以及更新设备固件等功能。

下图提供了iPhone的整个设备堆栈的简化概述,包括安装iTunes和创建AppleUsbMux设备的场景:

20.jpg

总结

在本文中,我们探讨了苹果的USB低级过滤器是如何在Windows设备上工作的,以及它在提供不同体验方面的作用,还深入研究了Windows便携式设备(WPD)和用户模式驱动程序框架(UMDF)等主题,以更好地理解苹果设备堆栈的内部工作原理。

我们谈到WPD设备是如何初始化和设置的,这帮助我们了解了为什么WPD设备协议属性和Apple设备中接口描述符定义的类之间存在不匹配。我们还研究了WPD设备的Storage对象是如何设置的,以及它如何在不使用第三方软件的情况下在iPhone上操作的限制中发挥作用。最后,我们简要讨论了安装iTunes对苹果移动设备栈的影响,以及iTunes如何妥善管理设备内容。

苹果希望保护某些信息,限制与iPhone存储交互的现成选项,但如果有一个更混合的解决方案,用户可以在一定的限制下拥有更大的灵活性。虽然iTunes为管理iPhone内容提供了一个强大的解决方案,但有时安装第三方软件可能不是一个选择。然而,随着iTunes最近作为微软商店应用程序的发布,这种限制可能会减少。

文章翻译自:https://n4r1b.com/posts/2023/03/the-intersection-of-apples-usb-lower-filter-and-iphone-wpd-integration/如若转载,请注明原文地址

  • 分享至

取消 嘶吼

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟


文章来源: https://www.4hou.com/posts/7yxw
如有侵权请联系:admin#unsafe.sh