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 대신 PAGED_CODE_LOCKED 사용합니다. PAGE_CODE_LOCKED 매크로를 사용하면 드라이버에서 드라이버에 대한 PREfast 경고가 발생하지 않고 IRQL을 발생시키는 호출을 할 수 있습니다.
이 조건은 테스트하는 동안 찾기가 매우 어려운 경우가 많습니다(드라이버 검증 도구가 오류에 대해 검사 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
}