RTL_RUN_ONCE_INIT_FN función de devolución de llamada (ntddk.h)

La rutina RunOnceInitialization realiza una operación de inicialización única.

Sintaxis

RTL_RUN_ONCE_INIT_FN (
    _Inout_ PRTL_RUN_ONCE RunOnce,
    _Inout_opt_ PVOID Parameter,
    _Inout_opt_ PVOID *Context
  );

Parámetros

[in, out] RunOnce

Puntero a la estructura de inicialización única de RTL_RUN_ONCE que el controlador pasó anteriormente como parámetro a la rutina RtlRunOnceExecuteOnce Que llamó a esta rutina RunOnceInitialization .

[in, out] Parameter

Valor de parámetro que el controlador pasó a la rutina RtlRunOnceExecuteOnce que llamó a esta rutina RunOnceInitialization .

[out] Context

Puntero a una variable PVOID en la que la rutina escribe los datos de inicialización.

Valor devuelto

La rutina RunOnceInitialization devuelve un valor distinto de cero para indicar que se ha realizado correctamente y devuelve cero para indicar un error.

Comentarios

Una rutina runOnceInitialization implementada por el controlador realiza la inicialización específica del controlador y, a continuación, escribe los datos de inicialización en la ubicación de memoria a la que apunta el parámetro Context . Los controladores usan la rutina RtlRunOnceExecuteOnce para realizar una llamada única a una rutina RunOnceInitialization . El sistema operativo garantiza que no se llama a la rutina RunOnceInitialization dos veces para el mismo valor del parámetro RunOnce .

El sistema operativo reserva un pequeño número de bits de orden bajo en la ubicación a la que apunta el parámetro Context . La rutina RunOnceInitialization del controlador debe establecer estos bits reservados en cero en el valor de salida que escribe en *Context. La constante RTL_RUN_ONCE_CTX_RESERVED_BITS definida en Ntddk.h especifica el número de bits de orden bajo reservados. Actualmente, RTL_RUN_ONCE_CTX_RESERVED_BITS se define como dos, lo que significa que el controlador debe establecer los dos bits menos significativos del valor PVOID al que apunta Context en cero.

Ejemplos

Para definir una rutina de devolución de llamada RunOnceInitialization , primero debe proporcionar una declaración de función que identifique el tipo de rutina de devolución de llamada que va a definir. Windows proporciona un conjunto de tipos de función de devolución de llamada para controladores. Declarar una función mediante los tipos de función de devolución de llamada ayuda a Code Analysis for Drivers, Static Driver Verifier (SDV) y otras herramientas de comprobación encuentran errores y es un requisito para escribir controladores para el sistema operativo Windows.

Por ejemplo, para definir una rutina de devolución de llamada RunOnceInitialization denominada MyRunOnceInitialization, use el tipo RTL_RUN_ONCE_INIT_FN como se muestra en este ejemplo de código:

RTL_RUN_ONCE_INIT_FN MyRunOnceInitialization;

A continuación, implemente la rutina de devolución de llamada de la siguiente manera:

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

El tipo de función RTL_RUN_ONCE_INIT_FN se define en el archivo de encabezado Wdm.h. Para identificar con más precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación a la _Use_decl_annotations_ definición de la función. La _Use_decl_annotations_ anotación garantiza que se usen las anotaciones que se aplican al tipo de función RTL_RUN_ONCE_INIT_FN en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, vea Declarar funciones mediante tipos de roles de función para controladores WDM. Para obtener información sobre _Use_decl_annotations_, consulte Anotación del comportamiento de la función.

Requisitos

Requisito Value
Cliente mínimo compatible Los controladores pueden implementar la rutina RunOnceInitialization solo en Windows Vista y versiones posteriores de Windows.
Plataforma de destino Escritorio
Encabezado ntddk.h (incluya Ntddk.h, Ntifs.h)
IRQL Se llama en IRQL <= APC_LEVEL.

Consulte también

RTL_RUN_ONCE

RtlRunOnceBeginInitialize

RtlRunOnceComplete

RtlRunOnceExecuteOnce

RtlRunOnceInitialize