/* 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
#ifndef FSCTL_MARK_VOLUME_DIRTY\r
#define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,12,METHOD_BUFFERED,FILE_ANY_ACCESS)\r
#endif\r
+#ifndef FSCTL_SET_COMPRESSION\r
+#define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,16,METHOD_BUFFERED,FILE_READ_DATA|FILE_WRITE_DATA)\r
+#endif\r
#ifndef FSCTL_INVALIDATE_VOLUMES\r
#define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,21,METHOD_BUFFERED,FILE_ANY_ACCESS)\r
#endif\r
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
IoStackLocation->Parameters.Write.Length);\r
break;\r
case IRP_MJ_FILE_SYSTEM_CONTROL:\r
- DBGSINGLE2("FILE_SYSTEM_CONTROL: MinorFunction=%s (%d)",\r
+ DBGSINGLE2("FILE_SYSTEM_CONTROL: MinorFunction=%s (%0x%X)",\r
((1\r
&& IoStackLocation->MinorFunction>=0\r
&& IoStackLocation->MinorFunction<G_N_ELEMENTS(dump_irp_mj_FILE_SYSTEM_CONTROL_MinorFunction_names))\r
case FSCTL_UNLOCK_VOLUME: FsControlCode_name="FSCTL_UNLOCK_VOLUME"; break;\r
case FSCTL_DISMOUNT_VOLUME: FsControlCode_name="FSCTL_DISMOUNT_VOLUME"; break;\r
case FSCTL_MARK_VOLUME_DIRTY: FsControlCode_name="FSCTL_MARK_VOLUME_DIRTY"; break;\r
+ case FSCTL_SET_COMPRESSION: FsControlCode_name="FSCTL_SET_COMPRESSION"; break;\r
case FSCTL_INVALIDATE_VOLUMES: FsControlCode_name="FSCTL_INVALIDATE_VOLUMES"; break;\r
case FSCTL_IS_VOLUME_DIRTY: FsControlCode_name="FSCTL_IS_VOLUME_DIRTY"; break;\r
case FSCTL_FILE_PREFETCH: FsControlCode_name="FSCTL_FILE_PREFETCH"; break;\r
default: FsControlCode_name="???"; break;\r
}\r
- DBGSINGLE2("USER_FS_REQUEST: FsControlCode=%s (%d)",FsControlCode_name,\r
+ DBGSINGLE2("USER_FS_REQUEST: FsControlCode=%s (0x%X)",FsControlCode_name,\r
IoStackLocation->Parameters.FileSystemControl.FsControlCode);\r
} break;\r
}\r
}\r
+\r
+ return FileObject;\r
}\r
\r
#define TRACEFS_MAJORS \\r
{ \\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
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