Initial original import from: fuse-2.4.2-2.fc4
[captive.git] / src / TraceFS / TraceFS-W32 / TraceFS.c
index 72cb138..61ac199 100644 (file)
@@ -71,6 +71,7 @@ static void lock(void)
 /* We need to _fully_ release the lock if we are passing the control to\r
  * callback functions. Single unlock() would free us from our current 'enter:'\r
  * lock but another lock() from Cc*() function which called us would be held.\r
+ * FIXME: Enable of file compression still hangs in CcFlushCache().\r
  */\r
 static void lock_full(int n)\r
 {\r
@@ -288,28 +289,32 @@ static void dump_FileObject(FILE_OBJECT *FileObject)
                DBGSINGLE0("FileObject=NULL");\r
                return;\r
                }\r
-       DBGSINGLE5("FileObject=0x%lX: FileName=%s,Flags=0x%lX,SectionObjectPointer=0x%lX,->SharedCacheMap=0x%lX",\r
+       DBGSINGLE6("FileObject=0x%lX: FileName=%s,ref=%+ld,Flags=0x%lX,SectionObjectPointer=0x%lX,->SharedCacheMap=0x%lX",\r
                        (long)FileObject,\r
-                       dbg_unicode_string(&FileObject->FileName),FileObject->Flags,\r
+                       dbg_unicode_string(&FileObject->FileName),\r
+                       *(LONG *)(((char *)FileObject)-0x18),\r
+                       FileObject->Flags,\r
                        (long)FileObject->SectionObjectPointer,\r
                        (!FileObject->SectionObjectPointer ? -1 : (long)FileObject->SectionObjectPointer->SharedCacheMap));\r
        SectionObjectPointer_set(FileObject);\r
 }\r
 \r
-static void dump_irp_mj(struct _DEVICE_OBJECT *DeviceObject,struct _IRP *Irp)\r
+static FILE_OBJECT *dump_irp_mj(struct _DEVICE_OBJECT *DeviceObject,struct _IRP *Irp)\r
 {\r
 IO_STACK_LOCATION *IoStackLocation;\r
+FILE_OBJECT *FileObject;\r
 \r
        if (!Irp) {\r
                DBGSINGLE0("Irp==NULL");\r
-               return;\r
+               return NULL;\r
                }\r
        IoStackLocation=IoGetCurrentIrpStackLocation(Irp);\r
        if (!IoStackLocation) {\r
                DBGSINGLE0("IoStackLocation==NULL");\r
-               return;\r
+               return NULL;\r
                }\r
-       dump_FileObject(IoStackLocation->FileObject);\r
+       FileObject=IoStackLocation->FileObject;\r
+       dump_FileObject(FileObject);\r
        \r
        switch (IoStackLocation->MajorFunction) {\r
                case IRP_MJ_READ:\r
@@ -349,6 +354,8 @@ const char *FsControlCode_name;
                                        } break;\r
                                }\r
                }\r
+\r
+       return FileObject;\r
 }\r
 \r
 #define TRACEFS_MAJORS \\r
@@ -388,15 +395,20 @@ static NTSTATUS tracefs_major_##irp_mj_name(IN struct _DEVICE_OBJECT *DeviceObje
 { \\r
 NTSTATUS r; \\r
 int locked; \\r
+FILE_OBJECT *FileObject; \\r
  \\r
        DBGSINGLEENTER0( #irp_mj_name ); \\r
-       dump_irp_mj(DeviceObject,Irp); \\r
+       FileObject=dump_irp_mj(DeviceObject,Irp); \\r
        /* Prevent deadlock during display of File Explorer directory listing. \\r
         * Needed at least for IRP_MJ_DIRECTORY_CONTROL and IRP_MJ_CLOSE. \\r
         */ \\r
        locked=unlock_full(); \\r
        r=(*tracefs_major_##irp_mj_name##_orig)(DeviceObject,Irp); \\r
        lock_full(locked); \\r
+       /* Dump_irp_mj() would crash here even now IRP_MJ_READ; \\r
+        * Invalid FileObject address gets detected. \\r
+        */ \\r
+       dump_FileObject(FileObject); \\r
        DBGSINGLELEAVE1( #irp_mj_name ": r=0x%lX",(long)r); \\r
        return r; \\r
 }\r
@@ -1557,3 +1569,62 @@ Wait
        DBGSINGLELEAVE1("CcZeroData: r=%d",r);\r
        return r;\r
 }\r
+\r
+BOOLEAN\r
+CcIsThereDirtyData (\r
+    IN PVPB Vpb\r
+    );\r
+BOOLEAN\r
+TcIsThereDirtyData (\r
+    IN PVPB Vpb\r
+    )\r
+{\r
+BOOLEAN r;\r
+\r
+       DBGSINGLEENTER1("CcIsThereDirtyData: Vpb=0x%lX",(long)Vpb);\r
+       r=CcIsThereDirtyData (\r
+Vpb\r
+    );\r
+       DBGSINGLELEAVE1("CcIsThereDirtyData: r=%d",r);\r
+       return r;\r
+}\r
+\r
+VOID\r
+CcRepinBcb (\r
+    IN PVOID Bcb\r
+    );\r
+VOID\r
+TcRepinBcb (\r
+    IN PVOID Bcb\r
+    )\r
+{\r
+       DBGSINGLEENTER1("CcRepinBcb: Bcb=0x%lX",(long)Bcb);\r
+       CcRepinBcb (\r
+Bcb\r
+    );\r
+       DBGSINGLELEAVE0("CcRepinBcb");\r
+}\r
+\r
+VOID\r
+CcUnpinRepinnedBcb (\r
+    IN PVOID Bcb,\r
+    IN BOOLEAN WriteThrough,\r
+    OUT PIO_STATUS_BLOCK IoStatus\r
+    );\r
+VOID\r
+TcUnpinRepinnedBcb (\r
+    IN PVOID Bcb,\r
+    IN BOOLEAN WriteThrough,\r
+    OUT PIO_STATUS_BLOCK IoStatus\r
+    )\r
+{\r
+       DBGSINGLEENTER2("CcUnpinRepinnedBcb: Bcb=0x%lX,WriteThrough=%d",\r
+                       (long)Bcb,WriteThrough);\r
+       CcUnpinRepinnedBcb (\r
+Bcb,\r
+WriteThrough,\r
+IoStatus\r
+    );\r
+       DBGSINGLELEAVE2("CcUnpinRepinnedBcb: IoStatus->Status=0x%lX,IoStatus->Information=0x%lX",\r
+                       (!IoStatus ? -1 : (long)IoStatus->Status),(!IoStatus ? -1 : (long)IoStatus->Information));\r
+}\r