首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不调用Xxx_Init的设备驱动程序

不调用Xxx_Init的设备驱动程序
EN

Stack Overflow用户
提问于 2012-07-23 23:14:27
回答 1查看 1.7K关注 0票数 1

我刚开始开发驱动程序,并试图通过启动操作系统初始化设备驱动程序。驱动程序用于Windows嵌入式CE 6.0。

我一直试图让我的设备通过串口发送一条消息到我的电脑,无论何时它被初始化。

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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

下面是串口日志中的几行代码:

代码语言:javascript
复制
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文件包括导出下的MYD_Init。.reg键位于BuiltIn路径: HKEY_LOCAL_MACHINE\Drivers\BuiltIn\MyDriver中。不确定是否还有其他人。

我想我真正的问题是,我遗漏/忘记了哪些可能的东西来调用MYD_Init函数?

感谢你们能提供的任何帮助来帮助我完成这份工作!

编辑:

我已经意识到CreateFile函数从来没有被调用过,并且觉得这就是我出现问题的原因。我可以采取哪些步骤来确定这个函数应该放在哪里,以便在MYD_Init之前不调用DllEntry?

或者是ActivateDevice/ActiveDeviceEx函数?操作系统是为HKEY_LOCAL_MACHINE\Drivers\BuiltIn下列出的驱动程序自动调用这些驱动程序,还是必须手动调用?

再次感谢您提供的任何见解!

编辑2:

以下是易于阅读的注册表设置:

代码语言:javascript
复制
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\MyDriver]
    "Prefix"="MYD"
    "Dll"="myDriver.dll"
    "Index"=dword:1
    "Flags"=dword:0

编辑3:

这是试图通过应用程序打开驱动程序后的输出:

代码语言:javascript
复制
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: Dumpbin输出

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-24 17:48:31

加载驱动程序时将调用Xxx_Init。它可能通过手动调用ActivateDevice来加载,或者通过DeviceManager通过在[HKLM\Drivers\BuiltIn]中设置正确的注册表设置自动加载它(显示您正在使用的键)。

Xxx_Init保证在DllEntry之后被调用,因为DllEntry是在操作系统加载DLL时调用的,这必须发生在设备管理器能够加载它之前。

CreateFile在驱动程序中调用Xxx_Open方法,这是在所有这些操作发生之后。

因此,事件的顺序是:

  1. 操作系统加载DLL,调用DllEntry
  2. 设备管理器加载驱动程序(手动或自动),调用Xxx_Init
  3. App通过调用CreateFile打开驱动程序,这使得设备管理器调用Xxx_Open

可能有一些权力管理部分,可以下降到2.5,但他们是可选的,很可能与你看到的问题无关。

在第一次测试驱动程序时,我将使用测试应用程序对ActivateDevice/DeactivateDevice的显式调用。它允许您替换驱动程序DLL,而不必每次重新启动系统。

所以你要问的问题是:

  1. 如果您从应用程序手动调用ActivateDevice,会发生什么?
  2. 您目前用来尝试让设备管理器加载驱动程序的注册表项是什么?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11621894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档