2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 // File: AFSFSControl.cpp
39 #include "AFSCommon.h"
42 AFSFSControl( IN PDEVICE_OBJECT LibDeviceObject,
46 NTSTATUS ntStatus = STATUS_SUCCESS;
47 IO_STACK_LOCATION *pIrpSp;
49 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
54 switch( pIrpSp->MinorFunction)
57 case IRP_MN_USER_FS_REQUEST:
59 ntStatus = AFSProcessUserFsRequest( Irp);
63 case IRP_MN_MOUNT_VOLUME:
67 case IRP_MN_VERIFY_VOLUME:
76 AFSCompleteRequest( Irp,
80 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
85 "EXCEPTION - AFSFSControl\n");
87 AFSDumpTraceFilesFnc();
94 AFSParseMountPointTarget( IN UNICODE_STRING *Target,
96 OUT UNICODE_STRING *Volume,
97 OUT UNICODE_STRING *Cell)
99 // Targets are of the form <type>[<cell>:]<volume>
101 *Type = Target->Buffer[ 0];
103 // Extract the cell name (if any)
105 Cell->Buffer = &Target->Buffer[ 1];
107 // Search for colon separator or end of counted string
109 for ( Cell->Length = 0; Cell->Length < Target->Length - sizeof( WCHAR); Cell->Length += sizeof( WCHAR))
112 if ( Cell->Buffer[ Cell->Length / sizeof( WCHAR)] == L':')
118 // If a colon is not found, it means there is no cell
120 if ( Cell->Length < Target->Length - sizeof( WCHAR) &&
121 Cell->Buffer[ Cell->Length / sizeof( WCHAR)] == L':')
124 Cell->MaximumLength = Cell->Length;
126 if ( Cell->Length > Target->Length - 2 * sizeof( WCHAR))
128 // Invalid target string if there is no room for
134 Volume->Length = Volume->MaximumLength = (Target->Length - Cell->Length - 2 * sizeof( WCHAR));
136 Volume->Buffer = &Target->Buffer[ Cell->Length / sizeof( WCHAR) + 2];
142 Volume->Length = Volume->MaximumLength = Cell->Length;
144 Volume->Buffer = Cell->Buffer;
146 Cell->Length = Cell->MaximumLength = 0;
155 AFSProcessUserFsRequest( IN PIRP Irp)
158 NTSTATUS ntStatus = STATUS_SUCCESS;
159 ULONG ulFsControlCode;
161 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp );
163 ULONG ulOutputBufferLen, ulInputBufferLen;
168 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
170 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
172 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
175 pCcb->DirectoryCB == NULL)
178 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
179 AFS_TRACE_LEVEL_VERBOSE_2,
180 "AFSProcessUserFsRequest Invalid Fcb\n");
182 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
185 if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
188 ntStatus = AFSProcessShareFsCtrl( Irp,
192 try_return( ntStatus);
195 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
196 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
199 // Process the request
202 switch( ulFsControlCode )
205 case FSCTL_REQUEST_OPLOCK_LEVEL_1:
206 case FSCTL_REQUEST_OPLOCK_LEVEL_2:
207 case FSCTL_REQUEST_BATCH_OPLOCK:
208 case FSCTL_OPLOCK_BREAK_ACKNOWLEDGE:
209 case FSCTL_OPBATCH_ACK_CLOSE_PENDING:
210 case FSCTL_OPLOCK_BREAK_NOTIFY:
211 case FSCTL_OPLOCK_BREAK_ACK_NO_2:
212 case FSCTL_REQUEST_FILTER_OPLOCK :
215 // Note that implementing this call will probably need us
216 // to call the server as well as adding code in read and
217 // write and caching. Also that it is unlikely that
218 // anyone will ever call us at this point - RDR doesn't
222 ntStatus = STATUS_NOT_IMPLEMENTED;
227 case FSCTL_LOCK_VOLUME:
229 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
230 AFS_TRACE_LEVEL_VERBOSE_2,
231 "AFSProcessUserFsRequest Processing FSCTL_LOCK_VOLUME request\n");
233 ntStatus = STATUS_NOT_IMPLEMENTED;
238 case FSCTL_UNLOCK_VOLUME:
240 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
241 AFS_TRACE_LEVEL_VERBOSE_2,
242 "AFSProcessUserFsRequest Processing FSCTL_UNLOCK_VOLUME request\n");
244 ntStatus = STATUS_NOT_IMPLEMENTED;
249 case FSCTL_DISMOUNT_VOLUME:
251 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
252 AFS_TRACE_LEVEL_VERBOSE_2,
253 "AFSProcessUserFsRequest Processing FSCTL_DISMOUNT_VOLUME request\n");
255 ntStatus = STATUS_NOT_IMPLEMENTED;
260 case FSCTL_MARK_VOLUME_DIRTY:
262 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
263 AFS_TRACE_LEVEL_VERBOSE_2,
264 "AFSProcessUserFsRequest Processing FSCTL_MARK_VOLUME_DIRTY request\n");
266 ntStatus = STATUS_NOT_IMPLEMENTED;
271 case FSCTL_IS_VOLUME_DIRTY:
273 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
274 AFS_TRACE_LEVEL_VERBOSE_2,
275 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_DIRTY request\n");
277 ntStatus = STATUS_NOT_IMPLEMENTED;
282 case FSCTL_IS_VOLUME_MOUNTED:
284 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
285 AFS_TRACE_LEVEL_VERBOSE_2,
286 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_MOUNTED request\n");
288 ntStatus = STATUS_NOT_IMPLEMENTED;
293 case FSCTL_IS_PATHNAME_VALID:
295 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
296 AFS_TRACE_LEVEL_VERBOSE_2,
297 "AFSProcessUserFsRequest Processing FSCTL_IS_PATHNAME_VALID request\n");
299 ntStatus = STATUS_SUCCESS;
304 #ifndef FSCTL_CSC_INTERNAL
305 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
307 case FSCTL_CSC_INTERNAL:
309 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
310 AFS_TRACE_LEVEL_VERBOSE_2,
311 "AFSProcessUserFsRequest Processing FSCTL_CSC_INTERNAL request\n");
313 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
318 case FSCTL_GET_REPARSE_POINT:
321 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
322 ULONG ulRemainingLen = ulOutputBufferLen;
323 AFSReparseTagInfo *pReparseInfo = NULL;
325 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
326 AFS_TRACE_LEVEL_VERBOSE_2,
327 "AFSProcessUserFsRequest Processing FSCTL_GET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
328 &pCcb->DirectoryCB->NameInformation.FileName,
329 pCcb->DirectoryCB->ObjectInformation->FileType,
330 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
333 // Check if we have the reparse entry set on the entry
336 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
339 ntStatus = STATUS_NOT_A_REPARSE_POINT;
344 if( ulOutputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
347 ntStatus = STATUS_BUFFER_TOO_SMALL;
349 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
354 ulRemainingLen -= FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
357 // Populate the data in the reparse buffer
360 pReparseBuffer->ReparseDataLength = 0;
362 AFSAcquireExcl( &pCcb->DirectoryCB->NonPaged->Lock,
365 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
369 // We'll reset the DV to ensure we validate the metadata content
372 pCcb->DirectoryCB->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
374 SetFlag( pCcb->DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
376 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
377 AFS_TRACE_LEVEL_VERBOSE,
378 "AFSProcessUserFsRequest Verifying symlink %wZ FID %08lX-%08lX-%08lX-%08lX\n",
379 &pCcb->DirectoryCB->NameInformation.FileName,
380 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
381 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
382 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
383 pCcb->DirectoryCB->ObjectInformation->FileId.Unique);
385 ntStatus = AFSVerifyEntry( &pCcb->AuthGroup,
388 if( !NT_SUCCESS( ntStatus))
391 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
392 AFS_TRACE_LEVEL_ERROR,
393 "AFSProcessUserFsRequest Failed to verify symlink %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
394 &pCcb->DirectoryCB->NameInformation.FileName,
395 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
396 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
397 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
398 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
401 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
407 pReparseInfo = (AFSReparseTagInfo *)&pReparseBuffer->GenericReparseBuffer.DataBuffer[ 0];
409 switch( pCcb->DirectoryCB->ObjectInformation->FileType)
412 case AFS_FILE_TYPE_SYMLINK:
415 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
418 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
423 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
426 ntStatus = STATUS_BUFFER_TOO_SMALL;
428 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
429 FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) +
430 pCcb->DirectoryCB->NameInformation.TargetName.Length;
435 pReparseInfo->SubTag = OPENAFS_SUBTAG_SYMLINK;
437 pReparseInfo->AFSSymLink.RelativeLink = AFSIsRelativeName( &pCcb->DirectoryCB->NameInformation.TargetName);
439 pReparseInfo->AFSSymLink.SymLinkTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
441 RtlCopyMemory( pReparseInfo->AFSSymLink.Buffer,
442 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
443 pCcb->DirectoryCB->NameInformation.TargetName.Length);
445 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
450 case AFS_FILE_TYPE_MOUNTPOINT:
452 UNICODE_STRING Cell, Volume;
455 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
457 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
462 if ( !AFSParseMountPointTarget( &pCcb->DirectoryCB->NameInformation.TargetName,
467 ntStatus = STATUS_INVALID_PARAMETER;
472 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length)
475 ntStatus = STATUS_BUFFER_TOO_SMALL;
477 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
478 FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) +
479 Volume.Length + Cell.Length;
484 pReparseInfo->SubTag = OPENAFS_SUBTAG_MOUNTPOINT;
486 pReparseInfo->AFSMountPoint.Type = Type;
488 pReparseInfo->AFSMountPoint.MountPointCellLength = Cell.Length;
490 pReparseInfo->AFSMountPoint.MountPointVolumeLength = Volume.Length;
492 RtlCopyMemory( pReparseInfo->AFSMountPoint.Buffer,
496 RtlCopyMemory( &pReparseInfo->AFSMountPoint.Buffer[ Cell.Length / sizeof( WCHAR)],
500 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length);
505 case AFS_FILE_TYPE_DFSLINK:
508 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
511 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
516 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
519 ntStatus = STATUS_BUFFER_TOO_SMALL;
521 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
522 FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) +
523 pCcb->DirectoryCB->NameInformation.TargetName.Length;
528 pReparseInfo->SubTag = OPENAFS_SUBTAG_UNC;
530 pReparseInfo->UNCReferral.UNCTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
532 RtlCopyMemory( pReparseInfo->UNCReferral.Buffer,
533 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
534 pCcb->DirectoryCB->NameInformation.TargetName.Length);
536 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
543 ntStatus = STATUS_NOT_A_REPARSE_POINT;
548 if ( ntStatus == STATUS_SUCCESS)
551 ulRemainingLen -= pReparseBuffer->ReparseDataLength;
553 pReparseBuffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
555 RtlCopyMemory( &pReparseBuffer->ReparseGuid,
556 &GUID_AFS_REPARSE_GUID,
559 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
560 pReparseBuffer->ReparseDataLength;
563 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
568 case FSCTL_SET_REPARSE_POINT:
571 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
573 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
574 AFS_TRACE_LEVEL_VERBOSE_2,
575 "AFSProcessUserFsRequest Processing FSCTL_SET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
576 &pCcb->DirectoryCB->NameInformation.FileName,
577 pCcb->DirectoryCB->ObjectInformation->FileType,
578 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
581 // Check if we have the reparse entry set on the entry
584 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
587 ntStatus = STATUS_NOT_A_REPARSE_POINT;
592 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
595 ntStatus = STATUS_IO_REPARSE_DATA_INVALID;
600 if( (pReparseBuffer->ReparseTag & 0x0000FFFF) != IO_REPARSE_TAG_OPENAFS_DFS)
603 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
608 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
609 &GUID_AFS_REPARSE_GUID,
610 sizeof( GUID)) != sizeof( GUID))
613 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
619 // For now deny access on this call
622 ntStatus = STATUS_INVALID_PARAMETER;
627 case FSCTL_DELETE_REPARSE_POINT:
630 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
632 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
633 AFS_TRACE_LEVEL_VERBOSE_2,
634 "AFSProcessUserFsRequest Processing FSCTL_DELETE_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
635 &pCcb->DirectoryCB->NameInformation.FileName,
636 pCcb->DirectoryCB->ObjectInformation->FileType,
637 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
640 // Check if we have the reparse entry set on the entry
643 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
646 ntStatus = STATUS_NOT_A_REPARSE_POINT;
651 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
654 ntStatus = STATUS_INVALID_PARAMETER;
659 if( (pReparseBuffer->ReparseTag & 0x0000FFFF) != IO_REPARSE_TAG_OPENAFS_DFS)
662 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
667 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
668 &GUID_AFS_REPARSE_GUID,
669 sizeof( GUID)) != sizeof( GUID))
672 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
678 // For now deny access on this call
681 ntStatus = STATUS_ACCESS_DENIED;
686 #ifndef FSCTL_SET_PURGE_FAILURE_MODE
687 #define FSCTL_SET_PURGE_FAILURE_MODE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 156, METHOD_BUFFERED, FILE_ANY_ACCESS)
690 case FSCTL_SET_PURGE_FAILURE_MODE:
694 // For the time being just succeed this call
697 ntStatus = STATUS_SUCCESS;
705 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
706 AFS_TRACE_LEVEL_VERBOSE_2,
707 "AFSProcessUserFsRequest Processing default (%08lX) request\n", ulFsControlCode);
709 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
724 AFSProcessShareFsCtrl( IN IRP *Irp,
729 NTSTATUS ntStatus = STATUS_SUCCESS;
730 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
731 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
732 ULONG ulFsControlCode;
737 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
739 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
740 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
742 switch( ulFsControlCode)
745 case FSCTL_PIPE_TRANSCEIVE:
748 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
749 AFS_TRACE_LEVEL_VERBOSE,
750 "AFSProcessShareFsCtrl On pipe %wZ Class FSCTL_PIPE_TRANSCEIVE\n",
751 &Ccb->DirectoryCB->NameInformation.FileName);
753 ntStatus = AFSNotifyPipeTransceive( Ccb,
756 pIrpSp->Parameters.FileSystemControl.Type3InputBuffer,
758 (ULONG *)&Irp->IoStatus.Information);
760 if( !NT_SUCCESS( ntStatus))
763 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
764 AFS_TRACE_LEVEL_VERBOSE,
765 "AFSProcessShareFsCtrl Failure on pipe %wZ Class FSCTL_PIPE_TRANSCEIVE Status %08lX\n",
766 &Ccb->DirectoryCB->NameInformation.FileName,
776 if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_SERVER_SERVICE))
779 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For srvsvc input %08lX output %08lX\n",
782 // ulOutputBufferLen);
784 else if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_WORKSTATION_SERVICE))
787 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For wkssvc input %08lX output %08lX\n",
790 // ulOutputBufferLen);
795 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For IPC$ input %08lX output %08lX\n",
798 // ulOutputBufferLen);