다음을 통해 공유


NtCreateFile 함수(winternl.h)

새 파일 또는 디렉터리를 만들거나 기존 파일, 디바이스, 디렉터리 또는 볼륨을 엽니다.

이 함수는 WDK(Windows 드라이버 키트)에 설명된 ZwCreateFile 함수와 동일한 사용자 모드입니다.

통사론

__kernel_entry 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]           PVOID              EaBuffer,
  [in]           ULONG              EaLength
);

매개 변수

[out] FileHandle

호출에 성공하면 파일 핸들을 받는 변수에 대한 포인터입니다.

[in] DesiredAccess

호출자가 파일 또는 디렉터리에 필요한 액세스 유형을 나타내는 ACCESS_MASK 값입니다. 시스템 정의 DesiredAccess 플래그 집합은 파일 개체에 대한 다음과 같은 특정 액세스 권한을 결정합니다.

의미
DELETE
파일을 삭제할 수 있습니다.
FILE_READ_DATA
파일에서 데이터를 읽을 수 있습니다.
FILE_READ_ATTRIBUTES
FileAttributes 플래그(나중에 설명)를 읽을 수 있습니다.
FILE_READ_EA
파일과 연결된 확장 특성을 읽을 수 있습니다. 이 플래그는 디바이스 및 중간 드라이버와 관련이 없습니다.
READ_CONTROL
ACL(액세스 제어 목록) 및 파일과 연결된 소유권 정보를 읽을 수 있습니다.
FILE_WRITE_DATA
데이터를 파일에 쓸 수 있습니다.
FILE_WRITE_ATTRIBUTES
FileAttributes 플래그를 작성할 수 있습니다.
FILE_WRITE_EA
파일과 연결된 EA(확장 특성)를 작성할 수 있습니다. 이 플래그는 디바이스 및 중간 드라이버와 관련이 없습니다.
FILE_APPEND_DATA
데이터를 파일에 추가할 수 있습니다.
WRITE_DAC
파일과 연결된 DACL(임의 액세스 제어 목록)을 작성할 수 있습니다.
WRITE_OWNER
파일과 연결된 소유권 정보를 작성할 수 있습니다.
동기화
반환된 FileHandle I/O 작업의 완료와 동기화하기 위해 대기할 수 있습니다. 동기 I/O에 대해 FileHandle 열리지 않은 경우 이 값은 무시됩니다.
FILE_EXECUTE
시스템 페이징 I/O를 사용하여 파일에서 메모리로 데이터를 읽을 수 있습니다. 이 플래그는 디바이스 및 중간 드라이버와 관련이 없습니다.
  디렉터리를 만들거나 열 때 FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATA또는 FILE_EXECUTE 지정하지 마세요.

NtCreateFile 호출자는 디렉터리 파일을 나타내지 않는 파일 개체에 대해 이전 DesiredAccess 플래그 목록의 추가 호환 플래그가 있는 비트 OR을 사용하여 다음 중 하나 또는 조합을 지정할 수 있습니다.

의미
FILE_GENERIC_READ
STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE
FILE_GENERIC_WRITE
STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE
FILE_GENERIC_EXECUTE
STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE

FILE_GENERIC_EXECUTE 값은 디바이스 및 중간 드라이버와 관련이 없습니다.

STANDARD_RIGHTS_XXX 시스템 개체에 보안을 적용하는 데 사용되는 미리 정의된 시스템 값입니다.

CreateOptions 매개 변수와 함께 표시된 대로 디렉터리 파일을 열거나 만들려면 NtCreateFile 호출자는 이전 DesiredAccess 플래그 목록에서 하나 이상의 호환 플래그가 있는 비트 OR을 사용하여 다음 중 하나 또는 조합을 지정할 수 있습니다.

의미
FILE_LIST_DIRECTORY
디렉터리의 파일을 나열할 수 있습니다.
FILE_TRAVERSE
디렉터리를 트래버스할 수 있습니다. 즉, 파일의 경로 이름에 속할 수 있습니다.

[in] ObjectAttributes

InitializeObjectAttributes사용하여 이미 초기화된 구조체에 대한 포인터입니다. 파일 개체에 대한 이 구조체의 멤버는 다음과 같습니다.

의미
ULONG 길이
제공된 ObjectAttributes의 바이트 수를 지정합니다. 이 값은 적어도 sizeof(OBJECT_ATTRIBUTES)여야 합니다.
HANDLE RootDirectory
필요에 따라 NtCreateFile대한 이전 호출에서 가져온 디렉터리에 대한 핸들을 지정합니다. 이 값이 NULL경우 ObjectName 멤버는 대상 파일의 전체 경로를 포함하는 정규화된 파일 사양이어야 합니다. 이 값이NULL이 아닌경우 ObjectName 멤버는 이 디렉터리를 기준으로 파일 이름을 지정합니다.
ObjectName PUNICODE_STRING
만들거나 열 파일의 이름을 지정하는 버퍼링된 유니코드 문자열을 가리킵니다. 이 값은 RootDirectory지정한 디렉터리에 상대적인 파일의 이름이 아닌 한 디바이스 개체의 이름 또는 정규화된 파일 사양이어야 합니다. 예를 들어 \Device\Floppy1\myfile.dat 또는 \?? \B:\myfile.dat 플로피 드라이버와 오버레이 파일 시스템이 이미 로드되어 있는 경우 정규화된 파일 사양일 수 있습니다. 자세한 내용은 파일 이름, 경로 및 네임스페이스참조하세요.
ULONG 특성
파일 개체 특성을 제어하는 플래그 집합입니다. 이 값은 0 또는 OBJ_CASE_INSENSITIVE수 있습니다. 즉, 이름 조회 코드가 정확한 일치 검색을 수행하는 대신 ObjectName 멤버의 대/소문자를 무시해야 함을 나타냅니다. OBJ_INHERIT 값은 디바이스 및 중간 드라이버와 관련이 없습니다.
PSECURITY_DESCRIPTOR SecurityDescriptor
필요에 따라 파일에 적용할 보안 설명자를 지정합니다. 이러한 보안 설명자로 지정된 ACL은 생성될 때만 파일에 적용됩니다. 파일을 만들 때 값이 NULL 경우 파일에 배치된 ACL은 파일 시스템에 종속됩니다. 대부분의 파일 시스템은 호출자의 기본 ACL과 결합된 부모 디렉터리 파일에서 이러한 ACL의 일부를 전파합니다. 디바이스 및 중간 드라이버는 이 멤버를 NULL설정할 수 있습니다.
securityQualityOfService PSECURITY_QUALITY_OF_SERVICE
서버가 클라이언트의 보안 컨텍스트에 부여되어야 하는 액세스 권한을 지정합니다. 이 값은 보호된 서버에 대한 연결이 설정된 경우에만NULL 호출자가 서버에서 사용할 수 있는 호출자 보안 컨텍스트의 일부와 서버에서 호출자를 가장할 수 있는지 여부를 제어할 수 있도록 합니다.

[out] IoStatusBlock

요청된 작업에 대한 최종 완료 상태 및 정보를 받는 변수에 대한 포인터입니다. NtCreateFile반환할 때 Information 멤버에는 다음 값 중 하나가 포함됩니다.

  • FILE_CREATED
  • FILE_OPENED
  • FILE_OVERWRITTEN
  • FILE_SUPERSEDED
  • FILE_EXISTS
  • FILE_DOES_NOT_EXIST

[in, optional] AllocationSize

파일의 초기 할당 크기(바이트)입니다. 파일이 생성, 덮어쓰기 또는 대체되지 않는 한 0이 아닌 값은 적용되지 않습니다.

[in] FileAttributes

파일 특성입니다. 명시적으로 지정된 특성은 파일을 만들거나, 대체하거나, 경우에 따라 덮어쓸 때만 적용됩니다. 기본적으로 이 값은 Wdm.h 및 NtDdk.h에 정의된 하나 이상의 FILE_ATTRIBUTE_xxxx 플래그의 ORed 조합으로 재정의할 수 있는 FILE_ATTRIBUTE_NORMAL. NtCreateFile사용할 수 있는 플래그 목록은 CreateFile참조하세요.

[in] ShareAccess

호출자가 파일에서 사용하려는 공유 액세스 유형(0) 또는 다음 값 중 하나 또는 조합으로 사용됩니다.

의미
FILE_SHARE_READ
다른 스레드의 NtCreateFile호출하여 읽기 액세스를 위해 파일을 열 수 있습니다.
FILE_SHARE_WRITE
다른 스레드의 NtCreateFile호출하여 쓰기 액세스를 위해 파일을 열 수 있습니다.
FILE_SHARE_DELETE
다른 스레드의 NtCreateFile호출하여 액세스를 삭제하기 위해 파일을 열 수 있습니다.

자세한 내용은 Windows SDK를 참조하세요.

[in] CreateDisposition

파일이 이미 있는지 여부에 따라 다음 값 중 하나로 수행할 작업을 지정합니다.

의미
FILE_SUPERSEDE
파일이 이미 있는 경우 지정된 파일로 바꿉니다. 그렇지 않으면 지정된 파일을 만듭니다.
FILE_CREATE
파일이 이미 있는 경우 요청에 실패하고 지정된 파일을 만들거나 열지 않습니다. 그렇지 않으면 지정된 파일을 만듭니다.
FILE_OPEN
파일이 이미 있는 경우 새 파일을 만드는 대신 엽니다. 그렇지 않은 경우 요청에 실패하고 새 파일을 만들지 않습니다.
FILE_OPEN_IF
파일이 이미 있는 경우 엽니다. 그렇지 않으면 지정된 파일을 만듭니다.
FILE_OVERWRITE
파일이 이미 있는 경우 파일을 열고 덮어씁니다. 그렇지 않은 경우 요청을 실패합니다.
FILE_OVERWRITE_IF
파일이 이미 있는 경우 파일을 열고 덮어씁니다. 그렇지 않으면 지정된 파일을 만듭니다.

[in] CreateOptions

다음 플래그의 호환 가능한 조합으로 파일을 만들거나 열 때 적용할 옵션입니다.

의미
FILE_DIRECTORY_FILE
만들거나 여는 파일은 디렉터리 파일입니다. 이 플래그를 사용하면 CreateDisposition 매개 변수를 FILE_CREATE, FILE_OPEN또는 FILE_OPEN_IF설정해야 합니다. 이 플래그를 사용하면 호환되는 다른 CreateOptions 플래그에는 FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO _NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENTFILE_OPEN_BY_FILE_ID만 포함됩니다.
FILE_NON_DIRECTORY_FILE
열려 있는 파일이 디렉터리 파일이 아니거나 이 호출이 실패하면 안 됩니다. 열려는 파일 개체는 데이터 파일, 논리, 가상 또는 물리적 디바이스 또는 볼륨을 나타낼 수 있습니다.
FILE_WRITE_THROUGH
파일에 데이터를 쓰는 애플리케이션은 요청된 쓰기 작업이 완료된 것으로 간주되기 전에 실제로 데이터를 파일로 전송해야 합니다. 이 플래그는 CreateOptions 플래그 FILE_NO_INTERMEDIATE _BUFFERING 설정되면 자동으로 설정됩니다.
FILE_SEQUENTIAL_ONLY
파일에 대한 모든 액세스는 순차적으로 적용됩니다.
FILE_RANDOM_ACCESS
파일에 대한 액세스는 임의일 수 있으므로 FSD 또는 시스템에서 파일에 대해 순차적 미리 읽기 작업을 수행해서는 안 됩니다.
FILE_NO_INTERMEDIATE_BUFFERING
파일은 드라이버의 내부 버퍼에 캐시하거나 버퍼링할 수 없습니다. 이 플래그는 DesiredAccessFILE_APPEND_DATA 플래그와 호환되지 않습니다.
FILE_SYNCHRONOUS_IO_ALERT
파일에 대한 모든 작업은 동기적으로 수행됩니다. 호출자를 대신하여 대기하는 모든 대기는 경고에서 조기 종료될 수 있습니다. 또한 이 플래그를 사용하면 I/O 시스템이 파일 위치 컨텍스트를 유지 관리합니다. 이 플래그가 설정되면 DesiredAccessSYNCHRONIZE 플래그도 설정해야 합니다.
FILE_SYNCHRONOUS_IO_NONALERT
파일에 대한 모든 작업은 동기적으로 수행됩니다. 시스템에서 I/O 큐를 동기화하기 위한 대기 및 완료는 경고가 적용되지 않습니다. 또한 이 플래그를 사용하면 I/O 시스템이 파일 위치 컨텍스트를 유지 관리합니다. 이 플래그가 설정되면 DesiredAccessSYNCHRONIZE 플래그도 설정해야 합니다.
FILE_CREATE_TREE_CONNECTION
네트워크를 통해 열기 위해 이 파일에 대한 트리 연결을 만듭니다. 이 플래그는 디바이스 및 중간 드라이버에서 사용되지 않습니다.
FILE_NO_EA_KNOWLEDGE
열려 있는 기존 파일의 확장 특성이 호출자가 파일을 제대로 해석하기 위해 EA를 이해해야 함을 나타내는 경우 호출자가 EA를 처리하는 방법을 이해하지 못하기 때문에 이 요청에 실패합니다. 이 플래그는 디바이스 및 중간 드라이버와 관련이 없습니다.
FILE_OPEN_REPARSE_POINT
재처리 지점이 있는 파일을 열고 파일에 대한 일반 재처리 지점 처리를 무시합니다. 자세한 내용은 설명 섹션을 참조하세요.
FILE_DELETE_ON_CLOSE
마지막 핸들이 NtClose전달되면 파일을 삭제합니다. 이 플래그가 설정된 경우 DELETE 플래그는 DesiredAccess 매개 변수에 설정해야 합니다.
FILE_OPEN_BY_FILE_ID
ObjectAttributes 매개 변수로 지정된 파일 이름에는 파일에 대한 8 바이트 파일 참조 번호가 포함됩니다. 이 번호는 특정 파일 시스템에 의해 할당되며 특정 파일 시스템에 따라 지정됩니다. 파일이 재구문 지점인 경우 파일 이름에도 디바이스 이름이 포함됩니다. FAT 파일 시스템은 이 플래그를 지원하지 않습니다. 이 플래그는 디바이스 및 중간 드라이버에서 사용되지 않습니다.
FILE_OPEN_FOR_BACKUP_INTENT
백업 의도를 위해 파일을 열고 있습니다. 따라서 시스템은 파일의 보안 설명자에 대해 DesiredAccess 매개 변수를 확인하기 전에 특정 액세스 권한을 확인하고 호출자에게 파일에 대한 적절한 액세스 권한을 부여해야 합니다. 이 플래그는 디바이스 및 중간 드라이버에서 사용되지 않습니다.
FILE_RESERVE_OPFILTER
이 플래그를 사용하면 애플리케이션이 필터 기회 잠금([기회 잠금](/windows/win32/fileio/opportunistic-locks))을 요청하여 다른 애플리케이션이 공유 위반을 받지 못하도록 할 수 있습니다. 열려 있는 핸들이 이미 있는 경우 만들기 요청은 STATUS_OPLOCK_NOT_GRANTED함께 실패합니다. 자세한 내용은 설명 섹션을 참조하세요.
FILE_OPEN_REQUIRING_OPLOCK
파일이 열리고 파일의 기회 잠금([기회 잠금](/windows/win32/fileio/opportunistic-locks))이 단일 원자성 작업으로 요청됩니다. 파일 시스템은 만들기 작업을 수행하기 전에 oplock을 확인하고 결과가 기존 oplock을 중단하는 경우 반환 코드 STATUS_CANNOT_BREAK_OPLOCK 사용하여 만들기에 실패합니다. 자세한 내용은 설명 섹션을 참조하세요.Windows Server 2008, Windows Vista, Windows Server 2003 및 Windows XP: 이 플래그는 지원되지 않습니다.

이 플래그는 NTFS, FAT 및 exFAT 파일 시스템에서 지원됩니다.

FILE_COMPLETE_IF_OPLOCKED
호출자의 스레드를 차단하는 대신 대상 파일이 잠겨 있는 경우 STATUS_OPLOCK_BREAK_IN_PROGRESS 대체 성공 코드로 이 작업을 즉시 완료합니다. 파일이 잠겨 있는 경우([기회 잠금](/windows/win32/fileio/opportunistic-locks)) 다른 호출자는 이미 파일에 액세스할 수 있습니다. 이 플래그는 디바이스 및 중간 드라이버에서 사용되지 않습니다.

[in] EaBuffer

확장 특성을 전달하는 데 사용되는 EA 버퍼에 대한 포인터입니다.

참고 일부 파일 시스템은 EA 버퍼를 지원하지 않을 수 있습니다.
 

[in] EaLength

EA 버퍼의 길이입니다.

반환 값

NtCreateFileSTATUS_SUCCESS 또는 적절한 오류 상태를 반환합니다. 오류 상태를 반환하는 경우 호출자는 IoStatusBlock확인하여 오류의 원인에 대한 자세한 정보를 찾을 수 있습니다. 이 검사를 간소화하기 위해 애플리케이션은 NT_SUCCESS, NT_ERRORNT_WARNING 매크로를 사용할 수 있습니다.

발언

NtCreateFile지정된 핸들은 후속 호출에서 파일 또는 파일 개체의 상태 또는 특성 내에서 데이터를 조작하는 데 사용할 수 있습니다.

NtCreateFile사용하여 만들거나 열 파일의 이름을 지정하는 두 가지 다른 방법이 있습니다.

  • 입력 ObjectAttributes의 ObjectName 멤버에 제공된 정규화된 경로 이름으로
  • 입력 ObjectAttributes의 RootDirectory 멤버에서 핸들이 나타내는 디렉터리 파일을 기준으로 하는 경로 이름으로

특정 DesiredAccess 플래그 및 플래그 조합에는 다음과 같은 효과가 있습니다.

  • 호출자가 반환된 FileHandle대기하여 I/O 완성을 동기화하려면 SYNCHRONIZE 플래그를 설정해야 합니다.
  • DesiredFlags 0을 전달하는 것은 유효하지 않습니다.
  • FILE_APPEND_DATASYNCHRONIZE 플래그만 설정된 경우 호출자는 파일의 끝에만 쓸 수 있으며 파일에 대한 쓰기에 대한 오프셋 정보는 무시됩니다. 그러나 이 유형의 쓰기 작업에 필요한 경우 파일이 자동으로 확장됩니다.
  • 파일에 대한 FILE_WRITE_DATA 플래그를 설정하면 파일 끝 이후의 쓰기도 발생할 수 있습니다. 이 형식의 쓰기에 대해서도 파일이 자동으로 확장됩니다.
  • FILE_EXECUTESYNCHRONIZE 플래그만 설정된 경우 호출자는 반환된 FileHandle사용하여 파일의 데이터를 직접 읽거나 쓸 수 없습니다. 즉, 파일의 모든 작업은 명령 및 데이터 액세스에 대한 응답으로 시스템 호출기를 통해 발생합니다.

ShareAccess 매개 변수는 개별 스레드가 동일한 파일에 동시에 액세스할 수 있는지 여부를 결정합니다. 두 파일 열기 모두 지정된 방식으로 파일에 액세스할 수 있는 권한이 있는 경우 파일을 성공적으로 열고 공유할 수 있습니다. NtCreateFile 원래 호출자가 FILE_SHARE_READ, FILE_SHARE_WRITE또는 FILE_SHARE_DELETE지정하지 않으면 파일에 대해 다른 열린 작업을 수행할 수 없습니다. 즉, 원래 호출자에게 파일에 대한 단독 액세스 권한이 부여됩니다.

공유 파일을 성공적으로 열려면 요청된 DesiredAccess 매개 변수가 NtClose아직 릴리스되지 않은 모든 이전 열기의 DesiredAccessShareAccess 사양과 호환되어야 합니다. 즉, 지정된 파일에 대해 NtCreateFile 지정한 DesiredAccess 매개 변수는 파일의 다른 오프너가 허용하지 않은 액세스와 충돌해서는 안 됩니다.

CreateDispositionFILE_SUPERSEDE 호출자에게 기존 파일 개체에 대한 DELETE 액세스 권한이 있어야 합니다. 그렇다면 기존 파일의 FILE_SUPERSEDE 사용하여 NtCreateFile 성공적으로 호출하면 해당 파일이 효과적으로 삭제된 다음 다시 생성됩니다. 즉, 파일이 다른 스레드에서 이미 열려 있는 경우 FILE_SHARE_DELETE 플래그가 설정된 ShareAccess 매개 변수를 지정하여 파일을 열었습니다.

이러한 유형의 처리는 덮어쓰기 파일의 POSIX 스타일과 일치합니다. CreateDispositionFILE_OVERWRITE_IFFILE_SUPERSEDE 비슷합니다. ZwCreateFile 기존 파일과 이러한 CreateDisposition 값 중 하나를 사용하여 호출되면 파일이 대체됩니다.

파일을 덮어쓰는 것은 다음을 제외하고 대체 작업과 의미상 동일합니다.

  • 호출자는 액세스 권한을 삭제하는 대신 파일에 대한 쓰기 권한이 있어야 합니다. 이는 파일이 다른 스레드에서 이미 열려 있는 경우 입력 ShareAccess 매개 변수에 설정된 FILE_SHARE_WRITE 플래그를 사용하여 파일을 열었다는 것을 의미합니다.
  • 지정된 파일 특성은 파일에 이미 있는 특성과 논리적으로 ORed됩니다. 즉, 다른 스레드에서 파일을 이미 연 경우 NtCreateFile 후속 호출자는 기존 FileAttributes 플래그를 사용하지 않도록 설정할 수 없지만 동일한 파일에 대해 추가 플래그를 사용하도록 설정할 수 있습니다. 이 덮어쓰기 파일 스타일은 MS-DOS, Windows 3.1 및 OS/2 운영 체제와 일치합니다.

CreateOptionsFILE_DIRECTORY_FILE 값은 만들거나 열 파일이 디렉터리 파일임을 지정합니다. 디렉터리 파일을 만들 때 파일 시스템은 디스크에 해당 특정 파일 시스템의 디스크 내 구조에 대한 빈 디렉터리를 나타내는 적절한 구조를 만듭니다. 이 옵션을 지정하고 열 지정된 파일이 디렉터리 파일이 아니거나 호출자가 CreateOptions 또는 CreateDisposition 값을 일관성 없는 지정한 경우 NtCreateFile 호출에 실패합니다.

CreateOptionsFILE_NO_INTERMEDIATE_BUFFERING 플래그를 사용하면 파일 시스템이 호출자를 대신하여 중간 버퍼링을 수행할 수 없습니다. 이 값을 지정하면 다음을 포함하여 다른 NtXXX파일 루틴에 호출자의 매개 변수에 대한 특정 제한이 적용됩니다.

  • NtReadFile 또는 NtWriteFile 함수에 전달되는 선택적 ByteOffset 섹터 크기의 정수여야 합니다.
  • NtReadFile 또는 NtWriteFile전달되는 Length 섹터 크기의 정수여야 합니다. 길이가 정확히 섹터 크기인 버퍼에 읽기 작업을 지정하면 전송 중에 파일의 끝에 도달한 경우 해당 버퍼로 전송되는 유효 바이트 수가 줄어들 수 있습니다.
  • 버퍼는 기본 디바이스의 맞춤 요구 사항에 따라 조정되어야 합니다. 이 정보는 NtCreateFile 호출하여 물리적 디바이스를 나타내는 파일 개체에 대한 핸들을 가져온 다음 해당 핸들로 NtQueryInformationFile 호출하여 가져올 수 있습니다. 시스템 FILE_XXX_ALIGNMENT 값 목록은 Windows SDK 설명서를 참조하세요.
  • filePositionInformation FileInformationClass 매개 변수로 설정된 NtSetInformationFile 호출은 섹터 크기의 정수 계열 오프셋을 지정해야 합니다.
이름에서 알 수 있듯이 상호 배타적인 CreateOptionsFILE_SYNCHRONOUS_IO_ALERTFILE_SYNCHRONOUS_IO_NONALERT 플래그는 반환된 FileHandle참조하는 파일 개체를 통해 발생하는 한 파일의 모든 I/O 작업이 동기되도록 지정합니다. 이러한 파일의 모든 I/O는 반환된 핸들을 사용하여 모든 스레드에서 직렬화됩니다. 이러한 CreateOptions중 하나를 사용하면 I/O 관리자가 파일 개체를 동기화 개체로 사용하도록 DesiredAccessSYNCHRONIZE 플래그를 설정해야 합니다. 이러한 CreateOptions 집합 중 하나를 사용하여 I/O 관리자는 파일 개체의 "파일 위치 컨텍스트"를 내부, 현재 파일 위치 오프셋으로 유지 관리합니다. 이 오프셋은 NtReadFile 및 NtWriteFile호출에 사용할 수 있습니다. NtQueryInformationFileNtSetInformationFile사용하여 해당 위치를 쿼리하거나 설정할 수도 있습니다.

CreateOptions 매개 변수가 FILE_OPEN_REPARSE_POINT 플래그를 지정하고 NtCreateFile 재분석 지점이 있는 파일을 여는 경우 정상적인 재분석 처리가 수행되지 않으며 NtCreateFile 재분석 지점 파일을 직접 열려고 시도합니다. FILE_OPEN_REPARSE_POINT 플래그를 지정하지 않으면 파일에 대한 일반 재처리 지점 처리가 수행됩니다. 두 경우 모두 열기 작업이 성공한 경우 NtCreateFileSTATUS_SUCCESS반환합니다. 그렇지 않으면 오류 코드입니다. NtCreateFile 함수는 STATUS_REPARSE반환하지 않습니다.

CreateOptions 매개 변수의 FILE_OPEN_REQUIRING_OPLOCK 플래그를 사용하면 파일을 열고 타사에서 파일을 열 수 있는 oplock을 요청하는 시점 사이의 시간을 제거하여 공유 위반이 발생할 수 있습니다. 애플리케이션은 NtCreateFileFILE_OPEN_REQUIRING_OPLOCK 플래그를 사용한 다음 oplock을 요청할 수 있습니다. 이렇게 하면 공유 위반을 유발하는 후속 미해결 요청에 대해 oplock 소유자에게 알림을 받습니다.

Windows 7에서 애플리케이션이 이 플래그를 사용할 때 파일에 다른 핸들이 있으면 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 이상 운영 체제에서 NTFS, FAT 및 exFAT 파일 시스템에 사용할 수 있습니다.
 

CreateOptions 매개 변수의 FILE_RESERVE_OPFILTER 플래그를 사용하면 애플리케이션이 수준 1, Batch 또는 Filter oplock을 요청하여 다른 애플리케이션이 공유 위반을 받지 못하도록 할 수 있습니다. 그러나 실질적으로 FILE_RESERVE_OPFILTER 필터 oplock에만 유용합니다. 이를 사용하려면 다음 단계를 완료해야 합니다.

  1. FILE_RESERVE_OPFILTERCreateOptions, 정확히 FILE_READ_ATTRIBUTESDesiredAccess , 정확히 ShareAccess 만들기 요청을 실행합니다. 가능한 오류는 다음과 같습니다.
    • 열려 있는 핸들이 이미 있는 경우 STATUS_OPLOCK_NOT_GRANTED생성 요청이 실패하고 다음 요청된 oplock도 실패합니다.
    • (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE) FILE_READ_ATTRIBUTES 이상의 액세스 권한으로 열거나 공유하지 않는 경우 STATUS_OPLOCK_NOT_GRANTED요청이 실패합니다.
  2. 만들기 요청이 성공하면 oplock을 요청합니다.
  3. 파일에 대한 다른 핸들을 열어 I/O를 수행합니다.
3단계에서는 필터 oplock에 대해서만 이 작업을 실용화합니다. 3단계에서 열린 핸들은 최대 (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | SYNCHRONIZE | READ_CONTROL) 포함하고 필터 oplock을 중단하지 않는 DesiredAccess 가질 수 있습니다. 그러나 보다
DesiredAccess는 수준 1 또는 Batch oplock을 중단하고 해당 oplock 형식에 FILE_RESERVE_OPFILTER 플래그를 쓸모 없게 만듭니다.

NTFS는 FILE_RESERVE_OPFILTER구현하는 유일한 Microsoft 파일 시스템입니다.

oplock에 대한 자세한 내용은 기회 잠금참조하세요.

WDK 헤더 파일 NtDef.h는 많은 상수 정의뿐만 아니라 InitializeObjectAttributes 매크로에도 필요합니다. 또한 LoadLibrary 사용하고 GetProcAddress 함수를 NtDll.dll동적으로 연결할 수 있습니다.

요구 사항

요구
대상 플랫폼 Windows
헤더 winternl.h
라이브러리 ntdll.lib
DLL ntdll.dll