3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: services/fs/vfat/shutdown.c
6 * PURPOSE: VFAT Filesystem
7 * PROGRAMMER: Eric Kohl (ekohl@rz-online.de)
10 /* INCLUDES *****************************************************************/
12 #include <ddk/ntddk.h>
19 /* FUNCTIONS ****************************************************************/
22 VfatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp)
25 PLIST_ENTRY ListEntry;
26 PDEVICE_EXTENSION DeviceExt;
28 DPRINT("VfatShutdown(DeviceObject %x, Irp %x)\n",DeviceObject, Irp);
30 /* FIXME: block new mount requests */
32 if (DeviceObject == VfatGlobalData->DeviceObject)
34 Irp->IoStatus.Status = STATUS_SUCCESS;
35 ExAcquireResourceExclusiveLite(&VfatGlobalData->VolumeListLock, TRUE);
36 ListEntry = VfatGlobalData->VolumeListHead.Flink;
37 while (ListEntry != &VfatGlobalData->VolumeListHead)
39 DeviceExt = CONTAINING_RECORD(ListEntry, VCB, VolumeListEntry);
40 ListEntry = ListEntry->Flink;
42 ExAcquireResourceExclusiveLite(&DeviceExt->DirResource, TRUE);
43 Status = VfatFlushVolume(DeviceExt, DeviceExt->VolumeFcb);
44 ExReleaseResourceLite(&DeviceExt->DirResource);
45 if (!NT_SUCCESS(Status))
47 DPRINT1("VfatFlushVolume failed, status = %x\n", Status);
48 Irp->IoStatus.Status = Status;
50 /* FIXME: Unmount the logical volume */
52 ExReleaseResourceLite(&VfatGlobalData->VolumeListLock);
54 /* FIXME: Free all global acquired resources */
56 Status = Irp->IoStatus.Status;
60 Status = STATUS_INVALID_DEVICE_REQUEST;
63 Irp->IoStatus.Status = Status;
64 Irp->IoStatus.Information = 0;
66 IoCompleteRequest(Irp, IO_NO_INCREMENT);