2012-06-28 3 views
0

아래 코드로 메모리의 주소를 읽습니다. 모든 주소가 서로 이웃하고 (1 바이트 따라 가기) 모든 주소를 개별적으로 호출 할 때 매우 비효율적으로 수행 할 수 있습니다.인접한 주소에 대한 프로세스 메모리를 읽는 가장 효율적인 방법은 무엇입니까?

[DllImport("kernel32", EntryPoint = "ReadProcessMemory")] 
    private static extern byte ReadProcessMemoryByte(int Handle, int Address, ref byte Value, int Size, ref int BytesRead); 

기능은 다음과 같은 :

pseudo: 
     For loop: 
     read memory address (base address offset) 
     add result to array 
     addressoffset++ 

그래서 나는 3 별도의 호출을 할 것, 3 개 주소를 말한다. 무슨 뜻인지 안다면, 단지 1 번만 전화를 걸고 그 결과를 3 개의 개별 데이터 세그먼트로 나누는 내부 논리를 만드는 방법이 있을까요? 바이트 단위로 읽는 대신 한 번에 4 바이트를 읽은 다음 배열에 추가하기 전에 분할하십시오.

내가 묻는 이유는 프로그램이 영원히 반복적으로 진행되기 때문에 때로는 최대 40,000 개의 주소를 읽는 데 3 분이 걸리는 경우가 있기 때문입니다. 내가 묻는 것을 할 수 있다면, 잠시 후에 그걸 끊을 수 있을까?

답변

2

http://www.pinvoke.net/default.aspx/kernel32.readprocessmemory에서 메서드 서명과 같은해야한다 : 현재

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

, 당신은 단지/ValuelpBuffer, 당신은 한 번에 하나의 바이트를 읽고에 대한 단일 byte이 있기 때문에. 1024 바이트 덩어리 인 byte[]을 읽고 1보다 큰 Size을 전달하면 더 많은 바이트 (읽으려는 모든 바이트 또는 1024 바이트 덩어리)를 읽을 수 있습니다.

+0

감사합니다. 내가 이웃 주소에 150 바이트를 가지고 있다고 가정 해 봅시다. 길이 150을 만들어서 반복을 처리 한 다음 150 개의 별도 호출보다는 속도에 많은 차이가 있습니까? – user1166981

+1

은 관리되지 않는 코드를 썽킹하지 않기 때문에 상당히 빠릅니다. –

+0

그래서 40,000 건의 전화가 200 건이됩니다 (200 번지 200 번 읽음) - 지금 바보 같아요. – user1166981

관련 문제