WinCE 6流设备驱动程序:CreateFile()导致GetLastError = 1359

时间:2013-11-12 08:46:09

标签: driver windows-ce

我尝试将流设备驱动程序从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

驱动程序已添加到我的OS设计的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 Image迁移的。所有流接口函数都在驱动程序的源代码中声明(xxx_init(),xxx_open()...)。有没有人知道可能导致此错误的原因或我需要仔细查看哪些细节?

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

2 个答案:

答案 0 :(得分:0)

马丁,          您在此处添加了驱动程序详细信息[HKEY_LOCAL_MACHINE \ Drivers \ MyDriver \ DRV]并在您提供的代码中

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

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

通常CreateFile()需要7个参数,但你只提到了6.错误或有目的地完成了吗?

答案 1 :(得分:0)

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