FltCreateFile 함수(fltkernel.h)
미니 필터 드라이버는 FltCreateFile 을 호출하여 새 파일을 만들거나 기존 파일을 엽니다.
구문
NTSTATUS FLTAPI FltCreateFile(
[in] PFLT_FILTER Filter,
[in, optional] PFLT_INSTANCE Instance,
[out] PHANDLE FileHandle,
[in] ACCESS_MASK DesiredAccess,
[in] POBJECT_ATTRIBUTES ObjectAttributes,
[out] PIO_STATUS_BLOCK IoStatusBlock,
[in, optional] PLARGE_INTEGER AllocationSize,
[in] ULONG FileAttributes,
[in] ULONG ShareAccess,
[in] ULONG CreateDisposition,
[in] ULONG CreateOptions,
[in, optional] PVOID EaBuffer,
[in] ULONG EaLength,
[in] ULONG Flags
);
매개 변수
[in] Filter
호출자에 대한 불투명 필터 포인터입니다.
[in, optional] Instance
만들기 요청을 보낼 미니 필터 드라이버 인스턴스에 대한 불투명 인스턴스 포인터입니다. 인스턴스는 파일 또는 디렉터리가 있는 볼륨에 연결되어야 합니다. 이 매개 변수는 선택 사항이며 NULL 일 수 있습니다. 이 매개 변수가 NULL 이면 요청이 볼륨에 대한 파일 시스템 드라이버 스택의 맨 위에 있는 디바이스 개체로 전송됩니다. NULL 이 아닌 경우 요청은 지정된 인스턴스 아래에 연결된 미니 필터 드라이버 인스턴스로만 전송됩니다.
[out] FileHandle
FltCreateFile 에 대한 호출이 성공한 경우 파일 핸들을 받는 호출자 할당 변수에 대한 포인터입니다.
[in] DesiredAccess
호출자에게 필요한 파일 또는 디렉터리에 대한 액세스 유형을 지정하는 플래그의 비트 마스크입니다. 이 매개 변수에 대한 자세한 내용과 플래그 값 목록은 IoCreateFileEx의 DesiredAccess 매개 변수를 참조하세요.
[in] ObjectAttributes
InitializeObjectAttributes를 사용하여 이미 초기화된 불투명 OBJECT_ATTRIBUTES 구조체에 대한 포인터입니다. 자세한 내용 및 각 구조체 멤버에 대한 설명은 IoCreateFileEx의 ObjectAttributes 매개 변수를 참조하세요.
[out] IoStatusBlock
요청된 작업에 대한 최종 완료 상태 및 정보를 수신하는 IO_STATUS_BLOCK 구조체에 대한 포인터입니다. 이 매개 변수에 대한 자세한 내용은 IoCreateFileEx의 IoStatusBlock 매개 변수를 참조하세요.
[in, optional] AllocationSize
필요에 따라 파일 스트림에 대한 초기 할당 크기(바이트)를 지정합니다. 파일을 만들거나 덮어쓰거나 대체하지 않는 한 0이 아닌 값은 적용되지 않습니다.
[in] FileAttributes
파일을 만들거나 대체하거나 덮어쓰는 경우 설정할 파일 특성을 나타내는 하나 이상의 FILE_ATTRIBUTE_ XXX 플래그를 지정합니다. 자세한 내용 및 플래그 목록은 IoCreateFileEx의 FileAttributes 매개 변수를 참조하세요.
[in] ShareAccess
호출자가 필요로 하는 파일에 대한 공유 액세스 유형을 0개 또는 1개 또는 플래그 조합으로 지정합니다. 자세한 내용 및 플래그 목록은 IoCreateFileEx의 ShareAccess 매개 변수를 참조하세요.
[in] CreateDisposition
파일이 이미 있는지 여부에 따라 수행할 작업을 결정하는 값을 지정합니다. 가능한 값 목록은 IoCreateFileEx의 Disposition 매개 변수를 참조하세요.
[in] CreateOptions
파일을 만들거나 열 때 적용할 옵션을 지정합니다. 이 매개 변수는 IoCreateFileEx의 CreateOptions 매개 변수에 나열되고 설명된 플래그의 호환 가능한 조합입니다.
[in, optional] EaBuffer
파일에 적용할 EA(확장 특성) 정보를 포함하는 호출자 제공 FILE_FULL_EA_INFORMATION 구조화된 버퍼에 대한 포인터입니다.
[in] EaLength
EaBuffer 의 길이(바이트)입니다.
[in] Flags
만들기 요청을 만드는 동안 사용할 옵션을 지정합니다. 가능한 옵션 목록은 IoCreateFileEx 의 Options 매개 변수를 참조하세요.
반환 값
FltCreateFile 은 STATUS_SUCCESS 또는 적절한 NTSTATUS 값을 반환합니다. 가능한 반환 코드 목록은 IoCreateFileEx의 반환 값 섹션을 참조하세요.
참고
FltCreateFile 은 STATUS_FILE_LOCK_CONFLICT 반환 값으로 반환하거나 IoStatusBlock 매개 변수가 가리키는 IO_STATUS_BLOCK 구조체의 Status 멤버로 반환할 수 있습니다. 이는 NTFS 로그 파일이 가득 차 있고 FltCreateFile 이 이 상황을 처리하려고 시도하는 동안 오류가 발생하는 경우에만 발생합니다.
설명
Windows 2000 SP4 및 Windows Server 2003 SP1용 Microsoft Windows 업데이트 롤업 이전 버전의 Windows 미니 필터 드라이버는 IoCreateFile, IoCreateFileSpecifyDeviceObjectHint 또는 ZwCreateFile 대신 FltCreateFile을 호출하여 ZwXxx I/O 루틴과 같은 ZwXxx I/O 루틴에 사용할 파일 핸들을 가져와야 합니다. ZwReadFile 및 ZwQueryInformationFile.
Windows 2000 SP4, Windows Server 2003 SP1 이상용 Microsoft Windows 업데이트 롤업에서 미니 필터 드라이버는 FltCreateFileEx를 사용하여 FltReadFile 및 FltWriteFile과 같은 FltXxxFile 루틴에 사용할 파일 개체 포인터를 가져올 수 있습니다 . 이전 버전의 Windows FltCreateFile 에서 가져온 핸들은 다음과 같이 ObReferenceObjectByHandle을 호출하여 파일 개체 포인터로 변환할 수 있습니다.
status = ObReferenceObjectByHandle(
handle, //Handle
0, //DesiredAccess
NULL, //ObjectType
KernelMode, //AccessMode
&handleFileObject, //Object
NULL); //HandleInformation</pre>
FltCreateFile 은 지정된 미니 필터 드라이버 인스턴스 아래에 연결된 인스턴스와 파일 시스템에만 만들기 요청을 보냅니다. 지정된 인스턴스와 위에 연결된 인스턴스는 만들기 요청을 받지 않습니다. 인스턴스를 지정하지 않으면 요청이 스택의 맨 위로 이동하고 모든 인스턴스 및 파일 시스템에서 수신됩니다.
FltCreateFile 을 사용하여 만들거나 열 파일의 이름을 지정하는 두 가지 다른 방법이 있습니다.
- 입력 ObjectAttributes 의 ObjectName 멤버에 제공된 정규화된 경로 이름입니다.
- 입력 ObjectAttributes 의 RootDirectory 멤버에 있는 핸들이 나타내는 디렉터리 파일을 기준으로 하는 경로 이름입니다.
FltCreateFile 에서 가져온 모든 핸들은 결국 FltClose를 호출하여 해제해야 합니다.
시스템 프로세스 컨텍스트에서 실행되지 않는 드라이버 루틴은 FltCreateFile 의 ObjectAttributes 매개 변수에 대한 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다. 이 특성을 설정하면 FltCreateFile 에서 반환되는 핸들을 커널 모드에서 실행되는 프로세스로 제한합니다. 그렇지 않으면 드라이버가 실행 중인 컨텍스트의 프로세스에서 핸들에 액세스할 수 있습니다.
참고
시스템 교착 상태가 발생할 수 있으므로 NULL이 아닌 최상위 IRP 값으로 이 루틴을 호출하지 마세요.
특정 DesiredAccess 플래그 및 플래그 조합에는 다음과 같은 효과가 있습니다.
반환된 FileHandle 이 신호됨 상태로 설정될 때까지 대기하여 호출자가 I/O 완료를 동기화하려면 SYNCHRONIZE 플래그를 설정해야 합니다.
FILE_APPEND_DATA 및 SYNCHRONIZE 플래그만 설정된 경우 호출자는 파일의 끝에만 쓸 수 있으며 파일에 대한 쓰기에 대한 오프셋 정보는 무시됩니다. 그러나 이 유형의 쓰기 작업에 필요한 경우 파일이 자동으로 확장됩니다.
파일에 대한 FILE_WRITE_DATA 플래그를 설정하면 파일의 끝부분에 있는 쓰기도 발생할 수 있습니다. 파일은 이러한 유형의 쓰기에 대해서도 자동으로 확장됩니다.
FILE_EXECUTE 및 SYNCHRONIZE 플래그만 설정된 경우 호출자는 반환된 FileHandle 을 사용하여 파일을 직접 읽거나 파일에서 데이터를 쓸 수 없습니다. 즉, 파일의 모든 작업은 시스템 페이징 I/O를 사용하여 파일 데이터를 읽거나 써야 합니다.
ShareAccess 매개 변수는 별도의 스레드가 동일한 파일에 동시에 액세스할 수 있는지 여부를 결정합니다. 두 파일 오프너 모두 지정된 방식으로 파일에 액세스할 수 있는 권한이 있는 경우 파일을 성공적으로 열고 공유할 수 있습니다. FltCreateFile 의 원래 호출자가 FILE_SHARE_READ, FILE_SHARE_WRITE 또는 FILE_SHARE_DELETE 지정하지 않으면 원래 호출자에게 파일에 대한 단독 액세스 권한이 부여되므로 파일에 대해 다른 열린 작업을 수행할 수 없습니다.
공유 파일을 성공적으로 열려면 파일에 요청 된 DesiredAccess 가 FltClose와 함께 아직 릴리스되지 않은 모든 이전 열기의 DesiredAccess 및 ShareAccess 사양과 호환되어야 합니다. 즉, 지정된 파일에 대해 FltCreateFile 에 지정된 DesiredAccess 는 파일의 다른 오프너가 허용하지 않은 액세스와 충돌해서는 안 됩니다.
참고
Flags 매개 변수에 IO_IGNORE_SHARE_ACCESS_CHECK 지정되면 I/O 관리자는 ShareAccess 매개 변수를 무시합니다. 그러나 파일 시스템은 여전히 액세스 검사를 수행할 수 있습니다. 따라서 IO_IGNORE_SHARE_ACCESS_CHECK 플래그를 사용하는 경우에도 ShareAccess 매개 변수에 대해 원하는 공유 모드를 지정하는 것이 중요합니다. 또한 IO_IGNORE_SHARE_ACCESS_CHECK 지정되면 파일 시스템은 현재 열려 있는 액세스 또는 공유 액세스를 추적하지 않습니다. 이 때문에 동일한 파일에 대한 후속 열기 호출이 성공할 수 있습니다.
CreateDisposition 값 FILE_SUPERSEDE 호출자에게 기존 파일 개체에 대한 DELETE 액세스 권한이 있어야 합니다. 그렇다면 기존 파일에서 FILE_SUPERSEDE 사용하여 FltCreateFile 을 성공적으로 호출하면 해당 파일이 효과적으로 삭제된 다음 다시 만들어집니다. 이는 파일이 다른 스레드에서 이미 열려 있는 경우 FILE_SHARE_DELETE 플래그 집합으로 ShareAccess 매개 변수를 지정하여 파일을 열었다는 것을 의미합니다. 이러한 유형의 처리는 파일을 덮어쓰는 POSIX 스타일과 일치합니다.
createDisposition 값 FILE_OVERWRITE_IF 및 FILE_SUPERSEDE 비슷합니다. FltCreateFile 이 기존 파일과 이러한 CreateDisposition 값 중 하나를 사용하여 호출되면 파일이 대체됩니다.
다음을 제외하고 파일을 덮어쓰는 것은 의미상 대체 작업과 동일합니다.
- 호출자는 액세스 권한을 삭제하는 대신 파일에 대한 쓰기 권한이 있어야 합니다. 이는 파일이 이미 다른 스레드에서 열려 있는 경우 입력 ShareAccess 에 설정된 FILE_SHARE_WRITE 플래그를 사용하여 파일을 열었다는 것을 의미합니다.
- 지정된 파일 특성은 파일에 이미 있는 특성과 논리적으로 ORed됩니다. 이는 파일이 다른 스레드에서 이미 열려 있는 경우 FltCreateFile 의 후속 호출자가 기존 FileAttributes 플래그를 사용하지 않도록 설정할 수 없지만 동일한 파일에 대해 추가 플래그를 사용하도록 설정할 수 있음을 의미합니다. 이 파일 덮어쓰기 스타일은 MS-DOS, Windows 3.1 및 OS/2와 일치합니다.
CreateOptions FILE_DIRECTORY_FILE 값은 만들거나 열 파일이 디렉터리 파일임을 지정합니다. 디렉터리 파일을 만들 때 파일 시스템은 디스크에 해당 특정 파일 시스템의 디스크 구조에 대한 빈 디렉터리를 나타내는 적절한 구조를 만듭니다. 이 옵션을 지정하고 열 지정된 파일이 디렉터리 파일이 아니거나 호출자가 일관성 없는 CreateOptions 또는 CreateDisposition 값을 지정한 경우 FltCreateFile에 대한 호출이 실패합니다.
CreateOptions FILE_NO_INTERMEDIATE_BUFFERING 플래그를 사용하면 파일 시스템이 호출자를 대신하여 중간 버퍼링을 수행할 수 없습니다. 이 값을 지정하면 호출자의 매개 변수에 특정 제한이 Zw로 지정됩니다. 다음 을 포함한 파일 루틴:
- ZwReadFile 또는 ZwWriteFile에 전달된 바이트 오프셋 값은 섹터 크기의 배수여야 합니다.
- ZwReadFile 또는 ZwWriteFile 에 전달되는 길이 는 섹터 크기의 배수여야 합니다. 길이가 정확히 섹터 크기인 버퍼에 읽기 작업을 지정하면 전송 중에 파일의 끝에 도달한 경우 해당 버퍼로 전송되는 중요한 바이트가 줄어들 수 있습니다.
- 버퍼는 기본 스토리지 디바이스의 맞춤 요구 사항에 따라 정렬되어야 합니다. 이 정보는 FltCreateFile 을 호출하여 물리적 디바이스를 나타내는 파일 개체에 대한 핸들을 가져온 다음 해당 핸들을 사용하여 ZwQueryInformationFile 을 호출하여 FileAlignmentInformation을 FileInformationClass 로 지정하여 가져올 수 있습니다. ntifs.h에 정의된 시스템 FILE_ XXX _ALIGNMENT 값에 대한 자세한 내용은 DEVICE_OBJECT 및 디바이스 개체 초기화를 참조하세요.
- FileInformationClass 매개 변수가 FilePositionInformation 으로 설정된 ZwSetInformationFile에 대한 호출은 섹터 크기의 배수인 오프셋을 지정해야 합니다.
CreateOptions FILE_SYNCHRONOUS_IO_ALERT 및 FILE_SYNCHRONOUS_IO_NONALERT 이름에서 제안한 대로 함께 사용할 수 있으므로 파일이 동기 I/O용으로 열리도록 지정합니다. 즉, 반환된 FileHandle 이 참조하는 파일 개체를 통해 발생하는 한 파일에 대한 모든 I/O 작업이 동기적이어야 합니다. 이러한 파일의 모든 I/O는 반환된 핸들을 사용하여 모든 스레드에서 serialize됩니다. 이러한 CreateOptions 중 하나를 설정하면 I/O 관리자는 파일 개체의 CurrentByteOffset 필드에서 현재 파일 위치 오프셋을 유지 관리합니다. 이 오프셋은 ZwReadFile 및 ZwWriteFile 호출에 사용할 수 있습니다. ZwQueryInformationFile 또는 ZwSetInformationFile을 호출하여 쿼리하거나 설정할 수도 있습니다.
CreateOptions FILE_OPEN_REPARSE_POINT 플래그를 지정하지 않고 FltCreateFile 이 재분석 지점이 있는 파일을 열려고 하면 파일에 대해 일반적인 재분석 지점 처리가 수행됩니다. 반면에 FILE_OPEN_REPARSE_POINT 플래그가 지정되면 일반적인 재 분석 처리가 발생하지 않으며 FltCreateFile 에서 재문 분석 지점 파일을 직접 열려고 시도합니다. 두 경우 모두 열기 작업이 성공하면 FltCreateFile 은 STATUS_SUCCESS; 그렇지 않으면 루틴이 NTSTATUS 오류 코드를 반환합니다. FltCreateFile은 STATUS_REPARSE 반환하지 않습니다.
CreateOptions FILE_OPEN_REQUIRING_OPLOCK 플래그를 사용하면 파일을 열고 타사에서 파일을 열고 공유 위반을 받을 수 있는 oplock을 요청하는 시간 사이의 시간이 제거됩니다. 애플리케이션은 FltCreateFile 에서 FILE_OPEN_REQUIRING_OPLOCK 플래그를 사용한 다음 모든 oplock을 요청할 수 있습니다. 이렇게 하면 공유 위반을 유발하는 나중에 열려 있는 요청이 oplock 소유자에게 알림을 받게 됩니다.
Windows 7에서 애플리케이션이 FILE_OPEN_REQUIRING_OPLOCK 플래그를 사용할 때 다른 핸들이 파일에 있으면 STATUS_OPLOCK_NOT_GRANTED 함께 만들기 작업이 실패합니다. 이 제한은 더 이상 Windows 8 시작되지 않습니다.
이 만들기 작업이 파일에 이미 있는 oplock을 중단하는 경우 FILE_OPEN_REQUIRING_OPLOCK 플래그를 설정하면 만들기 작업이 STATUS_CANNOT_BREAK_OPLOCK 실패합니다. 기존 oplock은 이 만들기 작업으로 인해 손상되지 않습니다.
이 플래그를 사용하는 애플리케이션은 이 호출이 성공한 후 oplock을 요청해야 합니다. 또는 나중에 파일을 열려는 모든 시도는 일반적인 oplock 처리의 이점 없이 차단됩니다. 마찬가지로 이 호출이 성공하지만 이후 oplock 요청이 실패하면 이 플래그를 사용하는 애플리케이션은 oplock 요청이 실패했음을 감지한 후 핸들을 닫아야 합니다.
참고
FILE_OPEN_REQUIRING_OPLOCK 플래그는 Windows 7, Windows Server 2008 R2 이상 Windows 운영 체제에서 사용할 수 있습니다. Windows 7에서 이 플래그를 구현하는 Microsoft 파일 시스템은 NTFS, FAT 및 exFAT입니다.
CreateOptions 플래그 FILE_RESERVE_OPFILTER 사용하면 애플리케이션이 수준 1, 일괄 처리 또는 필터 oplock을 요청하여 다른 애플리케이션이 공유 위반을 받지 못하도록 할 수 있습니다. 그러나 FILE_RESERVE_OPFILTER 필터 oplock에만 실질적으로 유용합니다. 이를 사용하려면 다음 단계를 완료해야 합니다.
FILE_RESERVE_OPFILTER CreateOptions, 정확히 FILE_READ_ATTRIBUTES DesiredAccess 및 정확히 FILE_SHARE_READ | ShareAccess를 사용하여 만들기 요청을 실행합니다. FILE_SHARE_WRITE | FILE_SHARE_DELETE.
- 열려 있는 핸들이 이미 있는 경우 STATUS_OPLOCK_NOT_GRANTED 함께 만들기 요청이 실패하고 다음 요청된 oplock도 실패합니다.
- 더 많은 액세스 또는 더 적은 공유로 열면 STATUS_OPLOCK_NOT_GRANTED 오류가 발생합니다.
만들기 요청이 성공하면 oplock을 요청합니다.
파일에 대한 다른 핸들을 열어 I/O를 수행합니다.
3단계에서는 필터 oplock에 대해서만 이 작업을 실용화합니다. 3단계에서 열린 핸들에는 최대 FILE_READ_ATTRIBUTES | 포함하는 DesiredAccess가 있을 수 있습니다. FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | 동기화 | READ_CONTROL 필터 연동을 중단하지 않습니다. 그러나 FILE_READ_ATTRIBUTES |보다 큰 DesiredAccess는 FILE_WRITE_ATTRIBUTES | SYNCHRONIZE는 수준 1 또는 일괄 처리 oplock을 중단하고 해당 oplock 형식에 FILE_RESERVE_OPFILTER 플래그를 쓸모없게 만듭니다.
NTFS는 FILE_RESERVE_OPFILTER 구현하는 유일한 Microsoft 파일 시스템입니다.
미니 필터 드라이버는 파일 이름을 바꾸려면 ZwSetInformationFile이 아닌 FltSetInformationFile을 사용해야 합니다.
참고
볼륨을 열려고 하지만 DesiredAccess 매개 변수에 대해 다음 플래그의 조합만 지정하면 FltCreateFile 은 볼륨에 대한 스토리지 디바이스에 직접 액세스할 수 있는 파일 시스템과 관계없이 핸들을 엽니다.
- FILE_READ_ATTRIBUTES
- READ_CONTROL
- WRITE_DAC
- WRITE_OWNER
- SYNCHRONIZE
FltCreateFile을 사용하여 볼륨에 대한 스토리지 디바이스에 직접 액세스할 수 있는 핸들을 열거나 시스템 리소스를 누수해서는 안 됩니다. 스토리지 디바이스에 직접 액세스할 수 있는 핸들을 열려면 IoCreateFileEx, IoCreateFileSpecifyDeviceObjectHint 또는 ZwCreateFile 함수를 대신 호출합니다.
요구 사항
| 지원되는 최소 클라이언트 | SP4, Windows XP SP2, Windows Server 2003 SP1 이상 운영 체제용 Microsoft Windows 2000 업데이트 롤업 1에서 사용할 수 있습니다. Windows 2000 SP4 및 이전 운영 체제에서는 사용할 수 없습니다. |
| 대상 플랫폼 | 유니버설 |
| 헤더 | fltkernel.h(FltKernel.h 포함) |
| 라이브러리 | Fltmgr.lib |
| IRQL | PASSIVE_LEVEL |
참조
피드백
다음에 대한 사용자 의견 제출 및 보기