reactos/drivers/filesystems/npfs/flushbuf.c

93 lines
2.4 KiB
C

/*
* PROJECT: ReactOS Named Pipe FileSystem
* LICENSE: BSD - See COPYING.ARM in the top level directory
* FILE: drivers/filesystems/npfs/flushbuf.c
* PURPOSE: Buffers Flushing Support
* PROGRAMMERS: ReactOS Portable Systems Group
*/
/* INCLUDES *******************************************************************/
#include "npfs.h"
// File ID number for NPFS bugchecking support
#define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_FLUSHBUF)
/* FUNCTIONS ******************************************************************/
NTSTATUS
NTAPI
NpCommonFlushBuffers(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
NODE_TYPE_CODE NodeTypeCode;
PNP_CCB Ccb;
ULONG NamedPipeEnd;
NTSTATUS Status;
PNP_DATA_QUEUE FlushQueue;
PAGED_CODE();
NodeTypeCode = NpDecodeFileObject(IoGetCurrentIrpStackLocation(Irp)->FileObject,
NULL,
&Ccb,
&NamedPipeEnd);
if (NodeTypeCode != NPFS_NTC_CCB) return STATUS_PIPE_DISCONNECTED;
ExAcquireResourceExclusiveLite(&Ccb->NonPagedCcb->Lock, TRUE);
if (NamedPipeEnd == FILE_PIPE_SERVER_END)
{
FlushQueue = &Ccb->DataQueue[FILE_PIPE_OUTBOUND];
}
else
{
FlushQueue = &Ccb->DataQueue[FILE_PIPE_INBOUND];
}
if (FlushQueue->QueueState == WriteEntries)
{
Status = NpAddDataQueueEntry(NamedPipeEnd,
Ccb,
FlushQueue,
WriteEntries,
2,
0,
Irp,
NULL,
0);
}
else
{
Status = STATUS_SUCCESS;
}
ExReleaseResourceLite(&Ccb->NonPagedCcb->Lock);
return Status;
}
NTSTATUS
NTAPI
NpFsdFlushBuffers(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
NTSTATUS Status;
PAGED_CODE();
FsRtlEnterFileSystem();
NpAcquireSharedVcb();
Status = NpCommonFlushBuffers(DeviceObject, Irp);
NpReleaseVcb();
FsRtlExitFileSystem();
if (Status != STATUS_PENDING)
{
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
}
return Status;
}
/* EOF */