2013-09-21 2 views
1

Я создал метод, который будет читать многопозиционный указатель, предоставив требуемые смещения + начальный адрес. (Код ниже). Подводя итог, я пытаюсь оптимизировать этот метод и ниже, я объясню свою проблему.C# Ускоренное чтение памяти с несколькими указателями

Я боролся с конверсией. Параметр - это IntPtr, а выход считываемого адреса - это байтовый массив. Моя первая идея заключалась в следующем: «Преобразовать байтовый массив в IntPtr, переработать его и, наконец, преобразовать последний прочитанный адрес в int32 (поскольку последний адрес не является указателем он никогда не будет считаться, поэтому преобразование здесь в Int32 должно быть полным) »,

Однако это не дало приятного результата. Так что в настоящее время я застрял с решением преобразования байтового массива в Int32, а затем Int32 в IntPtr. Люди говорят, что битконвертер - плохой подход, потому что это может вызвать проблемы на 64-битных платформах, и я также считаю, что есть подход, который может дать лучшую производительность (поскольку Im конвертирует объект 2 раза).

Наконец, если кто-нибудь подумает, что можно будет сделать аналогичную функцию на C++, а затем P/Invoke it in C# (я думаю, это было бы более эффективно так?), Пожалуйста, скажите мне. (Im пытается адаптировать свои знания программирования. И найти сочетание языков очень интересных)

[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 будет, безусловно, самой медленной частью. Все ваши «конверсии» не будут иметь значения для перформанса. – 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

Да, я думаю, что чтение страницы происходит так же быстро, как один байт –

Смежные вопросы