2013-09-21 62 views
1

我已經提出了一種方法,通過提供所需的偏移量+起始地址來讀取多指針。 (代碼如下)。總結一下,我試圖精簡這個方法,下面我會解釋我的問題。C#簡化多指針內存讀取

我一直在與轉換鬥爭。該參數是一個IntPtr和讀取地址的輸出是一個字節數組,我的第一個想法是:「將字節數組轉換爲IntPtr,重新處理它,最後將最後一個讀取的地址轉換爲int32(由於最後一個地址不是指針它永遠不會被讀取,所以轉換到Int32應該是好的)「,

但是,這並沒有給出好的結果。所以目前我堅持將Byte數組轉換爲Int32,然後將Int32轉換爲IntPtr的解決方案。人們會說bit轉換器是一種壞方法,因爲它可能會在64位平臺上引發問題,我也相信有一種方法可以提供更好的性能(因爲Im將對象轉換爲2次)。

最後,如果有人認爲有可能在C++中做類似的功能,然後P /在C#中調用它(我想這樣會更有效率?)請告訴我。 (我試着去適應我的編程知識,而且找到的語言非常有趣的組合)

[DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")] 
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, 
[In, Out] byte[] buffer, Int32 sizeout, out IntPtr lpNumberOfBytesRead); 

public Int32 ReadBytes(IntPtr Handle, IntPtr Address, int[] Offsets, int BytesToRead = 4) 
{ 
    IntPtr ptrBytesRead; 
    byte[] value = new byte[BytesToRead]; 

    ReadProcessMemory(Handle, Address, value, BytesToRead, out ptrBytesRead); 

    //Read Offsets 
    for (int i = 0; i < Offsets.Length; i++) 
    { 
     ReadProcessMemory(Handle, 
     new IntPtr(BitConverter.ToInt32(value, 0) + Offsets[i]), 
     value, 
     BytesToRead, 
     out ptrBytesRead); 
    } 

    return BitConverter.ToInt32(value, 0); 
} 

任何想法,以簡化這個方法會非常好感激!先謝謝了!

+0

有沒有比「改善這個」更具體的問題?此外,ReadProcessMemory將是迄今爲止最慢的部分。所有的「轉換」對perf都無關緊要。 – usr

+0

這當然是真的!非常感謝答覆!不,我不這麼認爲。至少現在不行。 – LamaCoder

回答

2

如@usr所述,代碼的執行完全由ReadProcessMemory的調用所支配。您不應該期望從當前級別改進性能。

但是,您可以通過避免字節數組和BitConverter使代碼更容易閱讀。像這樣:

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern int ReadProcessMemory(
    IntPtr hProcess, 
    IntPtr lpBaseAddress, 
    out IntPtr lpBuffer, 
    IntPtr nSize, 
    out IntPtr lpNumberOfBytesRead 
); 

private static IntPtr ReadProcessPointer(IntPtr hProcess, IntPtr Address) 
{ 
    IntPtr result; 
    IntPtr NumberOfBytesRead; 
    if (ReadProcessMemory(hProcess, Address, out result, (IntPtr)IntPtr.Size, out NumberOfBytesRead) == 0) 
     throw new Win32Exception(); 
    return result; 
} 

public static IntPtr FollowPointers(IntPtr hProcess, IntPtr Address, int[] Offsets) 
{ 
    IntPtr ptr = ReadProcessPointer(hProcess, Address); 
    for (int i = 0; i < Offsets.Length; i++) 
     ptr = ReadProcessPointer(hProcess, ptr + Offsets[i]); 
    return ptr; 
} 
+0

非常感謝! 好了!這是一次讀取多個字節的問題,然後解析它以提高性能,一旦我想從附近的地址獲取多個數據,那麼! – LamaCoder

+0

是的,我想讀一頁就像一個字節一樣快 –