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( &pCcb->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_IO_REPARSE_DATA_INVALID;
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
619 ntStatus = STATUS_INVALID_PARAMETER;
624 case FSCTL_DELETE_REPARSE_POINT:
627 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
629 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
630 AFS_TRACE_LEVEL_VERBOSE_2,
631 "AFSProcessUserFsRequest Processing FSCTL_DELETE_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
632 &pCcb->DirectoryCB->NameInformation.FileName,
633 pCcb->DirectoryCB->ObjectInformation->FileType,
634 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
637 // Check if we have the reparse entry set on the entry
640 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
643 ntStatus = STATUS_NOT_A_REPARSE_POINT;
648 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
651 ntStatus = STATUS_INVALID_PARAMETER;
656 if( pReparseBuffer->ReparseTag != IO_REPARSE_TAG_OPENAFS_DFS)
659 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
664 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
665 &GUID_AFS_REPARSE_GUID,
666 sizeof( GUID)) != sizeof( GUID))
669 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
675 // For now deny access on this call
678 ntStatus = STATUS_ACCESS_DENIED;
685 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
686 AFS_TRACE_LEVEL_VERBOSE_2,
687 "AFSProcessUserFsRequest Processing default (%08lX) request\n", ulFsControlCode);
689 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
703 AFSProcessShareFsCtrl( IN IRP *Irp,
708 NTSTATUS ntStatus = STATUS_SUCCESS;
709 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
710 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
711 ULONG ulFsControlCode;
716 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
718 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
719 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
721 switch( ulFsControlCode)
724 case FSCTL_PIPE_TRANSCEIVE:
727 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
728 AFS_TRACE_LEVEL_VERBOSE,
729 "AFSProcessShareFsCtrl On pipe %wZ Class FSCTL_PIPE_TRANSCEIVE\n",
730 &Ccb->DirectoryCB->NameInformation.FileName);
732 ntStatus = AFSNotifyPipeTransceive( Ccb,
735 pIrpSp->Parameters.FileSystemControl.Type3InputBuffer,
737 (ULONG *)&Irp->IoStatus.Information);
739 if( !NT_SUCCESS( ntStatus))
742 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
743 AFS_TRACE_LEVEL_VERBOSE,
744 "AFSProcessShareFsCtrl Failure on pipe %wZ Class FSCTL_PIPE_TRANSCEIVE Status %08lX\n",
745 &Ccb->DirectoryCB->NameInformation.FileName,
755 if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_SERVER_SERVICE))
758 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For srvsvc input %08lX output %08lX\n",
761 // ulOutputBufferLen);
763 else if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_WORKSTATION_SERVICE))
766 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For wkssvc input %08lX output %08lX\n",
769 // ulOutputBufferLen);
774 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For IPC$ input %08lX output %08lX\n",
777 // ulOutputBufferLen);