ReadProcessMemoryが失敗します


HP  2012-04-10 01:36:13  No: 73327  IP: 192.*.*.*

任意のプロセスのメモリー内容を全て取得したいと思っています。
下記コードをVS2008(WindowsXP),VS2010(Vista)にて実行してメモ帳のメモリーを取得しようとしましたが、
ReadProcessMemory()が失敗します。
読み込むサイズを1024などに変更しても同様でした。
どのようにすれば実現できますでしょうか?
よろしくお願いいたします。

////////////////////////////////////////////////////////////////////////////

// ReadProcessMemoryTest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

#include <iostream>
using namespace std;

#include <windows.h>
#include "Psapi.h"

#pragma comment(lib,"psapi.lib")

int _tmain(int argc, _TCHAR* argv[])
{
  HWND hWnd;

  DWORD dwID;

  HANDLE hProcess;


  hWnd = FindWindow(TEXT("Notepad"),NULL);

  GetWindowThreadProcessId(hWnd, &dwID);

  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwID);

  if (!hProcess)
  {
    printf("Couldn't open process.\n");
    system("PAUSE");
    return 0;
  }

  PROCESS_MEMORY_COUNTERS memInfo;
  memInfo.WorkingSetSize=0;
  memInfo.PagefileUsage=0;
  if(!GetProcessMemoryInfo(hProcess, &memInfo, sizeof(memInfo)))
  {
    printf("Couldn't get memory info.\n");
    CloseHandle(hProcess);
    return 0;
  }
  printf("memory size is %d\n",memInfo.WorkingSetSize);

  int value = 9999999, newvalue = -1;

  DWORD address = (0x0000000); //pointer address

//  DWORD newpvalue = NULL;

  printf("Pointer address is intially %x\n", address);

  char *buf = new char[memInfo.WorkingSetSize];
  memset(buf, 0, memInfo.WorkingSetSize);

  if(!ReadProcessMemory(hProcess,(LPCVOID) address, &buf, memInfo.WorkingSetSize ,NULL))
  {
    DWORD errorCode = GetLastError();
    printf("Couldn't get memory. Erro code is %d\n",errorCode);

    delete buf;
    system("PAUSE");
    return 0;
  }

  printf("Pointer value is\n");
  for (int i=0 ;i<memInfo.WorkingSetSize;++i)
  {
    printf( " %02X", buf[i] );
  }
  printf( "\n" );

  delete buf;

  system("PAUSE");

  return 0;

}

編集 削除
tetrapod  2012-04-10 06:38:12  No: 73328  IP: 192.*.*.*

GetLastError を調べなきゃ。

編集 削除
オショウ  2012-04-10 10:22:11  No: 73329  IP: 192.*.*.*

プロセスに対する PROCESS_VM_READ アクセス権が無いのが原因かも・・・
と思いましたが、以下の情報が検索でヒットしましたので、そちらを
どうぞ!

http://social.msdn.microsoft.com/Forums/ja/vcgeneralja/thread/caa5b07e-52b8-43fd-99af-7bcef325d6f3

以上。

編集 削除
snao  2012-04-10 13:39:14  No: 73330  IP: 192.*.*.*

(1) 0x0--0xffffは読めません
(2) ReadProcessMemoryの引数 &buf --> buf
(3) delete buf ---> delete[] buf

編集 削除