typedef NTSTATUS (*PFAT_OPERATION_HANDLER) (PFAT_IRP_CONTEXT);
+/* Node type stuff */
+typedef CSHORT FAT_NODE_TYPE;
+typedef FAT_NODE_TYPE *PFAT_NODE_TYPE;
+
+#define FatNodeType(Ptr) (*((PFAT_NODE_TYPE)(Ptr)))
+
+/* Node type codes */
+#define FAT_NTC_VCB (CSHORT) '00VF'
+#define FAT_NTC_FCB (CSHORT) 'CF'
+#define FAT_NTC_DCB (CSHORT) 'DF'
+#define FAT_NTC_ROOT_DCB (CSHORT) 'RFD'
+#define FAT_NTC_CCB (CSHORT) 'BCC'
+
typedef struct _FAT_GLOBAL_DATA
{
ERESOURCE Resource;
BOOLEAN Win31FileSystem;
/* Jan 1, 1980 System Time */
LARGE_INTEGER DefaultFileTime;
+
+ /* FullFAT integration */
+ FF_IOMAN *Ioman;
+ FF_ERROR FF_Error;
} FAT_GLOBAL_DATA;
typedef struct _FAT_PAGE_CONTEXT
PFAT_SETFAT_VALUE_RUN_ROUTINE SetValueRun;
} FAT_METHODS, *PFAT_METHODS;
-#define FAT_NTC_VCB (USHORT) '00VF'
+#define VCB_STATE_FLAG_LOCKED 0x01
+
+typedef enum _VCB_CONDITION
+{
+ VcbGood,
+ VcbNotMounted,
+ VcbBad
+} VCB_CONDITION;
/* Volume Control Block */
typedef struct _VCB
PDEVICE_OBJECT TargetDeviceObject;
LIST_ENTRY VcbLinks;
PVPB Vpb;
+ ULONG State;
+ VCB_CONDITION Condition;
+ ERESOURCE Resource;
/* Notifications support */
PNOTIFY_SYNC NotifySync;
ULONG RootDirentSectors;
LONGLONG BeyondLastClusterInFat;
FAT_METHODS Methods;
- /* Root Directory Fcb: */
- struct _FCB *RootFcb;
+
+ /* Root Directory Control block */
+ struct _FCB *RootDcb;
ULONG MediaChangeCount;
+
+ /* FullFAT integration */
+ FF_IOMAN *Ioman;
} VCB, *PVCB;
#define VcbToVolumeDeviceObject(xVcb) \
} FCB_NAME_TYPE;
typedef struct _FCB_NAME_LINK {
+ struct _FCB *Fcb;
RTL_SPLAY_LINKS Links;
- UNICODE_STRING String;
- UCHAR Type;
+ union
+ {
+ OEM_STRING Ansi;
+ UNICODE_STRING String;
+ } Name;
+ BOOLEAN IsDosName;
} FCB_NAME_LINK, *PFCB_NAME_LINK;
-#define FAT_NTC_FCB (USHORT) 'CF'
-#define FAT_NTC_DCB (USHORT) 'DF'
+typedef enum _FCB_CONDITION
+{
+ FcbGood,
+ FcbBad,
+ FcbNeedsToBeVerified
+} FCB_CONDITION;
typedef struct _FCB
{
* FCB into paged and non paged parts
* (as it is done in MS implementation
*/
- FAST_MUTEX HeaderMutex;
+ FAST_MUTEX HeaderMutex; // nonpaged!
SECTION_OBJECT_POINTERS SectionObjectPointers;
- ERESOURCE Resource;
- ERESOURCE PagingIoResource;
+ ERESOURCE Resource; // nonpaged!
+ ERESOURCE PagingIoResource; // nonpaged!
FILE_LOCK Lock;
+ /* First cluster in the fat allocation chain */
+ ULONG FirstClusterOfFile;
+ /* A list of all FCBs of that DCB */
+ LIST_ENTRY ParentDcbLinks;
/* Reference to the Parent Dcb*/
struct _FCB *ParentFcb;
/* Pointer to a Vcb */
PVCB Vcb;
+ /* Fcb state */
+ ULONG State;
+ /* Fcb condition */
+ FCB_CONDITION Condition;
/* Mcb mapping Vbo->Lbo */
LARGE_MCB Mcb;
ULONG FirstCluster;
/* Links into FCB Trie */
- FCB_NAME_LINK FileName[0x2];
+ FCB_NAME_LINK FileName;
/* Buffer for the short name */
WCHAR ShortNameBuffer[0xc];
+ /* Full file name */
+ UNICODE_STRING FullFileName;
+ /* Long name with exact case */
+ UNICODE_STRING ExactCaseLongName;
+ /* A copy of fat attribute byte */
+ UCHAR DirentFatFlags;
/* File basic info */
FILE_BASIC_INFORMATION BasicInfo;
+ /* FullFAT file handle */
+ FF_FILE *FatHandle;
union
{
struct
{
+ /* A list of all FCBs/DCBs opened under this DCB */
+ LIST_ENTRY ParentDcbList;
/* Directory data stream (just handy to have it). */
PFILE_OBJECT StreamFileObject;
/* Bitmap to search for free dirents. */
- /* RTL_BITMAP Bitmap; */
- PRTL_SPLAY_LINKS SplayLinks;
+ RTL_BITMAP FreeBitmap;
+ /* Names */
+ PRTL_SPLAY_LINKS SplayLinksAnsi;
+ PRTL_SPLAY_LINKS SplayLinksUnicode;
} Dcb;
};
} FCB, *PFCB;
typedef struct _CCB
{
+ CSHORT NodeTypeCode;
+ CSHORT NodeByteSize;
+
LARGE_INTEGER CurrentByteOffset;
ULONG Entry;
UNICODE_STRING SearchPattern;
UCHAR Flags;
} CCB, *PCCB;
+typedef enum _TYPE_OF_OPEN
+{
+ UnopenedFileObject,
+ UserFileOpen,
+ UserDirectoryOpen,
+ UserVolumeOpen,
+ VirtualVolumeFile,
+ DirectoryFile,
+ EaFile
+} TYPE_OF_OPEN;
#define CCB_SEARCH_RETURN_SINGLE_ENTRY 0x01
#define CCB_SEARCH_PATTERN_LEGAL_8DOT3 0x02