BOOLEAN CcZeroData(IN PFILE_OBJECT FileObject,IN PLARGE_INTEGER StartOffset,IN PLARGE_INTEGER EndOffset,IN BOOLEAN Wait)
{
-CaptiveSharedCacheMapObject *SharedCacheMap;
+CaptiveSharedCacheMapObject *SharedCacheMap,*SharedCacheMap_orig;
BOOLEAN r;
g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"enter: CcZeroData: FileObject=0x%lX,StartOffset=0x%lX,EndOffset=0x%lX,Wait=%d",
g_return_val_if_fail(StartOffset->QuadPart<=EndOffset->QuadPart,FALSE);
g_return_val_if_fail((EndOffset->QuadPart-StartOffset->QuadPart)
==(size_t)(EndOffset->QuadPart-StartOffset->QuadPart),FALSE);
- g_return_val_if_fail(Wait==TRUE,FALSE);
-
- g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(StartOffset->QuadPart,PAGE_SIZE)); /* NOT YET IMPLEMENTED */
- g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(EndOffset->QuadPart,PAGE_SIZE)); /* NOT YET IMPLEMENTED */
-
- SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
+ /* 'Wait' may be FALSE; used by ext2fsd.sys-v0.10a. */
+
+ /* 'StartOffset' may not be PAGE_SIZE aligned */
+ /* 'EndOffset' may not be PAGE_SIZE aligned */
+
+ g_assert(FileObject->SectionObjectPointers);
+ if ((SharedCacheMap_orig=FileObject->SectionObjectPointers->SharedCacheMap))
+ SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
+ else {
+CC_FILE_SIZES FileSizes;
+static const CACHE_MANAGER_CALLBACKS CallBacks;
+
+ /* ext2fsd.sys-v0.10a calls us on non-SharedCacheMapped object: */
+ FileSizes.AllocationSize=*EndOffset;
+ FileSizes.FileSize=*EndOffset;
+ FileSizes.ValidDataLength=*EndOffset;
+ SharedCacheMap=captive_shared_cache_map_get_ref(
+ FileObject, /* FileObject */
+ &FileSizes, /* FileSizes */
+ FALSE, /* PinAccess */
+ &CallBacks, /* CallBacks */
+ NULL); /* LazyWriterContext */
+ }
captive_shared_cache_map_set_data_valid(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
+ if (Wait)
+ captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,StartOffset->QuadPart,EndOffset->QuadPart);
+ else {
+ captive_shared_cache_map_data_validate_noread(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
+ }
memset(captive_shared_cache_map_get_buffer(SharedCacheMap)+StartOffset->QuadPart,0,EndOffset->QuadPart-StartOffset->QuadPart);
captive_shared_cache_map_set_dirty(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
r=TRUE;
+ if (!SharedCacheMap_orig) {
+ captive_shared_cache_map_flush(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
+ g_object_unref(SharedCacheMap);
+ /* FIXME: Undo captive_shared_cache_map_get_ref:'Currently we never close it.' */
+ g_object_unref(SharedCacheMap);
+ }
+
g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcZeroData: r=%d",r);
return r;