【问题标题】:Problems getting a device driver to load at startup - WM6.1在启动时加载设备驱动程序时出现问题 - WM6.1
【发布时间】:2010-08-27 14:46:09
【问题描述】:

我们的嵌入式系统程序员为我们的移动硬件开发了一个虚拟串行端口驱动程序的外壳,我一直在填写方法以使其工作。该驱动程序确实按预期工作,它模拟了一个用于喷出 NMEA 字符串(GPS 数据)的 USB 设备的 COM 端口。

我输入的是 WM6 的简称,但操作系统是 WM6.1,如果它有什么不同的话。

我遇到的问题是驱动程序仅在 WM6 上的设备启动时不加载。该驱动程序是为 CE5 和 WM6 开发的,但在 CE5 上,驱动程序“确实”在启动时加载,这将我指向 WM6 配置问题。 在这一点上可能值得注意的是,驱动程序将使用 ActivateDevice() 方法加载到 WM6 和 CE5 中,这是我迄今为止一直在使用的 WM6,一个用于启动驱动程序的小型测试应用程序,因此我至少可以测试驱动程序正在开发 WM6。

注册表中已经填充了启动驱动程序所需的密钥。所以驱动程序应该在启动时加载,没有任何问题。 HKEY_LOCAL_MACHINE\Drivers\BuiltIn 包含一个子键 A36D_GPS_COM,并且包含在该键中。

设备数组索引:0

设备类型:0

Dll:A36D.dll

标志:0

友好名称:A36D GPS COM 端口

索引:8

订单:3

前缀:COM

优先级:0

优先级:256

据我所知,我已经调查过这个问题通常有 2 个常见的答案。这些想法是嵌入式程序员给我的,但我自己研究了如何去做。

1) 当驱动程序尝试加载时,COM 端口已经在使用中,即使在加载设备后该 COM 端口最终是空闲的。我已将注册表中的索引值从 1 更改为 20 并重新启动设备,驱动程序未加载到指定的 COM 端口。因此,为了更彻底地尝试和测试,我将另一个设备从 COM9 移动到 COM8,并将我的驱动程序移动到 COM9(使用上述注册表设置)。其他设备驱动程序在 COM8 上启动时非常愉快地加载,但我的设备驱动程序无法在 COM9 上启动。我什至尝试过调整其他设置,但仍然无法在启动时加载。

2) CE5 和 WM6 之间另一个可能的问题和区别是安全性。因此,使用 MSDN 文章 http://msdn.microsoft.com/en-us/library/bb737570.aspx,我一直致力于签名和 XML 配置。使用特权密钥(未过期),在 Visual Studio 中对 A36D.dll 进行签名,并且创建的安装 CAB 文件也使用相同的密钥进行签名。创建一个 _setup.xml 文件并将其附加到 cab 文件,以便将签名密钥添加到证书存储区。 CAB 文件使用相同的密钥再次签名,以确保它仍然有效。此外,_setup.xml 被打包到它自己的 .CPF 文件中。 CAB 和 CPF 文件都将密钥添加到证书存储“HKEY_LOCAL_MACHINE\Comm\Security\SystemCertificates”,所以知道这是有效的。为谨慎起见,我已将其安装到 Privileged、Unprivileged、ROOT 和 SPC 证书存储区。但是当移动设备启动时,设备驱动程序仍然没有加载到 device.exe 中。

除了在驱动程序上调用 ActivateDevice() 的启动应用程序的解决方法之外,我对如何在启动时加载此驱动程序感到困惑。

我觉得这很奇怪,它在 CE5 中有效,但在 WM6 中无效,我只是不知道其他任何可能导致问题的东西。

有没有人有任何进一步的建议可以尝试。

感谢所有帮助。

【问题讨论】:

  • 小更新,这仍在进行中。

标签: windows-mobile device-driver code-signing signing virtual-serial-port


【解决方案1】:

我更熟悉 Windows CE,但这里有几件事:

  • 是否在 DllMain 函数中添加了调试打印以查看它是否被调用?
  • 您是否检查了依赖关系中断。会不会是因为某种方式你有一个在 CE 5 下可用的 Dll,而在 WM6 下却没有?

【讨论】:

  • 嗨 Shaihi,我查看了 DllMain 并且没有调试打印,我已经添加了一个,并将在周二早上再次访问 WM6 设备时对其进行测试。我知道事实上在启动时没有写入其他调试打印,所以如果即使加载了 dll,也可能进行即时调试可能会解决这个问题。至于依赖关系中断,我不知道如何在移动操作系统上执行此操作。但是考虑到它可以使用ActiviateDevice手动激活驱动程序,所以肯定已经安装了所有需要的依赖项,不是吗?谢谢你的建议。
  • 我错过了它在 WM 下使用 ActivateDevice 加载的部分。这排除了依赖性。您是否尝试更改注册表中的order?也许驱动程序会在它需要的某些功能准备好之前尝试加载。
  • 嗨 Shaihi,没问题,感谢所有帮助。我确实考虑了顺序,实际上试图让它尽快加载而不是稍后加载,以防 COM 端口正在使用,而不是其他尚未加载的文件的依赖问题,当我下次进入时将其设置为 255 并查看是否有帮助。值得一提的是,有人指出了可能的签名问题。虽然我已经用我们的证书对其进行了签名,但他们建议退回到新的(2010 年 1 月)SDK 证书并使用 cabsigner.exe 而不是 signtool.exe,并查看它是否加载。你能看出这是一个可能的问题吗?谢谢
  • 我没有考虑标牌,因为我不与 WM 合作(那是我的答案中的开头 (: )。您不能尝试将其加载到“打开”的设备上吗? /“解锁”/“是否需要标牌”?
  • 抱歉 ;) 据我所知,对 DLL 签名的要求是内置在操作系统中的,不能禁用。刚刚花了最后 30 分钟查找和禁用证书仅适用于服务器/交换/wifi,不适用于驱动程序。 RapiConfig.exe 是用于 WM6 的工具,我将对其进行调查,但认为它不会有帮助。至于设备,驱动程序适用于该设备的特定部件或硬件,因此很遗憾无法在不同的 WM6 设备上进行测试,但这是一个很好的建议。
【解决方案2】:

这是一个答案,但不是“正确”的答案。这只是解决加载问题的方法。我在一个多星期前就知道了,但不想用它作为解决方案。所以希望这只是一个临时修复。

以下代码用于手动加载驱动程序,它是用 C# 编写的,使用 C++ 调用,我习惯于 C#,这就是为什么我做了一个 C# 项目而不是 C++ 项目。那些使用 C++ 的人无疑会在 C++ 应用程序中创建它。

public class LoadDriver
{
    [DllImport("coredll.dll", SetLastError = true)]
    public extern static IntPtr ActivateDevice(string lpszDevKey, int dwClientInfo);
    [DllImport("coredll.dll", SetLastError = true)]
    public static extern void SignalStarted( uint dw);

    public static void Main(string[] args)
    {
        Cursor.Current = Cursors.Default;
        IntPtr handle = ActivateDevice("Drivers\\BuiltIn\\A36D_GPS_COM", 0);
        if(handle != IntPtr.Zero)
        {
            Console.Write("Success");
        }

        if (args.Length > 0)
        {
            try
            {
                SignalStarted(uint.Parse(args[0]));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

现在为了让它工作,它需要在启动时运行,所以我添加了所需的注册表项。

"HKEY_LOCAL_MACHINE/init"
Launch62 = A36D_loaddriver.exe
Depend62 = "32 00"

“32 00”是为了保证在shell32.exe之后加载

现在设备启动,驱动在device.exe中激活。

关于签名/注册问题,仍在调查中。

【讨论】:

    猜你喜欢
    • 2020-08-01
    • 2019-03-18
    • 1970-01-01
    • 2021-11-20
    • 2017-02-14
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多