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
&& NamedPipeEnd
== FILE_PIPE_SERVER_END
)
246 Status
= NpImpersonateClientContext(Ccb
);
250 Status
= STATUS_ILLEGAL_FUNCTION
;
258 NpDisconnect(IN PDEVICE_OBJECT DeviceObject
,
265 NODE_TYPE_CODE NodeTypeCode
;
266 PIO_STACK_LOCATION IoStack
;
269 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
271 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
272 if (NodeTypeCode
== NPFS_NTC_CCB
)
274 if (NamedPipeEnd
== FILE_PIPE_SERVER_END
)
276 ExAcquireResourceExclusiveLite(&Ccb
->NonPagedCcb
->Lock
, TRUE
);
278 Status
= NpSetDisconnectedPipeState(Ccb
, List
);
280 NpUninitializeSecurity(Ccb
);
282 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
286 Status
= STATUS_ILLEGAL_FUNCTION
;
291 Status
= STATUS_PIPE_DISCONNECTED
;
299 NpListen(IN PDEVICE_OBJECT DeviceObject
,
306 NODE_TYPE_CODE NodeTypeCode
;
307 PIO_STACK_LOCATION IoStack
;
310 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
312 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
313 if (NodeTypeCode
== NPFS_NTC_CCB
)
315 if (NamedPipeEnd
== FILE_PIPE_SERVER_END
)
317 ExAcquireResourceExclusiveLite(&Ccb
->NonPagedCcb
->Lock
, TRUE
);
319 Status
= NpSetListeningPipeState(Ccb
, Irp
, List
);
321 NpUninitializeSecurity(Ccb
);
323 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
327 Status
= STATUS_ILLEGAL_FUNCTION
;
332 Status
= STATUS_ILLEGAL_FUNCTION
;
340 NpPeek(IN PDEVICE_OBJECT DeviceObject
,
344 PIO_STACK_LOCATION IoStack
;
349 PFILE_PIPE_PEEK_BUFFER PeekBuffer
;
350 PNP_DATA_QUEUE DataQueue
;
351 ULONG_PTR BytesPeeked
;
352 IO_STATUS_BLOCK IoStatus
;
354 PNP_DATA_QUEUE_ENTRY DataEntry
;
357 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
358 OutputLength
= IoStack
->Parameters
.FileSystemControl
.OutputBufferLength
;
359 Type
= NpDecodeFileObject(IoStack
->FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
363 return STATUS_PIPE_DISCONNECTED
;
366 if ((Type
!= NPFS_NTC_CCB
) &&
367 (OutputLength
< FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER
, Data
)))
369 return STATUS_INVALID_PARAMETER
;
372 PeekBuffer
= (PFILE_PIPE_PEEK_BUFFER
)Irp
->AssociatedIrp
.SystemBuffer
;
373 if (NamedPipeEnd
!= FILE_PIPE_CLIENT_END
)
375 if (NamedPipeEnd
!= FILE_PIPE_SERVER_END
)
377 NpBugCheck(NamedPipeEnd
, 0, 0);
380 DataQueue
= &Ccb
->DataQueue
[FILE_PIPE_INBOUND
];
384 DataQueue
= &Ccb
->DataQueue
[FILE_PIPE_OUTBOUND
];
387 if (Ccb
->NamedPipeState
!= FILE_PIPE_CONNECTED_STATE
)
389 if (Ccb
->NamedPipeState
!= FILE_PIPE_CLOSING_STATE
)
391 return STATUS_INVALID_PIPE_STATE
;
394 if (DataQueue
->QueueState
!= WriteEntries
)
396 return STATUS_PIPE_BROKEN
;
400 PeekBuffer
->NamedPipeState
= 0;
401 PeekBuffer
->ReadDataAvailable
= 0;
402 PeekBuffer
->NumberOfMessages
= 0;
403 PeekBuffer
->MessageLength
= 0;
404 PeekBuffer
->NamedPipeState
= Ccb
->NamedPipeState
;
405 BytesPeeked
= FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER
, Data
);
407 if (DataQueue
->QueueState
== WriteEntries
)
409 DataEntry
= CONTAINING_RECORD(DataQueue
->Queue
.Flink
,
412 ASSERT((DataEntry
->DataEntryType
== Buffered
) || (DataEntry
->DataEntryType
== Unbuffered
));
414 PeekBuffer
->ReadDataAvailable
= DataQueue
->BytesInQueue
- DataQueue
->ByteOffset
;
415 if (Ccb
->Fcb
->NamedPipeType
== FILE_PIPE_MESSAGE_TYPE
)
417 PeekBuffer
->NumberOfMessages
= DataQueue
->EntriesInQueue
;
418 PeekBuffer
->MessageLength
= DataEntry
->DataSize
- DataQueue
->ByteOffset
;
421 if (OutputLength
== FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER
, Data
))
423 Status
= PeekBuffer
->ReadDataAvailable
? STATUS_BUFFER_OVERFLOW
: STATUS_SUCCESS
;
427 IoStatus
= NpReadDataQueue(DataQueue
,
431 OutputLength
- FIELD_OFFSET(FILE_PIPE_PEEK_BUFFER
, Data
),
432 Ccb
->Fcb
->NamedPipeType
== FILE_PIPE_MESSAGE_TYPE
,
435 Status
= IoStatus
.Status
;
436 BytesPeeked
+= IoStatus
.Information
;
441 Status
= STATUS_SUCCESS
;
444 Irp
->IoStatus
.Information
= BytesPeeked
;
450 NpCompleteTransceiveIrp(IN PDEVICE_OBJECT DeviceObject
,
456 if (Irp
->AssociatedIrp
.SystemBuffer
)
458 ExFreePool(Irp
->AssociatedIrp
.SystemBuffer
);
462 return STATUS_MORE_PROCESSING_REQUIRED
;
467 NpTransceive(IN PDEVICE_OBJECT DeviceObject
,
471 PIO_STACK_LOCATION IoStack
;
472 PVOID InBuffer
, OutBuffer
;
473 ULONG InLength
, OutLength
, BytesWritten
;
474 NODE_TYPE_CODE NodeTypeCode
;
477 PNP_NONPAGED_CCB NonPagedCcb
;
478 PNP_DATA_QUEUE ReadQueue
, WriteQueue
;
479 PNP_EVENT_BUFFER EventBuffer
;
484 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
485 InLength
= IoStack
->Parameters
.FileSystemControl
.InputBufferLength
;
486 InBuffer
= IoStack
->Parameters
.FileSystemControl
.Type3InputBuffer
;
487 OutLength
= IoStack
->Parameters
.FileSystemControl
.OutputBufferLength
;
488 OutBuffer
= Irp
->UserBuffer
;
490 if (Irp
->RequestorMode
== UserMode
)
494 ProbeForRead(InBuffer
, InLength
, sizeof(CHAR
));
495 ProbeForWrite(OutBuffer
, OutLength
, sizeof(CHAR
));
497 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
499 _SEH2_YIELD(return _SEH2_GetExceptionCode());
504 NodeTypeCode
= NpDecodeFileObject(IoStack
->FileObject
, NULL
, &Ccb
, &NamedPipeEnd
);
505 if (NodeTypeCode
!= NPFS_NTC_CCB
)
507 return STATUS_PIPE_DISCONNECTED
;
510 NonPagedCcb
= Ccb
->NonPagedCcb
;
511 ExAcquireResourceExclusiveLite(&NonPagedCcb
->Lock
, TRUE
);
513 if (Ccb
->NamedPipeState
!= FILE_PIPE_CONNECTED_STATE
)
515 Status
= STATUS_INVALID_PIPE_STATE
;
519 if (NamedPipeEnd
!= FILE_PIPE_CLIENT_END
)
521 if (NamedPipeEnd
!= FILE_PIPE_SERVER_END
)
523 NpBugCheck(NamedPipeEnd
, 0, 0);
525 ReadQueue
= &Ccb
->DataQueue
[FILE_PIPE_INBOUND
];
526 WriteQueue
= &Ccb
->DataQueue
[FILE_PIPE_OUTBOUND
];
530 ReadQueue
= &Ccb
->DataQueue
[FILE_PIPE_OUTBOUND
];
531 WriteQueue
= &Ccb
->DataQueue
[FILE_PIPE_INBOUND
];
534 EventBuffer
= NonPagedCcb
->EventBuffer
[NamedPipeEnd
];
536 if (Ccb
->Fcb
->NamedPipeConfiguration
!= FILE_PIPE_FULL_DUPLEX
||
537 Ccb
->ReadMode
[NamedPipeEnd
] != FILE_PIPE_MESSAGE_MODE
)
539 Status
= STATUS_INVALID_PIPE_STATE
;
543 if (ReadQueue
->QueueState
!= Empty
)
545 Status
= STATUS_PIPE_BUSY
;
549 Status
= NpWriteDataQueue(WriteQueue
,
553 Ccb
->Fcb
->NamedPipeType
,
557 Irp
->Tail
.Overlay
.Thread
,
559 if (Status
== STATUS_MORE_PROCESSING_REQUIRED
)
561 ASSERT(WriteQueue
->QueueState
!= ReadEntries
);
562 NewIrp
= IoAllocateIrp(DeviceObject
->StackSize
, TRUE
);
565 Status
= STATUS_INSUFFICIENT_RESOURCES
;
569 IoSetCompletionRoutine(Irp
, NpCompleteTransceiveIrp
, NULL
, TRUE
, TRUE
, TRUE
);
573 NewIrp
->AssociatedIrp
.SystemBuffer
= ExAllocatePoolWithQuotaTag(PagedPool
| POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
,
575 NPFS_WRITE_BLOCK_TAG
);
576 if (!NewIrp
->AssociatedIrp
.SystemBuffer
)
579 Status
= STATUS_INSUFFICIENT_RESOURCES
;
585 RtlCopyMemory(NewIrp
->AssociatedIrp
.SystemBuffer
,
586 (PVOID
)((ULONG_PTR
)InBuffer
+ InLength
- BytesWritten
),
589 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
591 Status
= _SEH2_GetExceptionCode();
592 _SEH2_YIELD(goto Quickie
);
598 NewIrp
->AssociatedIrp
.SystemBuffer
= NULL
;
601 IoStack
= IoGetNextIrpStackLocation(NewIrp
);
602 IoSetNextIrpStackLocation(NewIrp
);
604 NewIrp
->Tail
.Overlay
.Thread
= Irp
->Tail
.Overlay
.Thread
;
605 NewIrp
->IoStatus
.Information
= BytesWritten
;
607 IoStack
->Parameters
.Read
.Length
= BytesWritten
;
608 IoStack
->MajorFunction
= IRP_MJ_WRITE
;
610 if (BytesWritten
> 0) NewIrp
->Flags
= IRP_DEALLOCATE_BUFFER
| IRP_BUFFERED_IO
;
611 NewIrp
->UserIosb
= &NpUserIoStatusBlock
;
613 Status
= NpAddDataQueueEntry(NamedPipeEnd
,
622 if (Status
!= STATUS_PENDING
)
624 NewIrp
->IoStatus
.Status
= Status
;
625 InsertTailList(List
, &NewIrp
->Tail
.Overlay
.ListEntry
);
629 if (!NT_SUCCESS(Status
)) goto Quickie
;
631 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
632 ASSERT(ReadQueue
->QueueState
== Empty
);
633 Status
= NpAddDataQueueEntry(NamedPipeEnd
,
642 if (NT_SUCCESS(Status
))
644 if (EventBuffer
) KeSetEvent(EventBuffer
->Event
, IO_NO_INCREMENT
, FALSE
);
648 ExReleaseResourceLite(&Ccb
->NonPagedCcb
->Lock
);
654 NpWaitForNamedPipe(IN PDEVICE_OBJECT DeviceObject
,
657 PIO_STACK_LOCATION IoStack
;
658 ULONG InLength
, NameLength
;
659 UNICODE_STRING SourceString
, Prefix
;
662 PFILE_PIPE_WAIT_FOR_BUFFER Buffer
;
664 NODE_TYPE_CODE NodeTypeCode
;
665 PLIST_ENTRY NextEntry
;
667 PWCHAR OriginalBuffer
;
670 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
671 InLength
= IoStack
->Parameters
.FileSystemControl
.InputBufferLength
;
673 SourceString
.Buffer
= NULL
;
675 if (NpDecodeFileObject(IoStack
->FileObject
,
678 &NamedPipeEnd
) != NPFS_NTC_ROOT_DCB
)
680 Status
= STATUS_ILLEGAL_FUNCTION
;
684 Buffer
= (PFILE_PIPE_WAIT_FOR_BUFFER
)Irp
->AssociatedIrp
.SystemBuffer
;
685 if (InLength
< sizeof(*Buffer
))
687 Status
= STATUS_INVALID_PARAMETER
;
691 NameLength
= Buffer
->NameLength
;
692 if ((NameLength
> (0xFFFF - sizeof(UNICODE_NULL
))) ||
693 ((NameLength
+ FIELD_OFFSET(FILE_PIPE_WAIT_FOR_BUFFER
, Name
)) > InLength
))
695 Status
= STATUS_INVALID_PARAMETER
;
699 SourceString
.Length
= (USHORT
)NameLength
+ sizeof(OBJ_NAME_PATH_SEPARATOR
);
700 SourceString
.Buffer
= ExAllocatePoolWithTag(PagedPool
,
702 NPFS_WRITE_BLOCK_TAG
);
703 if (!SourceString
.Buffer
)
705 Status
= STATUS_INSUFFICIENT_RESOURCES
;
709 SourceString
.Buffer
[0] = OBJ_NAME_PATH_SEPARATOR
;
710 RtlCopyMemory(&SourceString
.Buffer
[1], Buffer
->Name
, Buffer
->NameLength
);
712 Status
= STATUS_SUCCESS
;
713 OriginalBuffer
= SourceString
.Buffer
;
714 //Status = NpTranslateAlias(&SourceString);
715 if (!NT_SUCCESS(Status
)) goto Quickie
;
717 Fcb
= NpFindPrefix(&SourceString
, TRUE
, &Prefix
);
718 Fcb
= (PNP_FCB
)((ULONG_PTR
)Fcb
& ~1);
720 NodeTypeCode
= Fcb
? Fcb
->NodeType
: 0;
721 if (NodeTypeCode
!= NPFS_NTC_FCB
)
723 Status
= STATUS_OBJECT_NAME_NOT_FOUND
;
727 for (NextEntry
= Fcb
->CcbList
.Flink
;
728 NextEntry
!= &Fcb
->CcbList
;
729 NextEntry
= NextEntry
->Flink
)
731 Ccb
= CONTAINING_RECORD(NextEntry
, NP_CCB
, CcbEntry
);
732 if (Ccb
->NamedPipeState
== FILE_PIPE_LISTENING_STATE
) break;
735 if (NextEntry
!= &Fcb
->CcbList
)
737 Status
= STATUS_SUCCESS
;
741 Status
= NpAddWaiter(&NpVcb
->WaitQueue
,
744 OriginalBuffer
== SourceString
.Buffer
?
745 NULL
: &SourceString
);
749 if (SourceString
.Buffer
) ExFreePool(SourceString
.Buffer
);
755 NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject
,
759 BOOLEAN Overflow
= FALSE
;
760 LIST_ENTRY DeferredList
;
764 InitializeListHead(&DeferredList
);
765 Fsctl
= IoGetCurrentIrpStackLocation(Irp
)->Parameters
.FileSystemControl
.FsControlCode
;
769 case FSCTL_PIPE_PEEK
:
770 NpAcquireExclusiveVcb();
771 Status
= NpPeek(DeviceObject
, Irp
, &DeferredList
);
774 case FSCTL_PIPE_INTERNAL_WRITE
:
775 NpAcquireSharedVcb();
776 Status
= NpInternalWrite(DeviceObject
, Irp
, &DeferredList
);
779 case FSCTL_PIPE_TRANSCEIVE
:
780 NpAcquireSharedVcb();
781 Status
= NpTransceive(DeviceObject
, Irp
, &DeferredList
);
784 case FSCTL_PIPE_INTERNAL_TRANSCEIVE
:
785 NpAcquireSharedVcb();
786 Status
= NpInternalTransceive(DeviceObject
, Irp
, &DeferredList
);
789 case FSCTL_PIPE_INTERNAL_READ_OVFLOW
:
793 case FSCTL_PIPE_INTERNAL_READ
:
794 NpAcquireSharedVcb();
795 Status
= NpInternalRead(DeviceObject
, Irp
, Overflow
, &DeferredList
);
798 case FSCTL_PIPE_QUERY_CLIENT_PROCESS
:
800 NpAcquireSharedVcb();
801 Status
= NpQueryClientProcess(DeviceObject
, Irp
);
804 case FSCTL_PIPE_ASSIGN_EVENT
:
806 NpAcquireExclusiveVcb();
807 Status
= NpAssignEvent(DeviceObject
, Irp
);
810 case FSCTL_PIPE_DISCONNECT
:
812 NpAcquireExclusiveVcb();
813 Status
= NpDisconnect(DeviceObject
, Irp
, &DeferredList
);
816 case FSCTL_PIPE_LISTEN
:
818 NpAcquireSharedVcb();
819 Status
= NpListen(DeviceObject
, Irp
, &DeferredList
);
822 case FSCTL_PIPE_QUERY_EVENT
:
824 NpAcquireExclusiveVcb();
825 Status
= NpQueryEvent(DeviceObject
, Irp
);
828 case FSCTL_PIPE_WAIT
:
830 NpAcquireExclusiveVcb();
831 Status
= NpWaitForNamedPipe(DeviceObject
, Irp
);
834 case FSCTL_PIPE_IMPERSONATE
:
836 NpAcquireExclusiveVcb();
837 Status
= NpImpersonate(DeviceObject
, Irp
);
840 case FSCTL_PIPE_SET_CLIENT_PROCESS
:
841 NpAcquireExclusiveVcb();
842 Status
= NpSetClientProcess(DeviceObject
, Irp
);
846 return STATUS_NOT_SUPPORTED
;
850 NpCompleteDeferredIrps(&DeferredList
);
857 NpFsdFileSystemControl(IN PDEVICE_OBJECT DeviceObject
,
863 FsRtlEnterFileSystem();
865 Status
= NpCommonFileSystemControl(DeviceObject
, Irp
);
867 FsRtlExitFileSystem();
869 if (Status
!= STATUS_PENDING
)
871 Irp
->IoStatus
.Status
= Status
;
872 IoCompleteRequest(Irp
, IO_NAMED_PIPE_INCREMENT
);