2012-05-31 49 views
2

我需要使用VirtualProtect,我的問題是關於傳遞給函數的區域的地址。 它表示(在MSDN上)「描述起始頁面的地址」,它是否必須是頁面開始的地址或者它可能是該頁面中的任何地址? 換句話說,我應該首先使用VirtualQuery來確定頁面的起始地址嗎?VirtualProtect是否需要頁面開始的地址?

回答

3

您不需要傳入頁面的基地址。 VirtualProtect將接受頁面內的任何地址。該description of the dwSize parameter使得其清楚:

受影響的頁面的區域包括包含該範圍內的一個或多個字節從lpAddress參數(lpAddress +的dwSize)的所有頁面。這意味着跨頁邊界的2字節範圍會導致兩個頁面的保護屬性發生更改。

F你現在能夠有跨頁邊界的兩個字節的範圍內,那麼它必須能夠lpAddress是一個頁面結束之前只是一個字節。頁面不能只是一個字節長,所以它不在頁面的開頭。

+0

謝謝,我錯過了那部分。 – Elad

1

無論哪種情況,您都不需要VirtualQuery - 頁面總是PAGE_SIZE的倍數,通常是4 KiB。所以你只需要將你的號碼整理成最接近的PAGE_SIZE

但是我不相信你需要向下取整;我認爲任何地址都可以工作。雖然這可能值得仔細檢查。

相關問題