2 * PROJECT: ReactOS Named Pipe FileSystem
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/filesystems/npfs/read.c
5 * PURPOSE: Pipes Reading
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES *******************************************************************/
13 // File ID number for NPFS bugchecking support
14 #define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_READ)
16 /* GLOBALS ********************************************************************/
20 /* FUNCTIONS ******************************************************************/
24 NpCommonRead(IN PFILE_OBJECT FileObject
,
27 OUT PIO_STATUS_BLOCK IoStatus
,
31 NODE_TYPE_CODE NodeType
;
32 PNP_DATA_QUEUE ReadQueue
;
33 PNP_EVENT_BUFFER EventBuffer
;
37 PNP_NONPAGED_CCB NonPagedCcb
;
41 IoStatus
->Information
= 0;
42 NodeType
= NpDecodeFileObject(FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
46 IoStatus
->Status
= STATUS_PIPE_DISCONNECTED
;
50 if (NodeType
!= NPFS_NTC_CCB
)
52 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
56 NonPagedCcb
= Ccb
->NonPagedCcb
;
57 ExAcquireResourceExclusiveLite(&NonPagedCcb
->Lock
, TRUE
);
59 if (Ccb
->NamedPipeState
== FILE_PIPE_DISCONNECTED_STATE
|| Ccb
->NamedPipeState
== FILE_PIPE_LISTENING_STATE
)
61 IoStatus
->Status
= Ccb
->NamedPipeState
!= FILE_PIPE_DISCONNECTED_STATE
? STATUS_PIPE_LISTENING
: STATUS_PIPE_DISCONNECTED
;
66 ASSERT((Ccb
->NamedPipeState
== FILE_PIPE_CONNECTED_STATE
) || (Ccb
->NamedPipeState
== FILE_PIPE_CLOSING_STATE
));
68 if ((NamedPipeEnd
== FILE_PIPE_SERVER_END
&& Ccb
->Fcb
->NamedPipeConfiguration
== FILE_PIPE_OUTBOUND
) ||
69 (NamedPipeEnd
== FILE_PIPE_CLIENT_END
&& Ccb
->Fcb
->NamedPipeConfiguration
== FILE_PIPE_INBOUND
))
71 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
76 if (NamedPipeEnd
== FILE_PIPE_SERVER_END
)
78 ReadQueue
= &Ccb
->DataQueue
[FILE_PIPE_INBOUND
];
82 ReadQueue
= &Ccb
->DataQueue
[FILE_PIPE_OUTBOUND
];
85 EventBuffer
= NonPagedCcb
->EventBuffer
[NamedPipeEnd
];
87 if (ReadQueue
->QueueState
== WriteEntries
)
89 *IoStatus
= NpReadDataQueue(ReadQueue
,
94 Ccb
->ReadMode
[NamedPipeEnd
],
97 if (!NT_SUCCESS(IoStatus
->Status
))
104 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
108 if (Ccb
->NamedPipeState
== FILE_PIPE_CLOSING_STATE
)
110 IoStatus
->Status
= STATUS_PIPE_BROKEN
;
112 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
116 if (Ccb
->CompletionMode
[NamedPipeEnd
] == FILE_PIPE_COMPLETE_OPERATION
)
118 IoStatus
->Status
= STATUS_PIPE_EMPTY
;
120 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
130 Status
= NpAddDataQueueEntry(NamedPipeEnd
,
139 IoStatus
->Status
= Status
;
140 if (!NT_SUCCESS(Status
))
147 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
151 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
157 NpFsdRead(IN PDEVICE_OBJECT DeviceObject
,
160 PIO_STACK_LOCATION IoStack
;
161 IO_STATUS_BLOCK IoStatus
;
162 LIST_ENTRY DeferredList
;
166 InitializeListHead(&DeferredList
);
167 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
169 FsRtlEnterFileSystem();
170 NpAcquireSharedVcb();
172 NpCommonRead(IoStack
->FileObject
,
174 IoStack
->Parameters
.Read
.Length
,
180 NpCompleteDeferredIrps(&DeferredList
);
181 FsRtlExitFileSystem();
183 if (IoStatus
.Status
!= STATUS_PENDING
)
185 Irp
->IoStatus
.Information
= IoStatus
.Information
;
186 Irp
->IoStatus
.Status
= IoStatus
.Status
;
187 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);
190 return IoStatus
.Status
;