能否将主机USB设备转发至EDK2的NT32仿真平台用于UEFI应用测试?
针对NT32模拟器中USB令牌测试的解决方案
首先得明确:EDK2的NT32模拟器本质是Windows用户态下的软件仿真环境,它并没有模拟真实的USB控制器硬件,所以原生不支持像VMware那样直接转发主机USB设备。不过我们可以通过几种方式实现类似的效果,或者仿真USB令牌来满足调试需求:
1. 别抱希望在那两个Pcd参数上
你提到的gEfiNt32PkgTokenSpaceGuid.PcdWinNtPhysicalDisk和PcdWinNtVirtualDisk,其实是用来把Windows系统里的物理/虚拟磁盘映射成模拟器中的UEFI块设备,和USB令牌(比如智能卡、USB密钥这类设备)完全不相关,调整这两个参数帮不了你的忙。
2. 最直接的方案:仿真USB令牌设备
如果你的UEFI应用只是需要读取USB令牌的特定数据,不需要完整的USB协议交互,可以这么做:
- 先在真机/VMware中把USB令牌的关键数据(比如设备描述符、令牌内的存储数据)导出成文件;
- 修改NT32Pkg的代码,添加一个简单的模拟UEFI USB设备模块,在模拟器启动时加载这个模块,读取你导出的文件数据,模拟成一个UEFI可识别的USB令牌设备;
- 这样你的应用就能在模拟器中“看到”这个仿真设备,完成源码级调试。
3. 进阶方案:扩展NT32的USB模拟层,对接Windows USB API
如果需要完整的USB令牌交互(比如实时读取令牌数据),可以扩展NT32的USB模拟框架:
- NT32本身有基础的USB设备模拟(比如键盘、鼠标),你可以参考这些模块的代码;
- 调用Windows的USB相关API(比如针对智能卡的
WinSCard接口,或者通用USB设备的SetupAPI),枚举主机上的USB令牌; - 在NT32的模拟层中把Windows获取到的USB设备信息转换成UEFI USB协议能识别的数据结构,让你的UEFI应用可以像访问真实设备一样和主机的USB令牌交互。
- 这种方式需要你对EDK2的UEFI USB协议栈和Windows的用户态USB编程都有一定了解,但实现后就能完全模拟VMware的设备转发效果。
4. 临时调试替代方案:绕过USB直接传数据
如果以上方案都太复杂,还有个偷懒的办法:在你的UEFI应用里加个调试分支,当检测到运行在NT32模拟器时,直接从本地文件(或者Windows的共享内存)读取令牌数据,而不是通过USB协议读取。这样可以快速验证应用的核心逻辑,不用折腾USB模拟。
内容的提问来源于stack exchange,提问作者andrey0722




