2013-10-05 19 views
1

這是我的Form 1代碼:我如何找到一個過程的開始和結束內存?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Diagnostics; 

namespace ReadMemory 
{ 
    public partial class Form1 : Form 
    { 
     List<int> memoryAddresses = new List<int>(); 

     public Form1() 
     { 
      InitializeComponent(); 


      Process proc = Process.GetCurrentProcess(); 
      IntPtr startOffset = proc.MainModule.BaseAddress; 
      IntPtr endOffset = IntPtr.Add(startOffset, proc.MainModule.ModuleMemorySize); 
      for (int i = 0; i < startOffset.ToInt64(); i++) 
      { 
       memoryAddresses.Add(startOffset[i] 
      } 

     } 

     private void modelsToolStripMenuItem_Click(object sender, EventArgs e) 
     { 

     } 
    } 
} 

我試圖從開始到結束掃描所有的內存地址,並將它們添加到列表中。 但我上線得到一個錯誤:

memoryAddresses.Add(startOffset[i] 

錯誤3無法適用與[]的索引類型爲「System.IntPtr」

第二件事的表達在循環做:開始偏移.ToInt64()可以嗎?或者我應該做ToInt32()?

+0

可能重複[添加偏移量到IntPtr](http://stackoverflow.com/questions/1866236/add-offset-to-intptr) – BartoszKP

回答

1

IntPtr值只是一個數字,它不是一個可以通過索引訪問的數組。現在你正在從零循環到startOffset,但我認爲你想從startOffset循環到endOffset

作爲存儲器地址可以是32位或64位,這取決於你上運行的代碼在平臺上時,需要一個longInt64)來處理任何類型的指針:

List<long> memoryAddresses = new List<long>(); 

這是正確使用ToInt64將指針值轉換爲整數。內存地址將只是您在循環中使用的變量。

for (long i = startOffset.ToInt64(); i < endOffset.ToInt64(); i++) { 
    memoryAddresses.Add(i); 
} 

注意:當您正在添加的項目的列表中的進程內存的每個字節,該列表將在進程內存的大小的8倍。這很可能是您的流程中沒有足夠的內存。

+0

Guffa但這樣做不只是數它嗎?我的意思是startOffset的第一個地址是:2162888,列表中的下一個是2162889,那麼2162889是下一個內存地址?或者我從開始到結束呢? –

+0

你不需要很長的時間,你可以使用IntPtr,因爲IntPtr的目的是處理內存位置。 IntPtr在x64上是64位,在x86上是32位 – Console

+0

@DoronMuzar:是的,循環只是遍歷數字,最初來自內存地址。 – Guffa

3

這只是Windows的工作方式。它是一個虛擬內存需求分頁的操作系統,每個進程獲得2GB的內存。對於32位進程,它從0x0001000開始,結束於0x7fffffff。大多數進程開始消耗虛擬機0x00400000,這是EXE的默認啓動地址。虛擬機空間的末端總是被Windows用來跟蹤進程中的線程等重要內容。中間有許多空間,用於加載DLL併爲堆分配內存。

看到分配需要VirtualQueryEx(),你不能用Process類來完成它。您的代碼無效,IntPtr不是數組。通過SysInternals的VMMap實用程序來了解進程如何使用虛擬內存空間的方式。同樣的作者寫了「Windows內部」一書,這本書是瞭解Windows如何在內部工作的重要書籍。

相關問題