方法
當做對應之 Win32 函式的邏輯包裝函式。VirtualProtect 的 Win32 實作會在呼叫處理序的虛擬位址空間裡,變更認可頁面區域上的保護。
BOOL VirtualProtect(
LPVOID lpAddress, // 目標地址起始位置
DWORD dwSize, // 大小
DWORD flNewProtect, // 請求的保護方式
PDWORD lpflOldProtect // 保存老的保護方式
);
--------------------------------------------------------------------------------------------------------------------------------
BOOL WINAPI VirtualProtect(
__in LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD flNewProtect,
__out PDWORD lpflOldProtect
);
參數
lpAddress
[in] 指針,指向要變更保護屬性的記憶體基址。
dwSize
[in] 要變更的記憶體分頁區域的大小 (單位是位元組)。但是需要注意,頁面邊界2位元組的記憶體屬性更改,有可能導致改變2個頁的屬性同時被改變
flNewProtect
[in] 要套用的記憶體保護類型。
lpflOldProtect
[out] 上一個記憶體保護值的指針。
返回值
HRESULT
S_OK
VirtualProtect 已成功傳回。
HOST_E_CLRNOTAVAILABLE
Common Language Runtime (CLR) 尚未載入至處理序中,或者此 CLR 目前的狀態無法執行 Managed 程式碼或成功處理呼叫。
HOST_E_TIMEOUT
呼叫已逾時。
HOST_E_NOT_OWNER
呼叫端不具備鎖定功能。
HOST_E_ABANDONED
已封鎖執行緒或 Fiber 在等候事件時,該事件已遭取消。
E_FAIL
發生未知的重大錯誤。當方法傳回 E_FAIL 時,便無法在處理序內使用 CLR。對裝載方法的後續呼叫會傳回 HOST_E_CLRNOTAVAILABLE。
備註
1.這個 VirtualProtect 實作會傳回 HRESULT 值,而 Win32 實作則會傳回表示成功的非零值,以及表示失敗的零值。如需詳細資訊,請參閱 Windows 平台的說明檔案。
2.參數pflOldProtect 不能為null,最好使用 PDWORD pflOldProtect =new DWORD;來定義,否則無法通過編譯。
參數詳解:訪問類型flNewProtect
PAGE_READONLY
該區域為唯讀。如果應用程式試圖訪問區域中的頁的時候,將會被拒絕訪問
PAGE_READWRITE
區域可被應用程式讀寫
PAGE_EXECUTE
區域包含可被系統執行的代碼。試圖讀寫該區域的操作將被拒絕。
PAGE_EXECUTE_READ
區域包含可執行代碼,應用程式可以讀該區域。
PAGE_EXECUTE_READWRITE
區域包含可執行代碼,應用程式可以讀寫該區域。
PAGE_GUARD
區域第一次被訪問時進入一個STATUS_GUARD_PAGE異常,這個標誌要和其他保護標誌合併使用,表明區域被第一次訪問的許可權
PAGE_NOACCESS
任何訪問該區域的操作將被拒絕
PAGE_NOCACHE
RAM中的頁映射到該區域時將不會被微處理器快取(cached)
注:PAGE_GUARD和PAGE_NOCHACHE標誌可以和其他標誌合併使用以進一步指定頁的特徵。PAGE_GUARD標誌指定了一個防護頁(guard page),即當一個頁被提交時會因第一次被訪問而產生一個one-shot異常,接著取得指定的訪問許可權。PAGE_NOCACHE防止當它映射到虛擬頁的時候被微處理器快取。這個標誌方便設備驅動使用直接記憶體訪問方式(DMA)來共享記憶體塊。