1

ReadProcessMemory関数が失敗し、GetLastError = 299である理由がわかりません。これが私のコードです。何か間違ったことをしていることはわかりません。

if(ReadProcessMemory(hProcess, (void*)0, IDH_Buffer, sizeof(IMAGE_DOS_HEADER), 0) != true)
        std::cout << "Failed to read from Process, GLE=" << GetLastError()  << "\n";

IDH_Buffer が割り当てられました。hProcess は非 NULL です

私のアプリは管理者として実行されており、読み込もうとしているアプリは標準のユーザーモードアプリケーションです。

教えてください。ありがとう

4

1 に答える 1

4

Win32エラーコードに関するMSDNからの引用:

ERROR_PARTIAL_COPY
299 (0x12B)
ReadProcessMemory または WriteProcessMemory 要求の一部のみが完了しました。

私の推測では、指定したアドレスには有効なデータが含まれていましたが、そのアドレスと (アドレス + コピーの長さ) の間のどこかに、メモリがマップされていませんでした。

オペレーティング システムがアドレス空間を確立する方法についてもう少し理解するには、ページ テーブルまたは仮想メモリに関するウィキペディアを参照してください。その言い方では、そのメモリ範囲のどこかに、無効なページ テーブル エントリがありました。

実際、あなたのコードを見ると...これがうまくいかないことは明らかです。BaseAddressパラメータはゼロです。他のプロセスのアドレス空間で NULL ポインターを逆参照しようとしています。ターゲット プロセス自体がこれをプルしようとすると、クラッシュします。:-) EXE のヘッダーはアドレス 0 にマップされていません。EXE ファイル自体から読み込もうとしている場合はCreateFileGetModuleFileNameEx.

于 2011-09-10T20:04:42.010 に答える