NtCreateFile 함수(ntifs.h)
NtCreateFile 루틴은 새 파일을 만들거나 기존 파일을 엽니다.
구문
__kernel_entry NTSYSCALLAPI NTSTATUS NtCreateFile(
[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
);
매개 변수
[out] FileHandle
파일에 대한 핸들을 수신하는 HANDLE 변수에 대한 포인터입니다.
[in] DesiredAccess
개체에 대한 요청된 액세스를 결정하는 ACCESS_MASK 값을 지정합니다.
호출자는 모든 유형의 개체에 대해 정의된 표준 액세스 권한 외에도 다음과 같은 특정 액세스 권한을 지정할 수 있습니다. 즉, 파일과 관련된 권한입니다.
ACCESS_MASK 플래그 | 호출자가 이 작업을 수행할 수 있도록 허용 |
---|---|
FILE_READ_DATA | 파일에서 데이터를 읽습니다. |
FILE_READ_ATTRIBUTES | 파일의 특성을 읽습니다. 자세한 내용은 FileAttributes 매개 변수에 대한 설명을 참조하세요. |
FILE_READ_EA | 파일의 EA(확장 특성)를 읽습니다. 이 플래그는 디바이스 및 중간 드라이버와 관련이 없습니다. |
FILE_WRITE_DATA | 파일에 데이터를 씁니다. |
FILE_WRITE_ATTRIBUTES | 파일의 특성을 작성합니다. 자세한 내용은 FileAttributes 매개 변수에 대한 설명을 참조하세요. |
FILE_WRITE_EA | 파일의 EA(확장 특성)를 변경합니다. 이 플래그는 디바이스 및 중간 드라이버와 관련이 없습니다. |
FILE_APPEND_DATA | 파일에 데이터를 추가합니다. |
FILE_EXECUTE | 시스템 페이징 I/O를 사용하여 파일에서 메모리로 데이터를 읽습니다. 이 플래그는 디바이스 및 중간 드라이버와 관련이 없습니다. |
참고
디렉터리를 만들거나 열 때 FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATA 또는 FILE_EXECUTE 지정하지 마세요.
호출자는 다음 제네릭 액세스 권한(각 제네릭 액세스 권한의 의미가 개체 형식과 관련된 모든 개체 형식에 적용되는 권한)을 지정할 수도 있습니다. 파일 개체에 대한 일반 액세스 권한은 다음 표와 같이 특정 액세스 권한에 해당합니다. ("correspond"는 "maps to"를 의미하며 제네릭 권한의 값이 특정 권한 매핑의 비트 OR 값과 "같음"을 의미하지는 않습니다. I/O 관리자는 실제 매핑을 정의합니다.
일반 액세스 권한 | 이러한 특정 액세스 권한에 매핑 |
---|---|
GENERIC_READ | STANDARD_RIGHTS_READ, FILE_READ_DATA, FILE_READ_ATTRIBUTES, FILE_READ_EA 및 SYNCHRONIZE |
GENERIC_WRITE | STANDARD_RIGHTS_WRITE, FILE_WRITE_DATA, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA 및 SYNCHRONIZE |
GENERIC_EXECUTE | STANDARD_RIGHTS_EXECUTE, FILE_EXECUTE, FILE_READ_ATTRIBUTES 및 SYNCHRONIZE. 이 값은 디바이스 및 중간 드라이버와 관련이 없습니다. |
GENERIC_ALL | FILE_ALL_ACCESS |
참고
일반 액세스 권한은 파일에 대해서만 지정할 수 있습니다. 디렉터리에 대해 지정할 수 없습니다.
일부 CreateOptions 플래그는 NtCreateFile이 호출될 때 DesiredAccess에서 특정 액세스 플래그를 설정해야 합니다. 자세한 내용은 CreateOptions 매개 변수를 참조하세요.
예를 들어 파일 개체에 GENERIC_READ 지정하는 경우 루틴은 이 값을 특정 액세스 권한의 FILE_GENERIC_READ 비트 마스크에 매핑합니다. 앞의 표에서 GENERIC_READ 나열된 특정 액세스 권한은 FILE_GENERIC_READ 비트 마스크에 포함된 액세스 플래그에 해당하지만 같지는 않습니다.
파일이 실제로 디렉터리인 경우 호출자는 다음 일반 액세스 권한을 지정할 수도 있습니다.
DesiredAccess 플래그 | 호출자가 이 작업을 수행할 수 있도록 허용 |
---|---|
FILE_LIST_DIRECTORY | 디렉터리의 파일을 나열합니다. |
FILE_TRAVERSE | 디렉터리를 트래버스합니다. 즉, 파일 경로에 디렉터리를 포함합니다. |
액세스 권한에 대한 자세한 내용은 ACCESS_MASK 및 액세스 권한을 참조하세요.
[in] ObjectAttributes
개체 이름 및 기타 특성을 지정하는 OBJECT_ATTRIBUTES 구조체에 대한 포인터입니다. InitializeObjectAttributes를 사용하여 이 구조를 초기화합니다. 호출자가 시스템 스레드 컨텍스트에서 실행되고 있지 않으면 InitializeObjectAttributes를 호출할 때 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다.
[out] IoStatusBlock
최종 완료 상태 수신하는 IO_STATUS_BLOCK 구조체에 대한 포인터 및 요청된 작업에 대한 기타 정보입니다. 특히 정보 멤버는 다음 값 중 하나를 받습니다.
- FILE_CREATED
- FILE_OPENED
- FILE_OVERWRITTEN
- FILE_SUPERSEDED
- FILE_EXISTS
- FILE_DOES_NOT_EXIST
[in, optional] AllocationSize
만들거나 덮어쓴 파일에 대한 초기 할당 크기(바이트)를 포함하는 LARGE_INTEGER 대한 포인터입니다. AllocationSize가 NULL이면 할당 크기가 지정되지 않습니다. 파일을 만들거나 덮어쓰지 않으면 AllocationSize 가 무시됩니다.
[in] FileAttributes
파일을 만들거나 덮어쓸 때 설정할 파일 특성을 나타내는 하나 이상의 FILE_ATTRIBUTE_XXX 플래그를 지정합니다. 호출자는 일반적으로 기본 특성을 설정하는 FILE_ATTRIBUTE_NORMAL 지정합니다. 유효한 FILE_ATTRIBUTE_XXX 플래그 목록은 Microsoft Windows SDK 설명서의 CreateFile 루틴을 참조하세요. 파일을 만들거나 덮어쓰지 않으면 FileAttributes 가 무시됩니다.
[in] ShareAccess
다음 플래그의 조합 또는 0으로 지정된 공유 액세스 유형입니다.
ShareAccess 플래그 | 다른 스레드에서 이 작업을 수행할 수 있도록 허용 |
---|---|
FILE_SHARE_READ | 파일 읽기 |
FILE_SHARE_WRITE | 파일 작성 |
FILE_SHARE_DELETE | 파일 삭제 |
디바이스 및 중간 드라이버는 일반적으로 ShareAccess 를 0으로 설정하므로 호출자에게 열려 있는 파일에 대한 단독 액세스 권한을 부여합니다.
[in] CreateDisposition
파일이 있거나 없는 경우 수행할 작업을 지정합니다. CreateDisposition 은 다음 표의 값 중 하나일 수 있습니다.
CreateDisposition 값 | 파일이 있는 경우 작업 | 파일이 없는 경우 작업 |
---|---|---|
FILE_SUPERSEDE | 파일을 바꿉다. | 파일을 만듭니다. |
FILE_CREATE | 오류를 반환합니다. | 파일을 만듭니다. |
FILE_OPEN | 파일을 엽니다. | 오류를 반환합니다. |
FILE_OPEN_IF | 파일을 엽니다. | 파일을 만듭니다. |
FILE_OVERWRITE | 파일을 열고 덮어씁 수 있습니다. | 오류를 반환합니다. |
FILE_OVERWRITE_IF | 파일을 열고 덮어씁 수 있습니다. | 파일을 만듭니다. |
[in] CreateOptions
드라이버가 파일을 만들거나 열 때 적용할 옵션을 지정합니다. 다음 표에서 하나 이상의 플래그를 사용합니다.
CreateOptions 플래그 | 의미 |
---|---|
FILE_DIRECTORY_FILE(0x00000001) | 파일이 디렉터리입니다. 호환되는 CreateOptions 플래그는 FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENT 및 FILE_OPEN_BY_FILE_ID. CreateDisposition 매개 변수는 FILE_CREATE, FILE_OPEN 또는 FILE_OPEN_IF 설정해야 합니다. |
FILE_WRITE_THROUGH(0x00000002) | 요청된 쓰기 작업이 완료된 것으로 간주되기 전에 파일에 데이터를 쓰는 시스템 서비스, 파일 시스템 드라이버 및 드라이버가 실제로 데이터를 파일로 전송해야 합니다. |
FILE_SEQUENTIAL_ONLY(0x00000004) | 파일에 대한 모든 액세스는 순차적으로 적용됩니다. |
FILE_NO_INTERMEDIATE_BUFFERING(0x00000008) | 파일은 드라이버의 내부 버퍼에서 캐시하거나 버퍼링할 수 없습니다. 이 플래그는 DesiredAccess 매개 변수의 FILE_APPEND_DATA 플래그와 호환되지 않습니다. |
FILE_SYNCHRONOUS_IO_ALERT(0x00000010) | 파일에 대한 모든 작업은 동기적으로 수행됩니다. 호출자를 대신하여 대기하는 모든 대기는 경고에서 조기 종료될 수 있습니다. 또한 이 플래그를 사용하면 I/O 시스템에서 파일 위치 포인터를 유지 관리합니다. 이 플래그가 설정되면 SYNCHRONIZE 플래그를 DesiredAccess 매개 변수에 설정해야 합니다. |
FILE_SYNCHRONOUS_IO_NONALERT(0x00000020) | 파일에 대한 모든 작업은 동기적으로 수행됩니다. I/O 큐와 완료를 동기화하는 시스템의 대기에는 경고가 적용되지 않습니다. 또한 이 플래그를 사용하면 I/O 시스템이 파일 위치 컨텍스트를 유지 관리합니다. 이 플래그가 설정되면 SYNCHRONIZE 플래그를 DesiredAccess 매개 변수에 설정해야 합니다. |
FILE_NON_DIRECTORY_FILE(0x00000040) | 파일이 디렉터리가 아닙니다 . 열 파일 개체는 데이터 파일을 나타낼 수 있습니다. 논리적, 가상 또는 물리적 디바이스; 또는 볼륨입니다. Windows 11 버전 24H2부터 NTFS는 이제 $INDEX_ALLOCATION 특성을 열 때 이 플래그를 적용합니다. |
FILE_CREATE_TREE_CONNECTION(0x00000080) | 네트워크를 통해 열기 위해 이 파일에 대한 트리 연결을 Create. 이 플래그는 디바이스 및 중간 드라이버에서 사용되지 않습니다. |
FILE_COMPLETE_IF_OPLOCKED(0x00000100) | 호출자의 스레드를 차단하는 대신 대상 파일이 잠겨 있는 경우 STATUS_OPLOCK_BREAK_IN_PROGRESS 대체 성공 코드로 이 작업을 즉시 완료합니다. 파일이 잠겨 있으면 다른 호출자가 이미 파일에 액세스할 수 있습니다. 이 플래그는 디바이스 및 중간 드라이버에서 사용되지 않습니다. |
FILE_NO_EA_KNOWLEDGE(0x00000200) | 열려 있는 기존 파일에 대한 확장 특성(EA)이 호출자가 파일을 제대로 해석하기 위해 EA를 이해해야 함을 나타내는 경우 NtCreateFile 에서 오류를 반환해야 합니다. 이 플래그는 디바이스 및 중간 드라이버와 관련이 없습니다. |
FILE_OPEN_REMOTE_INSTANCE(0x00000400) | 시스템 사용을 위해 예약됨; 를 사용하지 마세요. |
FILE_RANDOM_ACCESS(0x00000800) | 파일에 대한 액세스는 임의일 수 있으므로 파일 시스템 드라이버 또는 시스템에서 순차적 미리 읽기 작업을 수행해서는 안 됩니다. |
FILE_DELETE_ON_CLOSE(0x00001000) | 시스템은 파일에 대한 마지막 핸들이 NtClose에 전달될 때 파일을 삭제합니다. 이 플래그가 설정되면 DesiredAccess 매개 변수에서 DELETE 플래그를 설정해야 합니다. |
FILE_OPEN_BY_FILE_ID(0x00002000) | ObjectAttributes 매개 변수로 지정된 파일 이름에는 파일 시스템에 따라 파일에 대한 이진 8바이트 또는 16바이트 파일 참조 번호 또는 개체 ID가 포함됩니다. 필요에 따라 디바이스 이름 뒤에 백슬래시 문자가 있으면 이러한 이진 값을 진행할 수 있습니다. 자세한 내용 및 예제는 비고를 참조하세요. |
FILE_OPEN_FOR_BACKUP_INTENT(0x00004000) | 백업 의도를 위해 파일이 열리고 있습니다. 따라서 시스템에서 특정 액세스 권한을 검사 파일의 보안 설명자에 대해 DesiredAccess 매개 변수를 검사하기 전에 호출자에게 파일에 대한 적절한 액세스 권한을 부여해야 합니다. 이 플래그는 디바이스 및 중간 드라이버에서 사용되지 않습니다. |
FILE_NO_COMPRESSION(0x00008000) | 부모 디렉터리에서 FILE_ATTRIBUTE_COMPRESSED 상속을 표시하지 않습니다. 이렇게 하면 압축된 것으로 표시된 디렉터리에서 압축되지 않은 파일을 만들 수 있습니다. |
FILE_OPEN_REQUIRING_OPLOCK(0x00010000) | 파일이 열리고 파일의 기회 잠금(oplock)이 단일 원자성 작업으로 요청됩니다. 파일 시스템은 만들기 작업을 수행하기 전에 oplock을 확인하고, 결과가 기존 oplock을 중단하는 경우 STATUS_CANNOT_BREAK_OPLOCK 반환 코드로 만들기에 실패합니다. 이 플래그는 Windows 7 및 Windows Server 2008 R2부터 사용할 수 있습니다. |
FILE_DISALLOW_EXCLUSIVE(0x00020000) | 기존 파일을 열 때 FILE_SHARE_READ 지정되지 않고 파일 시스템 액세스 검사에서 호출자에게 파일에 대한 쓰기 권한을 부여하지 않는 경우 STATUS_ACCESS_DENIED 이 열기에 실패합니다. 이는 Windows 7 이전의 기본 동작이었습니다. 이 플래그는 Windows 7 및 Windows Server 2008 R2부터 사용할 수 있습니다. |
FILE_SESSION_AWARE(0x00040000) | 파일 또는 디바이스를 여는 클라이언트는 세션을 인식하고 필요한 경우 세션당 액세스의 유효성을 검사합니다. 이 플래그는 Windows 8 시작하여 사용할 수 있습니다. |
FILE_RESERVE_OPFILTER(0x00100000) | 이 플래그를 사용하면 애플리케이션에서 필터 기회 잠금(oplock)을 요청하여 다른 애플리케이션이 공유 위반을 방지할 수 있습니다. 열려 있는 핸들이 이미 있는 경우 만들기 요청은 STATUS_OPLOCK_NOT_GRANTED 실패합니다. 자세한 내용은 아래 설명 부분을 참조하십시오. |
FILE_OPEN_REPARSE_POINT(0x00200000) | 재분석 지점이 있는 파일을 열고 파일에 대한 일반 재분석 지점 처리를 무시합니다. 자세한 내용은 아래 설명 부분을 참조하십시오. |
FILE_OPEN_NO_RECALL(0x00400000) | 오프라인 스토리지 또는 가상화를 수행하는 필터에 이 열기의 결과로 파일의 내용을 회수하지 않도록 지시합니다. |
FILE_OPEN_FOR_FREE_SPACE_QUERY(0x00800000) | 이 플래그는 호출 스레드와 연결된 사용자를 캡처하도록 파일 시스템에 지시합니다. 반환된 핸들을 사용하여 FltQueryVolumeInformation 또는 ZwQueryVolumeInformationFile에 대한 후속 호출은 호출자가 사용할 수 있는 여유 공간을 계산하기 위해 당시 호출 사용자가 아닌 캡처된 사용자를 가정합니다. 이는 다음 FsInformationClass 값에 적용됩니다. FileFsSizeInformation, FileFsFullSizeInformation 및 FileFsFullSizeInformationEx. |
FILE_CONTAINS_EXTENDED_CREATE_INFORMATION(0x10000000) | EaBuffer 매개 변수를 EXTENDED_CREATE_INFORMATION instance 해석합니다. 이 플래그는 Windows 11 버전 22H2부터 사용할 수 있습니다. |
[in, optional] EaBuffer
디바이스 및 중간 드라이버의 경우 이 매개 변수는 NULL 포인터여야 합니다.
[in] EaLength
디바이스 및 중간 드라이버의 경우 이 매개 변수는 0이어야 합니다.
반환 값
NtCreateFile 은 성공 시 STATUS_SUCCESS 반환하거나 실패 시 적절한 NTSTATUS 오류 코드를 반환합니다. 후자의 경우 호출자는 IoStatusBlock 매개 변수를 확인하여 실패의 원인을 확인할 수 있습니다.
참고
NtCreateFile은 STATUS_FILE_LOCK_CONFLICT 반환 값 또는 IoStatusBlock 매개 변수가 가리키는 IO_STATUS_BLOCK 구조체의 Status 멤버로 반환할 수 있습니다. NTFS 로그 파일이 가득 차 있고 NtCreateFile 이 이 상황을 처리하려고 하는 동안 오류가 발생하는 경우에만 발생합니다.
설명
NtCreateFile 은 호출자가 파일의 데이터 또는 파일 개체의 상태 및 특성을 조작하는 데 사용할 수 있는 핸들을 제공합니다. 자세한 내용은 드라이버에서 파일 사용을 참조하세요.
FileHandle에서 가리키는 핸들이 더 이상 사용되지 않으면 드라이버는 NtClose를 호출하여 닫아야 합니다.
호출자가 시스템 스레드 컨텍스트에서 실행되고 있지 않으면 호출자가 만드는 핸들이 프라이빗 핸들인지 확인해야 합니다. 그렇지 않으면 드라이버가 실행 중인 컨텍스트의 프로세스에서 핸들에 액세스할 수 있습니다. 자세한 내용은 개체 핸들을 참조하세요.
NtCreateFile을 사용하여 만들거나 열 파일의 이름을 지정하는 두 가지 다른 방법이 있습니다.
- 입력 ObjectAttributes의 ObjectName 멤버에 제공된 정규화된 경로 이름입니다.
- 입력 ObjectAttributes의 RootDirectory 멤버에 있는 핸들이 나타내는 디렉터리 파일을 기준으로 하는 경로 이름입니다.
DesiredAccess 매개 변수에서 특정 플래그를 설정하면 다음과 같은 효과가 발생합니다.
- 호출자가 반환된 FileHandle을 대기하여 I/O 완료를 동기화하려면 SYNCHRONIZE 플래그를 설정해야 합니다. 그렇지 않으면 디바이스 또는 중간 드라이버인 호출자는 이벤트 개체를 사용하여 I/O 완료를 동기화해야 합니다.
- 호출자가 FILE_APPEND_DATA 및 SYNCHRONIZE 플래그만 설정하는 경우 파일의 끝에만 쓸 수 있으며 파일에 대한 쓰기 작업에 대한 오프셋 정보는 무시됩니다. 이 유형의 작업에 필요한 경우 파일이 자동으로 확장됩니다.
- 또한 파일에 대한 FILE_WRITE_DATA 플래그를 설정하면 호출자가 파일의 끝 부분을 넘어 쓸 수 있습니다. 다시 말하지만 파일은 필요에 따라 자동으로 확장됩니다.
- 호출자가 FILE_EXECUTE 및 SYNCHRONIZE 플래그만 설정하는 경우 반환된 FileHandle을 사용하여 파일에 데이터를 직접 읽거나 쓸 수 없습니다. 즉, 파일에 대한 모든 작업은 명령 및 데이터 액세스 작업에 대한 응답으로 시스템 호출기를 통해 발생합니다. 디바이스 및 중간 드라이버는 FILE_EXECUTE 플래그를 설정해서는 안 됩니다.
ShareAccess 매개 변수는 별도의 스레드가 동일한 파일에 동시에 액세스할 수 있는지 여부를 결정합니다. 두 호출자 모두 적절한 액세스 권한이 있는 경우 파일을 성공적으로 열고 공유할 수 있습니다. NtCreateFile의 원래 호출자가 FILE_SHARE_READ, FILE_SHARE_WRITE 또는 FILE_SHARE_DELETE 지정하지 않으면 다른 호출자가 파일을 열 수 없습니다. 즉, 원래 호출자에게 단독 액세스 권한이 부여됩니다.
공유 파일을 성공적으로 열려면 DesiredAccess 플래그가 를 통해 아직 릴리스되지 않은 모든 이전 열린 작업의 DesiredAccess 및 ShareAccess 플래그와 호환되어야 합니다. 즉, 지정된 파일에 대해 NtCreateFile에 지정된 DesiredAccess는 파일의 다른 오프너가 허용하지 않은 액세스와 충돌해서는 안 됩니다.
CreateDisposition 값 FILE_SUPERSEDE 호출자에게 기존 파일 개체에 대한 DELETE 액세스 권한이 있어야 합니다. 이 경우 기존 파일에서 FILE_SUPERSEDE 사용하여 NtCreateFile 을 성공적으로 호출하면 해당 파일이 효과적으로 삭제된 다음 다시 만들어집니다. 이는 파일이 이미 다른 스레드에서 열려 있는 경우 FILE_SHARE_DELETE 플래그 집합을 사용하여 ShareAccess 매개 변수를 지정하여 파일을 열었다는 것을 의미합니다. 이러한 유형의 처리는 파일을 덮어쓰는 POSIX 스타일과 일치합니다.
FILE_OVERWRITE_IF 및 FILE_SUPERSEDE CreateDisposition 값은 비슷합니다. NtCreateFile이 기존 파일과 이러한 CreateDisposition 값 중 하나로 호출되면 파일이 대체됩니다.
파일을 덮어쓰는 것은 다음을 제외하고 대체 작업과 의미상 동일합니다.
- 호출자는 액세스 권한을 삭제하는 대신 파일에 대한 쓰기 권한이 있어야 합니다. 이는 파일이 다른 스레드에서 이미 열려 있는 경우 입력 ShareAccess에 설정된 FILE_SHARE_WRITE 플래그로 파일을 열었다는 것을 의미합니다.
- 지정된 파일 특성은 논리적으로 파일에 이미 있는 특성과 함께 ORed됩니다. 즉, 다른 스레드에서 파일을 이미 연 경우 NtCreateFile 의 후속 호출자는 기존 FileAttributes 플래그를 사용하지 않도록 설정할 수 없지만 동일한 파일에 대해 추가 플래그를 사용하도록 설정할 수 있습니다. 이 파일 덮어쓰기 스타일은 MS-DOS, Microsoft Windows 3.1 및 OS/2와 일치합니다.
FILE_DIRECTORY_FILE CreateOptions 값은 만들거나 열 파일이 디렉터리임을 지정합니다. 디렉터리 파일을 만들 때 파일 시스템은 디스크에 해당 특정 파일 시스템의 디스크 내 구조에 대한 빈 디렉터리를 나타내는 적절한 구조를 만듭니다. 이 옵션을 지정하고 열 지정된 파일이 디렉터리 파일이 아니거나 호출자가 일관성 없는 CreateOptions 또는 CreateDisposition 값을 지정한 경우 NtCreateFile 에 대한 호출이 실패합니다.
FILE_NO_INTERMEDIATE_BUFFERING CreateOptions 플래그는 파일 시스템이 호출자를 대신하여 중간 버퍼링을 수행하지 못하도록 합니다. 이 플래그를 지정하면 호출자의 매개 변수에 다른 ZwXxx파일 루틴에 다음과 같은 제한이 적용됩니다.
- NtReadFile 또는 NtWriteFile에 전달된 선택적 ByteOffset은 섹터 크기의 배수여야 합니다.
- NtReadFile 또는 NtWriteFile에 전달된 길이는 섹터 크기의 정수여야 합니다. 길이가 정확히 섹터 크기인 버퍼에 읽기 작업을 지정하면 전송 중에 파일의 끝에 도달한 경우 해당 버퍼로 전송되는 상당한 바이트 수가 줄어들 수 있습니다.
- 버퍼는 기본 디바이스의 맞춤 요구 사항에 따라 정렬되어야 합니다. 이 정보를 가져오려면 NtCreateFile 을 호출하여 물리적 디바이스를 나타내는 파일 개체에 대한 핸들을 가져오고 해당 핸들을 NtQueryInformationFile에 전달합니다. 시스템의 FILE_XXX_ALIGNMENT 값 목록은 DEVICE_OBJECT 참조하세요.
- FileInformationClass 매개 변수가 FilePositionInformation으로 설정된 NtSetInformationFile에 대한 호출은 섹터 크기의 배수인 오프셋을 지정해야 합니다.
FILE_SYNCHRONOUS_IO_ALERT 및 FILE_SYNCHRONOUS_IO_NONALERT CreateOptions 플래그(상호 배타적임)는 반환된 FileHandle에서 참조하는 파일 개체를 통해 작업이 발생하는 한 파일의 모든 I/O 작업이 동기되도록 지정합니다. 이러한 파일의 모든 I/O는 반환된 핸들을 사용하여 모든 스레드에서 직렬화됩니다. 이러한 CreateOptions 플래그 중 하나가 설정된 경우 I/O 관리자가 파일 개체를 동기화 개체로 사용하도록 강제하도록 SYNCHRONIZE DesiredAccess 플래그도 설정해야 합니다. 이러한 경우 I/O 관리자는 NtReadFile 및NtWriteFile에 전달할 수 있는 현재 파일 위치 오프셋을 추적합니다. NtQueryInformationFile 또는 NtSetInformationFile을 호출하여 이 위치를 얻거나 설정합니다.
CreateOptions FILE_OPEN_REPARSE_POINT 플래그를 지정하지 않고NtCreateFile이 재분석 지점이 있는 파일을 열려고 하면 파일에 대해 일반적인 재분석 지점 처리가 발생합니다. 반면에 FILE_OPEN_REPARSE_POINT 플래그를 지정하면 정상적인 재분석 처리가 수행 되지 않고NtCreateFile 이 재분석 지점 파일을 직접 열려고 시도합니다. 두 경우 모두 열려 있는 작업이 성공하면 NtCreateFile 은 STATUS_SUCCESS 반환합니다. 그렇지 않으면 루틴은 NTSTATUS 오류 코드를 반환합니다. NtCreateFile은 STATUS_REPARSE 반환하지 않습니다.
CreateOptions FILE_OPEN_REQUIRING_OPLOCK 플래그는 파일을 열고 제3자가 파일을 열고 공유 위반을 가져올 수 있는 oplock을 요청하는 시점 사이의 시간을 제거합니다. 애플리케이션은 NtCreateFile 에서 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은 이 만들기 작업으로 인해 손상되지 않습니다.
FILE_OPEN_REQUIRING_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, Batch 또는 Filter 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 | SYNCHRONIZE | READ_CONTROL 필터 연산자를 중단하지 않습니다. 그러나 FILE_READ_ATTRIBUTES 보다 큰 DesiredAccess | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE는 수준 1 또는 Batch oplock을 중단하고 해당 oplock 형식에 FILE_RESERVE_OPFILTER 플래그를 쓸모없게 만듭니다.
NTFS는 FILE_RESERVE_OPFILTER 구현하는 유일한 Microsoft 파일 시스템입니다.
CreateOptions FILE_OPEN_BY_FILE_ID 플래그의 경우 예제 디바이스 이름에 형식이 있습니다.
\??\C:\<FileID>
\device\HardDiskVolume1\<ObjectID>
여기서 FileID는 8바이트이고 ObjectID는 16바이트입니다.
- NTFS에서 8 바이트 또는 16 바이트 참조 번호 또는 개체 ID일 수 있습니다. 16바이트 참조 번호는 0으로 패딩된 8바이트 숫자와 같습니다.
- ReFS에서 8 바이트 또는 16 바이트 참조 번호일 수 있습니다. 16 바이트 번호는 8 바이트 번호와 관련이 없습니다. 개체 ID는 지원되지 않습니다.
- FAT, ExFAT, UDFS 및 CDFS 파일 시스템은 FILE_OPEN_BY_FILE_ID 플래그를 지원하지 않습니다.
이 번호는 에 의해 할당되고 특정 파일 시스템에 따라 지정됩니다. 파일 이름 필드에는 이진 Blob이 부분적으로 포함되기 때문에 유효한 유니코드 문자열이라고 가정하는 것은 잘못된 것이며, 더 중요한 것은 null로 끝나는 문자열이 아닐 수도 있습니다.
NtCreateFile의 호출자는 IRQL = PASSIVE_LEVEL 및 특수 커널 APC를 사용하도록 설정된 상태에서 실행되어야 합니다.
참고
이 함수에 대한 호출이 사용자 모드에서 발생하는 경우 "ZwCreateFile" 대신 "NtCreateFile" 이름을 사용해야 합니다.
커널 모드 드라이버에서 호출하는 경우 Windows 네이티브 시스템 서비스 루틴의 NtXxx 및 ZwXxx 버전은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. 루틴의 NtXxx 버전과 ZwXxx 버전 간의 관계에 대한 자세한 내용은 네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용을 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000 |
대상 플랫폼 | 유니버설 |
헤더 | ntifs.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL(설명 섹션 참조) |
DDI 규정 준수 규칙 | HwStorPortProhibitedDDIs, PowerIrpDDis |