2 * PROJECT: ReactOS Named Pipe FileSystem
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/filesystems/npfs/fsctrl.c
5 * PURPOSE: Named Pipe FileSystem I/O Controls
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES *******************************************************************/
13 // File ID number for NPFS bugchecking support
14 #define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_FSCTRL)
16 /* GLOBALS ********************************************************************/
18 IO_STATUS_BLOCK NpUserIoStatusBlock
;
20 /* FUNCTIONS ******************************************************************/
24 NpInternalTransceive(IN PDEVICE_OBJECT DeviceObject
,
29 return STATUS_NOT_IMPLEMENTED
;
34 NpInternalRead(IN PDEVICE_OBJECT DeviceObject
,
40 return STATUS_NOT_IMPLEMENTED
;
45 NpInternalWrite(IN PDEVICE_OBJECT DeviceObject
,
50 return STATUS_NOT_IMPLEMENTED
;
55 NpQueryClientProcess(IN PDEVICE_OBJECT DeviceObject
,
58 PIO_STACK_LOCATION IoStackLocation
;
59 NODE_TYPE_CODE NodeTypeCode
;
61 PNP_CLIENT_PROCESS ClientSession
, QueryBuffer
;
65 /* Get the current stack location */
66 IoStackLocation
= IoGetCurrentIrpStackLocation(Irp
);
68 /* Decode the file object and check the node type */
69 NodeTypeCode
= NpDecodeFileObject(IoStackLocation
->FileObject
, 0, &Ccb
, 0);
70 if (NodeTypeCode
!= NPFS_NTC_CCB
)
72 return STATUS_PIPE_DISCONNECTED
;
75 /* Get the length of the query buffer */
76 Length
= IoStackLocation
->Parameters
.QueryFile
.Length
;
79 return STATUS_INVALID_PARAMETER
;
82 QueryBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
85 ExAcquireResourceExclusiveLite(&Ccb
->NonPagedCcb
->Lock
, TRUE
);
87 /* Get the CCBs client session and check if it's set */
88 ClientSession
= Ccb
->ClientSession
;
89 if (ClientSession
!= NULL
)
91 /* Copy first 2 fields */
92 QueryBuffer
->Unknown
= ClientSession
->Unknown
;
93 QueryBuffer
->Process
= ClientSession
->Process
;
97 /* Copy the process from the CCB */
98 QueryBuffer
->Unknown
= NULL
;
99 QueryBuffer
->Process
= Ccb
->Process
;
102 /* Does the caller provide a large enough buffer for the full data? */
103 if (Length
>= sizeof(NP_CLIENT_PROCESS
))
105 Irp
->IoStatus
.Information
= sizeof(NP_CLIENT_PROCESS
);
107 /* Do we have a ClientSession structure? */
108 if (ClientSession
!= NULL
)
110 /* Copy length and the data */
111 QueryBuffer
->DataLength
= ClientSession
->DataLength
;
112 RtlCopyMemory(QueryBuffer
->Buffer
,
113 ClientSession
->Buffer
,
114 ClientSession
->DataLength
);
116 /* NULL terminate the buffer */
117 NT_ASSERT(QueryBuffer
->DataLength
<= 30);
118 QueryBuffer
->Buffer
[QueryBuffer
->DataLength
/ sizeof(WCHAR
)] = 0;
123 QueryBuffer
->DataLength
= 0;
124 QueryBuffer
->Buffer
[0] = 0;
129 Irp
->IoStatus
.Information
= FIELD_OFFSET(NP_CLIENT_PROCESS
, DataLength
);
133 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
135 return STATUS_SUCCESS
;
140 NpSetClientProcess(IN PDEVICE_OBJECT DeviceObject
,
143 PIO_STACK_LOCATION IoStackLocation
;
144 NODE_TYPE_CODE NodeTypeCode
;
147 PNP_CLIENT_PROCESS InputBuffer
, ClientSession
, OldClientSession
;
150 /* Get the current stack location */
151 IoStackLocation
= IoGetCurrentIrpStackLocation(Irp
);
153 /* Only kernel calls are allowed! */
154 if (IoStackLocation
->MinorFunction
!= IRP_MN_KERNEL_CALL
)
156 return STATUS_ACCESS_DENIED
;
159 /* Decode the file object and check the node type */
160 NodeTypeCode
= NpDecodeFileObject(IoStackLocation
->FileObject
, 0, &Ccb
, 0);
161 if (NodeTypeCode
!= NPFS_NTC_CCB
)
163 return STATUS_PIPE_DISCONNECTED
;
166 /* Get the length of the query buffer and check if it's valid */
167 Length
= IoStackLocation
->Parameters
.QueryFile
.Length
;
168 if (Length
!= sizeof(NP_CLIENT_PROCESS
))
170 return STATUS_INVALID_PARAMETER
;
173 /* Get the buffer and check if the data Length is valid */
174 InputBuffer
= Irp
->AssociatedIrp
.SystemBuffer
;
175 if (InputBuffer
->DataLength
> 30)
177 return STATUS_INVALID_PARAMETER
;
180 /* Allocate a new structure */
181 ClientSession
= ExAllocatePoolWithQuotaTag(PagedPool
,
182 sizeof(NP_CLIENT_PROCESS
),
185 /* Copy the full input buffer */
186 RtlCopyMemory(ClientSession
, InputBuffer
, sizeof(NP_CLIENT_PROCESS
));
189 ExAcquireResourceExclusiveLite(&Ccb
->NonPagedCcb
->Lock
, TRUE
);
191 /* Get the old ClientSession and set the new */
192 OldClientSession
= Ccb
->ClientSession
;
193 Ccb
->ClientSession
= ClientSession
;
195 /* Copy the process to the CCB */
196 Ccb
->Process
= ClientSession
->Process
;
199 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
201 /* Check if there was already a ClientSession */
202 if (OldClientSession
!= NULL
)
205 ExFreePoolWithTag(OldClientSession
, 'iFpN');
208 return STATUS_SUCCESS
;
213 NpAssignEvent(IN PDEVICE_OBJECT DeviceObject
,
217 return STATUS_NOT_IMPLEMENTED
;
222 NpQueryEvent(IN PDEVICE_OBJECT DeviceObject
,
226 return STATUS_NOT_IMPLEMENTED
;
231 NpImpersonate(IN PDEVICE_OBJECT DeviceObject
,
237 NODE_TYPE_CODE NodeTypeCode
;
238 PIO_STACK_LOCATION IoStack
;
241 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
243 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
244 if (NodeTypeCode
== NPFS_NTC_CCB
)
246 if (NamedPipeEnd
== FILE_PIPE_SERVER_END
)
248 Status
= NpImpersonateClientContext(Ccb
);
252 Status
= STATUS_ILLEGAL_FUNCTION
;
261 NpDisconnect(IN PDEVICE_OBJECT DeviceObject
,
268 NODE_TYPE_CODE NodeTypeCode
;
269 PIO_STACK_LOCATION IoStack
;
272 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
274 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
275 if (NodeTypeCode
== NPFS_NTC_CCB
)
277 if (NamedPipeEnd
== FILE_PIPE_SERVER_END
)
279 ExAcquireResourceExclusiveLite(&Ccb
->NonPagedCcb
->Lock
, TRUE
);
281 Status
= NpSetDisconnectedPipeState(Ccb
, List
);
283 NpUninitializeSecurity(Ccb
);
285 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
289 Status
= STATUS_ILLEGAL_FUNCTION
;
294 Status
= STATUS_PIPE_DISCONNECTED
;
302 NpListen(IN PDEVICE_OBJECT DeviceObject
,
309 NODE_TYPE_CODE NodeTypeCode
;
310 PIO_STACK_LOCATION IoStack
;
313 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
315 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
316 if (NodeTypeCode
== NPFS_NTC_CCB
)
318 if (NamedPipeEnd
== FILE_PIPE_SERVER_END
)
320 ExAcquireResourceExclusiveLite(&Ccb
->NonPagedCcb
->Lock
, TRUE
);
322 Status
= NpSetListeningPipeState(Ccb
, Irp
, List
);
324 NpUninitializeSecurity(Ccb
);
326 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
330 Status
= STATUS_ILLEGAL_FUNCTION
;
335 Status
= STATUS_ILLEGAL_FUNCTION
;
343 NpPeek(IN PDEVICE_OBJECT DeviceObject
,
347 PIO_STACK_LOCATION IoStack
;
352 PFILE_PIPE_PEEK_BUFFER PeekBuffer
;
353 PNP_DATA_QUEUE DataQueue
;
354 ULONG_PTR BytesPeeked
;
355 IO_STATUS_BLOCK IoStatus
;
357 PNP_DATA_QUEUE_ENTRY DataEntry
;
360 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
361 OutputLength
= IoStack
->Parameters
.FileSystemControl
.OutputBufferLength
;
362 Type
= NpDecodeFileObject(IoStack
->FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
366 return STATUS_PIPE_DISCONNECTED
;
369 if ((Type
!= NPFS_NTC_CCB
) &&
370 (OutputLength
< FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER
, Data
)))
372 return STATUS_INVALID_PARAMETER
;
375 PeekBuffer
= (PFILE_PIPE_PEEK_BUFFER
)Irp
->AssociatedIrp
.SystemBuffer
;
376 if (NamedPipeEnd
!= FILE_PIPE_CLIENT_END
)
378 if (NamedPipeEnd
!= FILE_PIPE_SERVER_END
)
380 NpBugCheck(NamedPipeEnd
, 0, 0);
383 DataQueue
= &Ccb
->DataQueue
[FILE_PIPE_INBOUND
];
387 DataQueue
= &Ccb
->DataQueue
[FILE_PIPE_OUTBOUND
];
390 if (Ccb
->NamedPipeState
!= FILE_PIPE_CONNECTED_STATE
)
392 if (Ccb
->NamedPipeState
!= FILE_PIPE_CLOSING_STATE
)
394 return STATUS_INVALID_PIPE_STATE
;
397 if (DataQueue
->QueueState
!= WriteEntries
)
399 return STATUS_PIPE_BROKEN
;
403 PeekBuffer
->NamedPipeState
= 0;
404 PeekBuffer
->ReadDataAvailable
= 0;
405 PeekBuffer
->NumberOfMessages
= 0;
406 PeekBuffer
->MessageLength
= 0;
407 PeekBuffer
->NamedPipeState
= Ccb
->NamedPipeState
;
408 BytesPeeked
= FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER
, Data
);
410 if (DataQueue
->QueueState
== WriteEntries
)
412 DataEntry
= CONTAINING_RECORD(DataQueue
->Queue
.Flink
,
415 ASSERT((DataEntry
->DataEntryType
== Buffered
) || (DataEntry
->DataEntryType
== Unbuffered
));
417 PeekBuffer
->ReadDataAvailable
= DataQueue
->BytesInQueue
- DataQueue
->ByteOffset
;
418 if (Ccb
->Fcb
->NamedPipeType
== FILE_PIPE_MESSAGE_TYPE
)
420 PeekBuffer
->NumberOfMessages
= DataQueue
->EntriesInQueue
;
421 PeekBuffer
->MessageLength
= DataEntry
->DataSize
- DataQueue
->ByteOffset
;
424 if (OutputLength
== FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER
, Data
))
426 Status
= PeekBuffer
->ReadDataAvailable
? STATUS_BUFFER_OVERFLOW
: STATUS_SUCCESS
;
430 IoStatus
= NpReadDataQueue(DataQueue
,
434 OutputLength
- FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER
, Data
),
435 Ccb
->Fcb
->NamedPipeType
== FILE_PIPE_MESSAGE_TYPE
,
438 Status
= IoStatus
.Status
;
439 BytesPeeked
+= IoStatus
.Information
;
444 Status
= STATUS_SUCCESS
;
447 Irp
->IoStatus
.Information
= BytesPeeked
;
453 NpCompleteTransceiveIrp(IN PDEVICE_OBJECT DeviceObject
,
459 if (Irp
->AssociatedIrp
.SystemBuffer
)
461 ExFreePool(Irp
->AssociatedIrp
.SystemBuffer
);
465 return STATUS_MORE_PROCESSING_REQUIRED
;
470 NpTransceive(IN PDEVICE_OBJECT DeviceObject
,
474 PIO_STACK_LOCATION IoStack
;
475 PVOID InBuffer
, OutBuffer
;
476 ULONG InLength
, OutLength
, BytesWritten
;
477 NODE_TYPE_CODE NodeTypeCode
;
480 PNP_NONPAGED_CCB NonPagedCcb
;
481 PNP_DATA_QUEUE ReadQueue
, WriteQueue
;
482 PNP_EVENT_BUFFER EventBuffer
;
487 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
488 InLength
= IoStack
->Parameters
.FileSystemControl
.InputBufferLength
;
489 InBuffer
= IoStack
->Parameters
.FileSystemControl
.Type3InputBuffer
;
490 OutLength
= IoStack
->Parameters
.FileSystemControl
.OutputBufferLength
;
491 OutBuffer
= Irp
->UserBuffer
;
493 if (Irp
->RequestorMode
== UserMode
)
497 ProbeForRead(InBuffer
, InLength
, sizeof(CHAR
));
498 ProbeForWrite(OutBuffer
, OutLength
, sizeof(CHAR
));
500 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
502 _SEH2_YIELD(return _SEH2_GetExceptionCode());
507 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
508 if (NodeTypeCode
!= NPFS_NTC_CCB
)
510 return STATUS_PIPE_DISCONNECTED
;
513 NonPagedCcb
= Ccb
->NonPagedCcb
;
514 ExAcquireResourceExclusiveLite(&NonPagedCcb
->Lock
, TRUE
);
516 if (Ccb
->NamedPipeState
!= FILE_PIPE_CONNECTED_STATE
)
518 Status
= STATUS_INVALID_PIPE_STATE
;
522 if (NamedPipeEnd
!= FILE_PIPE_CLIENT_END
)
524 if (NamedPipeEnd
!= FILE_PIPE_SERVER_END
)
526 NpBugCheck(NamedPipeEnd
, 0, 0);
528 ReadQueue
= &Ccb
->DataQueue
[FILE_PIPE_INBOUND
];
529 WriteQueue
= &Ccb
->DataQueue
[FILE_PIPE_OUTBOUND
];
533 ReadQueue
= &Ccb
->DataQueue
[FILE_PIPE_OUTBOUND
];
534 WriteQueue
= &Ccb
->DataQueue
[FILE_PIPE_INBOUND
];
537 EventBuffer
= NonPagedCcb
->EventBuffer
[NamedPipeEnd
];
539 if (Ccb
->Fcb
->NamedPipeConfiguration
!= FILE_PIPE_FULL_DUPLEX
||
540 Ccb
->ReadMode
[NamedPipeEnd
] != FILE_PIPE_MESSAGE_MODE
)
542 Status
= STATUS_INVALID_PIPE_STATE
;
546 if (ReadQueue
->QueueState
!= Empty
)
548 Status
= STATUS_PIPE_BUSY
;
552 Status
= NpWriteDataQueue(WriteQueue
,
556 Ccb
->Fcb
->NamedPipeType
,
560 Irp
->Tail
.Overlay
.Thread
,
562 if (Status
== STATUS_MORE_PROCESSING_REQUIRED
)
564 ASSERT(WriteQueue
->QueueState
!= ReadEntries
);
565 NewIrp
= IoAllocateIrp(DeviceObject
->StackSize
, TRUE
);
568 Status
= STATUS_INSUFFICIENT_RESOURCES
;
572 IoSetCompletionRoutine(Irp
, NpCompleteTransceiveIrp
, NULL
, TRUE
, TRUE
, TRUE
);
576 NewIrp
->AssociatedIrp
.SystemBuffer
= ExAllocatePoolWithQuotaTag(PagedPool
| POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
,
578 NPFS_WRITE_BLOCK_TAG
);
579 if (!NewIrp
->AssociatedIrp
.SystemBuffer
)
582 Status
= STATUS_INSUFFICIENT_RESOURCES
;
588 RtlCopyMemory(NewIrp
->AssociatedIrp
.SystemBuffer
,
589 (PVOID
)((ULONG_PTR
)InBuffer
+ InLength
- BytesWritten
),
592 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
594 Status
= _SEH2_GetExceptionCode();
595 _SEH2_YIELD(goto Quickie
);
601 NewIrp
->AssociatedIrp
.SystemBuffer
= NULL
;
604 IoStack
= IoGetNextIrpStackLocation(NewIrp
);
605 IoSetNextIrpStackLocation(NewIrp
);
607 NewIrp
->Tail
.Overlay
.Thread
= Irp
->Tail
.Overlay
.Thread
;
608 NewIrp
->IoStatus
.Information
= BytesWritten
;
610 IoStack
->Parameters
.Read
.Length
= BytesWritten
;
611 IoStack
->MajorFunction
= IRP_MJ_WRITE
;
613 if (BytesWritten
> 0) NewIrp
->Flags
= IRP_DEALLOCATE_BUFFER
| IRP_BUFFERED_IO
;
614 NewIrp
->UserIosb
= &NpUserIoStatusBlock
;
616 Status
= NpAddDataQueueEntry(NamedPipeEnd
,
625 if (Status
!= STATUS_PENDING
)
627 NewIrp
->IoStatus
.Status
= Status
;
628 InsertTailList(List
, &NewIrp
->Tail
.Overlay
.ListEntry
);
632 if (!NT_SUCCESS(Status
)) goto Quickie
;
634 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
635 ASSERT(ReadQueue
->QueueState
== Empty
);
636 Status
= NpAddDataQueueEntry(NamedPipeEnd
,
645 if (NT_SUCCESS(Status
))
647 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
651 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
657 NpWaitForNamedPipe(IN PDEVICE_OBJECT DeviceObject
,
660 PIO_STACK_LOCATION IoStack
;
661 ULONG InLength
, NameLength
;
662 UNICODE_STRING SourceString
, Prefix
;
665 PFILE_PIPE_WAIT_FOR_BUFFER Buffer
;
667 NODE_TYPE_CODE NodeTypeCode
;
668 PLIST_ENTRY NextEntry
;
670 PWCHAR OriginalBuffer
;
673 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
674 InLength
= IoStack
->Parameters
.FileSystemControl
.InputBufferLength
;
676 SourceString
.Buffer
= NULL
;
678 if (NpDecodeFileObject(IoStack
->FileObject
,
681 &NamedPipeEnd
) != NPFS_NTC_ROOT_DCB
)
683 Status
= STATUS_ILLEGAL_FUNCTION
;
687 Buffer
= (PFILE_PIPE_WAIT_FOR_BUFFER
)Irp
->AssociatedIrp
.SystemBuffer
;
688 if (InLength
< sizeof(*Buffer
))
690 Status
= STATUS_INVALID_PARAMETER
;
694 NameLength
= Buffer
->NameLength
;
695 if ((NameLength
> (0xFFFF - sizeof(UNICODE_NULL
))) ||
696 ((NameLength
+ FIELD_OFFSET(FILE_PIPE_WAIT_FOR_BUFFER
, Name
)) > InLength
))
698 Status
= STATUS_INVALID_PARAMETER
;
702 SourceString
.Length
= (USHORT
)NameLength
+ sizeof(OBJ_NAME_PATH_SEPARATOR
);
703 SourceString
.Buffer
= ExAllocatePoolWithTag(PagedPool
,
705 NPFS_WRITE_BLOCK_TAG
);
706 if (!SourceString
.Buffer
)
708 Status
= STATUS_INSUFFICIENT_RESOURCES
;
712 SourceString
.Buffer
[0] = OBJ_NAME_PATH_SEPARATOR
;
713 RtlCopyMemory(&SourceString
.Buffer
[1], Buffer
->Name
, Buffer
->NameLength
);
715 Status
= STATUS_SUCCESS
;
716 OriginalBuffer
= SourceString
.Buffer
;
717 //Status = NpTranslateAlias(&SourceString);
718 if (!NT_SUCCESS(Status
)) goto Quickie
;
720 Fcb
= NpFindPrefix(&SourceString
, TRUE
, &Prefix
);
721 Fcb
= (PNP_FCB
)((ULONG_PTR
)Fcb
& ~1);
723 NodeTypeCode
= Fcb
? Fcb
->NodeType
: 0;
724 if (NodeTypeCode
!= NPFS_NTC_FCB
)
726 Status
= STATUS_OBJECT_NAME_NOT_FOUND
;
730 for (NextEntry
= Fcb
->CcbList
.Flink
;
731 NextEntry
!= &Fcb
->CcbList
;
732 NextEntry
= NextEntry
->Flink
)
734 Ccb
= CONTAINING_RECORD(NextEntry
, NP_CCB
, CcbEntry
);
735 if (Ccb
->NamedPipeState
== FILE_PIPE_LISTENING_STATE
) break;
738 if (NextEntry
!= &Fcb
->CcbList
)
740 Status
= STATUS_SUCCESS
;
744 Status
= NpAddWaiter(&NpVcb
->WaitQueue
,
747 OriginalBuffer
== SourceString
.Buffer
?
748 NULL
: &SourceString
);
752 if (SourceString
.Buffer
) ExFreePool(SourceString
.Buffer
);
758 NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject
,
762 BOOLEAN Overflow
= FALSE
;
763 LIST_ENTRY DeferredList
;
767 InitializeListHead(&DeferredList
);
768 Fsctl
= IoGetCurrentIrpStackLocation(Irp
)->Parameters
.FileSystemControl
.FsControlCode
;
772 case FSCTL_PIPE_PEEK
:
773 NpAcquireExclusiveVcb();
774 Status
= NpPeek(DeviceObject
, Irp
, &DeferredList
);
777 case FSCTL_PIPE_INTERNAL_WRITE
:
778 NpAcquireSharedVcb();
779 Status
= NpInternalWrite(DeviceObject
, Irp
, &DeferredList
);
782 case FSCTL_PIPE_TRANSCEIVE
:
783 NpAcquireSharedVcb();
784 Status
= NpTransceive(DeviceObject
, Irp
, &DeferredList
);
787 case FSCTL_PIPE_INTERNAL_TRANSCEIVE
:
788 NpAcquireSharedVcb();
789 Status
= NpInternalTransceive(DeviceObject
, Irp
, &DeferredList
);
792 case FSCTL_PIPE_INTERNAL_READ_OVFLOW
:
796 case FSCTL_PIPE_INTERNAL_READ
:
797 NpAcquireSharedVcb();
798 Status
= NpInternalRead(DeviceObject
, Irp
, Overflow
, &DeferredList
);
801 case FSCTL_PIPE_QUERY_CLIENT_PROCESS
:
803 NpAcquireSharedVcb();
804 Status
= NpQueryClientProcess(DeviceObject
, Irp
);
807 case FSCTL_PIPE_ASSIGN_EVENT
:
809 NpAcquireExclusiveVcb();
810 Status
= NpAssignEvent(DeviceObject
, Irp
);
813 case FSCTL_PIPE_DISCONNECT
:
815 NpAcquireExclusiveVcb();
816 Status
= NpDisconnect(DeviceObject
, Irp
, &DeferredList
);
819 case FSCTL_PIPE_LISTEN
:
821 NpAcquireSharedVcb();
822 Status
= NpListen(DeviceObject
, Irp
, &DeferredList
);
825 case FSCTL_PIPE_QUERY_EVENT
:
827 NpAcquireExclusiveVcb();
828 Status
= NpQueryEvent(DeviceObject
, Irp
);
831 case FSCTL_PIPE_WAIT
:
833 NpAcquireExclusiveVcb();
834 Status
= NpWaitForNamedPipe(DeviceObject
, Irp
);
837 case FSCTL_PIPE_IMPERSONATE
:
839 NpAcquireExclusiveVcb();
840 Status
= NpImpersonate(DeviceObject
, Irp
);
843 case FSCTL_PIPE_SET_CLIENT_PROCESS
:
844 NpAcquireExclusiveVcb();
845 Status
= NpSetClientProcess(DeviceObject
, Irp
);
849 return STATUS_NOT_SUPPORTED
;
853 NpCompleteDeferredIrps(&DeferredList
);
860 NpFsdFileSystemControl(IN PDEVICE_OBJECT DeviceObject
,
866 FsRtlEnterFileSystem();
868 Status
= NpCommonFileSystemControl(DeviceObject
, Irp
);
870 FsRtlExitFileSystem();
872 if (Status
!= STATUS_PENDING
)
874 Irp
->IoStatus
.Status
= Status
;
875 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);