{
KIRQL oldlvl;
PLIST_ENTRY current_entry;
- FILE_SYSTEM_OBJECT* current;
+ FILE_SYSTEM_OBJECT* current,*current_last=NULL;
PIRP Irp;
KEVENT Event;
IO_STATUS_BLOCK IoStatusBlock;
KeInitializeEvent(&Event,NotificationEvent,FALSE);
/* 'current' will get IoDeleteDevice()ed by IRP_MJ_SHUTDOWN! */
- /* FIXME: deadlock loop detection */
while ((current_entry = FileSystemListHead.Flink)!=(&FileSystemListHead))
{
current = CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry);
+ if (current==current_last)
+ {
+ /* At least ntfs.sys-NT5.1sp1 appears to not to unregister itself.
+ * It does not import symbol IoUnregisterFileSystem() at all!
+ * BTW also ext2fsd.sys<=v0.10A also forgets to call IoUnregisterFileSystem().
+ */
+ DPRINT("IoShutdownRegisteredFileSystems(): WARNING: filesystem forgot to call IoUnregisterFileSystem() !!!\n");
+ IoUnregisterFileSystem(current->DeviceObject);
+ continue;
+ }
+ current_last=current;
/* send IRP_MJ_SHUTDOWN */
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,