/* 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
SectionObjectPointer_set(FileObject);\r
}\r
\r
-static void dump_irp_mj(struct _DEVICE_OBJECT *DeviceObject,struct _IRP *Irp,BOOLEAN restricted)\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
-\r
- if (restricted)\r
- return;\r
+ FileObject=IoStackLocation->FileObject;\r
+ dump_FileObject(FileObject);\r
\r
switch (IoStackLocation->MajorFunction) {\r
case IRP_MJ_READ:\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,FALSE); \\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(DeviceObject,Irp,TRUE); \\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