C28111
경고 C28111: 부동 소수점 상태가 저장된 IRQL이 현재 IRQL과 일치하지 않습니다(이 복원 작업의 경우).
추가 정보 |
부동 저장/복원 함수를 사용하려면 저장 시 IRQL과 해당 복원이 동일해야 합니다. |
드라이버가 부동 소수점 상태를 복원할 때 실행되는 IRQL은 부동 소수점 상태를 저장할 때 실행하던 IRQL과 다릅니다.
드라이버가 실행되는 IRQL은 부동 소수점 상태를 저장하는 방법을 결정하기 때문에 부동 소수점 상태를 저장하고 복원하기 위해 함수를 호출할 때 드라이버가 동일한 IRQL에서 실행되어야 합니다.
예제
다음 코드 예제에서는 이 경고를 유도합니다.
void driver_utility()
{
// running at APC level
KFLOATING_SAVE FloatBuf;
if (KeSaveFloatingPointState(&FloatBuf))
{
KeLowerIrql(PASSIVE_LEVEL);
...
KeRestoreFloatingPointState(&FloatBuf);
}
}
다음 코드 예제에서는 이 경고를 방지합니다.
void driver_utility()
{
// running at APC level
KFLOATING_SAVE FloatBuf;
if (KeSaveFloatingPointState(&FloatBuf))
{
KeLowerIrql(PASSIVE_LEVEL);
...
KeRaiseIrql(APC_LEVEL, &old);
KeRestoreFloatingPointState(&FloatBuf);
}
}