CcPinMappedData(): Function should not invalidate already mapped data.
authorshort <>
Sat, 11 Oct 2003 12:59:14 +0000 (12:59 +0000)
committershort <>
Sat, 11 Oct 2003 12:59:14 +0000 (12:59 +0000)
 - Fixed mount by ntfs.sys of NT-5.1sp1.
 - Bugreport by the courtesy of Martin Drab.

src/libcaptive/cc/bcbpin.c

index e7af5a5..c9420dc 100644 (file)
@@ -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)