#define TAG_FCB 'BCFV'
#define TAG_IRP 'PRIV'
#define TAG_VFAT 'TAFV'
+#define TAG_FSD_CLOSE_CONTEXT 'CLCV'
/* Global resource acquire/release */
ExReleaseResourceLite(&(FatGlobalData.Resource)); \
}
+#define FatIsFastIoPossible(FCB) ((BOOLEAN) \
+ (((FCB)->Condition != FcbGood || !FsRtlOplockIsFastIoPossible(&(FCB)->Fcb.Oplock)) ? \
+ FastIoIsNotPossible \
+ : \
+ (!FsRtlAreThereCurrentFileLocks(&(FCB)->Fcb.Lock) && \
+ ((FCB)->OutstandingAsyncWrites == 0) && \
+ !FlagOn((FCB)->Vcb->State, VCB_STATE_FLAG_WRITE_PROTECTED) ? \
+ FastIoIsPossible \
+ : \
+ FastIoIsQuestionable \
+ ) \
+ ) \
+)
+
+#define IsFileObjectReadOnly(FO) (!((FO)->WriteAccess | (FO)->DeleteAccess))
+#define IsFileDeleted(FCB) (FlagOn((FCB)->State, FCB_STATE_DELETE_ON_CLOSE) && ((FCB)->UncleanCount == 0))
+
+BOOLEAN
+FORCEINLINE
+FatIsIoRangeValid(IN LARGE_INTEGER Start, IN ULONG Length)
+{
+ /* Check if it's more than 32bits, or if the length causes 32bit overflow.
+ FAT-specific! */
+
+ return !(Start.HighPart || Start.LowPart + Length < Start.LowPart);
+}
+
+
NTSYSAPI
NTSTATUS
NTAPI
PBCB *Bcb,
PVOID *Buffer);
+BOOLEAN
+NTAPI
+FatCheckForDismount(IN PFAT_IRP_CONTEXT IrpContext,
+ PVCB Vcb,
+ IN BOOLEAN Force);
+
/* ----------------------------------------------------------- dir.c */
NTSTATUS NTAPI
/* --------------------------------------------------------- fastfat.c */
+extern FAST_MUTEX FatCloseQueueMutex;
+
PFAT_IRP_CONTEXT NTAPI
FatBuildIrpContext(PIRP Irp, BOOLEAN CanWait);
PVOID FASTCALL
FatMapUserBuffer(PIRP Irp);
+BOOLEAN NTAPI
+FatIsTopLevelIrp(IN PIRP Irp);
+
+VOID NTAPI
+FatNotifyReportChange(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PVCB Vcb,
+ IN PFCB Fcb,
+ IN ULONG Filter,
+ IN ULONG Action);
+
/* --------------------------------------------------------- fullfat.c */
FF_T_SINT32
IN PFCB ParentDcb,
IN FF_FILE *FileHandle);
+VOID NTAPI
+FatDeleteFcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PFCB Fcb);
+
IO_STATUS_BLOCK NTAPI
FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext,
IN PFILE_OBJECT FileObject,
PCCB NTAPI
FatCreateCcb();
+VOID NTAPI
+FatDeleteCcb(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PCCB Ccb);
+
VOID NTAPI
FatSetFullNameInFcb(PFCB Fcb,
PUNICODE_STRING Name);