EX_CALLBACK_FUNCTION回呼函式 (wdm.h)

篩選驅動程式的 RegistryCallback 例程可以監視、封鎖或修改登錄作業。

語法

EX_CALLBACK_FUNCTION ExCallbackFunction;

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

參數

[in] CallbackContext

驅動程式在註冊此 RegistryCallback 例程時,以 Context 參數的形式傳遞至 CmRegisterCallbackCmRegisterCallbackEx 的值。

[in, optional] Argument1

REG_NOTIFY_CLASS型別值,識別正在執行的登錄作業類型,以及執行登錄作業之前或之後是否呼叫 RegistryCallback 例程。

[in, optional] Argument2

結構的指標,其中包含登錄作業類型特有的資訊。 結構類型取決於 Argument1的REG_NOTIFY_CLASS型別值,如下表所示。 如需哪些REG_NOTIFY_CLASS型別值可用於哪些操作系統版本的資訊,請參閱 REG_NOTIFY_CLASS

REG_NOTIFY_CLASS值 結構類型
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

從 Windows 7 開始,當 notify 類別為 RegNtPreCreateKeyEx 或 RegNtPreOpenKeyEx 時傳入的實際數據結構是此結構的 V1 版本, 分別REG_CREATE_KEY_INFORMATION_V1REG_OPEN_KEY_INFORMATION_V1。 檢查保留成員以判斷結構的版本。

版本號碼 結構名稱
0 REG_CREATE_KEY_INFORMATION和REG_OPEN_KEY_INFORMATION
1 REG_CREATE_KEY_INFORMATION_V1和REG_OPEN_KEY_INFORMATION_V1

傳回值

如需 RegistryCallback 例程何時應該傳回這些狀態值的詳細資訊,請參閱 篩選登錄呼叫

備註

若要通知登錄作業,核心模式元件 (例如防病毒軟體套件的驅動程式元件) 可以呼叫 CmRegisterCallback 或 CmRegisterCallbackEx 來註冊 RegistryCallback 例程。

RegistryCallback 例程可以檢查針對登錄作業提供的輸入和輸出緩衝區內容。 登錄作業可由呼叫使用者模式登錄例程的使用者模式應用程式起始, (例如 RegCreateKeyExRegOpenKeyEx) ,或呼叫核心模式登錄例程的驅動程式 (,例如 ZwCreateKeyZwOpenKey) 。 輸入緩衝區是由啟動器提供的記憶體緩衝區,登錄會從中讀取作業的輸入數據。 輸出緩衝區是由啟動器提供的緩衝區,登錄會寫入啟動器所要求的輸出數據。

在呼叫 RegistryCallback 例程之前,核心探查會 (驗證對齊和輔助功能,) 指向使用者模式記憶體中輸出緩衝區之 Argument2 結構的所有成員,但不會擷取系統記憶體中的使用者模式輸出緩衝區。 回呼例程必須在 try/ 中封入輸出緩衝區的任何存取權,但區塊除外。 如果回呼例程需要將輸出緩衝區指標傳遞至系統例程 (例如 ZwOpenKey) ,而且緩衝區處於使用者模式記憶體中,則回呼例程必須先擷取緩衝區。

輸入緩衝區的處理取決於 Windows 版本。 從 Windows 8 開始,核心會先擷取系統記憶體中Argument2結構成員所指向的所有輸入緩衝區,再呼叫RegistryCallback例程。 在 Windows 8 之前的 Windows 版本中,核心會探查指向使用者模式記憶體中輸入緩衝區之 Argument2 結構的所有成員,但只會在系統記憶體中擷取其中一些緩衝區。 在這些舊版 Windows 中,回呼例程必須在 try/ 中封入輸入緩衝區的任何存取權,但區塊除外。 此外,如果回呼例程需要將輸入緩衝區指標傳遞至系統例程 (例如 ZwOpenKey) ,而且緩衝區處於使用者模式記憶體中,則回呼例程必須先擷取緩衝區。

下表摘要說明 RegistryCallback 例程的緩衝區存取需求。

緩衝區類型 Windows 版本 傳遞至回呼例程的緩衝區指標 安全回呼例程直接存取? 安全傳遞至系統例程 (,例如 ZwOpenKey) ?
使用者模式輸入 Windows 8 和更新版本 指向擷取的數據。 Yes Yes
使用者模式輸入 Windows 7 (含) 以前版本 指向擷取的數據或原始使用者模式緩衝區。 不是 必須在 try/except 底下讀取。 不是 必須配置核心記憶體、從 try/except 底下的原始緩衝區複製數據,並將複製的數據傳遞至系統例程。
使用者模式輸出 全部 指向原始使用者模式緩衝區。 不是 必須在 try/except 底下寫入。 不是 必須配置核心記憶體、將核心記憶體傳遞至系統例程,並將結果複製到 try/except 下的原始緩衝區。
核心模式輸入和輸出 全部 指向原始核心模式緩衝區。 Yes Yes

如需 RegistryCallback 例程和登錄篩選驅動程式的詳細資訊,請參閱 篩選登錄呼叫

RegistryCallback 會在 IRQL = PASSIVE_LEVEL,並在執行登錄作業的線程內容中執行。

範例

若要定義 RegistryCallback 回 呼例程,您必須先提供函式宣告,以識別您要定義的回呼例程類型。 Windows 提供一組驅動程式的回呼函式類型。 使用回呼函式類型宣告函式有助於 驅動程式的程式代碼分析靜態驅動程式驗證器 (SDV) ,以及其他驗證工具會尋找錯誤,而且這是撰寫 Windows 操作系統驅動程式的需求。

例如,若要定義名為MyRegistryCallbackRegistryCallback 回呼例程,請使用 EX_CALLBACK_FUNCTION 類型,如下列程式代碼範例所示:

EX_CALLBACK_FUNCTION MyRegistryCallback;

然後,實作回呼例程,如下所示:

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

EX_CALLBACK_FUNCTION函式類型定義於 Wdm.h 頭檔中。 若要在執行程式代碼分析工具時更精確地識別錯誤,請務必將 Use_decl_annotations 註釋新增至函式定義。 Use_decl_annotations批注可確保使用頭檔中套用至EX_CALLBACK_FUNCTION函式類型的批注。 如需函式宣告需求的詳細資訊,請參閱 使用WDM驅動程式的函式角色類型來宣告函式。 如需 Use_decl_annotations的詳細資訊,請參閱 標註函式行為

規格需求

需求
最低支援的用戶端 從 Windows XP (開始支援,請參閱傳回值一節) 。
目標平台 桌面
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
IRQL PASSIVE_LEVEL (请参阅一节) 。

另請參閱

CmRegisterCallback

CmUnRegisterCallback

ProbeForRead

REG_NOTIFY_CLASS

ZwOpenKey