0

我尝试将流设备驱动程序从 WinCE 5 迁移到 WinCE 6,在使用 CreateFile() 打开接口时遇到问题。但从一开始:

我将以下注册表信息添加到 Platform.reg:

[HKEY_LOCAL_MACHINE\Drivers\MyDriver\DRV]
"Index"=dword:1
"DLL"="MyDriver.DLL"
"Prefix"="DRV"

在 Platform.bib 我包括我的驱动程序如下:

MyDriver.dll      $(_FLATRELEASEDIR)\MyDriver.dll                   NK  SHK

驱动程序已添加到我的操作系统设计的 dirs 文件中,我可以在我的 Visual Studio 解决方案中成功构建驱动程序。

在我的应用程序中,我通过 ActivateDeviceEx 手动加载驱动程序:

#define DRIVERSHELL_REG_KEY (TEXT("Drivers\\MyDriver\\DRV"))    

hDriverShell = ActivateDeviceEx( DRIVERSHELL_REG_KEY,
                            NULL,
                            0,
                            NULL
                            );

这里的结果既不是0也不是INVALID_HANDLE_VALUE,所以我认为驱动加载成功。

当我尝试使用 CreateFile() 打开驱动程序时:

hDS = CreateFile(TEXT("DRV1:")
        ,   GENERIC_READ|GENERIC_WRITE
        ,   FILE_SHARE_READ | FILE_SHARE_WRITE
        ,   NULL
        ,   OPEN_EXISTING
        ,   FILE_ATTRIBUTE_NORMAL
        ,   0);

GetLastError 返回 1359。错误说明如下:

1359 ERROR_INTERNAL_ERROR(描述:安全帐户数据库包含内部不一致)

如前所述,驱动程序是从工作的 WinCE 5 映像迁移而来的。所有流接口函数都在驱动程序的源代码中声明(xxx_init()、xxx_open()...)。有谁知道可能导致此错误的原因或我需要仔细查看哪些细节?

编辑:谢谢你的回答!我现在成功调试了图像和实现的驱动程序。“ActivateDeviceEx()”调用“XXX_Init()”,“CreateFile()”调用“XXX_Open()”。我确实在每个驱动程序函数中设置了一个断点并到达它。到目前为止,一切都很好。我现在找到了问题,即当我插入设备(操纵杆,驱动程序是 HID 操纵杆驱动程序)时未调用函数“HIDDeviceAttach()”。然后一些句柄为 0 并且 XXX_Open() 将内部错误设置为 LastError。操作系统如何知道 USB 总线上插入了哪个设备以及必须调用哪个 HIDDeviceAttach() 函数(鼠标/键盘/操纵杆)?[顺便说一句:我应该就此提出一个新问题吗?]

4

2 回答 2

0

您可以尝试使用调试操作系统并在您的 XXX_Init 和 XXX_Open 入口点设置断点来检查驱动程序代码中出了什么问题吗?如果您无法使用 KITL 进行连接,您仍然可以构建驱动程序的调试版本(如果您想保留操作系统的其余部分,则可以在源文件中使用 COMPILE_DEBUG 指令)并启用调试消息发送到您的调试串行端口。

于 2013-11-12T22:17:11.447 回答
0

Martin,您在 [HKEY_LOCAL_MACHINE\Drivers\MyDriver\DRV] 和您提供的代码中添加了您的驱动程序详细信息

#define DRIVERSHELL_REG_KEY (TEXT("Drivers\\Drivers\\MyDriver\\DRV"))

可能是两个“驱动程序”是拼写错误,因为您提到的ActivateDeviceEx没有返回任何错误。如果您想确保这一点,您可以在您的 中打印第一个参数,即 ' LPCTSTR pContext' DRV_Init(),它提供了驱动程序在活动键中的注册表位置(如 Drivers\Active\66)

通常CreateFile()需要 7 个参数,但你只提到了 6 个。错误还是故意做的?

于 2013-11-12T12:02:35.687 回答