AngusLiu
驱动牛犊
驱动牛犊
  • 注册日期2002-10-08
  • 最后登录2009-10-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望18点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1637回复:7

请教驱动加载的問題?

楼主#
更多 发布于:2008-06-14 23:47
自己写了一个简单的流式接口驱动,在platform.bib及platform.reg配置如下
platform.bib:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\sample]
    "Dll"="sample.dll"
    "Prefix"="DEMO"
    "Index"=dword:1
    "Order"=dword:40


platform.reg
MODULES
。。。。
    sample.dll                $(_FLATRELEASEDIR)\sample.dll            NK    SH

。。。

生成nk.bin下载映像到开發板后,启动wince,根据调试信息,驱动DLL_PROCESS_ATTACH后,马上DLL_PROCESS_DETACH了,请问这时哪里有問題?

简单的源码如下
#include <windows.h>


BOOL APIENTRY DllMain(HANDLE hinstDLL, DWORD fdwReason, LPVOID lpv)
{
    switch ( fdwReason )
    {
        case DLL_PROCESS_ATTACH:
            RETAILMSG(1, (TEXT("Sample: Enter DllMain PROCESS ATTACH!\r\n")));
            break;
        case DLL_PROCESS_DETACH:
            RETAILMSG(1, (TEXT("Sample: Enter DllMain PROCESS DETACH!\r\n")));
            break;
        case DLL_THREAD_ATTACH:
            RETAILMSG(1, (TEXT("Sample: Enter DllMain THREAD ATTACH!\r\n")));
            break;
        case DLL_THREAD_DETACH:
            RETAILMSG(1, (TEXT("Sample: Enter DllMain THREAD DETACH!\r\n")));
            break;
            
    }
    
    return TRUE;
}


DWORD DEMO_Init( DWORD /*registryPath*/ )
{
    RETAILMSG(1, (TEXT("Sample: Enter Init!\r\n")));
    return TRUE;
}


BOOL DEMO_Deinit( DWORD /*dwData*/ )
{    
    RETAILMSG(1, (TEXT("Sample: Enter Deinit!\r\n")));
    return TRUE;
}


DWORD DEMO_Open(     DWORD dwClientContext,
              DWORD /*access*/,
              DWORD /*shareMode*/ )  
{
    RETAILMSG(1, (TEXT("Sample: Enter Open!\r\n")));
    return TRUE;
}



BOOL DEMO_Close( DWORD /*dwData*/ )
{
    RETAILMSG(1, (TEXT("Sample: Enter Close!\r\n")));
    return TRUE;
}



DWORD DEMO_Write( DWORD    /*dwData*/,    
           LPCVOID    /*writeBytes*/,    
           DWORD    /*numBytes*/ )
{
    RETAILMSG(1, (TEXT("Sample: Enter Write!\r\n")));
    return 0;
}


DWORD DEMO_Read( DWORD        /*dwData*/,
          LPVOID    /*buffer*/,
          DWORD        /*numRead*/ )
{
    RETAILMSG(1, (TEXT("Sample: Enter Read!\r\n")));
    return 0;
}


BOOL DEMO_IOControl(
    DWORD hOpenContext,
    DWORD dwCode,
    PBYTE pBufIn,
    DWORD dwLenIn,
    PBYTE pBufOut,
    DWORD dwLenOut,
    PDWORD pdwActualOut )
{
    
    return TRUE;
}


void DEMO_PowerUp( DWORD /*hContext*/ )
{    
    // do nothing
}


void DEMO_PowerDown( DWORD /*hContext*/ )
{    
    // do nothing
}


DWORD DEMO_Seek( DWORD /*hOpenContext*/,
          long /*amount*/,
          WORD /*type*/ )
{
    // Do nothing, return fail
    return -1;
}


AngusLiu
驱动牛犊
驱动牛犊
  • 注册日期2002-10-08
  • 最后登录2009-10-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望18点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-06-15 12:30
問題已经解决,是选择了full kernel mode造成的,
加载虽然成功了,但我發現系统老是调用驱动的
DllMain()(老是DLL_PROCESS_ATTACH,然后
DLL_PROCESS_DETACH),这是怎么回事,是
因为电源管理造成的吗?
wenzai
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2011-03-04
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望424点
  • 贡献值0点
  • 好评度309点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-06-15 20:43
"Prefix"="DEMO"
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-06-15 20:53
引用第2楼wenzai于2008-06-15 20:43发表的  :
"Prefix"="DEMO"



对,多了一个, Prefix 最多三个。你多写了一个。
做一个出色的程序员!
AngusLiu
驱动牛犊
驱动牛犊
  • 注册日期2002-10-08
  • 最后登录2009-10-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望18点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-06-16 12:26
谢谢两位,
"Prefix"="DEMO"
确实是错误

另外想请教:
如果我要这个DEMO驱动运行在内核模式,该如何设置?
zq2002
论坛版主
论坛版主
  • 注册日期2003-12-30
  • 最后登录2018-09-26
  • 粉丝0
  • 关注0
  • 积分45分
  • 威望185点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-06-16 13:28
6.0以前的版本,驱动都是运行在用户态的
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-06-16 21:44
引用第1楼AngusLiu于2008-06-15 12:30发表的  :
問題已经解决,是选择了full kernel mode造成的,
加载虽然成功了,但我發現系统老是调用驱动的
DllMain()(老是DLL_PROCESS_ATTACH,然后
DLL_PROCESS_DETACH),这是怎么回事,是
因为电源管理造成的吗?


驱动加载成功不成功和选择full kernel mode没关系。
这个是会在realse模式下把release message打印出来。
好好看看书吧!
做一个出色的程序员!
AngusLiu
驱动牛犊
驱动牛犊
  • 注册日期2002-10-08
  • 最后登录2009-10-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望18点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-06-18 22:05
选择full kernel mode, 是会在realse模式下把release message打印出来???

我看书上怎么说是选择了full kernel mode的话,所有的线程工作在内核模式下!
游客

返回顶部