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 루틴을 등록할 때 CmRegisterCallback 또는 CmRegisterCallbackExContext 매개 변수로 전달한 값입니다.

[in, optional] Argument1

수행 중인 레지스트리 작업의 유형과 레지스트리 작업이 수행되기 전이나 후에 RegistryCallback 루틴이 호출되는지 여부를 식별하는 REG_NOTIFY_CLASS 형식의 값입니다.

[in, optional] Argument2

레지스트리 작업 유형과 관련된 정보를 포함하는 구조체에 대한 포인터입니다. 구조체 형식은 다음 표와 같이 argument1REG_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부터 알림 클래스가 RegNtPreCreateKeyEx 또는 RegNtPreOpenKeyEx일 때 전달되는 실제 데이터 구조는 각각 이 구조체의 V1 버전( REG_CREATE_KEY_INFORMATION_V1 또는 REG_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 루틴은 레지스트리 작업에 제공된 입력 및 출력 버퍼의 내용을 검사할 수 있습니다. 레지스트리 작업은 사용자 모드 레지스트리 루틴(예: RegCreateKeyEx 또는 RegOpenKeyEx)을 호출하는 사용자 모드 애플리케이션 또는 커널 모드 레지스트리 루틴(예: ZwCreateKey 또는 ZwOpenKey)을 호출하는 드라이버에서 시작할 수 있습니다. 입력 버퍼는 레지스트리가 작업에 대한 입력 데이터를 읽는 초기자에서 제공하는 메모리 버퍼입니다. 출력 버퍼는 레지스트리가 초기자가 요청한 출력 데이터를 쓰는 초기자에서 제공하는 버퍼입니다.

RegistryCallback 루틴을 호출하기 전에 커널은 사용자 모드 메모리의 출력 버퍼를 가리키지만 시스템 메모리에서 사용자 모드 출력 버퍼를 캡처하지 않는 Argument2 구조체의 모든 멤버를 프로브합니다(맞춤 및 접근성 확인). 콜백 루틴은 블록을제외한try/에서 출력 버퍼의 모든 액세스를 묶어야 합니다. 콜백 루틴이 출력 버퍼 포인터를 시스템 루틴(예: ZwOpenKey)에 전달해야 하고 버퍼가 사용자 모드 메모리에 있는 경우 콜백 루틴은 먼저 버퍼를 캡처해야 합니다.

입력 버퍼 처리는 Windows 버전에 따라 달라집니다. Windows 8 커널은 RegistryCallback 루틴을 호출하기 전에 시스템 메모리의 Argument2 구조체 멤버가 가리키는 모든 입력 버퍼를 캡처합니다. Windows 8 이전 Windows 버전에서 커널은 사용자 모드 메모리의 입력 버퍼를 가리키는 Argument2 구조체의 모든 멤버를 검색하지만 시스템 메모리에서 이러한 버퍼 중 일부만 캡처합니다. 이러한 이전 버전의 Windows에서 콜백 루틴은 블록을제외한시도/에서 입력 버퍼의 액세스를 묶어야 합니다. 또한 콜백 루틴이 입력 버퍼 포인터를 시스템 루틴(예: 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