EX_CALLBACK_FUNCTION funzione di callback (wdm.h)

La routine RegistryCallback di un driver di filtro può monitorare, bloccare o modificare un'operazione del Registro di sistema.

Sintassi

EX_CALLBACK_FUNCTION ExCallbackFunction;

NTSTATUS ExCallbackFunction(
  [in]           PVOID CallbackContext,
  [in, optional] PVOID Argument1,
  [in, optional] PVOID Argument2
)
{...}

Parametri

[in] CallbackContext

Valore passato dal driver come parametro Context a CmRegisterCallback o CmRegisterCallbackEx quando ha registrato questa routine RegistryCallback .

[in, optional] Argument1

Valore tipizzato REG_NOTIFY_CLASS che identifica il tipo di operazione del Registro di sistema che viene eseguita e se la routine RegistryCallback viene chiamata prima o dopo l'esecuzione dell'operazione del Registro di sistema.

[in, optional] Argument2

Puntatore a una struttura che contiene informazioni specifiche del tipo di operazione del Registro di sistema. Il tipo di struttura dipende dal valore tipizzato REG_NOTIFY_CLASS per Argument1, come illustrato nella tabella seguente. Per informazioni sui valori tipizzati REG_NOTIFY_CLASS disponibili per le versioni del sistema operativo, vedere REG_NOTIFY_CLASS.

valore REG_NOTIFY_CLASS Tipo di struttura
RegNtDeleteKey REG_DELETE_KEY_INFORMATION
RegNtPreDeleteKey REG_DELETE_KEY_INFORMATION
RegNtPostDeleteKey REG_POST_OPERATION_INFORMATION
RegNtSetValueKey REG_SET_VALUE_KEY_INFORMATION
RegNtPreSetValueKey REG_SET_VALUE_KEY_INFORMATION
RegNtPostSetValueKey REG_POST_OPERATION_INFORMATION
RegNtDeleteValueKey REG_DELETE_VALUE_KEY_INFORMATION
RegNtPreDeleteValueKey REG_DELETE_VALUE_KEY_INFORMATION
RegNtPostDeleteValueKey REG_POST_OPERATION_INFORMATION
RegNtSetInformationKey REG_SET_INFORMATION_KEY_INFORMATION
RegNtPreSetInformationKey REG_SET_INFORMATION_KEY_INFORMATION
RegNtPostSetInformationKey REG_POST_OPERATION_INFORMATION
RegNtRenameKey REG_RENAME_KEY_INFORMATION
RegNtPreRenameKey REG_RENAME_KEY_INFORMATION
RegNtPostRenameKey REG_POST_OPERATION_INFORMATION
RegNtEnumerateKey REG_ENUMERATE_KEY_INFORMATION
RegNtPreEnumerateKey REG_ENUMERATE_KEY_INFORMATION
RegNtPostEnumerateKey REG_POST_OPERATION_INFORMATION
RegNtEnumerateValueKey REG_ENUMERATE_VALUE_KEY_INFORMATION
RegNtPreEnumerateValueKey REG_ENUMERATE_VALUE_KEY_INFORMATION
RegNtPostEnumerateValueKey REG_POST_OPERATION_INFORMATION
RegNtQueryKey REG_QUERY_KEY_INFORMATION
RegNtPreQueryKey REG_QUERY_KEY_INFORMATION
RegNtPostQueryKey REG_POST_OPERATION_INFORMATION
RegNtQueryValueKey REG_QUERY_VALUE_KEY_INFORMATION
RegNtPreQueryValueKey REG_QUERY_VALUE_KEY_INFORMATION
RegNtPostQueryValueKey REG_POST_OPERATION_INFORMATION
RegNtQueryMultipleValueKey REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
RegNtPreQueryMultipleValueKey REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
RegNtPostQueryMultipleValueKey REG_POST_OPERATION_INFORMATION
RegNtPreCreateKey REG_PRE_CREATE_KEY_INFORMATION
RegNtPreCreateKeyEx REG_CREATE_KEY_INFORMATION**
RegNtPostCreateKey REG_POST_CREATE_KEY_INFORMATION
RegNtPostCreateKeyEx REG_POST_OPERATION_INFORMATION
RegNtPreOpenKey REG_PRE_OPEN_KEY_INFORMATION**
RegNtPreOpenKeyEx REG_OPEN_KEY_INFORMATION
RegNtPostOpenKey REG_POST_OPEN_KEY_INFORMATION
RegNtPostOpenKeyEx REG_POST_OPERATION_INFORMATION
RegNtKeyHandleClose REG_KEY_HANDLE_CLOSE_INFORMATION
RegNtPreKeyHandleClose REG_KEY_HANDLE_CLOSE_INFORMATION
RegNtPostKeyHandleClose REG_POST_OPERATION_INFORMATION
RegNtPreFlushKey REG_FLUSH_KEY_INFORMATION
RegNtPostFlushKey REG_POST_OPERATION_INFORMATION
RegNtPreLoadKey REG_LOAD_KEY_INFORMATION
RegNtPostLoadKey REG_POST_OPERATION_INFORMATION
RegNtPreUnLoadKey REG_UNLOAD_KEY_INFORMATION
RegNtPostUnLoadKey REG_POST_OPERATION_INFORMATION
RegNtPreQueryKeySecurity REG_QUERY_KEY_SECURITY_INFORMATION
RegNtPostQueryKeySecurity REG_POST_OPERATION_INFORMATION
RegNtPreSetKeySecurity REG_SET_KEY_SECURITY_INFORMATION
RegNtPostSetKeySecurity REG_POST_OPERATION_INFORMATION
RegNtCallbackObjectContextCleanup REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION
RegNtPreRestoreKey REG_RESTORE_KEY_INFORMATION
RegNtPostRestoreKey REG_POST_OPERATION_INFORMATION
RegNtPreSaveKey REG_SAVE_KEY_INFORMATION
RegNtPostSaveKey REG_POST_OPERATION_INFORMATION
RegNtPreReplaceKey REG_REPLACE_KEY_INFORMATION
RegNtPostReplaceKey REG_POST_OPERATION_INFORMATION
RegNtPreQueryKeyName REG_QUERY_KEY_NAME
RegNtPostQueryKeyName REG_POST_OPERATION_INFORMATION
RegNtPreSaveMergedKey REG_SAVE_MERGED_KEY_INFORMATION
RegNtPostSaveMergedKey REG_POST_OPERATION_INFORMATION

A partire da Windows 7, la struttura dei dati effettiva passata quando la classe notify è RegNtPreCreateKeyEx o RegNtPreOpenKeyEx è rispettivamente la versione V1 di questa struttura, REG_CREATE_KEY_INFORMATION_V1 o REG_OPEN_KEY_INFORMATION_V1. Controllare il membro riservato per determinare la versione della struttura.

Numero di versione Nome struttura
0 REG_CREATE_KEY_INFORMATION e REG_OPEN_KEY_INFORMATION
1 REG_CREATE_KEY_INFORMATION_V1 e REG_OPEN_KEY_INFORMATION_V1

Valore restituito

Per altre informazioni sui casi in cui una routine RegistryCallback deve restituire ognuno di questi valori di stato, vedere Filtro delle chiamate al Registro di sistema.

Commenti

Per ricevere una notifica delle operazioni del Registro di sistema, un componente in modalità kernel (ad esempio il componente driver di un pacchetto software antivirus) può chiamare CmRegisterCallback o CmRegisterCallbackEx per registrare una routine RegistryCallback .

La routine RegistryCallback può esaminare il contenuto dei buffer di input e di output forniti per le operazioni del Registro di sistema. Un'operazione del Registro di sistema può essere avviata da un'applicazione in modalità utente che chiama una routine del Registro di sistema in modalità utente (ad esempio RegCreateKeyEx o RegOpenKeyEx) o da un driver che chiama una routine del Registro di sistema in modalità kernel (ad esempio ZwCreateKey o ZwOpenKey). Un buffer di input è un buffer di memoria fornito dall'iniziatore da cui il Registro di sistema legge i dati di input per l'operazione. Un buffer di output è un buffer fornito dall'iniziatore in cui il Registro di sistema scrive i dati di output richiesti dall'iniziatore.

Prima di chiamare la routine RegistryCallback , i probe del kernel (per verificare l'allineamento e l'accessibilità) tutti i membri delle strutture Argument2 che puntano ai buffer di output nella memoria in modalità utente, ma non acquisisce i buffer di output in modalità utente nella memoria di sistema. La routine di callback deve racchiudere qualsiasi accesso di un buffer di output in un blocco try/except . Se la routine di callback deve passare un puntatore del buffer di output a una routine di sistema (ad esempio ZwOpenKey) e il buffer è in modalità utente, la routine di callback deve prima acquisire il buffer.

La gestione dei buffer di input dipende dalla versione di Windows. A partire da Windows 8, il kernel acquisisce tutti i buffer di input a cui puntano i membri delle strutture Argument2 nella memoria di sistema prima di chiamare la routine RegistryCallback. Nelle versioni di Windows prima di Windows 8, il kernel esegue il probe di tutti i membri delle strutture Argument2 che puntano ai buffer di input nella memoria in modalità utente, ma acquisisce solo alcuni di questi buffer nella memoria di sistema. In queste versioni precedenti di Windows, la routine di callback deve racchiudere qualsiasi accesso di un buffer di input in un blocco try/except . Inoltre, se la routine di callback deve passare un puntatore del buffer di input a una routine di sistema (ad esempio ZwOpenKey) e il buffer si trova in memoria in modalità utente, la routine di callback deve prima acquisire il buffer.

La tabella seguente riepiloga i requisiti per gli accessi al buffer tramite la routine RegistryCallback .

Tipo di buffer Versione di Windows Puntatore al buffer passato alla routine di callback Sicurezza per la routine di callback per l'accesso diretto? Sicuro da passare alle routine di sistema (ad esempio ZwOpenKey)?
Input in modalità utente Windows 8 e versioni successive Punta ai dati acquisiti.
Input in modalità utente Windows 7 e versioni precedenti Punta ai dati acquisiti o al buffer in modalità utente originale. No. Deve leggere in try/except. No. Deve allocare memoria kernel, copiare i dati dal buffer originale in try/except e passare i dati copiati alla routine di sistema.
Output in modalità utente Tutti Punta al buffer originale in modalità utente. No. Deve scrivere in try/except. No. Deve allocare memoria kernel, passare la memoria del kernel alla routine di sistema e copiare i risultati nel buffer originale in try/except.
Input e output in modalità kernel Tutti Punta al buffer originale in modalità kernel.

Per altre informazioni sulle routine RegistryCallback e sui driver di filtro del Registro di sistema, vedere Filtro delle chiamate al Registro di sistema.

RegistryCallback viene eseguito in IRQL = PASSIVE_LEVEL e nel contesto del thread che esegue l'operazione del Registro di sistema.

Esempio

Per definire una routine di callback RegistryCallback , è 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 RegistryCallback denominata MyRegistryCallback, usare il tipo di EX_CALLBACK_FUNCTION come illustrato nell'esempio di codice seguente:

EX_CALLBACK_FUNCTION MyRegistryCallback;

Implementare quindi la routine di callback come indicato di seguito:

_Use_decl_annotations_
NTSTATUS 
  MyRegistryCallback(
    PVOID  CallbackContext,
    PVOID  Argument1,
    PVOID  Argument2 
    )
  {
      // Function body
  }

Il tipo di funzione EX_CALLBACK_FUNCTION è definito nel file di intestazione Wdm.h. Per identificare in modo più accurato gli errori durante l'esecuzione degli 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 usate le annotazioni applicate al tipo di funzione EX_CALLBACK_FUNCTION nel file di intestazione. Per altre informazioni sui requisiti per le dichiarazioni di funzione, vedere Dichiarazione di funzioni tramite tipi di ruolo per i driver WDM. Per informazioni su Use_decl_annotations, vedere Annotazione del comportamento della funzione.

Requisiti

Requisito Valore
Client minimo supportato Supportato a partire da Windows XP (vedere sezione Valore restituito).
Piattaforma di destinazione Desktop
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL Chiamato in PASSIVE_LEVEL (vedere la sezione Osservazioni).

Vedi anche

CmRegisterCallback

CmUnRegisterCallback

ProbeForRead

REG_NOTIFY_CLASS

ZwOpenKey