/* GLOBALS ******************************************************************/
FAT_GLOBAL_DATA FatGlobalData;
+FAST_MUTEX FatCloseQueueMutex;
/* FUNCTIONS ****************************************************************/
RtlZeroMemory(&FatGlobalData, sizeof(FAT_GLOBAL_DATA));
FatGlobalData.DriverObject = DriverObject;
FatGlobalData.DiskDeviceObject = DeviceObject;
+ FatGlobalData.SystemProcess = PsGetCurrentProcess();
/* Fill major function handlers */
DriverObject->MajorFunction[IRP_MJ_CLOSE] = FatClose;
/* Initialize synchronization resource for the global data */
ExInitializeResourceLite(&FatGlobalData.Resource);
+ /* Initialize queued close stuff */
+ InitializeListHead(&FatGlobalData.AsyncCloseList);
+ InitializeListHead(&FatGlobalData.DelayedCloseList);
+ FatGlobalData.FatCloseItem = IoAllocateWorkItem(DeviceObject);
+ ExInitializeFastMutex(&FatCloseQueueMutex);
+
/* Initialize global VCB list */
InitializeListHead(&FatGlobalData.VcbListHead);
TypeOfOpen = (*Ccb == NULL ? DirectoryFile : UserDirectoryOpen);
- DPRINT1("Referencing a directory: %wZ\n", &(*FcbOrDcb)->FullFileName);
+ DPRINT("Referencing a directory: %wZ\n", &(*FcbOrDcb)->FullFileName);
break;
/* File */
return MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
}
+BOOLEAN
+NTAPI
+FatIsTopLevelIrp(IN PIRP Irp)
+{
+ if (!IoGetTopLevelIrp())
+ {
+ IoSetTopLevelIrp(Irp);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+VOID
+NTAPI
+FatNotifyReportChange(IN PFAT_IRP_CONTEXT IrpContext,
+ IN PVCB Vcb,
+ IN PFCB Fcb,
+ IN ULONG Filter,
+ IN ULONG Action)
+{
+ if (Fcb->FullFileName.Buffer == NULL)
+ FatSetFullFileNameInFcb(IrpContext, Fcb);
+
+ ASSERT(Fcb->FullFileName.Length != 0 );
+ ASSERT(Fcb->FileNameLength != 0 );
+ ASSERT(Fcb->FullFileName.Length > Fcb->FileNameLength );
+ ASSERT(Fcb->FullFileName.Buffer[(Fcb->FullFileName.Length - Fcb->FileNameLength)/sizeof(WCHAR) - 1] == L'\\' );
+
+ FsRtlNotifyFullReportChange(Vcb->NotifySync,
+ &Vcb->NotifyList,
+ (PSTRING)&Fcb->FullFileName,
+ (USHORT)(Fcb->FullFileName.Length -
+ Fcb->FileNameLength),
+ NULL,
+ NULL,
+ Filter,
+ Action,
+ NULL);
+}
+
/* EOF */