Condividi tramite


RTL_RUN_ONCE_INIT_FN funzione di callback (ntddk.h)

La routine RunOnceInitialization esegue un'operazione di inizializzazione una tantum.

Sintassi

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

Parametri

[in, out] RunOnce

Puntatore alla struttura di inizializzazione RTL_RUN_ONCE una tantum passata il driver in precedenza come parametro alla routine RtlRunOnceExecuteOnce che ha chiamato questa routine RunOnceInitialization .

[in, out] Parameter

Valore Parameter passato dal driver alla routine RtlRunOnceExecuteOnce che ha chiamato questa routine RunOnceInitialization .

[out] Context

Puntatore a una variabile PVOID in cui la routine scrive i dati di inizializzazione.

Valore restituito

La routine RunOnceInitialization restituisce un valore diverso da zero per indicare l'esito positivo e restituisce zero per indicare l'errore.

Commenti

Una routine RunOnceInitialization implementata dal driver esegue l'inizializzazione specifica del driver e quindi scrive i dati di inizializzazione nella posizione di memoria a cui punta il parametro Context . I driver usano la routine RtlRunOnceExecuteOnce per effettuare una chiamata una tantum a una routine RunOnceInitialization . Il sistema operativo garantisce che la routine RunOnceInitialization non venga chiamata due volte per lo stesso valore del parametro RunOnce .

Un numero ridotto di bit di ordine basso nella posizione a cui punta il parametro Context è riservato per l'uso da parte del sistema operativo. La routine RunOnceInitialization del driver deve impostare questi bit riservati su zero nel valore di output scritto in *Context. La costante RTL_RUN_ONCE_CTX_RESERVED_BITS definita in Ntddk.h specifica il numero di bit di ordine basso riservati. Attualmente, RTL_RUN_ONCE_CTX_RESERVED_BITS è definito come due, il che significa che il driver deve impostare i due bit meno significativi del valore PVOID a cui punta Context su zero.

Esempio

Per definire una routine di callback RunOnceInitialization , è innanzitutto necessario fornire una dichiarazione di funzione che identifica il tipo di routine di callback che si sta definendo. Windows fornisce un set di tipi di funzione di callback per i driver. La dichiarazione di una funzione tramite i tipi di funzione di callback consente di analizzare il codice per i driver, l'SDV ( Static Driver Verifier ) e altri strumenti di verifica di trovare errori ed è un requisito per la scrittura di driver per il sistema operativo Windows.

Ad esempio, per definire una routine di callback RunOnceInitialization denominata MyRunOnceInitialization, usare il tipo RTL_RUN_ONCE_INIT_FN come illustrato nell'esempio di codice seguente:

RTL_RUN_ONCE_INIT_FN MyRunOnceInitialization;

Implementare quindi la routine di callback come indicato di seguito:

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

Il tipo di funzione RTL_RUN_ONCE_INIT_FN è definito nel file di intestazione Wdm.h. Per identificare in modo più accurato gli errori quando si eseguono gli strumenti di analisi del codice, assicurarsi di aggiungere l'annotazione _Use_decl_annotations_ alla definizione della funzione. L'annotazione _Use_decl_annotations_ garantisce che vengano utilizzate le annotazioni applicate al tipo di funzione RTL_RUN_ONCE_INIT_FN nel file di intestazione. Per altre informazioni sui requisiti per le dichiarazioni di funzione, vedere Dichiarazione di funzioni tramite tipi di ruolo di funzione per i driver WDM. Per informazioni su _Use_decl_annotations_, vedere Annotazione del comportamento della funzione.

Requisiti

Requisito Valore
Client minimo supportato I driver possono implementare la routine RunOnceInitialization solo in Windows Vista e versioni successive di Windows.
Piattaforma di destinazione Desktop
Intestazione ntddk.h (include Ntddk.h, Ntifs.h)
IRQL Chiamato in IRQL <= APC_LEVEL.

Vedi anche

RTL_RUN_ONCE

RtlRunOnceBeginInitialize

RtlRunOnceComplete

RtlRunOnceExecuteOnce

RtlRunOnceInitialize