.net 如何为windows mobile在另一个进程中分配内存

.net 如何为windows mobile在另一个进程中分配内存,.net,windows-mobile,memory-management,compact-framework,.net,Windows Mobile,Memory Management,Compact Framework,我想阅读windows mobile中另一个进程listview控件的内容。为此,我需要一个指向该进程的一些空闲内存的指针,以便将值放在那里(然后从我的进程中读取它们)。这可以在普通的Windows或Win32中使用完成 但是,windows mobile不支持此功能!你能给我推荐一种分配内存的方法吗 嗯,经过大量搜索,我相信我找到了一个有效的解决方案。我并不是说这个解决方案工作得很完美,或者100%的时间都能工作,但是我相信,使用Windows Mobile提供的内存工具是最好的 下面是该方法

我想阅读windows mobile中另一个进程listview控件的内容。为此,我需要一个指向该进程的一些空闲内存的指针,以便将值放在那里(然后从我的进程中读取它们)。这可以在普通的Windows或Win32中使用完成


但是,windows mobile不支持此功能!你能给我推荐一种分配内存的方法吗

嗯,经过大量搜索,我相信我找到了一个有效的解决方案。我并不是说这个解决方案工作得很完美,或者100%的时间都能工作,但是我相信,使用Windows Mobile提供的内存工具是最好的

下面是该方法的大致描述(如果人们需要,我可以提供完整的源代码): a) 使用CreateToolhelp32Snapshot从所有正在运行的进程获取信息

CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS , 0 ); CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS,0); b) 遍历这些过程,直到找到具有listview的过程。该进程将有一个PROCESSENTRY32结构,我们称之为pe32

PROCESSENTRY32 pe32; if( !Process32First( hProcessSnap, &pe32 ) ) ... do { ... } while( Process32Next( hProcessSnap, &pe32 ) ); PROCESSENTRY32 pe32; 如果(!Process32First(HPProcessSnap和pe32)) ... 做{…} while(Process32Next(hprocessnap,&pe32)); c) 使用OpenProcess获取该进程的句柄,我们称之为HPProcess

HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID ); HANDLE hProcess=OpenProcess(PROCESS\u ALL\u ACCESS,FALSE,pe32.th32ProcessID); d) 从pe32.th32MemoryBase+512开始,直到pe32.th32MemoryBase+0x020000(windows mobile 6中的进程具有32 mb内存空间),使用VirtualQuery方法接收有关该区域的信息。您将得到一个内存基本信息结构,我们称之为mbi。内存区域将按mbi.RegionSize递增

DWORD dwAddress = pe32.th32MemoryBase + 512; DWORD dwStopAddress = pe32.th32MemoryBase + 0x02000000; while (VirtualQuery((LPVOID)dwAddress, &mbi, sizeof(mbi))) { ... dwAddress += mbi.RegionSize; if (dwAddress >= dwStopAddress) break; } DWORD dwAddress=pe32.th32MemoryBase+512; DWORD dwStopAddress=pe32.th32MemoryBase+0x0200000; while(VirtualQuery((LPVOID)dwAddress,&mbi,sizeof(mbi))){ ... dwAddress+=mbi.RegionSize; 如果(dwAddress>=dwStopAddress)中断; } e) 检查mbi.State==MEM\u COMMIT和mbi.Protect==PAGE\u READWRITE。如果两者都是真的,那么您可以向该区域写信。另外,查看mbi.RegionSize,看看内存区域是否足以容纳数据。若不满足条件,将转到下一个区域。警告:您不知道要写什么。您可能会破坏listview应用程序。稍后将对此进行详细介绍

if(mbi.State == MEM_COMMIT && mbi.Protect == PAGE_READWRITE ) { ... } 如果(mbi.State==MEM\u COMMIT&&mbi.Protect==PAGE\u READWRITE){…} f) 在上一个if中(满足所有条件):声明一个指针,该指针将指向mbi.BaseAddress-pe32.th32MemoryBase: char * membase2 = (char *)mbi.BaseAddress - pe32.th32MemoryBase ; char*membase2=(char*)mbi.BaseAddress-pe32.th32MemoryBase

g) 现在,您可以使用ReadProcessMemory和WriteProcessMemory读取或写入另一个进程的内存!例如,下面是我读取listview内容的代码:

LVITEM lvi, *_lvi; LPWSTR _item; TCHAR item[128]; _lvi = (LVITEM *) membase2; _item = (LPWSTR)membase2; _item += 128; lvi.iSubItem=1; lvi.pszText=_item; lvi.iItem = 0; lvi.cchTextMax = 64; WriteProcessMemory(hProcess, _lvi, &lvi, sizeof(LVITEM), NULL); SendMessage(listHWND, LVM_GETITEMTEXT, (WPARAM)0, (LPARAM)_lvi); ReadProcessMemory(hProcess, _item, item, 128, NULL); wprintf(TEXT("%s\n"), item); lvi项目lvi,*\U lvi; LPWSTR_项目; TCHAR项目[128]; _lvi=(LVITEM*)membase2; _项目=(LPWSTR)membase2; _项目+=128; lvi.iSubItem=1; lvi.pszText=_项; lvi.iItem=0; lvi.cchTextMax=64; WriteProcessMemory(hProcess,_lvi,&lvi,sizeof(LVITEM),NULL); SendMessage(listHWND,LVM_GETITEMTEXT,(WPARAM)0,(LPARAM)\u lvi); ReadProcessMemory(hProcess,_项,项,128,NULL); wprintf(文本(“%s\n”),项目);
h) 最后的想法:这个方法确实有效。我已经测试过了。但是,您必须始终考虑我前面提到的警告:您不知道要在哪里写入:您将使用的内存已提交,您可以向其写入,但是您无法确定要写入的内容。当然,这是另一个应用程序的内存,因此您只能破坏它。如果这不重要,你可以重新启动它,继续读取它的内存!当我测试它时,另一个应用程序甚至没有崩溃一次,但是它只是关闭了一两次。此外,如果无法使其工作,请尝试另一个内存区域(步骤d)

这将在CE6.0下惨遭失败,因此WinMo的下一个版本可能会破坏您的代码。坏主意,坏主意。为什么不使用真正的IPC而不是这种不安全的黑客攻击呢?因为这是唯一的方法!我知道CE6使用了一种非常不同的内存模型,可以使用VirtualAllocEx之类的函数来实现我想要的功能。但是,VirtualAllocEx不能在Windows Mobile 6中使用,因此无法在另一个进程中分配内存。使用普通IPC不是一个选项,因为我无法修改listview应用程序,我没有它的源代码-所以黑客是唯一的出路。。。