mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
93 lines
2.4 KiB
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 */
|