tw2050
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望49点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:2700回复:2

有点长, 请耐心看完, 谢谢!

楼主#
更多 发布于:2007-12-24 10:38
有点长,   请耐心看完,   谢谢!
我的代码:
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.   对于程序中使用的变量, 如全局变量, 局部变量, 静态变量等在页面中如何体现?
showerxu1979
驱动牛犊
驱动牛犊
  • 注册日期2008-03-18
  • 最后登录2008-05-15
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-03-22 15:38
你是在winnt(nt,2k,xp)下吧,到98下试试
我要吃带鱼
renzu
驱动牛犊
驱动牛犊
  • 注册日期2008-05-10
  • 最后登录2011-12-10
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望63点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-06-19 18:57
最近也遇到这个问题
readprocessmemory 出错299

请教高人!
游客

返回顶部