在启动时加载设备驱动程序的问题 - WM6.1

时间:2010-08-27 14:46:10

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

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

我输入简称WM6,但如果它有任何不同,操作系统是WM6.1。

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

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

DeviceArrayIndex:0

DeviceType:0

Dll:A36D.dll

标志:0

友好名称:A36D GPS COM端口

指数:8

订单:3

前缀:COM

优先级:0

优先级:256

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

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配置。使用特权密钥(未过期),A36D.dll在visual studio中签名,创建的安装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中没有用,我只是不知道其他任何可能导致问题的原因。

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

所有帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

我对Windows CE更熟悉,但有以下几点:

  • 您是否在DllMain函数中添加了调试打印以查看它是否被调用?
  • 您是否检查过依赖性中断?可能是因为你在CE 5下有一个Dll在WM6下不存在吗?

答案 1 :(得分:0)

这是一个答案,但不是“正确”的答案。它只是一个围绕加载问题的工作。我在一周前就想到了这一点,但不想用它作为解决方案。所以希望这只是一个临时修复。

以下代码用于手动加载驱动程序,使用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中激活。

关于签名/注册问题,这仍在研究中。