怎样得到流驱动里物理内存的虚拟地址指针?

didi111   2010-2-21 17:24 楼主
平台是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;
}

回复评论 (13)

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

说说看你最初的需求,再考虑是否可以用别的方法。
点赞  2010-2-21 20:56
好贴 呵    sunrain_hjb
点赞  2010-2-22 04:38
wince6 提供了 VirtualXXXX的增强版VirtualAllocEx和VirtualCopyEx。
可以将物理内存地址 映射到 用户程序进程的地址空间中。
点赞  2010-2-22 11:47
引用: 引用 1 楼 sunrain_hjb 的回复:
大概明白楼主的意思,楼主是想在应用中直接操作特定的物理空间,因为CE6.0不支持在应用中使用VirtualCopy,所以借助于一个驱动实现内存映射,并将其虚拟地址传递至应用。
不过,这种方法可能不行,即使成功将地址传递至应用,应用可能也无法正常访问到特定的物理空间。

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


不行?我看看去,呵呵。有个例子的。
点赞  2010-2-22 11:56

6楼 afg 

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

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

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


MmMapIoSpace函数可以,楼主请看http://www.armce.com/bbs/thread-271-1-1.html
呵呵。
点赞  2010-2-22 12:17
MmMapIoSpace,使用这个函数吧
另外如果获取的地址指针还是空,建议看下GetLastError()
点赞  2010-2-22 20:24
mark。。。。。。。。。。。。。。。
点赞  2010-2-22 21:21

  1. UP
点赞  2010-2-22 23:54
学习了,各位大虾,吸取营养
点赞  2010-2-24 17:58

12楼 XY 

MARK,我学习下

帮顶下,
点赞  2010-2-24 18:46
[url=http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html][/url]
看看这里,希望有一点作用。
点赞  2010-2-25 21:57
引用: 引用 12 楼 sunrain_hjb 的回复:
http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html
看看这里,希望有一点作用。


不错,学习了。呵呵。
点赞  2010-2-25 22:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复