阅读:2700回复:2
有点长, 请耐心看完, 谢谢!
有点长, 请耐心看完, 谢谢!
我的代码: BOOL WINAPI EnumProcess() // 枚举进程 { HANDLE hSnapShot = NULL; HANDLE hQQHandle = NULL; PROCESSENTRY32 stFirstProcess32; PROCESSENTRY32 stNextProcess32; hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapShot == INVALID_HANDLE_VALUE) { printf("create process snap error!\r\n"); return FALSE; } BOOL bFirst = Process32First(hSnapShot, &stFirstProcess32); if (bFirst) { printf("Process Name: %-20s Process Id: %4d\r\n", stFirstProcess32.szExeFile, stFirstProcess32.th32ParentProcessID); BOOL bNext = TRUE; while(bNext) { bNext = Process32Next(hSnapShot, &stNextProcess32); if (bNext) { printf("Process Name: %-20s Process Id: %4d\r\n", stNextProcess32.szExeFile, stNextProcess32.th32ParentProcessID); /* 找到进程testRead */ if (0 == strcmp("testRead.exe", stNextProcess32.szExeFile)) { /* 打开进程 */ hReadTestHandle = OpenProcess(PROCESS_QUERY_INFORMATION ¦PROCESS_VM_READ, FALSE, stNextProcess32.th32ProcessID); if (NULL != hReadTestHandle ) getMemoryInfo(hReadTestHandle ); CloseHandle(hReadTestHandle ); } } } } return TRUE; } /* 读取内存信息 */ void getMemoryInfo(HANDLE hAnd) { SYSTEM_INFO stSysInfo; GetSystemInfo(&stSysInfo); // 得到系统内存信息 static int i = 0; static int j = 0; char cBuffer[4096]; memset(cBuffer, '\0', 4096); LPVOID lpBeginAddress = stSysInfo.lpMinimumApplicationAddress; //低内存地址 LPVOID lpEndAddress = stSysInfo.lpMaximumApplicationAddress; //高内存地址 char* lpAddress = (char*)lpBeginAddress; MEMORY_BASIC_INFORMATION stMemoryInfo; while(lpAddress < lpEndAddress) { unsigned long ulSize = VirtualQueryEx(hAnd, (LPVOID)lpAddress, &stMemoryInfo, sizeof(MEMORY_BASIC_INFORMATION)); if ((stMemoryInfo.State == MEM_RESERVE) /* 已提交内存页面 */ &&(stMemoryInfo.Type == MEM_PRIVATE) /* 私有页面 */ &&(stMemoryInfo.AllocationProtect == PAGE_READWRITE)) /* 可读写页面 */ { unsigned long ulSize = 0; /* 读取内存 (这里出错了 GetLastError() 错误code为299) */ BOOL bRet = ReadProcessMemory(hAnd, lpAddress, (LPVOID)cBuffer, 4096, &ulSize); if (bRet != 0) { printf("success!\r\n"); } else { //printf("Error: \r\n"); printf("Error: %d\r\n", GetLastError()); } i ++; } lpAddress = lpAddress + 4096; } } 我的问题: 1. 为什么这里读取内存总是出错: code 299 MSDN上解释是 299 Only part of a ReadProcessMemoty or WriteProcessMemory request was completed. ERROR_PARTIAL_COPY 2. GetSystemInfo(&stSysInfo); // 得到系统内存信息 在这里有什么用? 因为我要使用DWORD VirtualQueryEx( HANDLE hProcess, // handle to process LPCVOID lpAddress, // address of region PMEMORY_BASIC_INFORMATION lpBuffer, // address of information buffer DWORD dwLength // size of buffer ); 这个函数来得到各内存分页的页面属性。 但这函数第二个参数lpAddress 在MSDN说 要通过GetSystemInfo函数得到。 是不是GetSystemInfo 这个函数在这里作用只是得到页面大小? 因为很多资料表明: 在WIN32中,每个应用程序都可“看见”4GB的线性地址空间,其中最开始的 4MB和最后的2GB由操作系统保留,剩下不足2GB的空间用于应用程序私有空间。 0xFFFFFFFF-0xC0000000的1GB用于VxD、存储器管理和文件系统; 0xBFFFFFFF-0x80000000的1GB用于共享的WIN32 DLL、存储器映射文件和共享存储区; 0x7FFFFFFF-0x00400000为每个进程的WIN32专用地址;0x003FFFFF- 0x00001000为MS-DOS 和 WIN16应用程序;0x00000FFF-0x00000000为防止使用 空指针的4,096字节。以上都是指逻辑地址,也就是虚拟内存。 3. 对于程序中使用的变量, 如全局变量, 局部变量, 静态变量等在页面中如何体现? |
|
沙发#
发布于:2008-03-22 15:38
你是在winnt(nt,2k,xp)下吧,到98下试试
|
|
|
板凳#
发布于:2008-06-19 18:57
最近也遇到这个问题
readprocessmemory 出错299 请教高人! |
|