3017|8

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SC_CreateMutex问题 [复制链接]

我现在把一个5.0的BSP移到6.0上,但是5.0在OAL时有用到SC_CreateMutex。6.0下现在不能用了,有什么办法能调用SC_CreateMutex吗?

最新回复

我现在有个想法就是不知道能不能行。 我看到Wince6.0有这样一个函数FindKernelEntry可以查找到kernel.dll的入口地址。如下: LPVOID FindKernelEntry (         ROMHDR *const pTOC         ) {     ULONG       loop;     e32_rom     *e32rp = NULL;     TOCentry    *tocptr;     // find kernel.dll (case sensitive)     tocptr = (TOCentry *)(pTOC+1);  // toc entries follow the header         for (loop = 0; loop < pTOC->nummods; loop++) {         if (_stricmp (tocptr->lpszFileName, KERNDLL) == 0) {             e32rp = (e32_rom *)(tocptr->ulE32Offset);             break;         }         tocptr++;     }     return (LPVOID) (e32rp? (e32rp->e32_vbase + e32rp->e32_entryrva) : 0);两个值相加就是程序入口的虚拟地址了。 } TOCentry的结构如下: typedef struct TOCentry {           // MODULE BIB section structure     DWORD       dwFileAttributes;     FILETIME    ftTime;      DWORD       nFileSize;     LPSTR       lpszFileName;     ULONG       ulE32Offset;        // Offset to E32 structure 这个指向E32的结构指针。     ULONG       ulO32Offset;        // Offset to O32 structure     ULONG       ulLoadOffset;       // MODULE load buffer offset } TOCentry, *LPTOCentry e32_rom的结构如下: typedef struct e32_rom {     unsigned short  e32_objcnt;     /* Number of memory objects            */     unsigned short  e32_imageflags; /* Image flags                         */     unsigned long   e32_entryrva;   /* Relative virt. addr. of entry point */这个是程序入口点的相对虚拟地址     unsigned long   e32_vbase;      /* Virtual base address of module      */这个是程序加载的虚拟地址     unsigned short  e32_subsysmajor;/* The subsystem major version number  */     unsigned short  e32_subsysminor;/* The subsystem minor version number  */     unsigned long   e32_stackmax;   /* Maximum stack size                  */     unsigned long   e32_vsize;      /* Virtual size of the entire image    */     unsigned long   e32_sect14rva;  /* section 14 rva */     unsigned long   e32_sect14size; /* section 14 size */     unsigned long   e32_timestamp;  /* Time EXE/DLL was created/modified   */     struct info     e32_unit[ROM_EXTRA]; /* Array of extra info units      */     unsigned short  e32_subsys;     /* The subsystem type                  */ } e32_rom e32_unit这个值,不太清楚是不是程序导出表的相对地址。如果是的话就可以通过e32_vbase和它这两个值查找kernell内的函数。找到想要的函数地址再把它映射过来,应该就能调用了。   详情 回复 发表于 2010-1-23 13:29
点赞 关注

回复
举报

88

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己先顶。。。
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
SC_CreateMutex-->NKCreateMutex
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
guopeixin:是不是在6.0用NKCreateMute代替SC_CreateMutex。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 yulewjx 的回复:
guopeixin:是不是在6.0用NKCreateMute代替SC_CreateMutex。


要注意lib要对
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
不明白NKCreateMutex是内核函数,OAL.exe怎么能调用到。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
弄清它的功能,不行就自己用代码实现,如果时间允许,最好这样办,呵呵…
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
这几天都在网上找资料。还是没有什么头绪呀。。。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
我现在有个想法就是不知道能不能行。
我看到Wince6.0有这样一个函数FindKernelEntry可以查找到kernel.dll的入口地址。如下:
LPVOID
FindKernelEntry (
        ROMHDR *const pTOC
        )
{
    ULONG       loop;
    e32_rom     *e32rp = NULL;
    TOCentry    *tocptr;

    // find kernel.dll (case sensitive)
    tocptr = (TOCentry *)(pTOC+1);  // toc entries follow the header
   
    for (loop = 0; loop < pTOC->nummods; loop++) {

        if (_stricmp (tocptr->lpszFileName, KERNDLL) == 0) {
            e32rp = (e32_rom *)(tocptr->ulE32Offset);
            break;
        }
        tocptr++;
    }

    return (LPVOID) (e32rp? (e32rp->e32_vbase + e32rp->e32_entryrva) : 0);两个值相加就是程序入口的虚拟地址了。
}
TOCentry的结构如下:
typedef struct TOCentry {           // MODULE BIB section structure
    DWORD       dwFileAttributes;
    FILETIME    ftTime;
     DWORD       nFileSize;
    LPSTR       lpszFileName;
    ULONG       ulE32Offset;        // Offset to E32 structure 这个指向E32的结构指针。
    ULONG       ulO32Offset;        // Offset to O32 structure
    ULONG       ulLoadOffset;       // MODULE load buffer offset
} TOCentry, *LPTOCentry
e32_rom的结构如下:
typedef struct e32_rom {
    unsigned short  e32_objcnt;     /* Number of memory objects            */
    unsigned short  e32_imageflags; /* Image flags                         */
    unsigned long   e32_entryrva;   /* Relative virt. addr. of entry point */这个是程序入口点的相对虚拟地址
    unsigned long   e32_vbase;      /* Virtual base address of module      */这个是程序加载的虚拟地址
    unsigned short  e32_subsysmajor;/* The subsystem major version number  */
    unsigned short  e32_subsysminor;/* The subsystem minor version number  */
    unsigned long   e32_stackmax;   /* Maximum stack size                  */
    unsigned long   e32_vsize;      /* Virtual size of the entire image    */
    unsigned long   e32_sect14rva;  /* section 14 rva */
    unsigned long   e32_sect14size; /* section 14 size */
    unsigned long   e32_timestamp;  /* Time EXE/DLL was created/modified   */
    struct info     e32_unit[ROM_EXTRA]; /* Array of extra info units      */
    unsigned short  e32_subsys;     /* The subsystem type                  */
} e32_rom
e32_unit这个值,不太清楚是不是程序导出表的相对地址。如果是的话就可以通过e32_vbase和它这两个值查找kernell内的函数。找到想要的函数地址再把它映射过来,应该就能调用了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表