我尝试将流设备驱动程序从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()函数(鼠标/键盘/操纵杆)? [顺便说一句:我是否应该就此提出一个新问题?]答案 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指令)并启用将要发送的调试消息发送到您的调试串口。