From cae747febaa28ce8764f322683f5aed6c5893ada Mon Sep 17 00:00:00 2001 From: short <> Date: Sat, 11 Oct 2003 12:59:14 +0000 Subject: [PATCH] CcPinMappedData(): Function should not invalidate already mapped data. - Fixed mount by ntfs.sys of NT-5.1sp1. - Bugreport by the courtesy of Martin Drab. --- src/libcaptive/cc/bcbpin.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/libcaptive/cc/bcbpin.c b/src/libcaptive/cc/bcbpin.c index e7af5a5..c9420dc 100644 --- a/src/libcaptive/cc/bcbpin.c +++ b/src/libcaptive/cc/bcbpin.c @@ -87,8 +87,11 @@ BOOLEAN r; g_assert((FileOffset->QuadPart&~(PAGE_SIZE-1))==((FileOffset->QuadPart+Length-1)&~(PAGE_SIZE-1))); SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject); + /* Do not invalide 'map'ped data otherwise ntfs.sys of NT-5.1sp1 mount crashes. + */ captive_private_bcb_pin_object=captive_private_bcb_pin_object_get_ref(SharedCacheMap, - CAPTIVE_ROUND_DOWN64(FileOffset->QuadPart,PAGE_SIZE)); + CAPTIVE_ROUND_DOWN64(FileOffset->QuadPart,PAGE_SIZE), + FALSE); /* invalidate_new */ captive_shared_cache_map_data_validate_noread(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length); @@ -164,9 +167,15 @@ BOOLEAN r; CAPTIVE_ROUND_DOWN64(FileOffset->QuadPart,PAGE_SIZE)))) g_object_ref(captive_private_bcb_pin_object); } - else + else { + /* Invalide possibly only 'map'ped data as we need to re-read them on CcPinRead(). + * Otherwise any file written by fastfat.sys of NT-5.1sp1 will corrupt + * the code+55AA of DOS boot sector (disk offset 0x0). + */ captive_private_bcb_pin_object=captive_private_bcb_pin_object_get_ref(SharedCacheMap, - CAPTIVE_ROUND_DOWN64(FileOffset->QuadPart,PAGE_SIZE)); + CAPTIVE_ROUND_DOWN64(FileOffset->QuadPart,PAGE_SIZE), + TRUE); /* invalidate_new */ + } if (captive_private_bcb_pin_object) { captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,FileOffset->QuadPart,FileOffset->QuadPart+Length); @@ -266,7 +275,8 @@ BOOLEAN r; SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject); captive_private_bcb_pin_object=captive_private_bcb_pin_object_get_ref(SharedCacheMap, - CAPTIVE_ROUND_DOWN64(FileOffset->QuadPart,PAGE_SIZE)); + CAPTIVE_ROUND_DOWN64(FileOffset->QuadPart,PAGE_SIZE), + FALSE); /* invalidate_new: FIXME: Is it compatible? */ captive_shared_cache_map_set_data_valid(SharedCacheMap,FileOffset->QuadPart,FileOffset->QuadPart+Length); if (Zero) -- 1.8.3.1