ReadProcessMemoryが使えません

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
hoge

ReadProcessMemoryが使えません

#1 投稿記事 by hoge »

他のアプリケーションのメモリを読みたいと試行錯誤しています。
プロセスIDを入手するまでは出来たのですが、ReadProcessMemoryが失敗します。

コード: 全て選択

Declare Function ReadProcessMemory Lib "Kernel32" _
  (hProcess As HANDLE, _
  lpBaseAddress As VoidPtr, _
  lpBuffer As VoidPtr, _
  nSize As DWord, _
  lpNumberOfBytesRead As DWordPtr) As Long

Dim buf[128] As Byte

ReadProcessMemory(hProcess, &H1234ABCD As VoidPtr, buf, 80, NULL)
こんな感じでやってみてます。
OpenProcessまでは成功しているようなんですが、なにが悪いんでしょうか。
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: ReadProcessMemoryが使えません

#2 投稿記事 by Tomorrow »

詳しいことはよく知らないですが...

MSDNの関数リファレンスによると、hProcessで指定するプロセスのハンドルにはPROCESS_VM_READアクセス権が必要だそうです。
OpenProcessの時点で、このアクセス権を指定していないのではないでしょうか?

あるいは、
MSDN さんが書きました:要求された読み取り処理の途中で、プロセスのアクセス不能領域が見つかると、関数は失敗します。
とあるので、そのプロセスのメモリ領域にはアクセス不能なのかも知れません。
ゲスト

#3 投稿記事 by ゲスト »

返信ありがとうございます。

PROCESS_VM_READは指定してます。
同様のことがBorland C++BuilderXでは可能なので、どうしてABでできないのかよくわかりません。
ABでできればGUIを作るのが非常に楽なのに・・・。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 by イグトランス »

とりあえずMSDNによるとReadProcessMemoryは失敗すると(つまりFALSEを返すと)GetLastErrorが使えるとあります。
これは確かめてみましたか?
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

#5 投稿記事 by Tomorrow »

> とりあえずMSDNによるとReadProcessMemoryは失敗すると(つまりFALSEを返すと)GetLastErrorが使えるとあります。

拡張エラー情報の表示はコレで↓

コード: 全て選択

ErrorMessageBox(0, GetLastError(), "拡張エラー情報", MB_OK Or MB_ICONEXCLAMATION)

Function ErrorMessageBox(hWnd As DWord, ErrCode As Long, lpCaption As BytePtr, uType As DWord) As Long
	Dim lpMsgBuf As BytePtr
	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ErrCode, LANG_USER_DEFAULT, VarPtr(lpMsgBuf), 0, NULL)
	ErrorMessageBox=MessageBox(hWnd, lpMsgBuf, lpCaption, uType)
	LocalFree(lpMsgBuf)
End Function
read

#6 投稿記事 by read »

AB4.10 + XP(SP2)で動作しました。
デバッグで実行するとエラーになりますが、リリースだと動作します。
その後は、デバッグでも動くようになりました。
デバッグで駄目なことが、たまにあるので試してください。
返信する