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;
176 pCcb->DirectoryCB == NULL)
179 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
180 AFS_TRACE_LEVEL_VERBOSE_2,
181 "AFSProcessUserFsRequest Invalid Fcb\n");
183 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
186 if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
189 ntStatus = AFSProcessShareFsCtrl( Irp,
193 try_return( ntStatus);
196 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
197 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
200 // Process the request
203 switch( ulFsControlCode )
206 case FSCTL_REQUEST_OPLOCK_LEVEL_1:
207 case FSCTL_REQUEST_OPLOCK_LEVEL_2:
208 case FSCTL_REQUEST_BATCH_OPLOCK:
209 case FSCTL_OPLOCK_BREAK_ACKNOWLEDGE:
210 case FSCTL_OPBATCH_ACK_CLOSE_PENDING:
211 case FSCTL_OPLOCK_BREAK_NOTIFY:
212 case FSCTL_OPLOCK_BREAK_ACK_NO_2:
213 case FSCTL_REQUEST_FILTER_OPLOCK :
216 // Note that implementing this call will probably need us
217 // to call the server as well as adding code in read and
218 // write and caching. Also that it is unlikely that
219 // anyone will ever call us at this point - RDR doesn't
223 ntStatus = STATUS_NOT_IMPLEMENTED;
228 case FSCTL_LOCK_VOLUME:
230 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
231 AFS_TRACE_LEVEL_VERBOSE_2,
232 "AFSProcessUserFsRequest Processing FSCTL_LOCK_VOLUME request\n");
234 ntStatus = STATUS_NOT_IMPLEMENTED;
239 case FSCTL_UNLOCK_VOLUME:
241 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
242 AFS_TRACE_LEVEL_VERBOSE_2,
243 "AFSProcessUserFsRequest Processing FSCTL_UNLOCK_VOLUME request\n");
245 ntStatus = STATUS_NOT_IMPLEMENTED;
250 case FSCTL_DISMOUNT_VOLUME:
252 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
253 AFS_TRACE_LEVEL_VERBOSE_2,
254 "AFSProcessUserFsRequest Processing FSCTL_DISMOUNT_VOLUME request\n");
256 ntStatus = STATUS_NOT_IMPLEMENTED;
261 case FSCTL_MARK_VOLUME_DIRTY:
263 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
264 AFS_TRACE_LEVEL_VERBOSE_2,
265 "AFSProcessUserFsRequest Processing FSCTL_MARK_VOLUME_DIRTY request\n");
267 ntStatus = STATUS_NOT_IMPLEMENTED;
272 case FSCTL_IS_VOLUME_DIRTY:
274 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
275 AFS_TRACE_LEVEL_VERBOSE_2,
276 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_DIRTY request\n");
278 ntStatus = STATUS_NOT_IMPLEMENTED;
283 case FSCTL_IS_VOLUME_MOUNTED:
285 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
286 AFS_TRACE_LEVEL_VERBOSE_2,
287 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_MOUNTED request\n");
289 ntStatus = STATUS_NOT_IMPLEMENTED;
294 case FSCTL_IS_PATHNAME_VALID:
296 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
297 AFS_TRACE_LEVEL_VERBOSE_2,
298 "AFSProcessUserFsRequest Processing FSCTL_IS_PATHNAME_VALID request\n");
300 ntStatus = STATUS_SUCCESS;
305 #ifndef FSCTL_CSC_INTERNAL
306 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
308 case FSCTL_CSC_INTERNAL:
310 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
311 AFS_TRACE_LEVEL_VERBOSE_2,
312 "AFSProcessUserFsRequest Processing FSCTL_CSC_INTERNAL request\n");
314 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
319 case FSCTL_GET_REPARSE_POINT:
322 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
323 ULONG ulRemainingLen = ulOutputBufferLen;
324 AFSReparseTagInfo *pReparseInfo = NULL;
326 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
327 AFS_TRACE_LEVEL_VERBOSE_2,
328 "AFSProcessUserFsRequest Processing FSCTL_GET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
329 &pCcb->DirectoryCB->NameInformation.FileName,
330 pCcb->DirectoryCB->ObjectInformation->FileType,
331 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
334 // Check if we have the reparse entry set on the entry
337 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
340 ntStatus = STATUS_NOT_A_REPARSE_POINT;
345 if( ulOutputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
348 ntStatus = STATUS_BUFFER_TOO_SMALL;
350 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
355 ulRemainingLen -= FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
358 // Populate the data in the reparse buffer
361 pReparseBuffer->ReparseDataLength = 0;
363 AFSAcquireExcl( &pCcb->DirectoryCB->NonPaged->Lock,
366 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
370 // We'll reset the DV to ensure we validate the metadata content
373 pCcb->DirectoryCB->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
375 SetFlag( pCcb->DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
377 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
378 AFS_TRACE_LEVEL_VERBOSE,
379 "AFSProcessUserFsRequest Verifying symlink %wZ FID %08lX-%08lX-%08lX-%08lX\n",
380 &pCcb->DirectoryCB->NameInformation.FileName,
381 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
382 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
383 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
384 pCcb->DirectoryCB->ObjectInformation->FileId.Unique);
386 ntStatus = AFSVerifyEntry( &pCcb->AuthGroup,
389 if( !NT_SUCCESS( ntStatus))
392 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
393 AFS_TRACE_LEVEL_ERROR,
394 "AFSProcessUserFsRequest Failed to verify symlink %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
395 &pCcb->DirectoryCB->NameInformation.FileName,
396 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
397 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
398 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
399 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
402 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
408 pReparseInfo = (AFSReparseTagInfo *)&pReparseBuffer->GenericReparseBuffer.DataBuffer[ 0];
410 switch( pCcb->DirectoryCB->ObjectInformation->FileType)
413 case AFS_FILE_TYPE_SYMLINK:
416 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
419 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
424 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
427 ntStatus = STATUS_BUFFER_TOO_SMALL;
429 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
430 FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) +
431 pCcb->DirectoryCB->NameInformation.TargetName.Length;
436 pReparseInfo->SubTag = OPENAFS_SUBTAG_SYMLINK;
438 pReparseInfo->AFSSymLink.RelativeLink = AFSIsRelativeName( &pCcb->DirectoryCB->NameInformation.TargetName);
440 pReparseInfo->AFSSymLink.SymLinkTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
442 RtlCopyMemory( pReparseInfo->AFSSymLink.Buffer,
443 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
444 pCcb->DirectoryCB->NameInformation.TargetName.Length);
446 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
451 case AFS_FILE_TYPE_MOUNTPOINT:
453 UNICODE_STRING Cell, Volume;
456 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
458 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
463 if ( !AFSParseMountPointTarget( &pCcb->DirectoryCB->NameInformation.TargetName,
468 ntStatus = STATUS_INVALID_PARAMETER;
473 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length)
476 ntStatus = STATUS_BUFFER_TOO_SMALL;
478 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
479 FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) +
480 Volume.Length + Cell.Length;
485 pReparseInfo->SubTag = OPENAFS_SUBTAG_MOUNTPOINT;
487 pReparseInfo->AFSMountPoint.Type = Type;
489 pReparseInfo->AFSMountPoint.MountPointCellLength = Cell.Length;
491 pReparseInfo->AFSMountPoint.MountPointVolumeLength = Volume.Length;
493 RtlCopyMemory( pReparseInfo->AFSMountPoint.Buffer,
497 RtlCopyMemory( &pReparseInfo->AFSMountPoint.Buffer[ Cell.Length / sizeof( WCHAR)],
501 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length);
506 case AFS_FILE_TYPE_DFSLINK:
509 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
512 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
517 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
520 ntStatus = STATUS_BUFFER_TOO_SMALL;
522 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
523 FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) +
524 pCcb->DirectoryCB->NameInformation.TargetName.Length;
529 pReparseInfo->SubTag = OPENAFS_SUBTAG_UNC;
531 pReparseInfo->UNCReferral.UNCTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
533 RtlCopyMemory( pReparseInfo->UNCReferral.Buffer,
534 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
535 pCcb->DirectoryCB->NameInformation.TargetName.Length);
537 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
544 ntStatus = STATUS_NOT_A_REPARSE_POINT;
549 if ( ntStatus == STATUS_SUCCESS)
552 ulRemainingLen -= pReparseBuffer->ReparseDataLength;
554 pReparseBuffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
556 RtlCopyMemory( &pReparseBuffer->ReparseGuid,
557 &GUID_AFS_REPARSE_GUID,
560 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
561 pReparseBuffer->ReparseDataLength;
564 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
569 case FSCTL_SET_REPARSE_POINT:
572 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
574 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
575 AFS_TRACE_LEVEL_VERBOSE_2,
576 "AFSProcessUserFsRequest Processing FSCTL_SET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
577 &pCcb->DirectoryCB->NameInformation.FileName,
578 pCcb->DirectoryCB->ObjectInformation->FileType,
579 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
582 // Check if we have the reparse entry set on the entry
585 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
588 ntStatus = STATUS_NOT_A_REPARSE_POINT;
593 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
596 ntStatus = STATUS_IO_REPARSE_DATA_INVALID;
601 if( (pReparseBuffer->ReparseTag & 0x0000FFFF) != IO_REPARSE_TAG_OPENAFS_DFS)
604 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
609 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
610 &GUID_AFS_REPARSE_GUID,
611 sizeof( GUID)) != sizeof( GUID))
614 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
620 // For now deny access on this call
623 ntStatus = STATUS_INVALID_PARAMETER;
628 case FSCTL_DELETE_REPARSE_POINT:
631 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
633 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
634 AFS_TRACE_LEVEL_VERBOSE_2,
635 "AFSProcessUserFsRequest Processing FSCTL_DELETE_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
636 &pCcb->DirectoryCB->NameInformation.FileName,
637 pCcb->DirectoryCB->ObjectInformation->FileType,
638 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
641 // Check if we have the reparse entry set on the entry
644 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
647 ntStatus = STATUS_NOT_A_REPARSE_POINT;
652 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
655 ntStatus = STATUS_INVALID_PARAMETER;
660 if( (pReparseBuffer->ReparseTag & 0x0000FFFF) != IO_REPARSE_TAG_OPENAFS_DFS)
663 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
668 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
669 &GUID_AFS_REPARSE_GUID,
670 sizeof( GUID)) != sizeof( GUID))
673 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
679 // For now deny access on this call
682 ntStatus = STATUS_ACCESS_DENIED;
687 #ifndef FSCTL_SET_PURGE_FAILURE_MODE
688 #define FSCTL_SET_PURGE_FAILURE_MODE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 156, METHOD_BUFFERED, FILE_ANY_ACCESS)
691 case FSCTL_SET_PURGE_FAILURE_MODE:
695 // For the time being just succeed this call
698 ntStatus = STATUS_SUCCESS;
706 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
707 AFS_TRACE_LEVEL_VERBOSE_2,
708 "AFSProcessUserFsRequest Processing default (%08lX) request\n", ulFsControlCode);
710 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
725 AFSProcessShareFsCtrl( IN IRP *Irp,
730 NTSTATUS ntStatus = STATUS_SUCCESS;
731 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
732 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
733 ULONG ulFsControlCode;
738 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
740 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
741 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
743 switch( ulFsControlCode)
746 case FSCTL_PIPE_TRANSCEIVE:
749 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
750 AFS_TRACE_LEVEL_VERBOSE,
751 "AFSProcessShareFsCtrl On pipe %wZ Class FSCTL_PIPE_TRANSCEIVE\n",
752 &Ccb->DirectoryCB->NameInformation.FileName);
754 ntStatus = AFSNotifyPipeTransceive( Ccb,
757 pIrpSp->Parameters.FileSystemControl.Type3InputBuffer,
759 (ULONG *)&Irp->IoStatus.Information);
761 if( !NT_SUCCESS( ntStatus))
764 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
765 AFS_TRACE_LEVEL_VERBOSE,
766 "AFSProcessShareFsCtrl Failure on pipe %wZ Class FSCTL_PIPE_TRANSCEIVE Status %08lX\n",
767 &Ccb->DirectoryCB->NameInformation.FileName,
777 AFSPrint( "AFSProcessShareFsCtrl (%08lX) For IPC$ input %08lX output %08lX\n",