Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows ce 设备驱动程序未调用Xxx\u Init_Windows Ce_Driver - Fatal编程技术网

Windows ce 设备驱动程序未调用Xxx\u Init

Windows ce 设备驱动程序未调用Xxx\u Init,windows-ce,driver,Windows Ce,Driver,我只是从驱动程序开发开始,并试图在启动时通过操作系统初始化设备驱动程序。该驱动程序适用于Windows Embedded CE 6.0 我一直试图让我的设备在初始化时通过串行端口向电脑发送消息 DWORD MYD_Init(LPCTSTR pContext, LPCVOID lpvBusContext) { DWORD dwResult = 1; RETAILMSG(TRUE, (TEXT("MyDriver: Initializing!\n"))); DEBUGMSG

我只是从驱动程序开发开始,并试图在启动时通过操作系统初始化设备驱动程序。该驱动程序适用于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
调用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。我不确定我错过了什么。可能是另一个文件中缺少的引用。My.def文件包括导出下的MYD_Init。.reg键位于内置路径:[HKEY\U LOCAL\U MACHINE\Drivers\BuiltIn\MyDriver]内。不确定是否还有其他人

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

谢谢你们能帮我完成这项工作

编辑:

我意识到CreateFile函数从未被调用,我觉得这就是我的问题所在。我可以采取哪些步骤来确定这个函数应该放在哪里,以便在DllEntry之前不调用MYD_Init

或者可能是ActivateDevice/ActiveDeviceEx功能?操作系统是否会自动为[HKEY\U LOCAL\U 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:Dumpbin输出

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

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

Xxx_Init
保证在
DllEntry
之后调用,因为操作系统加载DLL时会调用
DllEntry
,这必须在设备管理器加载DLL之前进行

CreateFile
调用驱动程序中的
Xxx\u Open
方法,该方法发生在所有这些操作之后

因此,事件的顺序是:

  • 操作系统加载DLL,调用
    DllEntry
  • 设备管理器加载驱动程序(手动或自动),调用
    Xxx\u Init
  • 应用程序通过调用
    CreateFile
    打开驱动程序,从而使设备管理器调用
    Xxx\u打开
  • 列表中可能有一些电源管理条目的值为2.5,但它们是可选的,可能与您看到的问题无关

    通常,当第一次测试驱动程序时,我会使用测试应用程序显式调用
    激活设备
    /
    停用设备
    。它允许您更换驱动程序DLL,而无需每次重新启动系统

    因此,我要问你的问题是:

  • 如果您从应用程序手动调用ActivateDevice,会发生什么情况
  • 您当前正在使用哪些注册表项来尝试让设备管理器加载驱动程序

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

    Xxx_Init
    保证在
    DllEntry
    之后调用,因为操作系统加载DLL时会调用
    DllEntry
    ,这必须在设备管理器加载DLL之前进行

    CreateFile
    调用驱动程序中的
    Xxx\u Open
    方法,该方法发生在所有这些操作之后

    因此,事件的顺序是:

  • 操作系统加载DLL,调用
    DllEntry
  • 设备管理器加载驱动程序(手动或自动),调用
    Xxx\u Init
  • 应用程序通过调用
    CreateFile
    打开驱动程序,从而使设备管理器调用
    Xxx\u打开
  • 列表中可能有一些电源管理条目的值为2.5,但它们是可选的,可能与您看到的问题无关

    通常,当第一次测试驱动程序时,我会使用测试应用程序显式调用
    激活设备
    /
    停用设备
    。它允许您更换驱动程序DLL,而无需每次重新启动系统

    因此,我要问你的问题是:

  • 如果您从应用程序手动调用ActivateDevice,会发生什么情况
  • 您当前正在使用哪些注册表项来尝试让设备管理器加载驱动程序

  • 首先,感谢您在调用函数时作出响应和澄清。Oops。没有意识到按enter键会提交,但要回答您的问题:1。我没有试过手动打电话,尽管从你所说的来看,这似乎是一种更好的做法。我假设XXX_Init函数将被调用。2.我的注册表设置如下:[HKEY\U LOCAL\U MACHINE\Drivers\BuiltIn\MyDriver]“Prefix”=“MYD”“Dll”=“MyDriver.Dll”“Index”=dword:1“Flags”=dword:0好的,所以我测试了应用程序调用ActivateDevice()时会发生什么,结果与设备管理器尝试在启动时加载驱动程序时的结果相同。将在原始post中发布屏幕输出。再次感谢您提供的任何帮助!ActivateDevice调用返回什么值?我想它失败了。什么是GetLastError电话