2005-01-06 13:58:04 +00:00
|
|
|
/* $Id$
|
2000-12-29 13:45:01 +00:00
|
|
|
*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
2003-10-11 17:51:56 +00:00
|
|
|
* FILE: drivers/fs/vfat/shutdown.c
|
2000-12-29 13:45:01 +00:00
|
|
|
* PURPOSE: VFAT Filesystem
|
|
|
|
* PROGRAMMER: Eric Kohl (ekohl@rz-online.de)
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
|
2001-05-01 23:08:21 +00:00
|
|
|
#define NDEBUG
|
2000-12-29 13:45:01 +00:00
|
|
|
#include "vfat.h"
|
|
|
|
|
|
|
|
/* FUNCTIONS ****************************************************************/
|
|
|
|
|
|
|
|
NTSTATUS STDCALL
|
|
|
|
VfatShutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
2003-02-09 18:02:56 +00:00
|
|
|
PLIST_ENTRY ListEntry;
|
|
|
|
PDEVICE_EXTENSION DeviceExt;
|
2000-12-29 13:45:01 +00:00
|
|
|
|
|
|
|
DPRINT("VfatShutdown(DeviceObject %x, Irp %x)\n",DeviceObject, Irp);
|
|
|
|
|
2001-01-14 15:28:50 +00:00
|
|
|
/* FIXME: block new mount requests */
|
|
|
|
|
2003-02-09 18:02:56 +00:00
|
|
|
if (DeviceObject == VfatGlobalData->DeviceObject)
|
|
|
|
{
|
|
|
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|
|
|
ExAcquireResourceExclusiveLite(&VfatGlobalData->VolumeListLock, TRUE);
|
|
|
|
ListEntry = VfatGlobalData->VolumeListHead.Flink;
|
|
|
|
while (ListEntry != &VfatGlobalData->VolumeListHead)
|
|
|
|
{
|
|
|
|
DeviceExt = CONTAINING_RECORD(ListEntry, VCB, VolumeListEntry);
|
|
|
|
ListEntry = ListEntry->Flink;
|
|
|
|
|
|
|
|
ExAcquireResourceExclusiveLite(&DeviceExt->DirResource, TRUE);
|
|
|
|
Status = VfatFlushVolume(DeviceExt, DeviceExt->VolumeFcb);
|
|
|
|
ExReleaseResourceLite(&DeviceExt->DirResource);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
DPRINT1("VfatFlushVolume failed, status = %x\n", Status);
|
|
|
|
Irp->IoStatus.Status = Status;
|
|
|
|
}
|
|
|
|
/* FIXME: Unmount the logical volume */
|
|
|
|
}
|
2004-12-05 16:31:51 +00:00
|
|
|
ExReleaseResourceLite(&VfatGlobalData->VolumeListLock);
|
|
|
|
|
2003-02-09 18:02:56 +00:00
|
|
|
/* FIXME: Free all global acquired resources */
|
|
|
|
|
|
|
|
Status = Irp->IoStatus.Status;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Status = STATUS_INVALID_DEVICE_REQUEST;
|
|
|
|
}
|
2000-12-29 13:45:01 +00:00
|
|
|
|
|
|
|
Irp->IoStatus.Status = Status;
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
return(Status);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* EOF */
|