Поделиться через


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