Partilhar via


C28111

aviso C28111: O IRQL onde o estado de ponto flutuante foi salvo não corresponde ao IRQL atual (para esta operação de restauração).

Informações adicionais

As funções flutuantes Save/Restore exigem que o IRQL seja o mesmo no momento do salvamento e da restauração correspondente.

O IRQL no qual o driver está executando quando restaura um estado de ponto flutuante é diferente do IRQL no qual estava sendo executado quando salvou o estado de ponto flutuante.

Como o IRQL no qual o driver é executado determina como o estado de ponto flutuante é salvo, o driver deve estar executando no mesmo IRQL quando chama as funções para salvar e restaurar o estado de ponto flutuante.

Exemplo

O exemplo de código a seguir provoca esse aviso.

void driver_utility()
{
    // running at APC level
    KFLOATING_SAVE FloatBuf;
    if (KeSaveFloatingPointState(&FloatBuf))
    {
        KeLowerIrql(PASSIVE_LEVEL);
        ...
        KeRestoreFloatingPointState(&FloatBuf);
    }
}

O exemplo de código a seguir evita esse aviso.

void driver_utility()
{
    // running at APC level
    KFLOATING_SAVE FloatBuf;
    if (KeSaveFloatingPointState(&FloatBuf))
    {
        KeLowerIrql(PASSIVE_LEVEL);
        ...
        KeRaiseIrql(APC_LEVEL, &old);
        KeRestoreFloatingPointState(&FloatBuf);
    }
}