Compartilhar via


RTL_RUN_ONCE_INIT_FN função de retorno de chamada (ntddk.h)

A rotina RunOnceInitialization executa uma operação de inicialização única.

Sintaxe

ULONG /* LOGICAL */
NTAPI
RTL_RUN_ONCE_INIT_FN (
    _Inout_ PRTL_RUN_ONCE RunOnce,
    _Inout_opt_ PVOID Parameter,
    _Inout_opt_ PVOID *Context
  );

typedef RTL_RUN_ONCE_INIT_FN *PRTL_RUN_ONCE_INIT_FN;

Parâmetros

[in, out] RunOnce

Um ponteiro para o RTL_RUN_ONCE estrutura de inicialização única que o driver passou anteriormente como um parâmetro para a rotina RtlRunOnceExecuteOnce que chamou essa rotina RunOnceInitialization .

[in, out] Parameter

O valor parameter que o driver passou para a rotina RtlRunOnceExecuteOnce que chamou essa rotina RunOnceInitialization .

[out] Context

Um ponteiro para uma variável PVOID na qual a rotina grava os dados de inicialização.

Retornar valor

A rotina RunOnceInitialization retorna um valor diferente de zero para indicar êxito e retorna zero para indicar falha.

Comentários

Uma rotina RunOnceInitialization implementada pelo driver executa a inicialização específica do driver e grava os dados de inicialização no local de memória para o qual o parâmetro Context aponta. Os drivers usam a rotina RtlRunOnceExecuteOnce para fazer uma chamada única para uma rotina RunOnceInitialization . O sistema operacional garante que a rotina RunOnceInitialization não seja chamada duas vezes para o mesmo valor do parâmetro RunOnce .

Um pequeno número de bits de baixa ordem no local apontado pelo parâmetro Context é reservado para uso pelo sistema operacional. A rotina RunOnceInitialization do driver deve definir esses bits reservados como zero no valor de saída que ele grava em *Contexto. A constante RTL_RUN_ONCE_CTX_RESERVED_BITS definida em Ntddk.h especifica o número de bits de baixa ordem reservados. Atualmente, RTL_RUN_ONCE_CTX_RESERVED_BITS é definido como dois, o que significa que o driver deve definir os dois bits menos significativos do valor PVOID apontado por Context como zero.

Exemplos

Para definir uma rotina de retorno de chamada RunOnceInitialization , primeiro você deve fornecer uma declaração de função que identifique o tipo de rotina de retorno de chamada que você está definindo. O Windows fornece um conjunto de tipos de função de retorno de chamada para drivers. Declarar uma função usando os tipos de função de retorno de chamada ajuda a Análise de Código para Drivers, SDV ( Verificador de Driver Estático ) e outras ferramentas de verificação a encontrar erros e é um requisito para gravar drivers para o sistema operacional Windows.

Por exemplo, para definir uma rotina de retorno de chamada RunOnceInitialization chamada MyRunOnceInitialization, use o tipo RTL_RUN_ONCE_INIT_FN conforme mostrado neste exemplo de código:

RTL_RUN_ONCE_INIT_FN MyRunOnceInitialization;

Em seguida, implemente sua rotina de retorno de chamada da seguinte maneira:

_Use_decl_annotations_
ULONG 
  MyRunOnceInitialization(
    PRTL_RUN_ONCE  RunOnce,
    PVOID  Parameter,
    PVOID  *Context
    )
  {
      // Function body
  }

O tipo de função RTL_RUN_ONCE_INIT_FN é definido no arquivo de cabeçalho Wdm.h. Para identificar erros com mais precisão ao executar as ferramentas de análise de código, adicione a _Use_decl_annotations_ anotação à sua definição de função. A _Use_decl_annotations_ anotação garante que as anotações aplicadas ao tipo de função RTL_RUN_ONCE_INIT_FN no arquivo de cabeçalho sejam usadas. Para obter mais informações sobre os requisitos para declarações de função, consulte Declarando funções usando tipos de função de função para drivers WDM. Para obter informações sobre _Use_decl_annotations_, consulte Anotando o comportamento da função.

Requisitos

Requisito Valor
Cliente mínimo com suporte Os drivers podem implementar a rotina RunOnceInitialization somente no Windows Vista e versões posteriores do Windows.
Plataforma de Destino Área de Trabalho
Cabeçalho ntddk.h (inclua Ntddk.h, Ntifs.h)
IRQL Chamado em IRQL <= APC_LEVEL.

Confira também

RTL_RUN_ONCE

RtlRunOnceBeginInitialize

RtlRunOnceComplete

RtlRunOnceExecuteOnce

RtlRunOnceInitialize