CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

创建子进程后的问题。高手大大们救命啊~~~

楼主feng_me(哲哲)2003-09-01 15:46:03 在 VC/MFC / 进程/线程/DLL 提问

我通过CreateProess创建了一个子进程,而后,我想读取这个子进程中某个内存地址中的数据(这个子进程虚拟内存空间中的一个地址的数据)。这时出现了问题。  
  看看代码先:  
  #include   <windows.h>  
  #include   <shellapi.h>  
  #include   <iostream.h>  
   
   
  void   main(void)  
  {  
  PROCESS_INFORMATION   pi;    
  STARTUPINFO   startInfo;  
   
  //   Set   up   members   of   STARTUPINFO   structure.  
          startInfo.cb                     =   sizeof(STARTUPINFO);  
          startInfo.lpReserved     =   NULL;  
          startInfo.lpTitle           =   "hehe";  
          startInfo.lpDesktop       =   NULL;  
          startInfo.dwX                   =   0;  
          startInfo.dwY                   =   0;  
          startInfo.dwXSize           =   0;  
          startInfo.dwYSize           =   0;  
          startInfo.dwXCountChars         =   0;  
          startInfo.dwYCountChars         =   0;  
          startInfo.dwFlags           =   STARTF_USESTDHANDLES;  
          startInfo.wShowWindow   =   0;   //SW_SHOWDEFAULT;  
          startInfo.lpReserved2   =   NULL;  
          startInfo.cbReserved2   =   0;  
          startInfo.hStdInput       =   GetStdHandle(STD_INPUT_HANDLE);  
          startInfo.hStdOutput     =   GetStdHandle(STD_OUTPUT_HANDLE);  
          startInfo.hStdError       =   GetStdHandle(STD_ERROR_HANDLE);  
   
  cout<<CreateProcess(  
  "notepad.exe",  
  NULL,  
  NULL,  
  NULL,  
  false,    
  NORMAL_PRIORITY_CLASS,  
  NULL,  
  NULL,    
  &startInfo,  
  &pi)<<endl;  
   
   
   
  cout<<"PID   :"<<pi.dwProcessId<<endl;  
  HANDLE   ph=OpenProcess(PROCESS_VM_READ,false,pi.dwProcessId);  
  cout<<"ph   :"<<ph<<"pi.hp   "<<pi.hProcess<<endl;  
  //这个的   ph(通过openprocess得到的进程句柄)和pi.hprocess(创建进程时得到的进程句柄)竟然不一样?!  
  DWORD   buf   =   0;  
  DWORD   lpAddress=0x89074324;  
          DWORD   oldprot,   dummy   =   0;    
          cout<<"result   :"<<VirtualProtectEx(ph,   LPVOID(lpAddress),   256,   PAGE_EXECUTE,   &oldprot)<<endl;//这里失败了。  
          ReadProcessMemory(ph,   (void*)   lpAddress,   &buf,   4,   NULL   );  
          VirtualProtectEx(ph,   (void*)   lpAddress,   256,   oldprot,   &dummy);  
  cout<<buf<<endl;  
  CloseHandle(ph);  
   
  //一下是错误捕获。显示“参数错误”  
  LPVOID   lpMsgBuf;  
  FormatMessage(    
  FORMAT_MESSAGE_ALLOCATE_BUFFER   |    
  FORMAT_MESSAGE_FROM_SYSTEM   |    
  FORMAT_MESSAGE_IGNORE_INSERTS,  
  NULL,  
  GetLastError(),  
  MAKELANGID(LANG_NEUTRAL,   SUBLANG_DEFAULT),   //   Default   language  
  (LPTSTR)   &lpMsgBuf,  
  0,  
  NULL    
  );  
  MessageBox(   NULL,   (LPCTSTR)lpMsgBuf,   "Error",   MB_OK   |   MB_ICONINFORMATION   );  
  //   Free   the   buffer.  
  LocalFree(   lpMsgBuf   );  
   
  }  
  怎么回事呢?难道由我创建的子进程我不能读取数据吗?  
  如何才能读取呢?  
   
  windows2000下。  
  问题点数:0、回复次数:16Top

1 楼feng_me(哲哲)回复于 2003-09-01 17:13:21 得分 0

我顶。顶~顶~~~~~~~Top

2 楼zhucde(【風間苍月】★<==>★【虚拟闲人】)回复于 2003-09-01 17:18:59 得分 0

看得头晕,待会儿再来Top

3 楼NowCan(城市浪人)回复于 2003-09-01 17:39:24 得分 0

干吗要VirtualProtectEx,这个函数需要在打开进程时使用PROCESS_VM_OPERATIONTop

4 楼FAICHEN(CC)回复于 2003-09-01 17:45:09 得分 0

//这个的   ph(通过openprocess得到的进程句柄)和pi.hprocess(创建进程时得到的进程句柄)竟然不一样?!  
  好像有一个是伪句柄Top

5 楼feng_me(哲哲)回复于 2003-09-01 18:02:01 得分 0

To   NowCan(能量、激情、雨水、彩虹——雷雨云)   :  
            试了,不行啊。如果不用这个函数,那么我应该如何完成呢?  
   
  请问有没有通过进程句柄得到进程ID的函数啊?  
  我只知道通过windows句柄得到进程ID的函数。Top

6 楼awnucel(西大耻犹未雪,南京恨何时灭&抵制日货)回复于 2003-09-01 19:50:37 得分 0

UPTop

7 楼feng_me(哲哲)回复于 2003-09-02 09:28:40 得分 0

顶啊~等待中~5555Top

8 楼feng_me(哲哲)回复于 2003-09-03 09:31:58 得分 0

顶啊。Top

9 楼feng_me(哲哲)回复于 2003-09-23 12:33:34 得分 0

唉~看来没人可以了。Top

10 楼ruihuahan(飞不起来的笨鸟)回复于 2003-09-23 17:22:04 得分 0

不要直接读内存,用内存映射文件。Top

11 楼binarier(沙子)回复于 2003-09-23 18:57:17 得分 0

我有一点不明白,你为什么把页面保护改为PAGE_EXECUTE?  
  这是MSDN中对PAGE_EXECUTE的说明:Enables   execute   access   to   the   committed   region   of   pages.   An   attempt   to   read   or   write   to   the   committed   region   results   in   an   access   violation.    
   
  Top

12 楼binarier(沙子)回复于 2003-09-23 19:00:33 得分 0

还有,你的lpAddress=0x89074324是哪来的?这块内存是不是committed的?Top

13 楼binarier(沙子)回复于 2003-09-23 19:00:54 得分 0

还有,你的lpAddress=0x89074324是哪来的?这块内存是不是committed的?Top

14 楼feng_me(哲哲)回复于 2003-09-26 13:54:48 得分 0

这块内存是可读的。使用别的软件可以读取这个地址的数据。  
   
  不能直接读内存是什么意思?如何使用内存映射文件?  
  疑问很多啊,不好意思。Top

15 楼wangbab(bab)回复于 2003-09-26 18:23:59 得分 0

cout<<"result   :"<<VirtualProtectEx(ph,   LPVOID(lpAddress),   256,   PAGE_EXECUTE,   &oldprot)<<endl;//这里失败了。  
   
   
  VirtualProtectEx:  
  The   access   protection   value   can   be   set   only   on   committed   pages.   If   the   state   of   any   page   in   the   specified   region   is   not   committed,   the   function   fails   and   returns   without   modifying   the   access   protection   of   any   pages   in   the   specified   region.    
   
  因此,楼主应该先VirtualAllocEx申请远进程的地址,  
  VirtualAllocEx(ph,LPVOID(lpAddress),   256,MEM_COMMIT,PAGE_READWRITE);Top

16 楼boywang(大力水手)回复于 2003-09-26 22:23:03 得分 0

那个地址可能是不能修改页保护属性的,但是用readprocessmemory可以直接读取的。Top

17 楼feng_me(哲哲)回复于 2003-09-28 10:44:26 得分 0

嗯。的确如此。  
  但是同样的地址,别人的程序可以读取,实在不甘心。  
  哪位可以给我一个例程?  
  谢谢。  
  主要是个例子。Top

相关问题

  • 关于进程创建子进程
  • 创建进程
  • 用createprocess创建子进程之后,如何关闭此进程?
  • ASP创建进程
  • 进程问题,不能创建进程
  • 关于创建进程
  • 如何在程序里面 创建进程,并用钩子监视这个进程?
  • 如何使CreateProcess(..)创建的子进程结束,我用PostThreadMessage(...WM_CLOSE..)不好使
  • 如何在一个进程内组件(COM)中创建子窗口
  • 迫求Windows下创建守护进程(daemon)的例子或方法说明

关键词

  • null
  • startinfo
  • 子进程
  • getstdhandle
  • startupinfo
  • std
  • handle
  • include

得分解答快速导航

  • 帖主:feng_me

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo