我在移植SC2440驱动cdev.dll,它在注册表里的项如下。但是它的入口函数DllEntry在process attach之后立刻就process detach了,初始化函数DEV_Init没有执行,DEV_Init函数在开头用RETAILMSG打印一串信息,在串口上没看到输出。
在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下确实已经看到了这个cdev.dll,
但在在[HKEY_LOCAL_MACHINE\Drivers\Active]下没看到这个DLL。
设备管理器是不是在启动时加载[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下的所有DLL吗?
网上看到有人也遇到过类似的问题,但没有说是怎样解决的
。
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\cdev]
"Prefix"="DEV"
"Dll"="cdev.dll"
"Index"=dword:1
"Order"=dword:1
可能是驱动提供的接口函数不规范或者不全吧,设备管理器不认为你的驱动是一个标准流驱动.
不过我做驱动很少加DllEntry入口.
def文件已经导出:
cdev.def文件:
LIBRARY CDEV
EXPORTS
DEV_Close
DEV_Deinit
DEV_Init
DEV_IOControl
DEV_Open
DEV_PowerDown
DEV_PowerUp
DEV_Read
DEV_Seek
DEV_Write
流接口函数是:
BOOL DEV_Close(DWORD hOpenContext);
BOOL DEV_Deinit(DWORD hDeviceContext);
DWORD DEV_Init(DWORD dwContext);
DWORD DEV_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode);
void DEV_PowerUp(DWORD hDeviceContext);
void DEV_PowerDown(DWORD hDeviceContext);
DWORD DEV_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);
DWORD DEV_Seek(DWORD hOpenContext, long Amount, DWORD Type);
DWORD DEV_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes);
BOOL DEV_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualO);
流接口函数的内部实现已经被我改为非常简单的打印信息,返回值,可是还是不能调用DEV_Init函数,启动后cdev.dll显示没有Active;
DEV_Init
这个函数不要返回 0,返回 0 就不会加载驱动,你看看。
我已经吧我的init函数改掉了,不进行任何操作,return 1,可是串口看不到打印信息,应该是没有调用这个函数就进入到 dllentry函数detach了
DWORD DEV_Init(DWORD dwContext)
{
RETAILMSG(1,(TEXT("CDEV: TESTDEV_Init----\r\n")));
RETAILMSG(1,(TEXT("CDEV: TESTDEV_Init----\r\n")));
RETAILMSG(1,(TEXT("CDEV: TESTDEV_Init----\r\n")));
RETAILMSG(1,(TEXT("CDEV: TESTDEV_Init----\r\n")));
return 1;
}
init函数参数不对 应该有两个参数 LPCTSTR pContext,LPCVOID lpvBusContext
用 Depends 查看流函数到底导出了没有?
如果不会看,那么把 dll 文件发给我
zaodt.ms@gmail.com
看到了,可能问题已经找到了,如下:
我用 Depend 看了你的 dll 文件,内容如下:
======================
TEST_Close
TEST_Deinit
TEST_IOControl
TEST_Init
TEST_Open
TEST_PowerDown
TEST_PowerUp
TEST_Read
TEST_Seek
TEST_Write
======================
而你在注册表的前缀为:
"Prefix"="DEV"
可能就是这个问题引起的!
现在的def文件我已经改了,昨天晚上重写的驱动
LIBRARY CDEV
EXPORTS
TEST_Close
TEST_Deinit
TEST_Init
TEST_IOControl
TEST_Open
TEST_PowerDown
TEST_PowerUp
TEST_Read
TEST_Seek
TEST_Write
前缀使用 3 个大写字母,你改为 TES_Init 试试看;
记着注册表前缀也要改成一样的。
我也遇到这个问题了,微软还真搞笑,前缀非要3个字符,要不是看了这个帖子不知道又要被折磨多久呢,
谢谢啊!