5195|10

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助关于CE下电源管理 [复制链接]

在CE下电源管理 MDD层代码中:
  电池驱动对外接口函数没有“BAT_”前缀,因为HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Battery\Flags注册表项设置了DEVFLAGS_NAKEDENTRIES属性,表示“Init”代替“BAT_Init”,这样修改注册表“Prefix”项的值时不需要修改驱动代码。

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Battery]
        "Prefix"="BAT"
        "Dll"="battdrvr.dll"
        "Flags"=dword:8                      ; DEVFLAGS_NAKEDENTRIES
        "Order"=dword:0
        "IClass"="{DD176277-CD34-4980-91EE-67DBEF3D8913}"



请问:
1、是不是所有CE的驱动都不用XXX_Init,XXX_Deinit.....的XXX前缀,只需要在注册表中
      设置:"Flags"=dword:8                      ; DEVFLAGS_NAKEDENTRIES
   就可以了???
2、这个电池驱动程序既然没有前缀“BAT_”,那么"Prefix"="BAT"这个代表什么??
   “这样修改注册表“Prefix”项的值时不需要修改驱动代码。”这句话怎么理解???
感谢大家!!

最新回复

...是的。  详情 回复 发表于 2008-10-9 11:56
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
既然后面的名字都一样的,那只要前面BAT就够了。太长了浪费资源。
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的问题,把我看糊涂了。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 yashi 的回复:
你的问题,把我看糊涂了。


---------------是啊,楼主的表述很让人费神
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用楼主 wangxin_801115 的帖子:
在CE下电源管理 MDD层代码中:
  电池驱动对外接口函数没有“BAT_”前缀,因为HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Battery\Flags注册表项设置了DEVFLAGS_NAKEDENTRIES属性,表示“Init”代替“BAT_Init”,这样修改注册表“Prefix”项的值时不需要修改驱动代码。

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Battery]
"Prefix"="BAT"
"Dll"="battdrvr.dll"
"Flags"=dword:8                      ; DEVFLAGS_NAKEDENTRIES…

所有的流式驱动都是XXX_Init...其中XXX必须在注册表中定义,这样device.exe才会根据注册表的prefix值去load制定dll并call其中的Prefix+Init函数。
但是,当用DEVFLAGS_NAKEDENTRIES时,说明将使用未修饰的入口点名称,即自己定义的接口函数。这样的话,device.exe就不会按照之前的Prefix+Init的方式了,就是Init。

还是代码说明问题:
D:\WINCE500\PRIVATE\WINCEOS\COREOS\DEVICE\DEVCORE\devload.c中的CreateDevice函数中有如下判断:

if((dwFlags & DEVFLAGS_NAKEDENTRIES) == 0) {
                if(lpszPrefix[0] != 0) {
                    DEBUGCHK(lpszBusPrefix[0] == 0 || wcsicmp(lpszBusPrefix, lpszPrefix) == 0);
                    pEffType = lpszPrefix;      // use standard prefix decoration
                } else if(lpszBusPrefix[0] != 0 && lpdev->pszBusName != NULL) {
                    pEffType = lpszBusPrefix;   // no standard prefix, use bus prefix decoration
                } else {
                    if(lpdev->pszDeviceName != NULL) {
                        // device is expected to have a device or bus name, but we don't know
                        // how to look for its entry points
                        DEBUGMSG(ZONE_ACTIVE || ZONE_ERROR,
                            (_T("DEVICE!CreateDevice: no entry point information for '%s' can't load '%s'\r\n"),
                            lpszLib, lpdev->pszDeviceName));
                        dwStatus = ERROR_INVALID_FUNCTION;
                    }
                }
            }
            
            lpdev->fnInit = (pInitFn)GetDMProcAddr(pEffType,L"Init",lpdev->hLib);
            lpdev->fnPreDeinit = (pDeinitFn)GetDMProcAddr(pEffType,L"PreDeinit",lpdev->hLib);
            lpdev->fnDeinit = (pDeinitFn)GetDMProcAddr(pEffType,L"Deinit",lpdev->hLib);
            lpdev->fnOpen = (pOpenFn)GetDMProcAddr(pEffType,L"Open",lpdev->hLib);
            lpdev->fnPreClose = (pCloseFn)GetDMProcAddr(pEffType,L"PreClose",lpdev->hLib);
            lpdev->fnClose = (pCloseFn)GetDMProcAddr(pEffType,L"Close",lpdev->hLib);
            lpdev->fnRead = (pReadFn)GetDMProcAddr(pEffType,L"Read",lpdev->hLib);
            lpdev->fnWrite = (pWriteFn)GetDMProcAddr(pEffType,L"Write",lpdev->hLib);
            lpdev->fnSeek = (pSeekFn)GetDMProcAddr(pEffType,L"Seek",lpdev->hLib);
            lpdev->fnControl = (pControlFn)GetDMProcAddr(pEffType,L"IOControl",lpdev->hLib);
            lpdev->fnPowerup = (pPowerupFn)GetDMProcAddr(pEffType,L"PowerUp",lpdev->hLib);
            lpdev->fnPowerdn = (pPowerupFn)GetDMProcAddr(pEffType,L"PowerDown",lpdev->hLib);



 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
To 4 楼:
   那是不是在注册表中
   添加:
   "Flags"=dword:8                      ; DEVFLAGS_NAKEDENTRIES
就说明使用了使用未修饰的入口点名称,也就可以自己定义接口函数??
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 songtitan 的回复:
引用楼主 wangxin_801115 的帖子:
在CE下电源管理 MDD层代码中:
  电池驱动对外接口函数没有“BAT_”前缀,因为HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Battery\Flags注册表项设置了DEVFLAGS_NAKEDENTRIES属性,表示“Init”代替“BAT_Init”,这样修改注册表“Prefix”项的值时不需要修改驱动代码。

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Battery]
"Prefix"="BAT"
"Dll"="battdrvr.dll"
"Flags"=dword:8            …

又查了一下MSDN和代码,只说明可以使用不加前缀的入口函数,即
当DEVFLAGS_NAKEDENTRIES 时,pEffType = NULL;
所以下面这些函数都会直接call Init...而不是Prefix_Init
自己定义接口函数应该不行。

        lpdev->fnInit = (pInitFn)GetDMProcAddr(pEffType,L"Init",lpdev->hLib);
            lpdev->fnPreDeinit = (pDeinitFn)GetDMProcAddr(pEffType,L"PreDeinit",lpdev->hLib);
            lpdev->fnDeinit = (pDeinitFn)GetDMProcAddr(pEffType,L"Deinit",lpdev->hLib);
            lpdev->fnOpen = (pOpenFn)GetDMProcAddr(pEffType,L"Open",lpdev->hLib);
            lpdev->fnPreClose = (pCloseFn)GetDMProcAddr(pEffType,L"PreClose",lpdev->hLib);
            lpdev->fnClose = (pCloseFn)GetDMProcAddr(pEffType,L"Close",lpdev->hLib);
            lpdev->fnRead = (pReadFn)GetDMProcAddr(pEffType,L"Read",lpdev->hLib);
            lpdev->fnWrite = (pWriteFn)GetDMProcAddr(pEffType,L"Write",lpdev->hLib);
            lpdev->fnSeek = (pSeekFn)GetDMProcAddr(pEffType,L"Seek",lpdev->hLib);
            lpdev->fnControl = (pControlFn)GetDMProcAddr(pEffType,L"IOControl",lpdev->hLib);
            lpdev->fnPowerup = (pPowerupFn)GetDMProcAddr(pEffType,L"PowerUp",lpdev->hLib);
            lpdev->fnPowerdn = (pPowerupFn)GetDMProcAddr(pEffType,L"PowerDown",lpdev->hLib);
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

8
 
做个记号
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
To 4 楼:
  那是不是在注册表中
  添加:
  "Flags"=dword:8                      ; DEVFLAGS_NAKEDENTRIES
就说明使用了使用未修饰的入口点名称
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
...是的。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
...是的。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表