VirtualProtect

VirtualProtect,是對應 Win32 函式的邏輯包裝函式,它會在呼叫處理程式的虛擬位置空間裡,變更認可頁面區域上的保護。

方法

當做對應之 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)來共享記憶體塊。

相關詞條

相關搜尋

熱門詞條

聯絡我們