2

VirtualProtectを使用する必要があります。質問は、関数に渡される領域のアドレスについてです。(MSDNで)「開始ページを説明するアドレス」と表示されていますが、ページの先頭のアドレスである必要がありますか、それともそのページの任意のアドレスである可能性がありますか?つまり、最初にVirtualQueryを使用してページの開始アドレスを決定する必要がありますか?

4

2 に答える 2

3

ページのベースアドレスを渡す必要はありません。VirtualProtectページ内のすべてのアドレスを受け入れます。パラメータ説明はdwSizeそれを明確にします:

影響を受けるページの領域には、lpAddressパラメーターから(lpAddress + dwSize)までの範囲の1つ以上のバイトを含むすべてのページが含まれます。これは、ページ境界にまたがる2バイトの範囲により、両方のページの保護属性が変更されることを意味します。

ページ境界にまたがる2バイトの範囲を持つことができる場合lpAddress、ページの終わりの1バイト前になることが可能でなければなりません。ページの長さは1バイトだけにすることはできないため、ページの先頭にはありません。

于 2012-05-31T19:02:28.867 に答える
1

どちらの場合も、必要はありません。VirtualQueryページは常にの倍数でありPAGE_SIZE、通常は4KiBです。したがって、番号を最も近いに切り捨てる必要がありますPAGE_SIZE

しかし、私はあなたが切り捨てる必要があるとは思わない。どんなアドレスでもうまくいくと思います。ただし、再確認する価値があるかもしれません。

于 2012-05-31T18:11:20.073 に答える