C28170
警告 C28170:函式已宣告為在分頁區段中,但找不到PAGED_CODE或PAGED_CODE_LOCKED
當 #pragma alloc_text 或 #pragma code_seg 用來將不包含PAGED_CODE或PAGED_CODE_LOCKED宏的函式移至可分頁程式代碼區段中時,程式代碼分析工具會報告此錯誤。 這個錯誤會回報在對應至函式中第一個大括弧 ({) 的 行號。
當區段名稱以PAGE開頭時,程式代碼分析工具會推斷區段可分頁。 可分頁程序代碼中的函式必須包含函式開頭的PAGED_CODE或PAGED_CODE_LOCKED宏,第一個大括號 ({ ) 和第一個條件語句。
這些宏可讓程式代碼分析工具和運行時間檢查程序判斷是否可以在提升許可權的 IRQL 上執行可分頁程序代碼。 如果在提升許可權層級執行系統時發生頁面錯誤,系統將會當機。
如果分頁區段中的函式後續鎖定到記憶體中,請使用 PAGED_CODE_LOCKED,而不是PAGED_CODE。 PAGE_CODE_LOCKED宏允許驅動程式呼叫引發 IRQL,而不會遇到 Drivers 警告的 PREfast。
除非使用PAGED_CODE宏來檢查錯誤) ,否則測試 (時,通常很難找到此狀況,因為程式代碼必須實際分頁,才能發生頁面錯誤。
範例
下列程式代碼範例會引發這個警告。
void func();
#pragma alloc_text("PAGED_CODE", func);
void func1()
{
// paged, no PAGED_CODE: error
}
下列程式代碼範例會避免這個警告。
void func();
#pragma alloc_text("PAGED_CODE", func);
void func2()
{
PAGED_CODE(); // includes PAGED_CODE macro
}