代码之家  ›  专栏  ›  技术社区  ›  Fleck

设备驱动程序未调用Xxx_Init

  •  1
  • Fleck  · 技术社区  · 12 年前

    我刚开始开发驱动程序,并试图在启动时通过操作系统初始化设备驱动程序。该驱动程序适用于Windows Embedded CE 6.0。

    我一直试图让我的设备在初始化时通过串行端口向我的电脑发送消息。

    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
    

    DLLEEntry函数被调用:

    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
    
    1 回复  |  直到 12 年前
        1
  •  1
  •   ctacke    12 年前

    Xxx_Init 将在加载驱动程序时调用。它可以通过手动调用ActivateDevice来加载,也可以通过在中设置正确的注册表设置由DeviceManager自动加载 [HKLM\Drivers\BuiltIn] (向我们展示您使用的钥匙)。

    Xxx_信息 保证在之后被调用 DllEntry 因为 Dll条目 当操作系统加载DLL时调用,这必须在设备管理器加载它之前发生。

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

    所以事件的顺序是:

    1. 操作系统加载DLL,调用 Dll条目
    2. 设备管理器加载驱动程序(手动或自动),调用 Xxx_信息
    3. 应用程序通过调用打开驱动程序 创建文件 ,使设备管理器调用 Xxx_打开

    列表中可能有一些电源管理部件的级别为2.5,但它们是可选的,可能与您看到的问题无关。

    通常我会使用一个明确的调用 ActivateDevice / DeactivateDevice 当第一次测试驱动程序时,从测试应用程序中调出。它允许您更换驱动程序DLL,而不必每次都重新启动系统。

    因此,您面临的问题是:

    1. 如果您从应用程序手动调用ActivateDevice,会发生什么?
    2. 您当前用来让设备管理器加载驱动程序的注册表项是什么?