레지스트리 알림의 잘못된 키 개체 포인터

심각한 오류 및 가능한 메모리 손상을 방지하기 위해 레지스트리 필터링 드라이버는 잘못된 개체 포인터를 사용하여 키 개체에 액세스하려고 시도해서는 안 됩니다. 이 항목에서는 레지스트리 콜백 알림 구조의 Object 멤버에 정의되지 않은 비 NULL 값이 포함될 수 있는 상황을 나열합니다.

레지스트리 필터링 드라이버에서 RegistryCallback 루틴의 두 번째 매개 변수는 REG_NOTIFY_CLASS 열거형 값입니다. 이 값은 RegistryCallback 루틴의 세 번째 매개 변수가 가리키는 레지스트리 콜백 알림 구조의 유형을 나타냅니다. 알림 구조에는 레지스트리 작업에 대한 정보가 포함됩니다. 이 구조체의 형식은 수행 중인 레지스트리 작업에 따라 달라집니다.

대부분의 알림 구조 형식에는 키 개체를 가리키는 Object 멤버가 포함되어 있습니다. 경우에 따라 Object 멤버에는 NULL이 아닌 값이 포함될 수 있지만 유효한 키 개체에 대한 포인터는 아닙니다.

키 개체 값이 정의되지 않음

레지스트리 필터링 드라이버의 RegistryCallback 루틴 호출에서 두 번째 매개 변수가 RegNtPostCreateKeyEx 또는 RegNtPostOpenKeyExREG_NOTIFY_CLASS 열거형 값인 경우 세 번째 매개 변수는 REG_POST_OPERATION_INFORMATION 구조체에 대한 포인터입니다. 이 구조체의 Object 멤버는 구조체의 Status 멤버가 STATUS_SUCCESS 설정된 경우에만 유효합니다. NT_SUCCESS 매크로가 TRUE로 평가되는 0이 아닌 상태 코드를 포함한 다른 상태 값은 Object 멤버의 값이 정의되지 않음을 나타냅니다.

키 개체 값이 유효한 상태가 아닙니다.

레지스트리 콜백의 두 번째 매개 변수가 다음 REG_NOTIFY_CLASS 열거형 값 중 하나인 경우 레지스트리 콜백 알림 구조의 Object 멤버는 제거되고 참조 수가 0인 키 개체를 가리킵니다.

Object 멤버는 유효한 상태가 아닌 키 개체를 가리키므로 레지스트리 필터링 드라이버는 Object 포인터 값을 매개 변수로 Windows 드라이버 지원 루틴(예: ObReferenceObjectByPointer)에 전달해서는 안 됩니다.

그러나 RegistryCallback 을 호출하여 RegNtPreKeyHandleClose 또는 RegNtPostKeyHandleClose 알림을 처리하는 동안 레지스트리 필터 드라이버는 레지스트리 개체를 매개 변수로 사용하는 구성 관리자 루틴(예: CmGetBoundTransaction)을 호출할 수 있습니다.