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->Length < Target->Length - sizeof( WCHAR) &&
119 Cell->Buffer[ Cell->Length / sizeof( WCHAR)] == L':')
122 Cell->MaximumLength = Cell->Length;
124 if ( Cell->Length > Target->Length - 2 * sizeof( WCHAR))
126 // Invalid target string if there is no room for
132 Volume->Length = Volume->MaximumLength = (Target->Length - Cell->Length - 2 * sizeof( WCHAR));
134 Volume->Buffer = &Target->Buffer[ Cell->Length / sizeof( WCHAR) + 2];
140 Volume->Length = Volume->MaximumLength = Cell->Length;
142 Volume->Buffer = Cell->Buffer;
144 Cell->Length = Cell->MaximumLength = 0;
153 AFSProcessUserFsRequest( IN PIRP Irp)
156 NTSTATUS ntStatus = STATUS_SUCCESS;
157 ULONG ulFsControlCode;
159 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp );
161 ULONG ulOutputBufferLen, ulInputBufferLen;
166 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
168 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
170 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
173 pCcb->DirectoryCB == NULL)
176 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
177 AFS_TRACE_LEVEL_VERBOSE_2,
178 "AFSProcessUserFsRequest Invalid Fcb\n");
180 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
183 if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
186 ntStatus = AFSProcessShareFsCtrl( Irp,
190 try_return( ntStatus);
193 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
194 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
197 // Process the request
200 switch( ulFsControlCode )
203 case FSCTL_REQUEST_OPLOCK_LEVEL_1:
204 case FSCTL_REQUEST_OPLOCK_LEVEL_2:
205 case FSCTL_REQUEST_BATCH_OPLOCK:
206 case FSCTL_OPLOCK_BREAK_ACKNOWLEDGE:
207 case FSCTL_OPBATCH_ACK_CLOSE_PENDING:
208 case FSCTL_OPLOCK_BREAK_NOTIFY:
209 case FSCTL_OPLOCK_BREAK_ACK_NO_2:
210 case FSCTL_REQUEST_FILTER_OPLOCK :
213 // Note that implementing this call will probably need us
214 // to call the server as well as adding code in read and
215 // write and caching. Also that it is unlikely that
216 // anyone will ever call us at this point - RDR doesn't
220 ntStatus = STATUS_NOT_IMPLEMENTED;
225 case FSCTL_LOCK_VOLUME:
227 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
228 AFS_TRACE_LEVEL_VERBOSE_2,
229 "AFSProcessUserFsRequest Processing FSCTL_LOCK_VOLUME request\n");
231 ntStatus = STATUS_NOT_IMPLEMENTED;
236 case FSCTL_UNLOCK_VOLUME:
238 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
239 AFS_TRACE_LEVEL_VERBOSE_2,
240 "AFSProcessUserFsRequest Processing FSCTL_UNLOCK_VOLUME request\n");
242 ntStatus = STATUS_NOT_IMPLEMENTED;
247 case FSCTL_DISMOUNT_VOLUME:
249 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
250 AFS_TRACE_LEVEL_VERBOSE_2,
251 "AFSProcessUserFsRequest Processing FSCTL_DISMOUNT_VOLUME request\n");
253 ntStatus = STATUS_NOT_IMPLEMENTED;
258 case FSCTL_MARK_VOLUME_DIRTY:
260 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
261 AFS_TRACE_LEVEL_VERBOSE_2,
262 "AFSProcessUserFsRequest Processing FSCTL_MARK_VOLUME_DIRTY request\n");
264 ntStatus = STATUS_NOT_IMPLEMENTED;
269 case FSCTL_IS_VOLUME_DIRTY:
271 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
272 AFS_TRACE_LEVEL_VERBOSE_2,
273 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_DIRTY request\n");
275 ntStatus = STATUS_NOT_IMPLEMENTED;
280 case FSCTL_IS_VOLUME_MOUNTED:
282 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
283 AFS_TRACE_LEVEL_VERBOSE_2,
284 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_MOUNTED request\n");
286 ntStatus = STATUS_NOT_IMPLEMENTED;
291 case FSCTL_IS_PATHNAME_VALID:
293 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
294 AFS_TRACE_LEVEL_VERBOSE_2,
295 "AFSProcessUserFsRequest Processing FSCTL_IS_PATHNAME_VALID request\n");
297 ntStatus = STATUS_SUCCESS;
302 #ifndef FSCTL_CSC_INTERNAL
303 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
305 case FSCTL_CSC_INTERNAL:
307 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
308 AFS_TRACE_LEVEL_VERBOSE_2,
309 "AFSProcessUserFsRequest Processing FSCTL_CSC_INTERNAL request\n");
311 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
316 case FSCTL_GET_REPARSE_POINT:
319 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
320 ULONG ulRemainingLen = ulOutputBufferLen;
321 AFSReparseTagInfo *pReparseInfo = NULL;
323 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
324 AFS_TRACE_LEVEL_VERBOSE_2,
325 "AFSProcessUserFsRequest Processing FSCTL_GET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
326 &pCcb->DirectoryCB->NameInformation.FileName,
327 pCcb->DirectoryCB->ObjectInformation->FileType,
328 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
331 // Check if we have the reparse entry set on the entry
334 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
337 ntStatus = STATUS_NOT_A_REPARSE_POINT;
342 if( ulOutputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
345 ntStatus = STATUS_BUFFER_TOO_SMALL;
347 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
352 ulRemainingLen -= FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
355 // Populate the data in the reparse buffer
358 pReparseBuffer->ReparseDataLength = 0;
360 AFSAcquireExcl( &pCcb->DirectoryCB->NonPaged->Lock,
363 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
367 // We'll reset the DV to ensure we validate the metadata content
370 pCcb->DirectoryCB->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
372 SetFlag( pCcb->DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
374 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
375 AFS_TRACE_LEVEL_VERBOSE,
376 "AFSProcessUserFsRequest Verifying symlink %wZ FID %08lX-%08lX-%08lX-%08lX\n",
377 &pCcb->DirectoryCB->NameInformation.FileName,
378 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
379 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
380 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
381 pCcb->DirectoryCB->ObjectInformation->FileId.Unique);
383 ntStatus = AFSVerifyEntry( &pCcb->AuthGroup,
386 if( !NT_SUCCESS( ntStatus))
389 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
390 AFS_TRACE_LEVEL_ERROR,
391 "AFSProcessUserFsRequest Failed to verify symlink %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
392 &pCcb->DirectoryCB->NameInformation.FileName,
393 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
394 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
395 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
396 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
399 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
405 pReparseInfo = (AFSReparseTagInfo *)&pReparseBuffer->GenericReparseBuffer.DataBuffer[ 0];
407 switch( pCcb->DirectoryCB->ObjectInformation->FileType)
410 case AFS_FILE_TYPE_SYMLINK:
413 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
416 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
421 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
424 ntStatus = STATUS_BUFFER_TOO_SMALL;
426 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
427 FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) +
428 pCcb->DirectoryCB->NameInformation.TargetName.Length;
433 pReparseInfo->SubTag = OPENAFS_SUBTAG_SYMLINK;
435 pReparseInfo->AFSSymLink.RelativeLink = AFSIsRelativeName( &pCcb->DirectoryCB->NameInformation.TargetName);
437 pReparseInfo->AFSSymLink.SymLinkTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
439 RtlCopyMemory( pReparseInfo->AFSSymLink.Buffer,
440 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
441 pCcb->DirectoryCB->NameInformation.TargetName.Length);
443 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
448 case AFS_FILE_TYPE_MOUNTPOINT:
450 UNICODE_STRING Cell, Volume;
453 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
455 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
460 if ( !AFSParseMountPointTarget( &pCcb->DirectoryCB->NameInformation.TargetName,
465 ntStatus = STATUS_INVALID_PARAMETER;
470 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length)
473 ntStatus = STATUS_BUFFER_TOO_SMALL;
475 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
476 FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) +
477 Volume.Length + Cell.Length;
482 pReparseInfo->SubTag = OPENAFS_SUBTAG_MOUNTPOINT;
484 pReparseInfo->AFSMountPoint.Type = Type;
486 pReparseInfo->AFSMountPoint.MountPointCellLength = Cell.Length;
488 pReparseInfo->AFSMountPoint.MountPointVolumeLength = Volume.Length;
490 RtlCopyMemory( pReparseInfo->AFSMountPoint.Buffer,
494 RtlCopyMemory( &pReparseInfo->AFSMountPoint.Buffer[ Cell.Length / sizeof( WCHAR)],
498 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length);
503 case AFS_FILE_TYPE_DFSLINK:
506 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
509 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
514 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
517 ntStatus = STATUS_BUFFER_TOO_SMALL;
519 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
520 FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) +
521 pCcb->DirectoryCB->NameInformation.TargetName.Length;
526 pReparseInfo->SubTag = OPENAFS_SUBTAG_UNC;
528 pReparseInfo->UNCReferral.UNCTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
530 RtlCopyMemory( pReparseInfo->UNCReferral.Buffer,
531 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
532 pCcb->DirectoryCB->NameInformation.TargetName.Length);
534 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
541 ntStatus = STATUS_NOT_A_REPARSE_POINT;
546 if ( ntStatus == STATUS_SUCCESS)
549 ulRemainingLen -= pReparseBuffer->ReparseDataLength;
551 pReparseBuffer->ReparseTag = IO_REPARSE_TAG_OPENAFS_DFS;
553 RtlCopyMemory( &pReparseBuffer->ReparseGuid,
554 &GUID_AFS_REPARSE_GUID,
557 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
558 pReparseBuffer->ReparseDataLength;
561 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
566 case FSCTL_SET_REPARSE_POINT:
569 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
571 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
572 AFS_TRACE_LEVEL_VERBOSE_2,
573 "AFSProcessUserFsRequest Processing FSCTL_SET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
574 &pCcb->DirectoryCB->NameInformation.FileName,
575 pCcb->DirectoryCB->ObjectInformation->FileType,
576 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
579 // Check if we have the reparse entry set on the entry
582 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
585 ntStatus = STATUS_NOT_A_REPARSE_POINT;
590 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
593 ntStatus = STATUS_IO_REPARSE_DATA_INVALID;
598 if( pReparseBuffer->ReparseTag != IO_REPARSE_TAG_OPENAFS_DFS)
601 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
606 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
607 &GUID_AFS_REPARSE_GUID,
608 sizeof( GUID)) != sizeof( GUID))
611 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
617 // For now deny access on this call
620 ntStatus = STATUS_INVALID_PARAMETER;
625 case FSCTL_DELETE_REPARSE_POINT:
628 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
630 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
631 AFS_TRACE_LEVEL_VERBOSE_2,
632 "AFSProcessUserFsRequest Processing FSCTL_DELETE_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
633 &pCcb->DirectoryCB->NameInformation.FileName,
634 pCcb->DirectoryCB->ObjectInformation->FileType,
635 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
638 // Check if we have the reparse entry set on the entry
641 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
644 ntStatus = STATUS_NOT_A_REPARSE_POINT;
649 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
652 ntStatus = STATUS_INVALID_PARAMETER;
657 if( pReparseBuffer->ReparseTag != IO_REPARSE_TAG_OPENAFS_DFS)
660 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
665 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
666 &GUID_AFS_REPARSE_GUID,
667 sizeof( GUID)) != sizeof( GUID))
670 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
676 // For now deny access on this call
679 ntStatus = STATUS_ACCESS_DENIED;
686 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
687 AFS_TRACE_LEVEL_VERBOSE_2,
688 "AFSProcessUserFsRequest Processing default (%08lX) request\n", ulFsControlCode);
690 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
704 AFSProcessShareFsCtrl( IN IRP *Irp,
709 NTSTATUS ntStatus = STATUS_SUCCESS;
710 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
711 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
712 ULONG ulFsControlCode;
717 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
719 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
720 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
722 switch( ulFsControlCode)
725 case FSCTL_PIPE_TRANSCEIVE:
728 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
729 AFS_TRACE_LEVEL_VERBOSE,
730 "AFSProcessShareFsCtrl On pipe %wZ Class FSCTL_PIPE_TRANSCEIVE\n",
731 &Ccb->DirectoryCB->NameInformation.FileName);
733 ntStatus = AFSNotifyPipeTransceive( Ccb,
736 pIrpSp->Parameters.FileSystemControl.Type3InputBuffer,
738 (ULONG *)&Irp->IoStatus.Information);
740 if( !NT_SUCCESS( ntStatus))
743 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
744 AFS_TRACE_LEVEL_VERBOSE,
745 "AFSProcessShareFsCtrl Failure on pipe %wZ Class FSCTL_PIPE_TRANSCEIVE Status %08lX\n",
746 &Ccb->DirectoryCB->NameInformation.FileName,
756 if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_SERVER_SERVICE))
759 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For srvsvc input %08lX output %08lX\n",
762 // ulOutputBufferLen);
764 else if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_WORKSTATION_SERVICE))
767 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For wkssvc input %08lX output %08lX\n",
770 // ulOutputBufferLen);
775 //AFSPrint("AFSProcessShareFsCtrl (%08lX) For IPC$ input %08lX output %08lX\n",
778 // ulOutputBufferLen);