我刚开始使用驱动程序开发,并且正在尝试在启动时通过操作系统初始化设备驱动程序。该驱动程序适用于Windows Embedded CE 6.0。
我一直试图让我的设备在初始化时通过串口向我的PC发送消息。
DWORD MYD_Init(LPCTSTR pContext, LPCVOID lpvBusContext)
{
DWORD dwResult = 1;
RETAILMSG(TRUE, (TEXT("MyDriver: Initializing!\n")));
DEBUGMSG(TRUE, (TEXT("MyDriver: Initializing!\n")));
return dwResult;
} //end MYD_Init
调用DLLEntry函数:
BOOL DllEntry(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
{
switch (dwReason) {
case DLL_PROCESS_ATTACH:
RETAILMSG(TRUE, (TEXT("MyDriver - Process Attached\n")));
DEBUGMSG(TRUE, (TEXT("MyDriver - Process Attached\n")));
break;
case DLL_PROCESS_DETACH:
RETAILMSG(TRUE, (TEXT("MyDriver - Process Detached\n")));
DEBUGMSG(TRUE, (TEXT("MyDriver - Process Detached\n")));
break;
.......
default:
break;
} //end Switch
return TRUE;
} //end DllEntry
以下是串口日志中的几行:
FMD_Init: Blocks reserved for the bootloader/run-time image: 3124
I2C Driver: Intialization Started
MyDriver - Process AttachedMyDriver - Process DetachedTurn on clocks for Device block (in OTG_CTRL)
2589 CUSBFN::IsConfigurationSupportable
2593 CUSBFN::IsEndpointSupportable
2595 CUSBFN::IsEndpointSupportable
第三行显示驱动程序已加载(我认为),但之后未调用MYD_Init。我不确定我错过了什么。可能是另一个文件丢失的引用。我的.def文件包含EXPORTS下的MYD_Init。 .reg键位于BuiltIn路径中:[HKEY_LOCAL_MACHINE \ Drivers \ BuiltIn \ MyDriver]。不确定是否还有其他人。
我想我真正的问题是我错过了哪些可能的东西/忘记让MYD_Init函数被调用?
感谢您提供帮助我完成这项工作的任何帮助!
修改
我已经意识到CreateFile函数永远不会被调用,并且觉得这是我的问题的原因。我可以采取哪些步骤来确定应该放置此函数的位置,以便在DllEntry之前不调用MYD_Init?
或者也许ActivateDevice / ActiveDeviceEx功能?操作系统是否自动为[HKEY_LOCAL_MACHINE \ Drivers \ BuiltIn]下列出的驱动程序调用这些驱动程序,还是必须手动调用它们?
再次感谢您提供的任何见解!
编辑2:
以下是易于阅读的注册表设置:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\MyDriver]
"Prefix"="MYD"
"Dll"="myDriver.dll"
"Index"=dword:1
"Flags"=dword:0
编辑3:
这是尝试通过应用程序打开驱动程序后的输出:
USBFN: dwDeviceStatus: 0x11, m_fAttached: Attached
USBFN: dwDeviceStatus: 0x1, m_fAttached: Attached
MyDriver - Process Attached
MyDriver - Process Detached
COM_Open
COM_Open
IOCTL_SERIAL_SET_COMMTIMEOUTS (50,1,50,5,500)
IOCTL_SERIAL_SET_COMMTIMEOUTS (50,1,50,5,500)
IOCTL_SERIAL_SET_COMMTIMEOUTS (-1,0,0,2,500)
Testing Driver
MyDriver - Process Attached
MyDriver - Process Detached
Driver Tested
第3行和第4行是系统启动期间的加载尝试。运行加载驱动程序的应用程序时输出最后四行。 “测试驱动程序”和“驱动程序测试”放在应用程序的开头和结尾。
编辑4:转储输出
Dump of file myDriver.dll
File Type: DLL
Section contains the following exports for myDriver.dll
00000000 characteristics
501012DA time date stamp Wed Jul 25 10:38:02 2012
0.00 version
1 ordinal base
9 number of functions
9 number of names
ordinal hint RVA name
1 0 000013D4 DllEntry = DllEntry
2 1 00001348 MYD_Close = MYD_Close
3 2 0000130C MYD_Deinit = MYD_Deinit
4 3 000013B8 MYD_IOControl = MYD_IOControl
5 4 000012B8 MYD_Init = MYD_Init
6 5 00001328 MYD_Open = MYD_Open
7 6 00001364 MYD_Read = MYD_Read
8 7 0000139C MYD_Seek = MYD_Seek
9 8 00001380 MYD_Write = MYD_Write
Summary
1000 .data
1000 .pdata
1000 .reloc
1000 .text
答案 0 :(得分:1)
Xxx_Init
。它可以通过手动调用ActivateDevice来加载,也可以通过在[HKLM\Drivers\BuiltIn]
中设置正确的注册表设置由DeviceManager自动加载(显示您正在使用的键)。
Xxx_Init
之后调用 DllEntry
,因为在操作系统加载DLL时会调用DllEntry
,这必须在设备管理器加载之前发生。
CreateFile
调用驱动程序中的Xxx_Open
方法,这是在所有这些操作发生之后。
所以事件的顺序是:
DllEntry
Xxx_Init
CreateFile
打开驱动程序,这会使设备管理器调用Xxx_Open
列表中可能有一些电源管理部件可能会达到2.5,但它们是可选的,可能与您看到的问题无关。
在第一次测试驱动程序启动时,我会在测试应用程序中使用对ActivateDevice
/ DeactivateDevice
的显式调用。它允许您替换驱动程序DLL,而无需每次都重新启动系统。
所以问题是: