From ca41096d98ab43ec1355271a01a7714cc55f0e6d Mon Sep 17 00:00:00 2001 From: short <> Date: Sat, 13 Sep 2003 05:59:11 +0000 Subject: [PATCH] CcZeroData(): Fix ext2fsd.sys-v0.10a call on non-SharedCacheMapped object. --- src/libcaptive/cc/copy.c | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/libcaptive/cc/copy.c b/src/libcaptive/cc/copy.c index 97612ca..1020a6a 100644 --- a/src/libcaptive/cc/copy.c +++ b/src/libcaptive/cc/copy.c @@ -129,7 +129,7 @@ BOOLEAN r; 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", @@ -144,18 +144,47 @@ BOOLEAN r; 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; -- 1.8.3.1