现在在Windows2000+VC6环境下,想读取内存从F000到FA4A地址段的数据,请达人指导一下……
以前没接触过这类东西,希望越详细越好!

解决方案 »

  1.   

      #ifndef   DPMI_HEADFILE  
      #define   DPMI_HEADFILE  
      /**********************************************************  
       
                                  Filename:   DPMI.h  
                                  Function:   Declare   DPMI   class  
                                  to   use   DPMI   functions   (0.9)  
                                   
                                  Writen   by   Han   Changzhe,   July   1997                  
                                                   
      **********************************************************/  
      #include   <windows.h>  
       
      class   DPMI   {  
      public:  
      static   DWORD   mapPhys(DWORD   dwPhysAddr,   DWORD   dwSize);  
      static   void   unmapPhys(DWORD   dwLineAddr);  
      };  
       
      #endif   //DPMI_HEADFILE  
       
       
       
      文件dpmi.cpp:  
       
      #include   <windows.h>  
      #include   "debug.h"  
       
       
      #include   "DPMI.h"  
       
      DWORD   DPMI::mapPhys(DWORD   dwPhysAddr,   DWORD   dwSize)  
      {  
      DWORD   dwLineAddr;  
       
      _asm   {                    
          push   si  
          push   di  
      mov   bx,   word   ptr   [dwPhysAddr+2]  
      mov   cx,   word   ptr   [dwPhysAddr]  
      mov   si,   word   ptr   [dwSize+2]  
      mov   di,   word   ptr   [dwSize]  
      mov   ax,   800h  
      int   31h          
      jc   failure  
      mov   word   ptr   [dwLineAddr+2],   bx  
      mov   word   ptr   [dwLineAddr],   cx  
      jmp   ok  
      failure:  
      mov   word   ptr   [dwLineAddr+2],   0  
      mov   word   ptr   [dwLineAddr],   0  
      ok:  
      pop   di  
      pop   si  
      }                                                      
      if   (!dwLineAddr)  
          OutputDebugString("\r\nError   mapping   phys   to   linear   address.");  
       
      return   dwLineAddr;  
      }  
       
      void   DPMI::unmapPhys(DWORD   dwLineAddr)  
      {    
      _asm   {                  
      mov   bx,   word   ptr   [dwLineAddr+2]  
      mov   cx,   word   ptr   [dwLineAddr]  
      mov   ax,   801h              
      int   31h            
      jnc   ok  
      }  
      OutputDebugString("\r\nError   unmapping   linear   addr");  
      ok:  
      return;  
      }  
       
       
    还有这个:  
       
      //make   far   pointer   from   physical   address   of   base  
      dwLineBase=DPMI::mapPhys(dwPhysBase,0x1000ul);    
      wSel=AllocSelector(SELECTOROF(this));  
      SetSelectorBase(wSel,dwLineBase);  
      SetSelectorLimit(wSel,0x00000ffful);  
      BaseAddr=(LPBYTE)MAKELP(wSel,0);        
       
      。。  
       
       
      WORD   wSel=SELECTOROF(BaseAddr);  
       
      dwLineBase=GetSelectorBase(wSel);  
      FreeSelector(wSel);  
      DPMI::unmapPhys(dwLineBase);   
      

  2.   

    貌似内核区的地址,可以在ring3下读出来吗?
      

  3.   

    内存从F000到FA4A地址段的数据 是你想要的吗? 用不到查看其值就可以了。 具体程序需要的话 先申请一块内存进行操作 然后读取才有意义吧  BYTE* p; p=new BYTE[100] ;memset(p,0,100*sizeof(BYTE)); 然后 for(int i=0;i<100;i++) {cout<<*p;}
      

  4.   

    我记得有人写过直接io读取的dll和sys,你去找找看说不定有收获
      

  5.   

    是我们订制的主板,
    开机会从BIOS里读一段数据到内存的F000:AF4A段区,
    现在需要读出来,
    MEMCPY只能读本进程内存地址,
    ReadProcess也试了下,不过好像同样不行……
      

  6.   

    用ZwOpenSection函数打开"\\Device\\PhysicalMemory",再用ZwMapViewOfSection映射0xf0000开始的0x10000字节物理内存,然后访问0xfa4a处即可。
    或者你写一个DOS程序来获取BIOS信息,然后输出,程序中加载这个DOS程序,将其输出重定向到管道或者文件,然后取回。