手动加载驱动失败

codeos 2011-04-26 08:02:57
1. 我已经将编译好的要加载的驱动test.dll放入"\windows"目录下
2. 开机后同过自己写的一个加载程序来实现驱动的手动加载,加载驱动的测试程序步骤是这样的:
(1)RegCreateKeyEx(HKEY_LOCAL_MACHINE,TEXT("Drivers\\BuiltIn\\MyDriver"),...)
(2)通过RegSetValueEx()添加“DLL”为“test.dll”,“Prefix”为“COM”,“Index”为“1”
(3)ActivateDeviceEx(TEXT("HKEY_LOCAL_MACHINE\\Drivers\\bUILTiN\\MyDriver"),NULL,0,NULL) 跟踪到这个地方发现就返回零fail了。
不知是何原因,请教大家。我用网上比较流行的驱动助手来加载这个驱动也是失败,但是,我在platform.reg文件里面添加上Drivers\\BuiltIn\\MyDriver的相关项后开机,这个驱动就加载成功了,为什么呢?
...全文
401 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
littleblack1987 2011-04-28
  • 打赏
  • 举报
回复
弱弱的问下楼主,在看norains的博客? 貌似这段的问题:
status = RegSetValueEx(hKey,_T("DLL"),0,REG_SZ,(LPBYTE)_T("\\Windows\\Driver.dll"),100);
status = RegSetValueEx(hKey,_T("Prefix"),0,REG_SZ,(LPBYTE)_T("FKE"),100);

你可以查下!RegSetValueEx函数中cbData的大小不能设置过大...
littleblack1987 2011-04-28
  • 打赏
  • 举报
回复
建议:hd=ActivateDeviceEx(TEXT("Drivers\\BuiltIn\\FakeDriver"),NULL,0,&dwParam); 后最好用GetLastError()查下失败的原因
codeos 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 littleblack1987 的回复:]
建议:hd=ActivateDeviceEx(TEXT("Drivers\\BuiltIn\\FakeDriver"),NULL,0,&dwParam); 后最好用GetLastError()查下失败的原因
[/Quote]

非常感谢你的建议,我又长见识了o(∩_∩)o
codeos 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 littleblack1987 的回复:]
弱弱的问下楼主,在看norains的博客? 貌似这段的问题:
status = RegSetValueEx(hKey,_T("DLL"),0,REG_SZ,(LPBYTE)_T("\\Windows\\Driver.dll"),100);
status = RegSetValueEx(hKey,_T("Prefix"),0,REG_SZ,(LPBYTE)_T("FKE"),100);

你……
[/Quote]

我也忘记是从那个博客上看的了,呵呵,刚试过了,跟你分析的一样,
status = RegSetValueEx(hKey,_T("DLL"),0,REG_SZ,(LPBYTE)_T("Driver.dll"),sizeof(_T("Driver.dll")));
status = RegSetValueEx(hKey,_T("Prefix"),0,REG_SZ,(LPBYTE)_T("FKE"),sizeof(_T("FKE")));

这样改就OK了,谢谢~
ccuair 2011-04-27
  • 打赏
  • 举报
回复
COM1:應該很容易被其他driver使用吧~是不是已經有人用了
lumouren 2011-04-27
  • 打赏
  • 举报
回复
用驱动助手来加载这个驱动时,返回的错误编号是多少?
codeos 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wswwxk 的回复:]
引用楼主 codeos 的回复:
1. 我已经将编译好的要加载的驱动test.dll放入"\windows"目录下
2. 开机后同过自己写的一个加载程序来实现驱动的手动加载,加载驱动的测试程序步骤是这样的:
(1)RegCreateKeyEx(HKEY_LOCAL_MACHINE,TEXT("Drivers\\BuiltIn\\MyDriver"),...)
(2)通过RegSetValu……
[/Quote]

我把相同的注册表配置写到platform.reg中,重启系统,驱动被自动加载成功,用驱动调试助手卸载这个驱动,然后再用驱动调试助手加载就没法加载了。
当我遇上-你 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 codeos 的回复:]
1. 我已经将编译好的要加载的驱动test.dll放入"\windows"目录下
2. 开机后同过自己写的一个加载程序来实现驱动的手动加载,加载驱动的测试程序步骤是这样的:
(1)RegCreateKeyEx(HKEY_LOCAL_MACHINE,TEXT("Drivers\\BuiltIn\\MyDriver"),...)
(2)通过RegSetValueEx()添加“DLL”为“……
[/Quote]
我在platform.reg文件里面添加上Drivers\\BuiltIn\\MyDriver的相关项后开机 这个驱动就加载成功了,为什么呢?
一般是在注册表中没找到你的驱动
codeos 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhang20072844 的回复:]
通过串口调试一下吧
[/Quote]
这其实不是一个串口驱动,虚拟了一个串口,底层用的是I2C来与芯片通信
codeos 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wswwxk 的回复:]
注册表文件完整不?
[/Quote]
已经通过AP添加注册表完整,还是无法加载驱动
codeos 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lumouren 的回复:]
“把相同的注册表配置写到platform.reg中,重启系统,驱动被自动加载成功”
你是说重新定制系统,把驱动添加到系统中吧。这样能加载成功,但是手动加载就是失败。对吧?另外,你用的什么虚拟串口的芯片?
[/Quote]

是的,驱动添加到系统加载成功,手动加载失败了。是一款TMC芯片,通过I2C驱动的。
刚找到原因,是手动加载程序出了问题,具体原因还在找。

非常感谢大家的帮助,等我找到具体原因贴一下就结贴,或大家还有见解也可以继续贴一下。
lumouren 2011-04-27
  • 打赏
  • 举报
回复
“把相同的注册表配置写到platform.reg中,重启系统,驱动被自动加载成功”
你是说重新定制系统,把驱动添加到系统中吧。这样能加载成功,但是手动加载就是失败。对吧?另外,你用的什么虚拟串口的芯片?
codeos 2011-04-27
  • 打赏
  • 举报
回复
说实话驱动的加载过程我不是很清楚,我索性自己写了个最简单的流驱动,并把build好的Driver.dll放到windows目录下。

驱动的代码:
-----------------------------------------------------------------------------------
#include <windows.h>

BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
switch ( dwReason )
{
case DLL_PROCESS_ATTACH:
break;
}
return TRUE;
}



DWORD FKE_Init(
LPCTSTR pContext,
LPCVOID lpvBusContext
)
{
NKDbgPrintfW(TEXT("[FKE] FKE_Init !\n"));
return TRUE;
}


BOOL FKE_Deinit(
DWORD dwContext
)
{
NKDbgPrintfW(TEXT("[FKE] FKE_Deinit !\n"));
return TRUE;
}

DWORD FKE_Open(
DWORD dwData,
DWORD dwAccess,
DWORD dwShareMode
)
{
return TRUE;
}

BOOL FKE_Close(DWORD dwHandle)
{
return TRUE;
}


BOOL FKE_IOControl(
DWORD dwHandle,
DWORD dwIoControlCode,
PBYTE pBufIn,
DWORD dwBufInSize,
PBYTE pBufOut,
DWORD dwBufOutSize,
PDWORD pBytesReturned
)
{
return FALSE;
}

DWORD FKE_Read(DWORD dwHandle, LPVOID pBuffer, DWORD dwNumBytes)
{
return 1;
}

DWORD FKE_Write(DWORD dwHandle, LPCVOID pBuffer, DWORD dwNumBytes)
{
return 0;
}


DWORD FKE_Seek(DWORD dwHandle, long lDistance, DWORD dwMoveMethod)
{
return FALSE;
}

void FKE_PowerUp(void)
{
return;
}

void FKE_PowerDown(void)
{
return;
}
-------------------------------------------------------------------------------------


测试程序代码:
------------------------------------------------------------------------------------
HKEY hKey;
DWORD dwDisp;
BOOL status;
DWORD tmp;
DWORD dwParam=89;
HANDLE hd=NULL;
DWORD hr = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
TEXT("Drivers\\BuiltIn\\FakeDriver"),
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisp);
status = RegSetValueEx(hKey,_T("DLL"),0,REG_SZ,(LPBYTE)_T("\\Windows\\Driver.dll"),100);
status = RegSetValueEx(hKey,_T("Prefix"),0,REG_SZ,(LPBYTE)_T("FKE"),100);
tmp=1;
status = RegSetValueEx(hKey,_T("Index"),0,REG_DWORD,(unsigned char *)&tmp,4);
tmp=0;
status = RegSetValueEx(hKey,_T("Order"),0,REG_DWORD,(unsigned char *)&tmp,4);

hd=ActivateDeviceEx(TEXT("Drivers\\BuiltIn\\FakeDriver"),NULL,0,&dwParam);
if(hd==NULL)
MessageBox(L"Fail!!");
else
MessageBox(L"Success!!");
-------------------------------------------------------------------------------------


在测试程序执行到ActivateDeviceEx的时候驱动应该会执行FKE_Init()并打印[FKE] FKE_Init !
但结果是测试程序执行了MessageBox(L"Fail!!"),并且没有打印[FKE] FKE_Init !
这样的话驱动根本没加载起来,用驱动调试助手来加载,返回错误ID为1,查了下资料好像是驱动程序有问题,
但是把相应的注册表里的DLL,Order等值写入platform.reg在重启系统,驱动则可以正常加载。


是什么原因呢,望大家指点迷津.
codeos 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ccuair 的回复:]
COM1:應該很容易被其他driver使用吧~是不是已經有人用了
[/Quote]

COM1可以确定没别的地方在用
codeos 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lumouren 的回复:]
用驱动助手来加载这个驱动时,返回的错误编号是多少?
[/Quote]

1. 系统启动时不加载,通过驱动助手加载,返回错误编号为1
2. 系统启动是加载,通过驱动助手卸载然后再加载失败,返回错误编号为110
AndyZhang 2011-04-26
  • 打赏
  • 举报
回复
通过串口调试一下吧
当我遇上-你 2011-04-26
  • 打赏
  • 举报
回复
注册表文件完整不?

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧