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_REGISTRATION SectionNotificationCallback 멤버가 이 콜백 루틴으로 설정된 경우 충돌 알림이 활성화됩니다. 알림이 수신되면 충돌하는 I/O 작업을 계속할 수 있도록 섹션을 닫을 수 있습니다.
참고
FltCreateSectionForDataScan 이 반환되기 전에 섹션 알림 콜백이 발생할 수 있습니다. 미니 필터는 콜백을 수신하고 SectionHandle 및 SectionObject 가 아직 유효하지 않은 경우를 처리할 수 있어야 합니다.
이 루틴에서 만든 섹션 개체가 더 이상 필요하지 않은 경우 ZwClose 루틴을 호출하여 섹션 개체의 핸들(SectionHandle)을 닫고 ObDereferenceObject 루틴을 호출하여 섹션 개체 자체(SectionObject)를 역참조해야 합니다.
매핑된 섹션 및 메모리 보기를 만드는 방법에 대한 개요 정보는 섹션 개체 및 뷰를 참조하세요. 또한 Microsoft Windows SDK의 CreateFileMapping 루틴에 대한 설명서를 참조하세요.
중요
미니 필터는 FltCreateSectionForDataScan 에 전달된 섹션 컨텍스트를 명시적으로 삭제해서는 안 됩니다. 섹션 컨텍스트가 FltCreateSectionForDataScan 에 전달된 후에는 FltDeleteContext를 호출하지 마세요. 이 경우 FltCloseSectionForDataScan 을 호출하여 섹션 컨텍스트의 할당이 취소되고 스트림에서 제거됩니다.
일반적으로 섹션은 읽기 전용으로 만들어야 합니다. 특히 읽기 전용 파일이 트랜잭션에 있고 미니 필터가 읽기 전용 섹션을 만들지 않는 경우 섹션에 대한 쓰기가 삭제되고 트랜잭션의 일부로 포함되지 않습니다.
요구 사항
| 지원되는 최소 클라이언트 | Windows 8 |
| 대상 플랫폼 | 유니버설 |
| 헤더 | fltkernel.h(Fltkernel.h 포함) |
| 라이브러리 | FltMgr.lib |
| IRQL | <= APC_LEVEL |
참고 항목
피드백
다음에 대한 사용자 의견 제출 및 보기