3

プロセス(Win7-64)のコミットされたすべてのページを読み込もうとしています。ほとんどのページで機能しますが、数ページでは失敗します。理由は説明できません。これが私のテストプログラムです(コンパイルされたx32、Win7-64でテストされました):

#include <windows.h>

void main()
{
    HANDLE hProc = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId());

    SYSTEM_INFO si;
    ZeroMemory(&si,sizeof(SYSTEM_INFO));
    GetSystemInfo(&si);

    char* buf = new char[si.dwPageSize];

    for (unsigned i = 0; i < 0x7fff0; i++)
    {
        void* baseOffs = (void*) (i * si.dwPageSize);
        MEMORY_BASIC_INFORMATION mbi;
        ZeroMemory(&mbi,sizeof(MEMORY_BASIC_INFORMATION));

        if (VirtualQueryEx(hProc, baseOffs, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) == 0)
        {
            MessageBox(NULL, TEXT("VirtualQueryEx failed"),TEXT(""),MB_OK);
        }

        if (mbi.State == MEM_COMMIT)
        {
            SIZE_T numByteWritten = 0;
            if(ReadProcessMemory(hProc, baseOffs,buf,si.dwPageSize,&numByteWritten) == FALSE)
                OutputDebugString(TEXT("bad\n")); //GetLastError()==ERROR_PARTIALLY_READ; numByteWritten == 0;
            else
                OutputDebugString(TEXT("good\n"));

        }
    }

    delete[] buf;
}

失敗したページのMEMORY_BASIC_INFORMATIONを調べるのに疲れましたが、そこに奇妙なものは何も見つかりませんでした。また、失敗するページの数は実行ごとに異なります(平均で約5)。なぜ私はこれらのページを読むことができませんか?プロセストークンのいくつかの特権を調整する必要がありますか?

4

2 に答える 2

6

少しのデバッグと興味深いことが識別されます。失敗したすべてのページには保護ビットPAGE_GUARDが設定されています(MSDNドキュメントを参照)。私がドキュメントを解釈するとき、これらのページをで読むことができないのは仕様によるものですReadProcessMemory

if(ReadProcessMemory(hProc, baseOffs,buf,si.dwPageSize,&numByteWritten) == FALSE) {
    assert(mbi.Protect & 0x100);
    OutputDebugString(TEXT("bad\n")); //GetLastError()==ERROR_PARTIALLY_READ; numByteWritten == 0; 
}
else {
    assert(!(mbi.Protect & 0x100));
    OutputDebugString(TEXT("good\n")); 
}
于 2012-08-27T14:16:31.520 に答える
3

32ビットWindowsのページサイズは、64ビットWindowsのページサイズと同じではありません。したがって、ページサイズはプロセスごとの値です。プロセスのページサイズは、読み取り元のプロセスのページサイズと必ずしも同じではありません。代わりにのRegionSizeメンバーを使用してください。MEMORY_BASIC_INFORMATIONこれが、影響を受ける領域の実際のサイズです。

于 2012-08-27T14:04:13.813 に答える