5597|13

55

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

怎样得到流驱动里物理内存的虚拟地址指针? [复制链接]

平台是WINCE 6.0,VirtualAlloc+VirtualCopy操作成功。
在应用程序里声明一个空指针,并且将这个空指针赋值给DeviceIoControl函数的第五个参数,对应下面函数中pOutBuf。
DeviceIoControl函数执行后,返回的pOutBuf还是空指针。不知该如何处理才能得到流驱动里物理内存的虚拟地址指针?
BOOL MEM_IOControl(
                                   DWORD OpenHandle,
                                   DWORD dwIoControlCode,
                                   PBYTE pInBuf,
                                   DWORD nInBufSize,
                                   PBYTE pOutBuf,
                                   DWORD nOutBufSize,
                                   PDWORD pBytesReturned)
{
        BOOL bReturn = TRUE;
        switch (dwIoControlCode)
        {        
        case IOCTL_VIRTUALMEM_ALLOC:
                pOutBuf = (byte*)VirtualAlloc(NULL,IMAGE_MEM_SIZE,MEM_RESERVE, PAGE_EXECUTE_READWRITE);
                if (pOutBuf != NULL)
                {
                        RETAILMSG(1,(L"VirtualAlloc is OK\r\n"));                         

                        *pBytesReturned = IMAGE_MEM_SIZE;
                        if (!VirtualCopy((void*)pOutBuf,        (void *)(IMAGE_MEM_PA_START >> 8),IMAGE_MEM_SIZE,PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
                        {
                                RETAILMSG(1,(L"VirtualCopy is fault\r\n"));
                                break;
                        }
                        else
                                RETAILMSG(1,(L"VirtualCopy is OK\r\n"));                         

                        if (!CeSetMemoryAttributes((void *)pOutBuf, (void *)(IMAGE_MEM_PA_START>>8), IMAGE_MEM_SIZE, PAGE_PHYSICAL))
                        {
                                RETAILMSG(1,(L"CeSetMemoryAttributes is fault\r\n"));
                        }
                        else
                                RETAILMSG(1,(L"CeSetMemoryAttributes is OK\r\n"));

                        //CeOpenCallerBuffer((void**)pOutBuf,virtualMem,IMAGE_MEM_SIZE,ARG_IO_PTR, FALSE);
                }
                else
                        RETAILMSG(1,(L"VirtualAlloc is fault\r\n"));               
                break;
        case IOCTL_VIRTUALMEM_FREE:
                if (!VirtualFree(pOutBuf,0,MEM_RELEASE))
                        RETAILMSG(1,(L"VirtualFree is fault\r\n"));               
                break;
        }

        RETAILMSG(1,(L"MEM_IOControl\r\n"));
        return bReturn;
}

最新回复

不错,学习了。呵呵。  详情 回复 发表于 2010-2-25 22:39
点赞 关注

回复
举报

92

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
大概明白楼主的意思,楼主是想在应用中直接操作特定的物理空间,因为CE6.0不支持在应用中使用VirtualCopy,所以借助于一个驱动实现内存映射,并将其虚拟地址传递至应用。
不过,这种方法可能不行,即使成功将地址传递至应用,应用可能也无法正常访问到特定的物理空间。

说说看你最初的需求,再考虑是否可以用别的方法。
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
好贴 呵    sunrain_hjb
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

4
 
wince6 提供了 VirtualXXXX的增强版VirtualAllocEx和VirtualCopyEx。
可以将物理内存地址 映射到 用户程序进程的地址空间中。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 1 楼 sunrain_hjb 的回复:
大概明白楼主的意思,楼主是想在应用中直接操作特定的物理空间,因为CE6.0不支持在应用中使用VirtualCopy,所以借助于一个驱动实现内存映射,并将其虚拟地址传递至应用。
不过,这种方法可能不行,即使成功将地址传递至应用,应用可能也无法正常访问到特定的物理空间。

说说看你最初的需求,再考虑是否可以用别的方法。


不行?我看看去,呵呵。有个例子的。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 aaa_tnt 的回复:
wince6 提供了 VirtualXXXX的增强版VirtualAllocEx和VirtualCopyEx。
可以将物理内存地址 映射到 用户程序进程的地址空间中。

真的吗?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 1 楼 sunrain_hjb 的回复:
大概明白楼主的意思,楼主是想在应用中直接操作特定的物理空间,因为CE6.0不支持在应用中使用VirtualCopy,所以借助于一个驱动实现内存映射,并将其虚拟地址传递至应用。
不过,这种方法可能不行,即使成功将地址传递至应用,应用可能也无法正常访问到特定的物理空间。

说说看你最初的需求,再考虑是否可以用别的方法。


MmMapIoSpace函数可以,楼主请看http://www.armce.com/bbs/thread-271-1-1.html
呵呵。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
MmMapIoSpace,使用这个函数吧
另外如果获取的地址指针还是空,建议看下GetLastError()
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

9
 
mark。。。。。。。。。。。。。。。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 

  1. UP
复制代码
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
学习了,各位大虾,吸取营养
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

12
 
MARK,我学习下

帮顶下,
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

13
 
[url=http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html][/url]
看看这里,希望有一点作用。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 sunrain_hjb 的回复:
http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html
看看这里,希望有一点作用。


不错,学习了。呵呵。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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