char szBuf[2048] = "";
int nLVItemCount;
HANDLE hProcess;
LVITEM lvItemLocal;
DWORD dwBytesRead, dwBytesWrite;
BOOL bSuccess,bWriteOK;
DWORD dwError;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
if(NULL == hProcess)
{
printf("打开进程失败!\n");
}
LPVOID lpTextRemote = VirtualAllocEx(hProcess,NULL,2048,MEM_COMMIT,PAGE_READWRITE);
LPVOID lpListItemRemote = VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
if((!lpTextRemote) || (!lpListItemRemote))
{
printf("不能在指定进程内分配存储空间!\n");
}
//查询虚拟内存的保护属性
MEMORY_BASIC_INFORMATION MemInfo;
DWORD dwOldProtect;
MemInfo.RegionSize = sizeof(MEMORY_BASIC_INFORMATION);
VirtualQueryEx(hProcess,lpTextRemote,&MemInfo,sizeof(MemInfo));
if(MemInfo.State != MEM_COMMIT)
{
printf("分配状态失败!\n");
}
if(MemInfo.Protect & (PAGE_NOACCESS|PAGE_GUARD|PAGE_READONLY))
{
if(VirtualProtectEx(hProcess,(void*)lpTextRemote,4,PAGE_READWRITE,&dwOldProtect) == FALSE)
{
printf("修改内存页属性失败!\n");
dwError = GetLastError();
printf("%d\n",dwError);
}
}
nLVItemCount=ListView_GetItemCount(hwnd);// 获取ListView行数
for(int i=0;i < nLVItemCount;++i)
{
ZeroMemory(szBuf,2048);
bWriteOK = WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,2048,(LPDWORD)&dwBytesWrite);
dwError = GetLastError();
printf("%d\n",dwError);
if(!bWriteOK)
{
printf("写内存错误\n");
}
for(int j=0;j<5;++j)
{
lvItemLocal.iItem = j; //获取第j列的数据
lvItemLocal.iSubItem = 0;
lvItemLocal.mask = LVIF_TEXT;
lvItemLocal.cchTextMax = 2047;
lvItemLocal.pszText = (LPTSTR)lpTextRemote;
dwBytesWrite = 0;
//将LVITEM结构写入进程
bWriteOK = WriteProcessMemory(hProcess,lpListItemRemote,(LPVOID)&lvItemLocal,sizeof(LVITEM),(LPDWORD)&dwBytesWrite);
dwError = GetLastError();
printf("%d\n",dwError);
if(!bWriteOK) //写内存错误
{
printf("写内存错误\n");
}
SendMessage(hwnd,LVM_GETITEMTEXT,(WPARAM)j,(LPARAM)lpListItemRemote);
bSuccess = ReadProcessMemory(hProcess,lpTextRemote,szBuf,2048,&dwBytesRead);
dwError = GetLastError();
printf("%d\n",dwError);
//从指定进程存储空间读取文本
if(!bSuccess) //不能在指定进程内读取文本
{
printf("不能在指定进程内读取文本\n");
}
if(szBuf == NULL)
{
printf("获取内容失败!\n");
}
MyData = szBuf;
MessageBox(NULL,szBuf,NULL,MB_OK);
printf("%s\n",szBuf);
}
}
//在指定进程内释放存储空间
VirtualFreeEx(hProcess,lpListItemRemote,0,MEM_RELEASE);
VirtualFreeEx(hProcess,lpTextRemote,0,MEM_RELEASE);
//关闭指定进程句柄
CloseHandle(hProcess);这段代码是读取其他进程中ListView控件的数据,程序运行没问题,就是得不到正确的结果,返回的错误值总是183
不知问题出在哪儿?
难道是:
1.被读取的进程采用了保护措施的?
2.代码本来有误?
3.逻辑不正确?
还望高手指点……
另外是你要看一下是不是标准控件,像qt那样的好像不行
再就是你是什么系统,不是xp的话,看看权限问题。
我在MSDN上看了这个函数,第二个参数应该为TRUE吧
我调用GetClassName返回的是SysListView32;这个应该是标准的控件吧!
权限问题
lvItemLocal.pszText = (LPTSTR)lpTextRemote;这个有问题吧?把自己给覆盖了,可能会出错吧?
为什么不试试: lvItemLocal.cchTextMax = 2047 - size(LVITEM);
lvItemLocal.pszText = (LPTSTR)lpTextRemote+size(LVITEM);