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 ULONG NpFastReadFalse
;
22 /* FUNCTIONS ******************************************************************/
26 NpCommonRead(IN PFILE_OBJECT FileObject
,
29 OUT PIO_STATUS_BLOCK IoStatus
,
33 NODE_TYPE_CODE NodeType
;
34 PNP_DATA_QUEUE ReadQueue
;
35 PNP_EVENT_BUFFER EventBuffer
;
39 PNP_NONPAGED_CCB NonPagedCcb
;
43 IoStatus
->Information
= 0;
44 NodeType
= NpDecodeFileObject(FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
48 IoStatus
->Status
= STATUS_PIPE_DISCONNECTED
;
52 if (NodeType
!= NPFS_NTC_CCB
)
54 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
58 NonPagedCcb
= Ccb
->NonPagedCcb
;
59 ExAcquireResourceExclusiveLite(&NonPagedCcb
->Lock
, TRUE
);
61 if (Ccb
->NamedPipeState
== FILE_PIPE_DISCONNECTED_STATE
|| Ccb
->NamedPipeState
== FILE_PIPE_LISTENING_STATE
)
63 IoStatus
->Status
= Ccb
->NamedPipeState
!= FILE_PIPE_DISCONNECTED_STATE
? STATUS_PIPE_LISTENING
: STATUS_PIPE_DISCONNECTED
;
68 ASSERT((Ccb
->NamedPipeState
== FILE_PIPE_CONNECTED_STATE
) || (Ccb
->NamedPipeState
== FILE_PIPE_CLOSING_STATE
));
70 if ((NamedPipeEnd
== FILE_PIPE_SERVER_END
&& Ccb
->Fcb
->NamedPipeConfiguration
== FILE_PIPE_OUTBOUND
) ||
71 (NamedPipeEnd
== FILE_PIPE_CLIENT_END
&& Ccb
->Fcb
->NamedPipeConfiguration
== FILE_PIPE_INBOUND
))
73 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
78 if (NamedPipeEnd
== FILE_PIPE_SERVER_END
)
80 ReadQueue
= &Ccb
->DataQueue
[FILE_PIPE_INBOUND
];
84 ReadQueue
= &Ccb
->DataQueue
[FILE_PIPE_OUTBOUND
];
87 EventBuffer
= NonPagedCcb
->EventBuffer
[NamedPipeEnd
];
89 if (ReadQueue
->QueueState
== WriteEntries
)
91 *IoStatus
= NpReadDataQueue(ReadQueue
,
96 Ccb
->ReadMode
[NamedPipeEnd
],
99 if (!NT_SUCCESS(IoStatus
->Status
))
106 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
110 if (Ccb
->NamedPipeState
== FILE_PIPE_CLOSING_STATE
)
112 IoStatus
->Status
= STATUS_PIPE_BROKEN
;
114 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
118 if (Ccb
->CompletionMode
[NamedPipeEnd
] == FILE_PIPE_COMPLETE_OPERATION
)
120 IoStatus
->Status
= STATUS_PIPE_EMPTY
;
122 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
132 Status
= NpAddDataQueueEntry(NamedPipeEnd
,
141 IoStatus
->Status
= Status
;
142 if (!NT_SUCCESS(Status
))
149 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
153 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
159 NpFsdRead(IN PDEVICE_OBJECT DeviceObject
,
162 PIO_STACK_LOCATION IoStack
;
163 IO_STATUS_BLOCK IoStatus
;
164 LIST_ENTRY DeferredList
;
168 InitializeListHead(&DeferredList
);
169 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
171 FsRtlEnterFileSystem();
172 NpAcquireSharedVcb();
174 NpCommonRead(IoStack
->FileObject
,
176 IoStack
->Parameters
.Read
.Length
,
182 NpCompleteDeferredIrps(&DeferredList
);
183 FsRtlExitFileSystem();
185 if (IoStatus
.Status
!= STATUS_PENDING
)
187 Irp
->IoStatus
.Information
= IoStatus
.Information
;
188 Irp
->IoStatus
.Status
= IoStatus
.Status
;
189 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);
192 return IoStatus
.Status
;
196 _Function_class_(FAST_IO_READ
)
201 _In_ PFILE_OBJECT FileObject
,
202 _In_ PLARGE_INTEGER FileOffset
,
207 _Out_ PIO_STATUS_BLOCK IoStatus
,
208 _In_ PDEVICE_OBJECT DeviceObject
)
210 LIST_ENTRY DeferredList
;
214 InitializeListHead(&DeferredList
);
216 FsRtlEnterFileSystem();
217 NpAcquireSharedVcb();
219 Result
= NpCommonRead(FileObject
,
231 NpCompleteDeferredIrps(&DeferredList
);
232 FsRtlExitFileSystem();