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);
    }
}