IoCreateFileSpecifyDeviceObjectHint 함수(ntddk.h)
IoCreateFileSpecifyDeviceObjectHint 루틴은 파일 시스템 필터 드라이버에서 지정된 디바이스 개체 아래의 필터와 파일 시스템에만 만들기 요청을 보내는 데 사용됩니다.
구문
NTSTATUS IoCreateFileSpecifyDeviceObjectHint(
[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 Disposition,
[in] ULONG CreateOptions,
[in, optional] PVOID EaBuffer,
[in] ULONG EaLength,
[in] CREATE_FILE_TYPE CreateFileType,
[in, optional] PVOID InternalParameters,
[in] ULONG Options,
[in, optional] PVOID DeviceObject
);
매개 변수
[out] FileHandle
이 호출에 성공하면 파일 개체에 대한 핸들을 받는 변수에 대한 포인터입니다.
[in] DesiredAccess
호출자가 파일 또는 디렉터리에 필요한 액세스 유형을 지정하는 플래그의 비트 마스크입니다. 시스템 정의 DesiredAccess 플래그 집합은 파일 개체에 대한 다음과 같은 특정 액세스 권한을 결정합니다.
| DesiredAccess 플래그 | 의미 |
|---|---|
| Delete | 파일을 삭제할 수 있습니다. |
| FILE_READ_DATA | 데이터를 파일에서 읽을 수 있습니다. |
| FILE_READ_ATTRIBUTES | 나중에 설명하는 FileAttributes 플래그를 읽을 수 있습니다. |
| FILE_READ_EA | 파일과 연결된 EA(확장 특성)를 읽을 수 있습니다. |
| READ_CONTROL | ACL(액세스 제어 목록) 및 파일과 연결된 소유권 정보를 읽을 수 있습니다. |
| FILE_WRITE_DATA | 데이터를 파일에 쓸 수 있습니다. |
| FILE_WRITE_ATTRIBUTES | FileAttributes 플래그를 작성할 수 있습니다. |
| FILE_WRITE_EA | 파일과 연결된 확장 특성을 작성할 수 있습니다. |
| FILE_APPEND_DATA | 데이터를 파일에 추가할 수 있습니다. |
| WRITE_DAC | 파일과 연결된 DACL(임의 액세스 제어 목록)을 작성할 수 있습니다. |
| WRITE_OWNER | 파일과 연결된 소유권 정보를 작성할 수 있습니다. |
| SYNCHRONIZE | 호출자는 반환된 FileHandle 이 신호됨 상태로 설정될 때까지 대기하여 I/O 작업의 완료를 동기화할 수 있습니다. CreateOptions FILE_SYNCHRONOUS_IO_ALERT 또는 FILE_SYNCHRONOUS_IO_NONALERT 플래그가 설정된 경우 이 플래그를 설정해야 합니다. |
| FILE_EXECUTE | 시스템 페이징 I/O를 사용하여 파일에서 데이터를 메모리로 읽을 수 있습니다. |
IoCreateFileSpecifyDeviceObjectHint의 호출자는 디렉터리 파일을 나타내지 않는 모든 파일 개체에 대해 다음 중 하나 또는 조합을 지정할 수 있습니다.
| 파일 값에 대한 DesiredAccess | DesiredAccess 플래그에 지도 |
|---|---|
| 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, SYNCHRONIZE, FILE_READ_ATTRIBUTES 및 FILE_EXECUTE. |
STANDARD_RIGHTS_XXX 는 시스템 개체에 보안을 적용하는 데 사용되는 미리 정의된 시스템 값입니다.
FILE_DIRECTORY_FILE CreateOptions 플래그가 설정된 경우 IoCreateFileSpecifyDeviceObjectHint 의 호출자는 위의DesiredAccess 플래그 목록에서 하나 이상의 호환 플래그를 사용하여 다음 중 하나 또는 조합을 지정할 수 있습니다.
| 디렉터리 값에 대한 DesiredAccess | 의미 |
|---|---|
| FILE_LIST_DIRECTORY | 디렉터리의 파일을 나열할 수 있습니다. |
| FILE_TRAVERSE | 디렉터리를 트래버스할 수 있습니다. 즉, 파일의 경로 이름에 속할 수 있습니다. |
FILE_READ_DATA, FILE_WRITE_DATA, FILE_EXECUTE 및 FILE_APPEND_DATA DesiredAccess 플래그는 디렉터리 파일을 만들거나 여는 것과 호환되지 않습니다.
[in] ObjectAttributes
InitializeObjectAttributes 루틴에 의해 이미 초기화된 OBJECT_ATTRIBUTES 구조체에 대한 포인터입니다. 호출자가 시스템 프로세스 컨텍스트에서 실행 중인 경우 이 매개 변수(ObjectAttributes)는 NULL일 수 있습니다. 그렇지 않으면 호출자는 InitializeObjectAttributes 루틴에 대한 호출에서 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다. 파일 개체에 대한 OBJECT_ATTRIBUTES 구조체의 멤버는 다음과 같습니다.
| 멤버 | 값 |
|---|---|
| ULONGLength | 제공된 ObjectAttributes 데이터의 바이트 수를 지정합니다. 이 값은 적어도 sizeof(OBJECT_ATTRIBUTES)여야 합니다. |
| PUNICODE_STRING ObjectName | 만들거나 열 파일의 이름을 지정하는 버퍼링된 유니코드 문자열에 대한 포인터입니다. 이 값은 RootDirectory에서 지정한 디렉터리를 기준으로 하는 파일의 이름이 아니면 정규화된 파일 사양이어야 합니다. 예를 들어 플로피 드라이버와 오버리싱 파일 시스템이 이미 로드되어 있는 경우 \Device\Floppy1\myfile.dat 또는 \??\B:\myfile.dat는 정규화된 파일 사양일 수 있습니다. (참고로?\? 는 \DosDevices를 Win32 개체 네임스페이스의 이름으로 바꿉니다. \DosDevices는 계속 작동하지만 \?? 는 개체 관리자에 의해 더 빠르게 변환됩니다.) |
| HANDLERootDirectory | 필요에 따라 IoCreateFileSpecifyDeviceObjectHint에 대한 이전 호출로 얻은 디렉터리에 대한 핸들을 지정합니다. 이 값이 NULL이면 ObjectName 멤버는 대상 파일의 전체 경로를 포함하는 정규화된 파일 사양이어야 합니다. 이 값이 NULL이 아닌 경우 ObjectName 멤버는 이 디렉터리를 기준으로 파일 이름을 지정합니다. |
| PSECURITY_DESCRIPTOR SecurityDescriptor | 필요에 따라 파일에 적용할 보안 설명자를 지정합니다. 이러한 보안 설명자가 지정한 ACL은 생성될 때만 파일에 적용됩니다. 파일을 만들 때 값이 NULL 이면 파일에 배치된 ACL은 파일 시스템에 종속됩니다. 대부분의 파일 시스템은 호출자의 기본 ACL과 결합된 부모 디렉터리 파일에서 이러한 ACL의 일부를 전파합니다. |
| ULONGAttributes | 파일 개체 특성을 제어하는 플래그 집합입니다. 호출자가 시스템 프로세스 컨텍스트에서 실행 중인 경우 이 매개 변수는 0일 수 있습니다. 그렇지 않으면 호출자가 OBJ_KERNEL_HANDLE 플래그를 설정해야 합니다. 호출자는 필요에 따라 OBJ_CASE_INSENSITIVE 플래그를 설정할 수 있습니다. 이는 이름 조회 코드가 정확히 일치하는 검색을 수행하는 대신 ObjectName 의 대/소문자를 무시해야 함을 나타냅니다. |
[out] IoStatusBlock
요청된 작업에 대한 최종 완료 상태 및 정보를 수신하는 IO_STATUS_BLOCK 구조체에 대한 포인터입니다. IoCreateFileSpecifyDeviceObjectHint에서 반환되는 정보 멤버에는 다음 값 중 하나가 포함됩니다.
FILE_CREATED
FILE_OPENED
FILE_OVERWRITTEN
FILE_SUPERSEDED
FILE_EXISTS
FILE_DOES_NOT_EXIST
[in, optional] AllocationSize
필요에 따라 파일에 대한 초기 할당 크기(바이트)를 지정합니다. 파일이 생성, 덮어쓰기 또는 대체되지 않는 한 0이 아닌 값은 적용되지 않습니다.
[in] FileAttributes
명시적으로 지정된 특성은 파일을 만들거나, 대체하거나, 경우에 따라 덮어쓸 때만 적용됩니다. 기본적으로 이 값은 FILE_ATTRIBUTE_NORMAL 다른 플래그 또는 호환 플래그의 ORed 조합으로 재정의할 수 있습니다. 가능한 FileAttributes 플래그는 다음과 같습니다.
| FileAttributes 플래그 | 의미 |
|---|---|
| FILE_ATTRIBUTE_NORMAL | 표준 특성이 있는 파일을 만들어야 합니다. |
| FILE_ATTRIBUTE_READONLY | 읽기 전용 파일을 만들어야 합니다. |
| FILE_ATTRIBUTE_HIDDEN | 숨겨진 파일을 만들어야 합니다. |
| FILE_ATTRIBUTE_SYSTEM | 시스템 파일을 만들어야 합니다. |
| FILE_ATTRIBUTE_ARCHIVE | 파일이 보관되도록 표시되어야 합니다. |
| FILE_ATTRIBUTE_TEMPORARY | 임시 파일을 만들어야 합니다. |
[in] ShareAccess
호출자가 0 또는 1로, 또는 다음 플래그의 조합으로 파일에 대한 공유 액세스 유형을 지정합니다. 단독 액세스를 요청하려면 이 매개 변수를 0으로 설정합니다. Options 매개 변수에 IO_IGNORE_SHARE_ACCESS_CHECK 플래그를 지정하면 I/O 관리자가 이 매개 변수를 무시합니다. 그러나 파일 시스템은 여전히 액세스 검사를 수행할 수 있습니다. 따라서 IO_IGNORE_SHARE_ACCESS_CHECK 플래그를 사용하는 경우에도 이 매개 변수에 대해 원하는 공유 모드를 지정해야 합니다. 공유 위반 오류를 방지할 가능성이 가장 높은 경우 다음 공유 액세스 플래그를 모두 지정합니다.
| ShareAccess 플래그 | 의미 |
|---|---|
| FILE_SHARE_READ | 다른 스레드에서 읽기 액세스를 위해 파일을 열 수 있습니다. |
| FILE_SHARE_WRITE | 다른 스레드에서 쓰기 액세스를 위해 파일을 열 수 있습니다. |
| FILE_SHARE_DELETE | 다른 스레드에서 액세스 권한을 삭제하기 위해 파일을 열 수 있습니다. |
[in] Disposition
파일이 이미 있는지 여부에 따라 수행할 작업을 결정하는 값을 지정합니다. 값은 다음에 설명된 값 중 어느 것이든 될 수 있습니다.
| 처리 값 | 의미 |
|---|---|
| FILE_SUPERSEDE | 파일이 이미 있는 경우 지정된 파일로 바꿉니다. 그렇지 않으면 지정된 파일을 만듭니다. |
| FILE_CREATE | 파일이 이미 있는 경우 요청에 실패하고 지정된 파일을 만들거나 열지 않습니다. 그렇지 않으면 지정된 파일을 만듭니다. |
| FILE_OPEN | 파일이 이미 있는 경우 새 파일을 만드는 대신 엽니다. 그렇지 않은 경우 요청을 실패하고 새 파일을 만들지 않습니다. |
| FILE_OPEN_IF | 파일이 이미 있는 경우 엽니다. 그렇지 않으면 지정된 파일을 만듭니다. |
| FILE_OVERWRITE | 파일이 이미 있는 경우 파일을 열고 덮어씁니다. 그렇지 않으면 요청을 실패합니다. |
| FILE_OVERWRITE_IF | 파일이 이미 있는 경우 파일을 열고 덮어씁니다. 그렇지 않으면 지정된 파일을 만듭니다. |
[in] CreateOptions
파일을 만들거나 열 때 적용할 옵션을 지정합니다. 이러한 옵션은 다음 플래그의 호환 가능한 조합으로 지정됩니다.
| CreateOptions 플래그 | 의미 |
|---|---|
| FILE_DIRECTORY_FILE | 만들거나 여는 파일은 디렉터리 파일입니다. 이 플래그가 설정되면 처리 매개 변수를 FILE_CREATE, FILE_OPEN 또는 FILE_OPEN_IF 중 하나로 설정해야 합니다. 이 플래그는 FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENT 및 FILE_OPEN_BY_FILE_ID CreateOptions 플래그와 호환됩니다. |
| FILE_NON_DIRECTORY_FILE | 열려 있는 파일이 디렉터리 파일이 아니어야 합니다. 그렇지 않으면 이 호출이 실패합니다. 열려 있는 파일 개체는 데이터 파일을 나타내야 합니다. |
| FILE_WRITE_THROUGH | 요청된 쓰기 작업이 완료된 것으로 간주되기 전에 파일에 데이터를 쓰는 시스템 서비스, FSD 및 드라이버는 실제로 데이터를 파일로 전송해야 합니다. |
| FILE_SEQUENTIAL_ONLY | 파일에 대한 모든 액세스는 순차적으로 적용됩니다. |
| FILE_RANDOM_ACCESS | 파일에 대한 액세스는 임의일 수 있으므로 FSD 또는 시스템에서 파일에 대해 순차적 미리 읽기 작업을 수행해서는 안 됩니다. |
| FILE_NO_INTERMEDIATE_BUFFERING | 파일은 드라이버의 내부 버퍼에서 캐시하거나 버퍼링할 수 없습니다. 이 플래그는 DesiredAccess FILE_APPEND_DATA 플래그와 호환되지 않습니다. |
| FILE_SYNCHRONOUS_IO_ALERT | 파일에 대한 모든 작업은 동기적으로 수행됩니다. 호출자를 대신하여 대기하는 모든 대기는 경고에서 조기 종료될 수 있습니다. 또한 이 플래그를 사용하면 I/O 시스템이 파일 위치 컨텍스트를 유지 관리합니다. 이 플래그가 설정되면 DesiredAccess SYNCHRONIZE 플래그도 설정해야 합니다. |
| FILE_SYNCHRONOUS_IO_NONALERT | 파일에 대한 모든 작업은 동기적으로 수행됩니다. I/O 큐를 동기화하기 위해 시스템에 존재하는 대기 및 완료에는 경고가 적용되지 않습니다. 또한 이 플래그를 사용하면 I/O 시스템이 파일 위치 컨텍스트를 유지 관리합니다. 이 플래그가 설정되면 DesiredAccess SYNCHRONIZE 플래그도 설정해야 합니다. |
| FILE_CREATE_TREE_CONNECTION | 네트워크를 통해 열기 위해 이 파일에 대한 트리 연결을 만듭니다. |
| FILE_COMPLETE_IF_OPLOCKED | 호출자의 스레드를 차단하는 대신 대상 파일이 잠겨 있는 경우 대체 성공 코드로 이 작업을 즉시 완료합니다. 파일이 잠겨 있지 않으면 다른 호출자가 이미 네트워크를 통해 파일에 액세스할 수 있습니다. |
| FILE_NO_EA_KNOWLEDGE | 열려 있는 기존 파일의 확장 특성이 호출자가 파일을 제대로 해석하기 위해 EA를 이해해야 함을 나타내는 경우 호출자가 EA를 처리하는 방법을 이해하지 못하기 때문에 이 요청에 실패합니다. |
| FILE_OPEN_REPARSE_POINT | 재문 분석 지점이 있는 파일을 열고 파일에 대한 일반 재처리 지점 처리를 무시합니다. 자세한 내용은 아래 설명 부분을 참조하십시오. |
| FILE_DELETE_ON_CLOSE | 마지막 핸들이 ZwClose에 전달되면 파일을 삭제합니다. |
| FILE_OPEN_BY_FILE_ID | ObjectAttributes 매개 변수에 지정된 파일 이름에는 파일에 대한 8 바이트 파일 참조 번호가 포함됩니다. 이 번호는 파일 시스템에 의해 할당되며 파일 시스템별입니다. 파일이 재구문 지점인 경우 파일 이름에도 디바이스 이름이 포함됩니다. 참고: FAT 파일 시스템은 FILE_OPEN_BY_FILE_ID 지원하지 않습니다. |
| FILE_OPEN_FOR_BACKUP_INTENT | 백업 의도를 위해 파일이 열려 있으므로 시스템에서 특정 액세스 권한을 확인하고 파일의 보안 설명자에 대해 DesiredAccess 입력을 확인하기 전에 호출자에게 파일에 대한 적절한 액세스 권한을 부여해야 합니다. |
| FILE_OPEN_REQUIRING_OPLOCK |
파일이 열리고 파일의 기회 잠금(oplock)이 단일 원자성 작업으로 요청됩니다. 파일 시스템은 만들기 작업을 수행하기 전에 oplock을 확인하고 만들기가 기존 oplock을 중단하는 경우 STATUS_CANNOT_BREAK_OPLOCK 반환 코드와 함께 만들기 작업이 실패합니다.
참고 FILE_OPEN_REQUIRING_OPLOCK 플래그는 Windows 7, Windows Server 2008 R2 이상 Windows 운영 체제에서 사용할 수 있습니다.
|
| FILE_RESERVE_OPFILTER | 이 플래그를 사용하면 애플리케이션이 필터 기회 잠금(oplock)을 요청하여 다른 애플리케이션이 공유 위반을 가져오지 못하도록 할 수 있습니다. 열려 있는 핸들이 이미 있는 경우 STATUS_OPLOCK_NOT_GRANTED 함께 만들기 요청이 실패합니다. 자세한 내용은 아래 설명 부분을 참조하십시오. |
[in, optional] EaBuffer
파일에 적용할 EA(확장 특성) 정보를 포함하는 호출자 제공 FILE_FULL_EA_INFORMATION 구조화된 버퍼에 대한 포인터입니다.
[in] EaLength
EaBuffer의 길이(바이트)입니다.
[in] CreateFileType
드라이버는 이 매개 변수를 CreateFileTypeNone으로 설정해야 합니다.
[in, optional] InternalParameters
드라이버는 이 매개 변수를 NULL로 설정해야 합니다.
[in] Options
만들기 요청을 만드는 동안 사용할 옵션을 지정합니다. 다음 표에서 사용 가능한 옵션을 나열합니다.
| 옵션 플래그 | 의미 |
|---|---|
| IO_FORCE_ACCESS_CHECK | I/O 관리자가 파일의 보안 설명자에 대해 만들기 요청을 확인해야 했음을 나타냅니다. |
| IO_IGNORE_SHARE_ACCESS_CHECK | I/O 관리자가 파일 개체를 만든 후 공유 액세스 검사를 수행하지 않아야 했음을 나타냅니다. 그러나 파일 시스템은 여전히 이러한 검사를 수행할 수 있습니다. |
[in, optional] DeviceObject
만들기 요청을 보낼 디바이스 개체에 대한 포인터입니다. 디바이스 개체는 파일 또는 디렉터리가 있는 볼륨에 대한 파일 시스템 드라이버 스택의 필터 또는 파일 시스템 디바이스 개체여야 합니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다. 이 매개 변수가 NULL이면 요청이 드라이버 스택의 맨 위에 있는 디바이스 개체로 전송됩니다.
반환 값
IoCreateFileSpecifyDeviceObjectHint 는 STATUS_SUCCESS 또는 다음 중 하나와 같은 적절한 NTSTATUS 값을 반환합니다.
| 반환 코드 | 설명 |
|---|---|
|
지정된 DeviceObject 가 파일 또는 디렉터리 이름에 지정된 볼륨의 파일 시스템 드라이버 스택에 연결되어 있지 않습니다. 이름에 탑재 지점 이외의 재구문 지점이 포함된 경우에도 이 오류가 발생할 수 있습니다. |
|
파일 또는 디렉터리 이름에는 지정된 DeviceObject 가 연결된 볼륨 이외의 볼륨으로 확인되는 탑재 지점이 포함되어 있습니다. |
|
설명
이 루틴은 파일 시스템 필터 드라이버에서 지정된 디바이스 개체 아래의 필터 및 파일 시스템에만 만들기 요청을 보내는 데 사용됩니다. 드라이버 스택에서 지정된 디바이스 개체 위에 연결된 필터는 만들기 요청을 받지 않습니다.
파일 시스템 필터 드라이버는 IoCreateFileSpecifyDeviceObjectHint 를 호출하여 지정된 디바이스 개체, 아래에 연결된 필터 및 파일 시스템에만 만들기 요청을 보냅니다. 드라이버 스택에서 지정된 디바이스 개체 위에 연결된 필터는 만들기 요청을 받지 않습니다. IoCreateFileSpecifyDeviceObjectHint에서 만든 파일 개체에 대한 정리 또는 닫기 요청의 경우도 마찬가지입니다.
IoCreateFileSpecifyDeviceObjectHint를 사용하여 만들거나 열 파일의 이름을 지정하는 두 가지 다른 방법이 있습니다.
- 입력 ObjectAttributes 의 ObjectName 멤버에 제공된 정규화된 경로 이름입니다.
- 입력 ObjectAttributes 의 RootDirectory 멤버에서 핸들로 표현되는 디렉터리 파일을 기준으로 하는 경로 이름입니다.
시스템 프로세스 이외의 프로세스 컨텍스트에서 실행되는 드라이버 루틴은 IoCreateFileSpecifyDeviceObjectHint의 ObjectAttributes 매개 변수에 대한 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다. 이렇게 하면 IoCreateFileSpecifyDeviceObjectHint 에서 반환되는 핸들을 커널 모드에서 실행되는 프로세스로 제한합니다. 그렇지 않으면 드라이버가 실행 중인 컨텍스트의 프로세스에서 핸들에 액세스할 수 있습니다.
특정 DesiredAccess 플래그 및 플래그 조합에는 다음과 같은 효과가 있습니다.
- 반환된 FileHandle 이 신호됨 상태로 설정될 때까지 대기하여 호출자가 I/O 완료를 동기화하려면 SYNCHRONIZE 플래그를 설정해야 합니다.
- FILE_APPEND_DATA 및 SYNCHRONIZE 플래그만 설정된 경우 호출자는 파일의 끝에만 쓸 수 있으며 파일에 대한 쓰기에 대한 오프셋 정보는 무시됩니다. 그러나 이러한 유형의 쓰기 작업에 필요한 경우 파일이 자동으로 확장됩니다.
- 파일에 대한 FILE_WRITE_DATA 플래그를 설정하면 파일의 끝부분에 있는 쓰기도 발생할 수 있습니다. 파일은 이러한 유형의 쓰기에 대해서도 자동으로 확장됩니다.
- FILE_EXECUTE 및 SYNCHRONIZE 플래그만 설정된 경우 호출자는 반환된 FileHandle을 사용하여 파일의 데이터를 직접 읽거나 쓸 수 없습니다. 즉, 파일에 대한 모든 작업은 명령 및 데이터 액세스에 대한 응답으로 시스템 호출기를 통해 발생합니다.
공유 파일을 성공적으로 열려면 파일에 요청된 DesiredAccess가 ZwClose에서 아직 릴리스되지 않은 모든 이전 열기의 DesiredAccess 및 ShareAccess 사양과 호환되어야 합니다. 즉, 지정된 파일에 대해 IoCreateFileSpecifyDeviceObjectHint에 지정된 DesiredAccess는 파일의 다른 오프너가 허용하지 않는 액세스와 충돌해서는 안 됩니다.
처리 값 FILE_SUPERSEDE 호출자에게 기존 파일 개체에 대한 DELETE 액세스 권한이 있어야 합니다. 이 경우 기존 파일에 대한 FILE_SUPERSEDE 사용하여 IoCreateFileSpecifyDeviceObjectHint 를 성공적으로 호출하면 해당 파일이 효과적으로 삭제된 다음 다시 만들어집니다. 이는 파일이 다른 스레드에서 이미 열려 있는 경우 FILE_SHARE_DELETE 플래그 집합으로 ShareAccess 매개 변수를 지정하여 파일을 열었다는 것을 의미합니다. 이러한 유형의 처리는 파일을 덮어쓰는 POSIX 스타일과 일치합니다.
FILE_OVERWRITE_IF 및 FILE_SUPERSEDE 처리 값은 비슷합니다. IoCreateFileSpecifyDeviceObjectHint가 기존 파일 및 이러한 처리 값 중 하나를 사용하여 호출되면 파일이 바뀝니다.
다음을 제외하고 파일을 덮어쓰는 것은 의미상 대체 작업과 동일합니다.
- 호출자는 액세스 권한을 삭제하는 대신 파일에 대한 쓰기 권한이 있어야 합니다. 이는 파일이 다른 스레드에서 이미 열려 있는 경우 입력 ShareAccess에 설정된 FILE_SHARE_WRITE 플래그를 사용하여 파일을 열었다는 것을 의미합니다.
- 지정된 파일 특성은 파일에 이미 있는 특성과 논리적으로 ORed됩니다. 이는 파일이 이미 다른 스레드에 의해 열려 있는 경우 IoCreateFileSpecifyDeviceObjectHint 의 후속 호출자가 기존 FileAttributes 플래그를 사용하지 않도록 설정할 수 없지만 동일한 파일에 대해 추가 플래그를 사용하도록 설정할 수 있음을 의미합니다. 이 파일 덮어쓰기 스타일은 MS-DOS, Windows 3.1 및 OS/2와 일치합니다.
CreateOptions FILE_NO_INTERMEDIATE_BUFFERING 플래그를 사용하면 파일 시스템이 호출자를 대신하여 중간 버퍼링을 수행할 수 없습니다. 이 값을 지정하면 호출자의 매개 변수에 대한 특정 제한이 다른 Zw에 배치됩니다. 다음 을 포함한 파일 루틴:
- ZwReadFile 또는 ZwWriteFile에 전달되는 바이트 오프셋 값은 기본 디바이스의 섹터 크기의 배수여야 합니다.
- ZwReadFile 또는 ZwWriteFile에 전달되는 길이는 섹터 크기의 배수여야 합니다. 길이가 정확히 섹터 크기인 버퍼에 읽기 작업을 지정하면 전송 중에 파일의 끝에 도달한 경우 해당 버퍼로 전송되는 상당한 바이트 수가 줄어들 수 있습니다.
- 버퍼는 기본 디바이스의 맞춤 요구 사항에 따라 정렬되어야 합니다. 이 정보는 IoCreateFileSpecifyDeviceObjectHint 를 호출하여 물리적 디바이스를 나타내는 파일 개체에 대한 핸들을 가져온 다음 해당 핸들을 사용하여 ZwQueryInformationFile 을 호출하여 가져올 수 있습니다. 시스템 FILE_XXX_ALIGNMENT 값 목록은 DEVICE_OBJECT 참조하세요.
- FileInformationClass 매개 변수가 FilePositionInformation으로 설정된 ZwSetInformationFile에 대한 호출은 섹터 크기의 배수인 오프셋을 지정해야 합니다.
CreateOptions FILE_OPEN_REPARSE_POINT 플래그를 지정하지 않고 IoCreateFileSpecifyDeviceObjectHint가 재분석 지점이 있는 파일을 열려고 하면 파일에 대해 일반적인 재분석 지점 처리가 발생합니다. 반면에 FILE_OPEN_REPARSE_POINT 플래그를 지정한 경우 정상적인 재구매 처리가 발생하지 않고 IoCreateFileSpecifyDeviceObjectHint 가 재문 분석 지점 파일을 직접 열려고 시도합니다. 두 경우 모두 열려 있는 작업이 성공한 경우 IoCreateFileSpecifyDeviceObjectHint 는 STATUS_SUCCESS 반환합니다. 그렇지 않으면 루틴은 NTSTATUS 오류 코드를 반환합니다. IoCreateFileSpecifyDeviceObjectHint는 STATUS_REPARSE 반환하지 않습니다.
CreateOptions FILE_OPEN_REQUIRING_OPLOCK 플래그는 파일을 열고 제3자가 파일을 열고 공유 위반을 받을 수 있는 oplock을 요청하는 시점 사이의 시간을 제거합니다. 애플리케이션은 IoCreateFileSpecifyDeviceObjectHint 에서 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_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를 수행합니다.
NTFS는 FILE_RESERVE_OPFILTER 구현하는 유일한 Microsoft 파일 시스템입니다.
IoCreateFileSpecifyDeviceObjectHint 를 사용하여 볼륨에 대한 핸들을 가져올 수 없습니다.
IoCreateFileSpecifyDeviceObjectHint에 전달된 파일 이름 경로에 재문 분석 지점이 포함되어 있는 경우 재문 분석 지점은 파일 또는 디렉터리가 있는 동일한 볼륨으로 확인되어야 합니다. 그렇지 않으면 오류 STATUS_INVALID_DEVICE_OBJECT_PARAMETER 또는 STATUS_MOUNT_POINT_NOT_RESOLVED 반환됩니다.
요구 사항
| 지원되는 최소 클라이언트 | IoCreateFileSpecifyDeviceObjectHint 루틴은 Windows XP부터 사용할 수 있습니다. |
| 대상 플랫폼 | 유니버설 |
| 헤더 | ntddk.h(Ntddk.h, Ntifs.h, FltKernel.h 포함) |
| 라이브러리 | NtosKrnl.lib |
| DLL | NtosKrnl.exe |
| IRQL | PASSIVE_LEVEL |
참고 항목
피드백
다음에 대한 사용자 의견 제출 및 보기