2

私はやるべきことをブラウジングしていて、ウィンドウの特定のアドレスにメモリを割り当てるというアイデアを思いつきました。

ここでいくつかの質問をスタックオーバーフローで読みましたが、実際に動作する例を示しているものはありませんでした。

#include <Windows.h>
#include <iostream>

struct Variable {
    int var;
};

#define ACCESS() ((Variable*)0x50000000)

int main()
{
    DWORD ptr;
    VirtualAlloc((void*)0x50000000,sizeof(Variable),MEM_COMMIT | MEM_RESERVE | MEM_PHYSICAL,PAGE_READWRITE);                    
    VirtualProtect((void*)0x50000000,sizeof(Variable),PAGE_READWRITE,&ptr);
    ACCESS()->var = 5;
    while(!GetAsyncKeyState('Q')){}
}

しかし、これは常にアクセス違反を引き起こします..

特定のアドレスにデータを割り当てる正しい方法は何ですか? なぜなら、この方法ではどうにかうまくいかないからです.. 同時に「どうして?」と混乱するからです。


編集:

最初の回答の後の2番目のコードも機能しません:

#include <Windows.h>
#include <iostream>

struct Variable {
    int var;
};

#define ACCESS() ((Variable*)0x50000000)
int main()
{   
    std::cout << VirtualAlloc((void*)0x50000000,sizeof(Variable),MEM_COMMIT,PAGE_READWRITE) << std::endl;
    std::cout << GetLastError() << std::endl;
    ACCESS()->var = 6;
    std::cout << ACCESS() << std::endl;
    while(!GetAsyncKeyState('Q')){}
}

戻り値は 0 で、これは失敗を示し、GetLastError() は 487 に等しい、

このページによると、487は次のことを意味します。

ERROR_INVALID_ADDRESS; 無効なアドレスにアクセスしようとしています。

それで、私がインターネットで読んだものとスタックオーバーフローはすべて偽物ですか? 指定したアドレスにデータを配置することはできません<? これが本当なら、なぜこの関数が必要なのでしょうか?


次の編集:

それは完全に可能で、作業コードのようです:

#include <Windows.h>
#include <iostream>

struct Variable {
    int var;
};

#define ACCESS() ((Variable*)0x50000000)
int main()
{   
    std::cout << VirtualAlloc((void*)0x50000000,sizeof(Variable),MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE) << std::endl;
    std::cout << GetLastError() << std::endl;
    std::cout << ACCESS() << std::endl;
    ACCESS()->var = 6;
    std::cout << ACCESS()->var << std::endl;
    while(!GetAsyncKeyState('Q')){}
}
4

1 に答える 1

5

への呼び出しVirtualAllocが失敗しています。その戻り値をチェックすれば、それを理解できたでしょう。

失敗する理由は、ドキュメントから直接得られます。他の値MEM_PHYSICALと一緒に使用する必要があります。とにかくMEM_RESERVE望んでいない可能性があります。それはAWEに関係しています。フラグを削除すると、割り当てが成功します。MEM_PHYSICAL

への呼び出しVirtualProtectは不要です。

以下が機能するはずです。

#include <windows.h>
int main()
{
    VirtualAlloc((void*)0x50000000,0x1000,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
    *((int*)0x50000000) = 5;
}
于 2013-07-29T07:08:35.647 に答える