📄 udfstruc.h
字号:
//
ERESOURCE FcbResource;
//
// This is the FastMutex for this Fcb.
//
FAST_MUTEX FcbMutex;
} FCB_NONPAGED;
typedef FCB_NONPAGED *PFCB_NONPAGED;
typedef struct _FCB_DATA {
//
// The following field is used by the oplock module
// to maintain current oplock information.
//
OPLOCK Oplock;
//
// The following field is used by the filelock module
// to maintain current byte range locking information.
// A file lock is allocated as needed.
//
PFILE_LOCK FileLock;
} FCB_DATA, *PFCB_DATA;
typedef struct _FCB_INDEX {
//
// Internal stream file for the directory.
//
PFILE_OBJECT FileObject;
//
// Root of splay trees for exact and ignore case prefix trees.
//
PRTL_SPLAY_LINKS ExactCaseRoot;
PRTL_SPLAY_LINKS IgnoreCaseRoot;
} FCB_INDEX, *PFCB_INDEX;
//
// The Fcb/Dcb record corresponds to every open file and directory, and to
// every directory on an opened path.
//
typedef struct _FCB {
//
// The following field is used for fast I/O. It contains the node
// type code and size, indicates if fast I/O is possible, contains
// allocation, file, and valid data size, a resource, and call back
// pointers for FastIoRead and FastMdlRead.
//
//
// Node type codes for the Fcb must be one of the following.
//
// UDFS_NTC_FCB_INDEX
// UDFS_NTC_FCB_DATA
//
//
// Common Fsrtl Header. The named header is for the fieldoff.c output. We
// use the unnamed header internally.
//
union {
FSRTL_COMMON_FCB_HEADER Header;
FSRTL_COMMON_FCB_HEADER;
};
//
// Vcb for this Fcb.
//
PVCB Vcb;
//
// Queues of Lcbs that are on this Fcb: Parent - edges that lead in
// Child - edges that lead out
//
// We anticipate supporting the streaming extension to UDF 2.0, so we
// leave the ChildLcbQueue here which in the case of a stream-rich file
// will contain a solitary Lcb leading to the stream directory.
//
LIST_ENTRY ParentLcbQueue;
LIST_ENTRY ChildLcbQueue;
//
// Length of Root ICB Extent for this object. Coupled with the information
// in the FileId, this will allow discovery of the active File Entry for this
// Fcb at any time.
//
ULONG RootExtentLength;
//
// FileId for this file.
//
FILE_ID FileId;
//
// Counts on this Fcb. Cleanup count represents the number of open handles
// on this Fcb. Reference count represents the number of reasons this Fcb
// is still present. It includes file objects, children Fcb and anyone
// who wants to prevent this Fcb from going away. Cleanup count is synchronized
// with the FcbResource. The reference count is synchronized with the
// FcbMutex.
//
ULONG FcbCleanup;
ULONG FcbReference;
ULONG FcbUserReference;
//
// State flags for this Fcb.
//
ULONG FcbState;
//
// NT style attributes for the Fcb.
//
ULONG FileAttributes;
//
// This is the thread and count for the thread which has locked this
// Fcb.
//
PVOID FcbLockThread;
ULONG FcbLockCount;
//
// Information for Lsn->Psn mapping. If the file data is embedded, we have a
// lookup into the metadata stream for the single logical block and an offset
// of the data within that block. If the file data is is external, we have a
// regular Mapping Control Block.
//
// Metadata structures are mapped through the volume-level Metadata Fcb which
// uses the volume's VMCB.
//
union {
LARGE_MCB Mcb;
struct EMBEDDED_MAPPING {
ULONG EmbeddedVsn;
ULONG EmbeddedOffset;
};
};
//
// This is the nonpaged data for the Fcb
//
PFCB_NONPAGED FcbNonpaged;
//
// Share access structure.
//
SHARE_ACCESS ShareAccess;
//
// We cache a few fields from the FE so that various operations do not have to
// hit the disk (query, etc.).
//
//
// Time stamps for this file.
//
TIMESTAMP_BUNDLE Timestamps;
//
// Link count on this file.
//
USHORT LinkCount;
union {
ULONG FcbType;
FCB_INDEX;
FCB_DATA;
};
} FCB, *PFCB;
#define FCB_STATE_INITIALIZED (0x00000001)
#define FCB_STATE_IN_FCB_TABLE (0x00000002)
#define FCB_STATE_VMCB_MAPPING (0x00000004)
#define FCB_STATE_EMBEDDED_DATA (0x00000008)
#define FCB_STATE_MCB_INITIALIZED (0x00000010)
#define SIZEOF_FCB_DATA \
(FIELD_OFFSET( FCB, FcbType ) + sizeof( FCB_DATA ))
#define SIZEOF_FCB_INDEX \
(FIELD_OFFSET( FCB, FcbType ) + sizeof( FCB_INDEX ))
//
// The Ccb record is allocated for every user file object
//
typedef struct _CCB {
//
// Type and size of this record (must be UDFS_NTC_CCB)
//
NODE_TYPE_CODE NodeTypeCode;
NODE_BYTE_SIZE NodeByteSize;
//
// Flags. Indicates flags to apply for the current open.
//
ULONG Flags;
//
// Fcb for the file being opened.
//
PFCB Fcb;
//
// Lcb for the file being opened.
//
PLCB Lcb;
//
// We store state information in the Ccb for a directory
// enumeration on this handle.
//
//
// Offset in the virtual directory stream to base the next enumeration.
//
// A small number (in fact, possibly one) of file indices are reserved for
// synthesized directory entries (like '.'). Past that point, CurrentFileIndex -
// UDF_MAX_SYNTHESIZED_FILEINDEX is a byte offset in the stream.
//
LONGLONG CurrentFileIndex;
UNICODE_STRING SearchExpression;
//
// Highest ULONG-representable FileIndex so far found in the directory stream.
// This corresponds to the highest FileIndex returnable in a query structure.
//
ULONG HighestReturnableFileIndex;
} CCB, *PCCB;
#define CCB_FLAG_OPEN_BY_ID (0x00000001)
#define CCB_FLAG_OPEN_RELATIVE_BY_ID (0x00000002)
#define CCB_FLAG_IGNORE_CASE (0x00000004)
//
// Following flags refer to index enumeration.
//
#define CCB_FLAG_ENUM_NAME_EXP_HAS_WILD (0x00010000)
#define CCB_FLAG_ENUM_MATCH_ALL (0x00020000)
#define CCB_FLAG_ENUM_RETURN_NEXT (0x00040000)
#define CCB_FLAG_ENUM_INITIALIZED (0x00080000)
#define CCB_FLAG_ENUM_NOMATCH_CONSTANT_ENTRY (0x00100000)
//
// The Irp Context record is allocated for every orginating Irp. It is
// created by the Fsd dispatch routines, and deallocated by the UdfComplete
// request routine
//
typedef struct _IRP_CONTEXT {
//
// Type and size of this record (must be UDFS_NTC_IRP_CONTEXT)
//
NODE_TYPE_CODE NodeTypeCode;
NODE_BYTE_SIZE NodeByteSize;
//
// Originating Irp for the request.
//
PIRP Irp;
//
// Vcb for this operation. When this is NULL it means we were called
// with our filesystem device object instead of a volume device object.
// (Mount will fill this in once the Vcb is created)
//
PVCB Vcb;
//
// Exception encountered during the request. Any error raised explicitly by
// the file system will be stored here. Any other error raised by the system
// is stored here after normalizing it.
//
NTSTATUS ExceptionStatus;
//
// Flags for this request.
//
ULONG Flags;
//
// Real device object. This represents the physical device closest to the media.
//
PDEVICE_OBJECT RealDevice;
//
// Io context for a read request.
// Address of Fcb for teardown oplock in create case.
//
union {
struct _UDF_IO_CONTEXT *IoContext;
PFCB *TeardownFcb;
};
//
// Top level irp context for this thread.
//
struct _IRP_CONTEXT *TopLevel;
//
// Major and minor function codes.
//
UCHAR MajorFunction;
UCHAR MinorFunction;
//
// Pointer to the top-level context if this IrpContext is responsible
// for cleaning it up.
//
struct _THREAD_CONTEXT *ThreadContext;
//
// This structure is used for posting to the Ex worker threads.
//
WORK_QUEUE_ITEM WorkQueueItem;
} IRP_CONTEXT, *PIRP_CONTEXT;
#define IRP_CONTEXT_FLAG_ON_STACK (0x00000001)
#define IRP_CONTEXT_FLAG_MORE_PROCESSING (0x00000002)
#define IRP_CONTEXT_FLAG_WAIT (0x00000004)
#define IRP_CONTEXT_FLAG_FORCE_POST (0x00000008)
#define IRP_CONTEXT_FLAG_TOP_LEVEL (0x00000010)
#define IRP_CONTEXT_FLAG_TOP_LEVEL_UDFS (0x00000020)
#define IRP_CONTEXT_FLAG_IN_FSP (0x00000040)
#define IRP_CONTEXT_FLAG_IN_TEARDOWN (0x00000080)
#define IRP_CONTEXT_FLAG_ALLOC_IO (0x00000100)
#define IRP_CONTEXT_FLAG_DISABLE_POPUPS (0x00000200)
//
// Flags used for create.
//
#define IRP_CONTEXT_FLAG_FULL_NAME (0x10000000)
#define IRP_CONTEXT_FLAG_TRAIL_BACKSLASH (0x20000000)
//
// The following flags need to be cleared when a request is posted.
//
#define IRP_CONTEXT_FLAGS_CLEAR_ON_POST ( \
IRP_CONTEXT_FLAG_MORE_PROCESSING | \
IRP_CONTEXT_FLAG_WAIT | \
IRP_CONTEXT_FLAG_FORCE_POST | \
IRP_CONTEXT_FLAG_TOP_LEVEL | \
IRP_CONTEXT_FLAG_TOP_LEVEL_UDFS | \
IRP_CONTEXT_FLAG_IN_FSP | \
IRP_CONTEXT_FLAG_IN_TEARDOWN | \
IRP_CONTEXT_FLAG_DISABLE_POPUPS \
)
//
// The following flags need to be cleared when a request is retried.
//
#define IRP_CONTEXT_FLAGS_CLEAR_ON_RETRY ( \
IRP_CONTEXT_FLAG_MORE_PROCESSING | \
IRP_CONTEXT_FLAG_IN_TEARDOWN | \
IRP_CONTEXT_FLAG_DISABLE_POPUPS \
)
//
// The following flags are set each time through the Fsp loop.
//
#define IRP_CONTEXT_FSP_FLAGS ( \
IRP_CONTEXT_FLAG_WAIT | \
IRP_CONTEXT_FLAG_TOP_LEVEL | \
IRP_CONTEXT_FLAG_TOP_LEVEL_UDFS | \
IRP_CONTEXT_FLAG_IN_FSP \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -