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

我简称WM6键入,但是如果有任何区别,则OS为WM6.1。

我面临的问题是,驱动程序不会在WM6上的设备启动时加载。该驱动程序是为CE5和WM6开发的,但是在CE5上,驱动程序在启动时“确实”加载,这将我指向WM6配置问题。可能值得注意的是,驾驶员将使用ActivatedEvice()方法在WM6和CE5中加载,这是我到目前为止一直在使用WM6的驱动程序,这是一个用于启动驱动程序的小型测试应用程序,以便我至少可以测试驱动程序正在研究WM6。

注册表已经在驾驶员启动的必需键中填充了该注册表。因此,驾驶员应在启动时加载,而没有任何问题。 HKEY_LOCAL_MACHINE dRIVERS hindin包含一个子密钥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上启动。我什至尝试调整其他设置,但仍然没有加载AT引导。

2)CE5和WM6之间的另一个可能的问题和差异是安全性。因此,使用MSDN文章 http://msdn.microsoft.com/en-us/library/bb737570.aspx 我一直在签署和XML供应。使用特权密钥(未过期),A36D.DLL在Visual Studio中签名,并且创建的安装驾驶室文件也使用相同的密钥签名。创建一个_setup.xml文件并将其附加到CAB文件中,以便将签名键添加到证书存储中。再次使用相同的键签名CAB文件,以确保其仍然有效。另外,_setup.xml将其包装到其自己的.cpf文件中。 CAB和CPF文件的确将密钥添加到证书存储的“ HKEY_LOCAL_MACHINE COMM COMM SECURE SECURESCERTIFIFATES”中,因此知道这是在工作。谨慎,我将其安装到了特权,无私人,根和SPC证书存储中。但是,当移动设备启动时,设备驱动程序仍未加载到device.exe中。

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

我发现它非常奇怪,它在CE5中起作用,但在WM6中不起作用,我只是不知道其他可能引起问题的东西。

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

所有人都表示赞赏。

有帮助吗?

解决方案

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

  • 您是否在dllmain函数中添加了调试打印,以查看是否被调用?
  • 您是否检查过是否有依赖性休息时间。难道您是否有某种方式在CE 5下可用的DLL在WM6下不存在?

其他提示

这是一个答案,但不是“正确”的答案。这只是围绕加载问题的工作。我一周前就发现了这一点,但不想将其用作解决方案。因此,希望这只是一个临时修复。

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

至于签名/注册表问题,仍在研究这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top