EVC中动态映射虚拟地址

来源:互联网 发布:网络电视机顶盒的安装 编辑:程序博客网 时间:2024/05/01 17:36

最早在CE下调屏的值的时候,因为没有挂仿真器,如果每次都是改好下载镜像看效果的话,速度显然太慢了。于是老大就给我出了一个注意,写个小软件直接写LCDC的寄存器看效果。于是就写了一个,效果也很不错,特别是设置IO的时候就变得很方便了。但是这是静态内存映射的,是参考了OAL层中OALPAtoVA函数直接把物理地址根据g_oalAddressTable中的对应关系直接转成虚拟地址的。然而在CE中,需要在全内核模式方可直接访问虚拟地址,而且不同平台下g_oalAddressTable列表也不一样,于是就想做成动态的映射,然而EVC下竟然不支持VirtualCopy,搜了一下帮助竟然没有找到,我的天,那咋整。

还好CSDN上卧虎藏龙,发了个帖子,终于有个兄弟xqhrs232回帖说,EVC下使用VirtualCopy需要声明一下:


#ifdef __cplusplus
extern "C"
{
#endif

BOOL VirtualCopy( LPVOID, LPVOID, DWORD, DWORD );

#ifdef __cplusplus
}
#endif

试了一下,果然可以。呵呵,谢谢这位兄台。

参考了一下函数MmMapIoSpace,稍作修改,终于可以用了。

ULONG CRWregisterDlg::GetVirtMem(ULONG phyaddr)
{
 PVOID   pVirtualAddress;
    ULONG   SourceSize;
    BOOL    bSuccess;
    ULONGLONG   SourcePhys;
    ULONG   tempvalue;

    SourcePhys = phyaddr & ~(PAGE_SIZE - 1); //页对齐
    SourceSize = 4 + (phyaddr & (PAGE_SIZE - 1)); //大小

    pVirtualAddress = VirtualAlloc(0, SourceSize, MEM_RESERVE, PAGE_NOACCESS);

    if (pVirtualAddress != NULL)
    {
        bSuccess = VirtualCopy(
            pVirtualAddress, (PVOID)(SourcePhys >> 8), SourceSize,
            PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE);

        if (bSuccess)
        {
   tempvalue =  (ULONG)pVirtualAddress ;
   tempvalue += phyaddr & (PAGE_SIZE - 1);
        }
        else
        {
            VirtualFree(pVirtualAddress, 0, MEM_RELEASE);
            pVirtualAddress = NULL;
   tempvalue = 0;
        }
    }
    return tempvalue;
}

再次感谢xqhrs232!

原创粉丝点击