다음을 통해 공유


FltCreateSectionForDataScan 함수(fltkernel.h)

FltCreateSectionForDataScan 루틴은 파일에 대한 섹션 개체를 만듭니다. 필터 관리자는 필요에 따라 I/O를 만든 섹션과 동기화할 수 있습니다.

통사론

NTSTATUS FLTAPI FltCreateSectionForDataScan(
  [in]            PFLT_INSTANCE      Instance,
  [in]            PFILE_OBJECT       FileObject,
  [in]            PFLT_CONTEXT       SectionContext,
  [in]            ACCESS_MASK        DesiredAccess,
  [in, optional]  POBJECT_ATTRIBUTES ObjectAttributes,
  [in, optional]  PLARGE_INTEGER     MaximumSize,
  [in]            ULONG              SectionPageProtection,
  [in]            ULONG              AllocationAttributes,
  [in]            ULONG              Flags,
  [out]           PHANDLE            SectionHandle,
  [out]           PVOID              *SectionObject,
  [out, optional] PLARGE_INTEGER     SectionFileSize
);

매개 변수

[in] Instance

컨텍스트를 검색할 미니 필터 드라이버 인스턴스에 대한 불투명 인스턴스 포인터입니다.

[in] FileObject

열려 있는 파일의 파일 개체입니다. 섹션 개체는 지정된 파일에서 지원됩니다. 이 매개 변수는 필수이며 NULL일 수 없습니다.

[in] SectionContext

이전에 할당된 섹션 컨텍스트에 대한 포인터입니다.

[in] DesiredAccess

다음 ACCESS_MASK 플래그 중 하나 이상의 섹션 개체에 대한 액세스 유형입니다.

호출자가 다음을 할 수 있도록 허용
SECTION_MAP_READ 섹션의 보기를 읽습니다.
SECTION_MAP_WRITE 섹션의 보기를 작성합니다.
SECTION_QUERY 섹션 개체에서 섹션에 대한 정보를 쿼리합니다. 드라이버는 이 플래그를 설정해야 합니다.
SECTION_ALL_ACCESS 이전 플래그에서 정의한 모든 작업과 STANDARD_RIGHTS_REQUIRED 정의한 작업 STANDARD_RIGHTS_REQUIRED 대한 자세한 내용은 ACCESS_MASK참조하세요.

[in, optional] ObjectAttributes

개체 이름 및 기타 특성을 지정하는 선택적 OBJECT_ATTRIBUTES 구조체에 대한 포인터입니다. InitializeObjectAttributes 매크로를 사용하여 이 구조를 초기화합니다.

[in, optional] MaximumSize

이 매개 변수는 나중에 사용하도록 예약되어 있습니다.

[in] SectionPageProtection

섹션의 각 페이지에 배치할 보호입니다. 다음 값 중 하나를 지정합니다. 이 매개 변수는 필수이며 0일 수 없습니다.

의미
PAGE_READONLY 커밋된 페이지 영역에 대한 읽기 전용 액세스를 사용하도록 설정합니다. 커밋된 지역에 쓰려고 시도하면 액세스 위반이 발생합니다. 시스템에서 읽기 전용 액세스와 실행 액세스를 구분하는 경우 커밋된 지역에서 코드를 실행하려고 하면 액세스 위반이 발생합니다.
PAGE_READWRITE 커밋된 페이지 영역에 대한 읽기 및 쓰기 액세스를 모두 사용하도록 설정합니다.

[in] AllocationAttributes

SEC_XXX 플래그의 비트 마스크는 섹션의 할당 특성을 결정합니다. 다음 값 중 하나 이상을 지정합니다. 이 매개 변수는 필수이며 0일 수 없습니다.

의미
SEC_COMMIT 섹션의 모든 페이지에 대해 메모리 또는 디스크의 페이징 파일에 실제 스토리지를 할당합니다. 기본 설정입니다. 이 플래그는 필수이며 생략할 수 없습니다.
SEC_FILE FileObject 매개 변수로 지정된 파일은 매핑된 파일입니다.

[in] Flags

이 매개 변수는 나중에 사용하도록 예약되어 있습니다.

[out] SectionHandle

섹션에 대한 불투명 핸들을 수신하는 호출자 할당 변수에 대한 포인터입니다. 기본적으로 섹션 핸들은 사용자 핸들입니다. 호출자에게 커널 핸들이 필요한 경우 OBJ_KERNEL_HANDLE 플래그가 설정된 ObjectAttributes 매개 변수의 초기화된 OBJECT_ATTRIBUTES 구조에 대한 포인터를 전달해야 합니다.

[out] SectionObject

섹션 개체에 대한 불투명 포인터를 수신하는 호출자 할당 변수에 대한 포인터입니다.

[out, optional] SectionFileSize

섹션 개체를 만들 때 파일의 크기(바이트)를 수신하는 호출자 할당 변수에 대한 포인터입니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.

반환 값

FltCreateSectionForDataScan STATUS_SUCCESS 또는 다음 중 하나와 같은 적절한 NTSTATUS 값을 반환합니다.

반환 코드 묘사
STATUS_END_OF_FILE FileObject 매개 변수로 지정된 파일의 크기는 0입니다.
STATUS_FILE_LOCK_CONFLICT FileObject 매개 변수로 지정된 파일이 잠겨 있습니다.
STATUS_INSUFFICIENT_RESOURCES FltCreateSectionForDataScan 풀 할당 오류가 발생했습니다.
STATUS_INVALID_FILE_FOR_SECTION FileObject 매개 변수로 지정된 파일은 섹션을 지원하지 않습니다.
STATUS_INVALID_PARAMETER 미니 필터가 등록되지 않았습니다.
STATUS_INVALID_PARAMETER_8 SectionPageProtection 매개 변수에 지정된 값이 잘못되었습니다.
STATUS_INVALID_PARAMETER_9 호출자가 AllocationAttributes 매개 변수에 잘못된 값을 지정했습니다.
STATUS_NOT_SUPPORTED 이 인스턴스에 연결된 볼륨은 섹션 컨텍스트를 지원하지 않습니다.
STATUS_PRIVILEGE_NOT_HELD 호출자에게 DesiredAccess 매개 변수에 지정된 액세스 권한이 있는 섹션 개체를 만드는 데 필요한 권한이 없습니다.
STATUS_FILE_IS_A_DIRECTORY FileObject 매개 변수로 지정된 파일이 디렉터리입니다.
STATUS_FLT_CONTEXT_ALREADY_DEFINED 인스턴스 지정한 필터 인스턴스에 스트림에 대해 열려 있는 섹션이 이미 있습니다. 따라서 인스턴스당 하나의 섹션만 지원됩니다.

발언

fltCreateSectionForDataScan호출하기 전에 먼저 미니 필터가 FltRegisterForDataScan호출하여 데이터 검색을 위해 볼륨을 등록해야 합니다. 다른 필터 컨텍스트 요소와 마찬가지로 SectionContext 먼저 FltAllocateContext할당됩니다.

FltCreateSectionForDataScan fltCreateSectionForDataScan 호출되는 스레드의 프로세스 핸들 테이블에 개체(SectionHandle )에 핸들을 삽입합니다.

핸들은 사용자 핸들 또는 커널 핸들일 수 있습니다. 가리키는 ObjectAttributes를 OBJECT_ATTRIBUTES 구조에서 설정된 OBJ_KERNEL_HANDLE 사용하여 만든 핸들은 커널 핸들이며 커널 모드에서만 액세스할 수 있습니다. OBJ_KERNEL_HANDLE 플래그 없이 만든 핸들은 사용자 또는 커널 모드에서 액세스할 수 있는 사용자 핸들입니다. 필터는 사용자 핸들을 만든 다음 처리를 위해 사용자 모드 애플리케이션에 전달할 수 있습니다. 예를 들어 바이러스 검사 엔진은 사용자 모드 애플리케이션에 있을 수 있으며 파일 시스템 필터에서 사용자 핸들을 공급할 수 있습니다.

섹션을 열어 두는 것이 현재 파일 I/O와 호환되지 않는 특정 상황이 발생할 수 있습니다. 특히 캐시 제거를 트리거하는 파일 I/O는 열린 섹션으로 인해 캐시 제거가 방지되는 경우 캐시 일관성을 유발할 수 있습니다. 미니 필터는 이러한 이벤트의 알림에 대한 선택적 콜백 루틴을 제공할 수 있습니다. 미니 필터 드라이버는 이러한 알림을 수신하는 PFLT_SECTION_CONFLICT_NOTIFICATION_CALLBACK 구현합니다. FLT_REGISTRATIONSectionNotificationCallback 멤버가 미니 필터를 등록할 때 이 콜백 루틴으로 설정된 경우 충돌 알림이 활성화됩니다. 알림이 수신되면 충돌하는 I/O 작업을 계속할 수 있도록 섹션을 닫을 수 있습니다.

메모

FltCreateSectionForDataScan 반환하기 전에 섹션 알림 콜백이 발생할 수 있습니다. 미니 필터는 콜백을 수신하고 SectionHandleSectionObject 아직 유효하지 않은 경우를 처리할 수 있어야 합니다.

이 루틴에서 만든 섹션 개체가 더 이상 필요하지 않은 경우 ZwClose 루틴을 호출하여 섹션 개체의 핸들(SectionHandle)을 닫고 ObDereferenceObject 루틴을 호출하여 섹션 개체 자체(SectionObject)를 역참조해야 합니다.

매핑된 섹션 및 메모리 뷰를 만드는 방법에 대한 개요 정보는 섹션 개체 및 뷰참조하세요. 또한 Microsoft Windows SDK의 CreateFileMapping 루틴에 대한 설명서를 참조하세요.

중요하다

미니 필터는 fltCreateSectionForDataScan전달된 섹션 컨텍스트를 명시적으로 삭제해서는 안 됩니다. 섹션 컨텍스트가 FltCreateSectionForDataScan전달된 후 FltDeleteContext 호출하지 마세요. 이 경우 FltCloseSectionForDataScan 호출하여 섹션 컨텍스트가 할당 취소되고 스트림에서 제거됩니다.

일반적으로 섹션은 읽기 전용으로 만들어야 합니다. 특히 읽기 전용 파일이 트랜잭션에 있고 미니 필터가 읽기 전용 섹션을 만들지 않는 경우 섹션에 대한 쓰기가 삭제되고 트랜잭션의 일부로 포함되지 않습니다.

요구 사항

요구
지원되는 최소 클라이언트 Windows 8
대상 플랫폼 보편적
헤더 fltkernel.h(Fltkernel.h 포함)
라이브러리 FltMgr.lib
IRQL <= APC_LEVEL

참고 항목

ACCESS_MASK

CcPurgeCacheSection

FLT_REGISTRATION

fltAllocateContext

FltCloseSectionForDataScan

FltRegisterForDataScan

ObDereferenceObject

PFLT_SECTION_CONFLICT_NOTIFICATION_CALLBACK

ZwClose

ZwCreateSection