2 * FFS File System Driver for Windows
8 * Lee Jae-Hong, http://www.pyrasis.com
19 extern PFFS_GLOBAL FFSGlobal
;
25 #pragma alloc_text(PAGE, FFSShutDown)
29 __drv_mustHoldCriticalRegion
32 IN PFFS_IRP_CONTEXT IrpContext
)
41 PIO_STACK_LOCATION IrpSp
;
44 PLIST_ENTRY ListEntry
;
46 BOOLEAN GlobalResourceAcquired
= FALSE
;
54 ASSERT((IrpContext
->Identifier
.Type
== FFSICX
) &&
55 (IrpContext
->Identifier
.Size
== sizeof(FFS_IRP_CONTEXT
)));
57 Status
= STATUS_SUCCESS
;
59 Irp
= IrpContext
->Irp
;
61 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
63 #pragma prefast( suppress: 28137, "by design" )
65 if (!ExAcquireResourceExclusiveLite(
67 IrpContext
->IsSynchronous
))
69 Status
= STATUS_PENDING
;
73 GlobalResourceAcquired
= TRUE
;
76 Event
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(KEVENT
), FFS_POOL_TAG
);
77 KeInitializeEvent(Event
, NotificationEvent
, FALSE
);
80 for (ListEntry
= FFSGlobal
->VcbList
.Flink
;
81 ListEntry
!= &(FFSGlobal
->VcbList
);
82 ListEntry
= ListEntry
->Flink
)
84 Vcb
= CONTAINING_RECORD(ListEntry
, FFS_VCB
, Next
);
86 if (ExAcquireResourceExclusiveLite(
91 Status
= FFSFlushFiles(Vcb
, TRUE
);
92 if(!NT_SUCCESS(Status
))
97 Status
= FFSFlushVolume(Vcb
, TRUE
);
99 if(!NT_SUCCESS(Status
))
104 FFSDiskShutDown(Vcb
);
106 ExReleaseResourceForThreadLite(
108 ExGetCurrentResourceThread());
113 IoUnregisterFileSystem(FFSGlobal->DeviceObject);
119 if (GlobalResourceAcquired
)
121 ExReleaseResourceForThreadLite(
122 &FFSGlobal
->Resource
,
123 ExGetCurrentResourceThread());
126 if (!IrpContext
->ExceptionInProgress
)
128 if (Status
== STATUS_PENDING
)
130 FFSQueueRequest(IrpContext
);
134 FFSCompleteIrpContext(IrpContext
, Status
);