我们的嵌入式系统程序员已经为我们的移动硬件开发了一个虚拟串口驱动程序的外壳,我一直在填写让它工作的方法。该驱动程序确实如预期的那样工作,它模拟了USB设备的COM端口,该USB设备正在输出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上启动。我甚至尝试过调整其他设置,但仍然不能加载at boot。
2) CE5和WM6之间可能存在的另一个问题和区别是安全性。因此,使用MSDN文章http://msdn.microsoft.com/en-us/library/bb737570.aspx,我一直致力于签名和XML provisioning。使用特权密钥(未过期),在visual studio中对A36D.dll进行签名,并使用相同的密钥对创建的安装CAB文件进行签名。将创建一个_setup.xml文件并将其附加到cab文件,以便将签名密钥添加到证书存储中。CAB文件使用相同的密钥再次签名,以确保它仍然有效。此外,_setup.xml被打包到自己的.CPF文件中。CAB和CPF文件都会将密钥添加到证书存储"HKEY_LOCAL_MACHINE\Comm\Security\SystemCertificates“中,因此要知道这是有效的。为谨慎起见,我已将其安装到特权、非特权、根和SPC证书存储区。但是当移动设备启动时,设备驱动程序仍然不会加载到device.exe中。
除了在驱动程序上调用ActivateDevice()的启动应用程序的变通方法之外,我对如何在启动时加载此驱动程序感到困惑。
我发现这很奇怪,它可以在CE5中工作,但不能在WM6中工作,我就是不知道还有什么可能会导致问题。
有没有人有进一步的建议可以试试。
感谢大家的帮助。
发布于 2010-08-29 12:41:13
我对Windows CE比较熟悉,但这里有几件事:
发布于 2010-09-01 23:32:15
这是一个答案,但不是“正确”的答案。这只是一个绕过加载问题的工作。我在一周前就知道了这一点,但我不想把它作为解决方案。因此,希望这只是一个临时修复。
下面的代码是用来手动加载驱动程序的,它是用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中被激活。
至于签名/注册的问题,这仍在调查中。
https://stackoverflow.com/questions/3585333
复制相似问题