Partilhar via


Usar valores NTSTATUS

Importante

Se você estiver procurando por uma tabela de mapeamentos de valores NTSTATUS para os códigos de erro Win32 correspondentes, consulte Mapeamentos de código de erro NTSTATUS para Win32.

Muitas rotinas de driver padrão de modo kernel e rotinas de suporte de driver usam o tipo NTSTATUS para valores de retorno. Além disso, os drivers fornecem um valor do tipo NTSTATUS na estrutura IO_STATUS_BLOCK de um IRP ao concluir IRPs. O tipo NTSTATUS é definido em Ntdef.h, e os códigos de status fornecidos pelo sistema são definidos em Ntstatus.h. (Os fornecedores também podem definir códigos de status privados, embora raramente precisem. Para obter mais informações, consulte Definindo novos valores NTSTATUS.)

Os valores NTSTATUS são divididos em quatro tipos:

  • Valores de sucesso
  • Valores informativos
  • Warnings
  • Valores de erro

Vários valores são atribuídos a cada tipo. Um erro comum, ao testar um retorno bem-sucedido de uma rotina, é comparar o valor de retorno da rotina com STATUS_SUCCESS. Esta comparação verifica apenas um dos vários valores de sucesso.

Ao testar um valor de retorno, você deve usar uma das seguintes macros fornecidas pelo sistema (definidas em Ntdef.h):

Macro Descrição
NT_SUCCESS(Status) Avalia como TRUE se o valor de retorno especificado por Status é um tipo de sucesso (0 - 0x3FFFFFFF) ou um tipo informativo (0x40000000 - 0x7FFFFFFF).
NT_INFORMATION(Status) É avaliado como TRUE se o valor de retorno especificado por Status for um tipo informativo (0x40000000 - 0x7FFFFFFF).
NT_WARNING(Status) Avalia como TRUE se o valor de retorno especificado por Status for um tipo de aviso (0x80000000 - 0xBFFFFFFF).
NT_ERROR(Status) Avalia como TRUE se o tipo de erro especificado no valor de retorno por Status estiver entre (0xC0000000 - 0xFFFFFFFF).

Por exemplo, suponha que um driver chama IoRegisterDeviceInterface para registrar uma interface de dispositivo. Se o driver verificar o valor de retorno usando a macro NT_SUCCESS, a macro avaliará como TRUE se a rotina retorna STATUS_SUCCESS, o que indica que não há erros, ou se retorna o status informativo STATUS_OBJECT_NAME_EXISTS, que indica que a interface do dispositivo já está registrada.

Como outro exemplo, suponha que um driver chama ZwEnumerateKey para enumerar as subchaves de uma chave do Registro especificada. Se a macro NT_SUCCESS for avaliada como FALSE, pode ser porque a rotina retornou STATUS_INVALID_PARAMETER, que é um código de erro, ou porque a rotina retornou STATUS_NO_MORE_ENTRIES, que é um código de aviso.

Como exemplo final, suponha que um driver envia um IRP que faz com que um driver de nível inferior leia informações de um dispositivo. Se o driver solicitante especificar um buffer que é muito pequeno para receber qualquer informação, o driver de nível inferior pode responder retornando STATUS_BUFFER_TOO_SMALL, que é um código de erro. Se o primeiro driver especificar um buffer que pode receber algumas, mas não todas, as informações solicitadas, o driver de nível inferior pode responder fornecendo o máximo de dados possível e, em seguida, retornando STATUS_BUFFER_OVERFLOW, que é um código de aviso. Se o primeiro driver testar o valor de status usando NT_SUCCESS ou NT_ERROR incorretamente, ele pode acidentalmente descartar algumas informações recebidas.