#define NDEBUG
#include <debug.h>
-/* FUNCTIONS ****************************************************************/
+/* GLOBALS ******************************************************************/
PCDFS_GLOBAL_DATA CdfsGlobalData;
DriverObject->DriverUnload = NULL;
+ /* Cache manager */
+ CdfsGlobalData->CacheMgrCallbacks.AcquireForLazyWrite = CdfsAcquireForLazyWrite;
+ CdfsGlobalData->CacheMgrCallbacks.ReleaseFromLazyWrite = CdfsReleaseFromLazyWrite;
+ CdfsGlobalData->CacheMgrCallbacks.AcquireForReadAhead = CdfsAcquireForLazyWrite;
+ CdfsGlobalData->CacheMgrCallbacks.ReleaseFromReadAhead = CdfsReleaseFromLazyWrite;
+
IoRegisterFileSystem(DeviceObject);
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
return(STATUS_SUCCESS);
}
+
+BOOLEAN NTAPI
+CdfsAcquireForLazyWrite(IN PVOID Context,
+ IN BOOLEAN Wait)
+{
+ PFCB Fcb = (PFCB)Context;
+ ASSERT(Fcb);
+ DPRINT("CdfsAcquireForLazyWrite(): Fcb %p\n", Fcb);
+
+ if (!ExAcquireResourceExclusiveLite(&(Fcb->MainResource), Wait))
+ {
+ DPRINT("CdfsAcquireForLazyWrite(): ExReleaseResourceLite failed.\n");
+ return FALSE;
+ }
+ return TRUE;
+}
+
+VOID NTAPI
+CdfsReleaseFromLazyWrite(IN PVOID Context)
+{
+ PFCB Fcb = (PFCB)Context;
+ ASSERT(Fcb);
+ DPRINT("CdfsReleaseFromLazyWrite(): Fcb %p\n", Fcb);
+
+ ExReleaseResourceLite(&(Fcb->MainResource));
+}
{
FSRTL_COMMON_FCB_HEADER RFCB;
SECTION_OBJECT_POINTERS SectionObjectPointers;
+ ERESOURCE MainResource;
ERESOURCE PagingIoResource;
PFILE_OBJECT FileObject;
WCHAR PathName[MAX_PATH]; /* path+filename 260 max */
WCHAR ShortNameBuffer[13];
- ERESOURCE MainResource;
-
LIST_ENTRY FcbListEntry;
struct _FCB* ParentFcb;
PDRIVER_OBJECT DriverObject;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
+ CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
} CDFS_GLOBAL_DATA, *PCDFS_GLOBAL_DATA;
extern PCDFS_GLOBAL_DATA CdfsGlobalData;
DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath);
+BOOLEAN NTAPI
+CdfsAcquireForLazyWrite(IN PVOID Context,
+ IN BOOLEAN Wait);
+
+VOID NTAPI
+CdfsReleaseFromLazyWrite(IN PVOID Context);
+
#endif //CDFS_H
CcInitializeCacheMap(FileObject,
(PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
FALSE,
- NULL,
- NULL);
+ &(CdfsGlobalData->CacheMgrCallbacks),
+ Fcb);
ObDereferenceObject(FileObject);
Fcb->Flags |= FCB_CACHE_INITIALIZED;
CcInitializeCacheMap(FileObject,
(PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
FALSE,
- NULL,
- NULL);
+ &(CdfsGlobalData->CacheMgrCallbacks),
+ Fcb);
Fcb->Flags |= FCB_CACHE_INITIALIZED;
}
CcInitializeCacheMap(DeviceExt->StreamFileObject,
(PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
TRUE,
- NULL,
- NULL);
+ &(CdfsGlobalData->CacheMgrCallbacks),
+ Fcb);
ExInitializeResourceLite(&DeviceExt->VcbResource);
ExInitializeResourceLite(&DeviceExt->DirResource);
CcInitializeCacheMap(FileObject,
(PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
FALSE,
- NULL,
- NULL);
+ &(CdfsGlobalData->CacheMgrCallbacks),
+ Fcb);
}
FileOffset.QuadPart = (LONGLONG)ReadOffset;