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( GetExceptionCode(), GetExceptionInformation()) )
85 "EXCEPTION - AFSFSControl\n");
92 AFSParseMountPointTarget( IN UNICODE_STRING *Target,
94 OUT UNICODE_STRING *Volume,
95 OUT UNICODE_STRING *Cell)
97 // Targets are of the form <type>[<cell>:]<volume>
99 *Type = Target->Buffer[ 0];
101 // Extract the cell name (if any)
103 Cell->Buffer = &Target->Buffer[ 1];
105 // Search for colon separator or end of counted string
107 for ( Cell->Length = 0; Cell->Length < Target->Length - sizeof( WCHAR); Cell->Length += sizeof( WCHAR))
110 if ( Cell->Buffer[ Cell->Length / sizeof( WCHAR)] == L':')
116 // If a colon is not found, it means there is no cell
118 if ( Cell->Buffer[ Cell->Length / sizeof( WCHAR)] == L':')
121 Cell->MaximumLength = Cell->Length;
123 if ( Cell->Length > Target->Length - 2 * sizeof( WCHAR))
125 // Invalid target string if there is no room for
131 Volume->Length = Volume->MaximumLength = (Target->Length - Cell->Length - 2 * sizeof( WCHAR));
133 Volume->Buffer = &Target->Buffer[ Cell->Length / sizeof( WCHAR) + 2];
139 Volume->Length = Volume->MaximumLength = Cell->Length;
141 Volume->Buffer = Cell->Buffer;
143 Cell->Length = Cell->MaximumLength = 0;
152 AFSProcessUserFsRequest( IN PIRP Irp)
155 NTSTATUS ntStatus = STATUS_SUCCESS;
156 ULONG ulFsControlCode;
158 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp );
160 ULONG ulOutputBufferLen, ulInputBufferLen;
165 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
167 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
169 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
172 pCcb->DirectoryCB == NULL)
175 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
176 AFS_TRACE_LEVEL_VERBOSE_2,
177 "AFSProcessUserFsRequest Invalid Fcb\n");
179 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
182 if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
185 ntStatus = AFSProcessShareFsCtrl( Irp,
189 try_return( ntStatus);
192 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
193 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
196 // Process the request
199 switch( ulFsControlCode )
202 case FSCTL_REQUEST_OPLOCK_LEVEL_1:
203 case FSCTL_REQUEST_OPLOCK_LEVEL_2:
204 case FSCTL_REQUEST_BATCH_OPLOCK:
205 case FSCTL_OPLOCK_BREAK_ACKNOWLEDGE:
206 case FSCTL_OPBATCH_ACK_CLOSE_PENDING:
207 case FSCTL_OPLOCK_BREAK_NOTIFY:
208 case FSCTL_OPLOCK_BREAK_ACK_NO_2:
209 case FSCTL_REQUEST_FILTER_OPLOCK :
212 // Note that implementing this call will probably need us
213 // to call the server as well as adding code in read and
214 // write and caching. Also that it is unlikely that
215 // anyone will ever call us at this point - RDR doesn't
219 ntStatus = STATUS_NOT_IMPLEMENTED;
224 case FSCTL_LOCK_VOLUME:
226 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
227 AFS_TRACE_LEVEL_VERBOSE_2,
228 "AFSProcessUserFsRequest Processing FSCTL_LOCK_VOLUME request\n");
230 ntStatus = STATUS_NOT_IMPLEMENTED;
235 case FSCTL_UNLOCK_VOLUME:
237 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
238 AFS_TRACE_LEVEL_VERBOSE_2,
239 "AFSProcessUserFsRequest Processing FSCTL_UNLOCK_VOLUME request\n");
241 ntStatus = STATUS_NOT_IMPLEMENTED;
246 case FSCTL_DISMOUNT_VOLUME:
248 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
249 AFS_TRACE_LEVEL_VERBOSE_2,
250 "AFSProcessUserFsRequest Processing FSCTL_DISMOUNT_VOLUME request\n");
252 ntStatus = STATUS_NOT_IMPLEMENTED;
257 case FSCTL_MARK_VOLUME_DIRTY:
259 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
260 AFS_TRACE_LEVEL_VERBOSE_2,
261 "AFSProcessUserFsRequest Processing FSCTL_MARK_VOLUME_DIRTY request\n");
263 ntStatus = STATUS_NOT_IMPLEMENTED;
268 case FSCTL_IS_VOLUME_DIRTY:
270 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
271 AFS_TRACE_LEVEL_VERBOSE_2,
272 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_DIRTY request\n");
274 ntStatus = STATUS_NOT_IMPLEMENTED;
279 case FSCTL_IS_VOLUME_MOUNTED:
281 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
282 AFS_TRACE_LEVEL_VERBOSE_2,
283 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_MOUNTED request\n");
285 ntStatus = STATUS_NOT_IMPLEMENTED;
290 case FSCTL_IS_PATHNAME_VALID:
292 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
293 AFS_TRACE_LEVEL_VERBOSE_2,
294 "AFSProcessUserFsRequest Processing FSCTL_IS_PATHNAME_VALID request\n");
296 ntStatus = STATUS_SUCCESS;
301 #ifndef FSCTL_CSC_INTERNAL
302 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
304 case FSCTL_CSC_INTERNAL:
306 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
307 AFS_TRACE_LEVEL_VERBOSE_2,
308 "AFSProcessUserFsRequest Processing FSCTL_CSC_INTERNAL request\n");
310 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
315 case FSCTL_GET_REPARSE_POINT:
318 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
319 ULONG ulRemainingLen = ulOutputBufferLen;
320 AFSReparseTagInfo *pReparseInfo = NULL;
322 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
323 AFS_TRACE_LEVEL_VERBOSE_2,
324 "AFSProcessUserFsRequest Processing FSCTL_GET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
325 &pCcb->DirectoryCB->NameInformation.FileName,
326 pCcb->DirectoryCB->ObjectInformation->FileType,
327 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
330 // Check if we have the reparse entry set on the entry
333 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
336 ntStatus = STATUS_NOT_A_REPARSE_POINT;
341 if( ulOutputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
344 ntStatus = STATUS_BUFFER_TOO_SMALL;
346 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
351 ulRemainingLen -= FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
354 // Populate the data in the reparse buffer
357 pReparseBuffer->ReparseDataLength = 0;
359 AFSAcquireExcl( &pCcb->DirectoryCB->NonPaged->Lock,
362 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
366 // We'll reset the DV to ensure we validate the metadata content
369 pCcb->DirectoryCB->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
371 SetFlag( pCcb->DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
373 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
374 AFS_TRACE_LEVEL_VERBOSE,
375 "AFSProcessUserFsRequest Verifying symlink %wZ FID %08lX-%08lX-%08lX-%08lX\n",
376 &pCcb->DirectoryCB->NameInformation.FileName,
377 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
378 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
379 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
380 pCcb->DirectoryCB->ObjectInformation->FileId.Unique);
382 ntStatus = AFSVerifyEntry( &pFcb->AuthGroup,
385 if( !NT_SUCCESS( ntStatus))
388 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
389 AFS_TRACE_LEVEL_ERROR,
390 "AFSProcessUserFsRequest Failed to verify symlink %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
391 &pCcb->DirectoryCB->NameInformation.FileName,
392 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
393 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
394 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
395 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
398 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
404 pReparseInfo = (AFSReparseTagInfo *)&pReparseBuffer->GenericReparseBuffer.DataBuffer[ 0];
406 switch( pCcb->DirectoryCB->ObjectInformation->FileType)
409 case AFS_FILE_TYPE_SYMLINK:
412 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
415 ntStatus = STATUS_ACCESS_DENIED;
420 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
423 ntStatus = STATUS_BUFFER_TOO_SMALL;
425 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
426 FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) +
427 pCcb->DirectoryCB->NameInformation.TargetName.Length;
432 pReparseInfo->SubTag = OPENAFS_SUBTAG_SYMLINK;
434 pReparseInfo->AFSSymLink.RelativeLink = AFSIsRelativeName( &pCcb->DirectoryCB->NameInformation.TargetName);
436 pReparseInfo->AFSSymLink.SymLinkTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
438 RtlCopyMemory( pReparseInfo->AFSSymLink.Buffer,
439 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
440 pCcb->DirectoryCB->NameInformation.TargetName.Length);
442 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
447 case AFS_FILE_TYPE_MOUNTPOINT:
449 UNICODE_STRING Cell, Volume;
452 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
454 ntStatus = STATUS_ACCESS_DENIED;
459 if ( !AFSParseMountPointTarget( &pCcb->DirectoryCB->NameInformation.TargetName,
464 ntStatus = STATUS_INVALID_PARAMETER;
469 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length)
472 ntStatus = STATUS_BUFFER_TOO_SMALL;
474 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
475 FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) +
476 Volume.Length + Cell.Length;
481 pReparseInfo->SubTag = OPENAFS_SUBTAG_MOUNTPOINT;
483 pReparseInfo->AFSMountPoint.Type = Type;
485 pReparseInfo->AFSMountPoint.MountPointCellLength = Cell.Length;
487 pReparseInfo->AFSMountPoint.MountPointVolumeLength = Volume.Length;
489 RtlCopyMemory( pReparseInfo->AFSMountPoint.Buffer,
493 RtlCopyMemory( &pReparseInfo->AFSMountPoint.Buffer[ Cell.Length / sizeof( WCHAR)],
497 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length);
502 case AFS_FILE_TYPE_DFSLINK:
505 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
508 ntStatus = STATUS_ACCESS_DENIED;
513 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
516 ntStatus = STATUS_BUFFER_TOO_SMALL;
518 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
519 FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) +
520 pCcb->DirectoryCB->NameInformation.TargetName.Length;
525 pReparseInfo->SubTag = OPENAFS_SUBTAG_UNC;
527 pReparseInfo->UNCReferral.UNCTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
529 RtlCopyMemory( pReparseInfo->UNCReferral.Buffer,
530 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
531 pCcb->DirectoryCB->NameInformation.TargetName.Length);
533 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
540 ntStatus = STATUS_NOT_A_REPARSE_POINT;
545 if ( ntStatus == STATUS_SUCCESS)
548 ulRemainingLen -= pReparseBuffer->ReparseDataLength;
550 pReparseBuffer->ReparseTag = IO_REPARSE_TAG_OPENAFS_DFS;
552 RtlCopyMemory( &pReparseBuffer->ReparseGuid,
553 &GUID_AFS_REPARSE_GUID,
556 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
557 pReparseBuffer->ReparseDataLength;
560 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
565 case FSCTL_SET_REPARSE_POINT:
568 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
570 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
571 AFS_TRACE_LEVEL_VERBOSE_2,
572 "AFSProcessUserFsRequest Processing FSCTL_SET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
573 &pCcb->DirectoryCB->NameInformation.FileName,
574 pCcb->DirectoryCB->ObjectInformation->FileType,
575 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
578 // Check if we have the reparse entry set on the entry
581 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
584 ntStatus = STATUS_NOT_A_REPARSE_POINT;
589 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
592 ntStatus = STATUS_INVALID_PARAMETER;
597 if( pReparseBuffer->ReparseTag != IO_REPARSE_TAG_OPENAFS_DFS)
600 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
605 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
606 &GUID_AFS_REPARSE_GUID,
607 sizeof( GUID)) != sizeof( GUID))
610 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
616 // For now deny access on this call
622 case FSCTL_DELETE_REPARSE_POINT:
625 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
627 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
628 AFS_TRACE_LEVEL_VERBOSE_2,
629 "AFSProcessUserFsRequest Processing FSCTL_DELETE_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
630 &pCcb->DirectoryCB->NameInformation.FileName,
631 pCcb->DirectoryCB->ObjectInformation->FileType,
632 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
635 // Check if we have the reparse entry set on the entry
638 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
641 ntStatus = STATUS_NOT_A_REPARSE_POINT;
646 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
649 ntStatus = STATUS_INVALID_PARAMETER;
654 if( pReparseBuffer->ReparseTag != IO_REPARSE_TAG_OPENAFS_DFS)
657 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
662 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
663 &GUID_AFS_REPARSE_GUID,
664 sizeof( GUID)) != sizeof( GUID))
667 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
673 // For now deny access on this call
676 ntStatus = STATUS_ACCESS_DENIED;
683 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
684 AFS_TRACE_LEVEL_VERBOSE_2,
685 "AFSProcessUserFsRequest Processing default (%08lX) request\n", ulFsControlCode);
687 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
701 AFSProcessShareFsCtrl( IN IRP *Irp,
706 NTSTATUS ntStatus = STATUS_SUCCESS;
707 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
708 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
709 ULONG ulFsControlCode;
714 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
716 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
717 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
719 switch( ulFsControlCode)
722 case FSCTL_PIPE_TRANSCEIVE:
725 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
726 AFS_TRACE_LEVEL_VERBOSE,
727 "AFSProcessShareFsCtrl On pipe %wZ Class FSCTL_PIPE_TRANSCEIVE\n",
728 &Ccb->DirectoryCB->NameInformation.FileName);
730 ntStatus = AFSNotifyPipeTransceive( Ccb,
733 pIrpSp->Parameters.FileSystemControl.Type3InputBuffer,
735 (ULONG *)&Irp->IoStatus.Information);
737 if( !NT_SUCCESS( ntStatus))
740 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
741 AFS_TRACE_LEVEL_VERBOSE,
742 "AFSProcessShareFsCtrl Failure on pipe %wZ Class FSCTL_PIPE_TRANSCEIVE Status %08lX\n",
743 &Ccb->DirectoryCB->NameInformation.FileName,
753 if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_SERVER_SERVICE))
756 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For srvsvc input %08lX output %08lX\n",
759 // ulOutputBufferLen);
761 else if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_WORKSTATION_SERVICE))
764 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For wkssvc input %08lX output %08lX\n",
767 // ulOutputBufferLen);
772 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For IPC$ input %08lX output %08lX\n",
775 // ulOutputBufferLen);