平台是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;
}
大概明白楼主的意思,楼主是想在应用中直接操作特定的物理空间,因为CE6.0不支持在应用中使用VirtualCopy,所以借助于一个驱动实现内存映射,并将其虚拟地址传递至应用。
不过,这种方法可能不行,即使成功将地址传递至应用,应用可能也无法正常访问到特定的物理空间。
说说看你最初的需求,再考虑是否可以用别的方法。
wince6 提供了 VirtualXXXX的增强版VirtualAllocEx和VirtualCopyEx。
可以将物理内存地址 映射到 用户程序进程的地址空间中。
引用: 引用 1 楼 sunrain_hjb 的回复:
大概明白楼主的意思,楼主是想在应用中直接操作特定的物理空间,因为CE6.0不支持在应用中使用VirtualCopy,所以借助于一个驱动实现内存映射,并将其虚拟地址传递至应用。
不过,这种方法可能不行,即使成功将地址传递至应用,应用可能也无法正常访问到特定的物理空间。
说说看你最初的需求,再考虑是否可以用别的方法。
MmMapIoSpace函数可以,楼主请看http://www.armce.com/bbs/thread-271-1-1.html
呵呵。
MmMapIoSpace,使用这个函数吧
另外如果获取的地址指针还是空,建议看下GetLastError()
[url=http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html][/url]
看看这里,希望有一点作用。