FILE_OBJECT 구조체(wdm.h)
FILE_OBJECT 구조체는 시스템에서 파일 개체를 나타내는 데 사용됩니다. 사용자 모드로 보호되는 하위 시스템에 파일 개체는 파일, 디바이스, 디렉터리 또는 볼륨의 열린 instance 나타냅니다. 디바이스 및 중간 드라이버의 경우 파일 개체는 일반적으로 디바이스 개체를 나타냅니다. 파일 시스템 스택의 드라이버에 대 한 파일 개체는 일반적으로 디렉터리 또는 파일을 나타냅니다.
파일 개체는 부분적으로 불투명합니다. 파일 시스템 드라이버 및 네트워크 전송 드라이버와 같은 특정 유형의 드라이버는 파일 개체의 일부 필드를 사용합니다.
구문
typedef struct _FILE_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
PVPB Vpb;
PVOID FsContext;
PVOID FsContext2;
PSECTION_OBJECT_POINTERS SectionObjectPointer;
PVOID PrivateCacheMap;
NTSTATUS FinalStatus;
struct _FILE_OBJECT *RelatedFileObject;
BOOLEAN LockOperation;
BOOLEAN DeletePending;
BOOLEAN ReadAccess;
BOOLEAN WriteAccess;
BOOLEAN DeleteAccess;
BOOLEAN SharedRead;
BOOLEAN SharedWrite;
BOOLEAN SharedDelete;
ULONG Flags;
UNICODE_STRING FileName;
LARGE_INTEGER CurrentByteOffset;
__volatile ULONG Waiters;
__volatile ULONG Busy;
PVOID LastLock;
KEVENT Lock;
KEVENT Event;
__volatile PIO_COMPLETION_CONTEXT CompletionContext;
KSPIN_LOCK IrpListLock;
LIST_ENTRY IrpList;
__volatile _IOP_FILE_OBJECT_EXTENSION *FileObjectExtension;
struct _IOP_FILE_OBJECT_EXTENSION;
} FILE_OBJECT, *PFILE_OBJECT;
멤버
Type
시스템에서 개체가 파일 개체임을 나타내는 데 사용하는 읽기 전용 멤버입니다. 개체가 파일 개체인 경우 이 멤버의 값은 5입니다.
Size
파일 개체의 크기(바이트)를 지정하는 읽기 전용 멤버입니다. 이 크기는 파일 개체 확장명(있는 경우)을 포함하지 않습니다.
DeviceObject
파일이 열려 있는 디바이스 개체에 대한 포인터입니다.
Vpb
파일 개체와 연결된 볼륨 매개 변수 블록에 대한 포인터입니다.
Vpb 멤버가 NULL이 아닌 경우 파일이 탑재된 볼륨에 상주합니다.
FsContext
드라이버가 파일 개체에 대해 유지 관리하는 선택적 상태에 대한 포인터입니다. 그렇지 않으면 NULL입니다. 파일 시스템 드라이버의 경우 이 멤버는 파일 시스템별 구조 내에 포함된 FSRTL_ADVANCED_FCB_HEADER 헤더 구조를 가리킵니다. 그렇지 않으면 시스템 불안정이 발생할 수 있습니다. 일반적으로 이 헤더 구조는 FCB(파일 제어 블록)에 포함됩니다. 그러나 NTFS와 같은 여러 데이터 스트림을 지원하는 일부 파일 시스템에서 이 헤더 구조는 SCB(스트림 제어 블록)입니다.
WDM 디바이스 스택에서는 FDO(기능 디바이스 개체)만 두 컨텍스트 포인터를 사용할 수 있습니다. 파일 시스템 드라이버는 동일한 데이터 스트림에 대해 여러 개의 열기에서 이 멤버를 공유합니다.
FsContext2
드라이버가 파일 개체에 대해 유지 관리하는 추가 상태에 대한 포인터입니다. 그렇지 않으면 NULL입니다.
기본 파일 시스템이 이 멤버를 활용하기 때문에 이 멤버는 파일 시스템 스택의 드라이버에 대해 불투명합니다.
SectionObjectPointer
파일 개체의 읽기 전용 섹션 개체에 대한 포인터입니다. 이 멤버는 파일 시스템에서만 설정되며 Cache Manager 상호 작용에 사용됩니다.
PrivateCacheMap
캐시 관리자 상호 작용에 사용되는 특정 정보를 처리하는 파일 시스템에서만 설정된 불투명 멤버입니다.
FinalStatus
파일 개체의 I/O 요청의 최종 상태 나타내기 위해 특정 동기적 경우에 사용되는 읽기 전용 멤버입니다.
RelatedFileObject
현재 파일 개체가 이미 열려 있는 파일 개체를 기준으로 열려 있음을 나타내는 데 사용되는 FILE_OBJECT 구조체에 대한 포인터입니다. 이 멤버가 가리키는 파일 개체는 일반적으로 디렉터리입니다(현재 파일이 이 디렉터리를 기준으로 열려 있다는 의미). 그러나 자체에 대해 파일을 다시 열 수 있으며 해당 파일에 대해 이미 열려 있는 기본 데이터 스트림을 기준으로 파일에 대한 대체 데이터 스트림을 열 수 있습니다. RelatedFileObject 멤버는 IRP_MJ_CREATE 요청을 처리하는 동안에만 유효합니다.
LockOperation
읽기 전용 멤버입니다. FALSE이면 파일 개체에서 잠금 작업(NtLockFile)이 수행된 적이 없습니다. TRUE이면 파일 개체에서 하나 이상의 잠금 작업이 수행되었습니다. TRUE로 설정하면 이 멤버는 항상 TRUE로 유지됩니다(예: 파일 개체에서 파일 잠금을 해제해도 이 멤버가 FALSE로 다시 설정되지 않음).
DeletePending
읽기 전용 멤버입니다. TRUE이면 파일 개체와 연결된 파일에 대한 삭제 작업이 있습니다. FALSE이면 현재 파일 개체에 대해 보류 중인 삭제 작업이 없습니다.
ReadAccess
읽기 전용 멤버입니다. TRUE이면 읽기 액세스를 위해 파일 개체와 연결된 파일이 열렸습니다. FALSE이면 읽기 권한 없이 파일이 열렸습니다. 이 정보는 파일의 공유 액세스를 확인 및/또는 설정할 때 사용됩니다.
WriteAccess
읽기 전용 멤버입니다. TRUE이면 쓰기 액세스를 위해 파일 개체와 연결된 파일이 열렸습니다. FALSE이면 쓰기 권한 없이 파일이 열렸습니다. 이 정보는 파일의 공유 액세스를 확인 및/또는 설정할 때 사용됩니다.
DeleteAccess
읽기 전용 멤버입니다. TRUE이면 파일 개체와 연결된 파일이 삭제 액세스를 위해 열렸습니다. FALSE이면 삭제 액세스 없이 파일이 열렸습니다. 이 정보는 파일의 공유 액세스를 확인 및/또는 설정할 때 사용됩니다.
SharedRead
읽기 전용 멤버입니다. TRUE이면 읽기 공유 액세스를 위해 파일 개체와 연결된 파일이 열렸습니다. FALSE이면 읽기 공유 액세스 권한 없이 파일이 열렸습니다. 이 정보는 파일의 공유 액세스를 확인 및/또는 설정할 때 사용됩니다.
SharedWrite
읽기 전용 멤버입니다. TRUE이면 쓰기 공유 액세스를 위해 파일 개체와 연결된 파일이 열렸습니다. FALSE이면 쓰기 공유 액세스 권한 없이 파일이 열렸습니다. 이 정보는 파일의 공유 액세스를 확인 및/또는 설정할 때 사용됩니다.
SharedDelete
읽기 전용 멤버입니다. TRUE이면 공유 액세스를 삭제하기 위해 파일 개체와 연결된 파일이 열렸습니다. FALSE이면 공유 액세스를 삭제하지 않고 파일이 열렸습니다. 이 정보는 파일의 공유 액세스를 확인 및/또는 설정할 때 사용됩니다.
Flags
시스템에서 다음 프라이빗 플래그 값 중 하나 이상(비트 포함 OR 조합)을 보유하는 데 사용하는 읽기 전용 멤버입니다.
플래그 | 의미 |
---|---|
FO_FILE_OPEN | 더 이상 사용되지 않습니다. |
FO_SYNCHRONOUS_IO | 파일 개체가 동기 I/O용으로 열립니다. |
FO_ALERTABLE_IO | 이 파일 개체에 대한 요청의 결과로 I/O 관리자의 모든 대기는 경고할 수 있습니다. |
FO_NO_INTERMEDIATE_BUFFERING | 파일 개체와 연결된 파일은 드라이버의 내부 버퍼에서 캐시하거나 버퍼링할 수 없습니다. |
FO_WRITE_THROUGH | 시스템 서비스, 파일 시스템 드라이버 및 파일에 데이터를 쓰는 드라이버는 요청된 쓰기 작업이 완료된 것으로 간주되기 전에 데이터를 파일로 전송해야 합니다. |
FO_SEQUENTIAL_ONLY | 파일 개체와 연결된 파일은 순차 I/O 작업에 대해서만 열렸습니다. |
FO_CACHE_SUPPORTED | 파일 개체와 연결된 파일은 캐시할 수 있습니다. 이 플래그는 파일 시스템 드라이버에서만 설정해야 하며 FsContext 멤버가 유효한 FSRTL_ADVANCED_FCB_HEADER 구조를 가리키는 경우에만 설정해야 합니다. |
FO_NAMED_PIPE | 파일 개체는 명명된 파이프를 나타냅니다. |
FO_STREAM_FILE | 파일 개체는 파일 스트림을 나타냅니다. |
FO_MAILSLOT | 파일 개체는 mailslot을 나타냅니다. |
FO_GENERATE_AUDIT_ON_CLOSE | 더 이상 사용되지 않습니다. |
FO_QUEUE_IRP_TO_THREAD | IRP는 이 파일 개체에 큐에 대기되지 않습니다. |
FO_DIRECT_DEVICE_OPEN | 이 파일 개체를 대상으로 하는 디바이스가 직접 열렸습니다. |
FO_FILE_MODIFIED | 파일 개체와 연결된 파일이 수정되었습니다. |
FO_FILE_SIZE_CHANGED | 파일 개체와 연결된 파일의 크기가 변경되었습니다. |
FO_CLEANUP_COMPLETE | 파일 시스템에서 이 파일 개체에 대한 정리를 완료했습니다. |
FO_TEMPORARY_FILE | 파일 개체와 연결된 파일은 임시 파일입니다. |
FO_DELETE_ON_CLOSE | 파일 개체와 연결된 파일은 닫히면 파일 시스템에 의해 삭제됩니다. |
FO_OPENED_CASE_SENSITIVE | 파일 개체와 연결된 파일의 파일 이름 케이스가 적용됩니다. |
FO_HANDLE_CREATED | 파일 개체에 대한 파일 핸들이 만들어졌습니다. |
FO_FILE_FAST_IO_READ | 이 파일 개체에서 빠른 I/O 읽기가 수행되었습니다. |
FO_RANDOM_ACCESS | 임의 액세스를 위해 파일 개체와 연결된 파일이 열렸습니다. |
FO_FILE_OPEN_CANCELLED | 이 파일 개체에 대한 만들기 요청이 완료되기 전에 취소되었습니다. |
FO_VOLUME_OPEN | 파일 개체는 볼륨 열기 요청을 나타냅니다. |
FO_REMOTE_ORIGIN | 파일 개체와 연결된 파일에 대한 만들기 요청은 원격 컴퓨터에서 시작되었습니다. |
FO_SKIP_COMPLETION_PORT | 포트와 연결된 파일 개체의 경우 IRP가 오류 없는 상태 반환 값으로 동기적으로 완료될 때 시스템에서 완료 포트로의 큐를 건너뛰어야 하는지 여부를 결정합니다. |
FO_SKIP_SET_EVENT | IRP 완료 시 파일 개체에 대한 이벤트 설정을 건너뜁니다. |
FO_SKIP_SET_FAST_IO | 빠른 I/O 경로가 성공하면 시스템 서비스에 제공된 이벤트 설정을 건너뜁니다. |
FileName
버퍼 멤버가 볼륨에서 열린 파일의 이름을 포함하는 읽기 전용 유니코드 문자열을 가리키는 UNICODE_STRING 구조체입니다. 볼륨이 열려 있는 경우 UNICODE_STRING 구조체의 Length 멤버는 0이 됩니다. 이 문자열의 파일 이름은 IRP_MJ_CREATE 요청을 처음 처리하는 동안에만 유효합니다. 파일 시스템이 IRP_MJ_CREATE 요청을 처리하기 시작한 후에는 이 파일 이름을 유효한 것으로 간주해서는 안 됩니다. UNICODE_STRING 구조체의 Buffer 멤버가 가리키는 문자열의 스토리지는 페이징된 시스템 메모리에 할당됩니다. 파일 이름을 가져오는 방법에 대한 자세한 내용은 FltGetFileNameInformation을 참조하세요.
CurrentByteOffset
파일 개체와 연결된 파일 오프셋(바이트)을 지정하는 읽기 전용 멤버입니다.
Waiters
시스템에서 동기 액세스를 위해 열린 파일 개체의 미해결 웨이터 수를 계산하는 데 사용하는 읽기 전용 멤버입니다.
Busy
시스템에서 동기 액세스를 위해 열린 파일 개체가 현재 사용 중인지 여부를 나타내는 데 사용되는 읽기 전용 멤버입니다.
LastLock
파일 개체에 적용된 마지막 잠금에 대한 불투명 포인터입니다.
Lock
시스템에서 파일 개체 이벤트 잠금을 보유하는 데 사용하는 불투명 멤버입니다. 이벤트 잠금은 파일 개체에 대한 동기 액세스를 제어하는 데 사용됩니다. 동기 액세스를 위해 열린 파일 개체에만 적용됩니다.
Event
시스템에서 파일 개체에 대한 이벤트 개체를 보유하는 데 사용하는 불투명 멤버입니다. 이벤트 개체는 사용자 이벤트가 제공되지 않거나 동기 API가 호출된 경우 파일 개체에 대한 I/O 요청이 완료되었음을 알리는 데 사용됩니다.
CompletionContext
파일 개체와 연결된 완료 포트 정보(포트 포인터 및 키)에 대한 불투명 포인터(있는 경우)입니다.
IrpListLock
파일 개체의 IRP 목록에 대한 액세스를 동기화하는 데 사용되는 스핀 잠금 역할을 하는 KSPIN_LOCK 구조체에 대한 불투명 포인터입니다.
IrpList
파일 개체와 연결된 IRP 목록의 헤드에 대한 불투명 포인터입니다.
FileObjectExtension
파일 개체의 FOBX(파일 개체 확장명) 구조에 대한 불투명 포인터입니다. FOBX 구조에는 내부적으로 사용되는 다양한 불투명 컨텍스트와 FsRtlXxx 루틴을 통해 사용할 수 있는 파일별 개체 컨텍스트가 포함됩니다.
_IOP_FILE_OBJECT_EXTENSION
_IOP_FILE_OBJECT_EXTENSION 구조체입니다.
설명
드라이버는 FsContext 및 FsContext2 멤버를 사용하여 열려 있는 파일 개체에 대한 드라이버 결정 상태를 유지할 수 있습니다. IRP의 드라이버 I/O 스택 위치에서 파일 개체에 액세스할 수 없는 한 드라이버는 이러한 멤버를 사용할 수 없습니다.
파일 개체의 나머지 멤버는 모두 불투명하거나 읽기 전용입니다.
파일 개체 내의 불투명 멤버는 액세스할 수 없는 것으로 간주되어야 합니다. 개체 필드 위치에 종속되거나 불투명 멤버에 대한 액세스 권한이 있는 드라이버는 시간이 지남에 따라 다른 드라이버와 이식 가능하고 상호 운용성이 유지되지 않을 수 있습니다.
드라이버는 읽기 전용 멤버를 사용하여 관련 정보를 가져올 수 있지만 읽기 전용 멤버 및 포인터인 경우 멤버가 가리키는 개체를 수정해서는 안됩니다.
IRP_MJ_CREATE 요청을 처리하는 동안 파일 시스템 드라이버는 IoSetShareAccess 루틴(클라이언트가 파일을 처음 여는 경우) 또는 IoCheckShareAccess 루틴(파일을 공유하려는 후속 클라이언트의 경우)을 호출합니다. IoSetShareAccess 및 IoCheckShareAccess 는 ReadAccess, WriteAccess 및 DeleteAccess 멤버를 업데이트하여 클라이언트가 파일에 대한 단독 액세스 권한이 있는 경우 클라이언트에 부여된 액세스 권한을 나타냅니다. 또한 IoCheckShareAccess 는 SharedRead, SharedWrite 및 SharedDelete 멤버를 업데이트하여 파일을 공유하는 두 개 이상의 클라이언트에 동시에 부여되는 액세스 권한을 나타냅니다. 파일 시스템 이외의 디바이스에 대한 드라이버가 클라이언트의 액세스 권한을 모니터링해야 하는 경우 이 드라이버는 일반적으로 FsContext 및 FsContext2 멤버가 가리키는 컨텍스트 버퍼에 액세스 권한 정보를 저장 합니다 .
지정된 파일 개체가 나타내는 개체 형식(예: 파일, 디렉터리 또는 볼륨)은 파일 개체 구조의 내용만 검사하여 확인할 수 없습니다. 파일 개체가 나타내는 개체의 형식을 확인하는 방법에 대한 자세한 내용은 ZwQueryInformationFile을 참조하세요.
CLFS(Common Log File System)는 LOG_FILE_OBJECT 구조를 사용하여 로그를 나타냅니다. ClfsCreateLogFile 함수는 클라이언트가 다른 CLFS 함수에 전달하는 LOG_FILE_OBJECT 구조체에 대한 포인터를 반환합니다.
CLFS 클라이언트는 LOG_FILE_OBJECT 구조체의 멤버에 직접 액세스하지 않습니다.
typedef FILE_OBJECT LOG_FILE_OBJECT, *PLOG_FILE_OBJECT, **PPLOG_FILE_OBJECT;
요구 사항
요구 사항 | 값 |
---|---|
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h 포함) |