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 UNREFERENCED_PARAMETER(LibDeviceObject);
47 NTSTATUS ntStatus = STATUS_SUCCESS;
48 IO_STACK_LOCATION *pIrpSp;
50 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
55 switch( pIrpSp->MinorFunction)
58 case IRP_MN_USER_FS_REQUEST:
60 ntStatus = AFSProcessUserFsRequest( Irp);
64 case IRP_MN_MOUNT_VOLUME:
68 case IRP_MN_VERIFY_VOLUME:
77 AFSCompleteRequest( Irp,
81 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
86 "EXCEPTION - AFSFSControl\n");
88 AFSDumpTraceFilesFnc();
95 AFSParseMountPointTarget( IN UNICODE_STRING *Target,
97 OUT UNICODE_STRING *Volume,
98 OUT UNICODE_STRING *Cell)
100 // Targets are of the form <type>[<cell>:]<volume>
102 *Type = Target->Buffer[ 0];
104 // Extract the cell name (if any)
106 Cell->Buffer = &Target->Buffer[ 1];
108 // Search for colon separator or end of counted string
110 for ( Cell->Length = 0; Cell->Length < Target->Length - sizeof( WCHAR); Cell->Length += sizeof( WCHAR))
113 if ( Cell->Buffer[ Cell->Length / sizeof( WCHAR)] == L':')
119 // If a colon is not found, it means there is no cell
121 if ( Cell->Length < Target->Length - sizeof( WCHAR) &&
122 Cell->Buffer[ Cell->Length / sizeof( WCHAR)] == L':')
125 Cell->MaximumLength = Cell->Length;
127 if ( Cell->Length > Target->Length - 2 * sizeof( WCHAR))
129 // Invalid target string if there is no room for
135 Volume->Length = Volume->MaximumLength = (Target->Length - Cell->Length - 2 * sizeof( WCHAR));
137 Volume->Buffer = &Target->Buffer[ Cell->Length / sizeof( WCHAR) + 2];
143 Volume->Length = Volume->MaximumLength = Cell->Length;
145 Volume->Buffer = Cell->Buffer;
147 Cell->Length = Cell->MaximumLength = 0;
156 AFSProcessUserFsRequest( IN PIRP Irp)
159 NTSTATUS ntStatus = STATUS_SUCCESS;
160 ULONG ulFsControlCode;
162 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp );
164 ULONG ulOutputBufferLen, ulInputBufferLen;
169 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
171 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
173 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
177 pCcb->DirectoryCB == NULL)
180 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
181 AFS_TRACE_LEVEL_VERBOSE_2,
182 "AFSProcessUserFsRequest Invalid Fcb\n");
184 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
187 if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
190 ntStatus = AFSProcessShareFsCtrl( Irp,
194 try_return( ntStatus);
197 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
198 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
201 // Process the request
204 switch( ulFsControlCode )
207 case FSCTL_REQUEST_OPLOCK_LEVEL_1:
208 case FSCTL_REQUEST_OPLOCK_LEVEL_2:
209 case FSCTL_REQUEST_BATCH_OPLOCK:
210 case FSCTL_OPLOCK_BREAK_ACKNOWLEDGE:
211 case FSCTL_OPBATCH_ACK_CLOSE_PENDING:
212 case FSCTL_OPLOCK_BREAK_NOTIFY:
213 case FSCTL_OPLOCK_BREAK_ACK_NO_2:
214 case FSCTL_REQUEST_FILTER_OPLOCK :
217 // Note that implementing this call will probably need us
218 // to call the server as well as adding code in read and
219 // write and caching. Also that it is unlikely that
220 // anyone will ever call us at this point - RDR doesn't
224 ntStatus = STATUS_NOT_IMPLEMENTED;
229 case FSCTL_LOCK_VOLUME:
231 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
232 AFS_TRACE_LEVEL_VERBOSE_2,
233 "AFSProcessUserFsRequest Processing FSCTL_LOCK_VOLUME request\n");
235 ntStatus = STATUS_NOT_IMPLEMENTED;
240 case FSCTL_UNLOCK_VOLUME:
242 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
243 AFS_TRACE_LEVEL_VERBOSE_2,
244 "AFSProcessUserFsRequest Processing FSCTL_UNLOCK_VOLUME request\n");
246 ntStatus = STATUS_NOT_IMPLEMENTED;
251 case FSCTL_DISMOUNT_VOLUME:
253 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
254 AFS_TRACE_LEVEL_VERBOSE_2,
255 "AFSProcessUserFsRequest Processing FSCTL_DISMOUNT_VOLUME request\n");
257 ntStatus = STATUS_NOT_IMPLEMENTED;
262 case FSCTL_MARK_VOLUME_DIRTY:
264 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
265 AFS_TRACE_LEVEL_VERBOSE_2,
266 "AFSProcessUserFsRequest Processing FSCTL_MARK_VOLUME_DIRTY request\n");
268 ntStatus = STATUS_NOT_IMPLEMENTED;
273 case FSCTL_IS_VOLUME_DIRTY:
275 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
276 AFS_TRACE_LEVEL_VERBOSE_2,
277 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_DIRTY request\n");
279 ntStatus = STATUS_NOT_IMPLEMENTED;
284 case FSCTL_IS_VOLUME_MOUNTED:
286 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
287 AFS_TRACE_LEVEL_VERBOSE_2,
288 "AFSProcessUserFsRequest Processing FSCTL_IS_VOLUME_MOUNTED request\n");
290 ntStatus = STATUS_NOT_IMPLEMENTED;
295 case FSCTL_IS_PATHNAME_VALID:
297 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
298 AFS_TRACE_LEVEL_VERBOSE_2,
299 "AFSProcessUserFsRequest Processing FSCTL_IS_PATHNAME_VALID request\n");
301 ntStatus = STATUS_SUCCESS;
306 #ifndef FSCTL_CSC_INTERNAL
307 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
309 case FSCTL_CSC_INTERNAL:
311 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
312 AFS_TRACE_LEVEL_VERBOSE_2,
313 "AFSProcessUserFsRequest Processing FSCTL_CSC_INTERNAL request\n");
315 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
320 case FSCTL_GET_REPARSE_POINT:
323 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
324 ULONG ulRemainingLen = ulOutputBufferLen;
325 AFSReparseTagInfo *pReparseInfo = NULL;
327 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
328 AFS_TRACE_LEVEL_VERBOSE_2,
329 "AFSProcessUserFsRequest Processing FSCTL_GET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
330 &pCcb->DirectoryCB->NameInformation.FileName,
331 pCcb->DirectoryCB->ObjectInformation->FileType,
332 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
335 // Check if we have the reparse entry set on the entry
338 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
341 ntStatus = STATUS_NOT_A_REPARSE_POINT;
346 if( ulOutputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
349 ntStatus = STATUS_BUFFER_TOO_SMALL;
351 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
356 ulRemainingLen -= FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer);
359 // Populate the data in the reparse buffer
362 pReparseBuffer->ReparseDataLength = 0;
364 AFSAcquireExcl( &pCcb->DirectoryCB->NonPaged->Lock,
367 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
371 // We'll reset the DV to ensure we validate the metadata content
374 pCcb->DirectoryCB->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
376 SetFlag( pCcb->DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
378 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
379 AFS_TRACE_LEVEL_VERBOSE,
380 "AFSProcessUserFsRequest Verifying symlink %wZ FID %08lX-%08lX-%08lX-%08lX\n",
381 &pCcb->DirectoryCB->NameInformation.FileName,
382 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
383 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
384 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
385 pCcb->DirectoryCB->ObjectInformation->FileId.Unique);
387 ntStatus = AFSVerifyEntry( &pCcb->AuthGroup,
390 if( !NT_SUCCESS( ntStatus))
393 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
394 AFS_TRACE_LEVEL_ERROR,
395 "AFSProcessUserFsRequest Failed to verify symlink %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
396 &pCcb->DirectoryCB->NameInformation.FileName,
397 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
398 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
399 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
400 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
403 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
409 pReparseInfo = (AFSReparseTagInfo *)&pReparseBuffer->GenericReparseBuffer.DataBuffer[ 0];
411 switch( pCcb->DirectoryCB->ObjectInformation->FileType)
414 case AFS_FILE_TYPE_SYMLINK:
417 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
420 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
425 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
428 ntStatus = STATUS_BUFFER_TOO_SMALL;
430 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
431 FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) +
432 pCcb->DirectoryCB->NameInformation.TargetName.Length;
437 pReparseInfo->SubTag = OPENAFS_SUBTAG_SYMLINK;
439 pReparseInfo->AFSSymLink.RelativeLink = AFSIsRelativeName( &pCcb->DirectoryCB->NameInformation.TargetName);
441 pReparseInfo->AFSSymLink.SymLinkTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
443 RtlCopyMemory( pReparseInfo->AFSSymLink.Buffer,
444 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
445 pCcb->DirectoryCB->NameInformation.TargetName.Length);
447 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSSymLink.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
452 case AFS_FILE_TYPE_MOUNTPOINT:
454 UNICODE_STRING Cell, Volume;
457 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
459 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
464 if ( !AFSParseMountPointTarget( &pCcb->DirectoryCB->NameInformation.TargetName,
469 ntStatus = STATUS_INVALID_PARAMETER;
474 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length)
477 ntStatus = STATUS_BUFFER_TOO_SMALL;
479 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
480 FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) +
481 Volume.Length + Cell.Length;
486 pReparseInfo->SubTag = OPENAFS_SUBTAG_MOUNTPOINT;
488 pReparseInfo->AFSMountPoint.Type = Type;
490 pReparseInfo->AFSMountPoint.MountPointCellLength = Cell.Length;
492 pReparseInfo->AFSMountPoint.MountPointVolumeLength = Volume.Length;
494 RtlCopyMemory( pReparseInfo->AFSMountPoint.Buffer,
498 RtlCopyMemory( &pReparseInfo->AFSMountPoint.Buffer[ Cell.Length / sizeof( WCHAR)],
502 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, AFSMountPoint.Buffer) + Volume.Length + Cell.Length);
507 case AFS_FILE_TYPE_DFSLINK:
510 if( pCcb->DirectoryCB->NameInformation.TargetName.Length == 0)
513 ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
518 if( ulRemainingLen < (ULONG) FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length)
521 ntStatus = STATUS_BUFFER_TOO_SMALL;
523 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
524 FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) +
525 pCcb->DirectoryCB->NameInformation.TargetName.Length;
530 pReparseInfo->SubTag = OPENAFS_SUBTAG_UNC;
532 pReparseInfo->UNCReferral.UNCTargetLength = pCcb->DirectoryCB->NameInformation.TargetName.Length;
534 RtlCopyMemory( pReparseInfo->UNCReferral.Buffer,
535 pCcb->DirectoryCB->NameInformation.TargetName.Buffer,
536 pCcb->DirectoryCB->NameInformation.TargetName.Length);
538 pReparseBuffer->ReparseDataLength = (FIELD_OFFSET( AFSReparseTagInfo, UNCReferral.Buffer) + pCcb->DirectoryCB->NameInformation.TargetName.Length);
545 ntStatus = STATUS_NOT_A_REPARSE_POINT;
550 if ( ntStatus == STATUS_SUCCESS)
553 ulRemainingLen -= pReparseBuffer->ReparseDataLength;
555 pReparseBuffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
557 RtlCopyMemory( &pReparseBuffer->ReparseGuid,
558 &GUID_AFS_REPARSE_GUID,
561 Irp->IoStatus.Information = FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer) +
562 pReparseBuffer->ReparseDataLength;
565 AFSReleaseResource( &pCcb->DirectoryCB->NonPaged->Lock);
570 case FSCTL_SET_REPARSE_POINT:
573 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
575 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
576 AFS_TRACE_LEVEL_VERBOSE_2,
577 "AFSProcessUserFsRequest Processing FSCTL_SET_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
578 &pCcb->DirectoryCB->NameInformation.FileName,
579 pCcb->DirectoryCB->ObjectInformation->FileType,
580 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
583 // Check if we have the reparse entry set on the entry
586 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
589 ntStatus = STATUS_NOT_A_REPARSE_POINT;
594 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
597 ntStatus = STATUS_IO_REPARSE_DATA_INVALID;
602 if( (pReparseBuffer->ReparseTag & 0x0000FFFF) != IO_REPARSE_TAG_OPENAFS_DFS)
605 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
610 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
611 &GUID_AFS_REPARSE_GUID,
612 sizeof( GUID)) != sizeof( GUID))
615 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
621 // For now deny access on this call
624 ntStatus = STATUS_INVALID_PARAMETER;
629 case FSCTL_DELETE_REPARSE_POINT:
632 REPARSE_GUID_DATA_BUFFER *pReparseBuffer = (REPARSE_GUID_DATA_BUFFER *)Irp->AssociatedIrp.SystemBuffer;
634 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
635 AFS_TRACE_LEVEL_VERBOSE_2,
636 "AFSProcessUserFsRequest Processing FSCTL_DELETE_REPARSE_POINT request %wZ Type 0x%x Attrib 0x%x\n",
637 &pCcb->DirectoryCB->NameInformation.FileName,
638 pCcb->DirectoryCB->ObjectInformation->FileType,
639 pCcb->DirectoryCB->ObjectInformation->FileAttributes);
642 // Check if we have the reparse entry set on the entry
645 if( !BooleanFlagOn( pCcb->DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
648 ntStatus = STATUS_NOT_A_REPARSE_POINT;
653 if( ulInputBufferLen < FIELD_OFFSET( REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer.DataBuffer))
656 ntStatus = STATUS_INVALID_PARAMETER;
661 if( (pReparseBuffer->ReparseTag & 0x0000FFFF) != IO_REPARSE_TAG_OPENAFS_DFS)
664 ntStatus = STATUS_IO_REPARSE_TAG_MISMATCH;
669 if( RtlCompareMemory( &pReparseBuffer->ReparseGuid,
670 &GUID_AFS_REPARSE_GUID,
671 sizeof( GUID)) != sizeof( GUID))
674 ntStatus = STATUS_REPARSE_ATTRIBUTE_CONFLICT;
680 // For now deny access on this call
683 ntStatus = STATUS_ACCESS_DENIED;
688 #ifndef FSCTL_SET_PURGE_FAILURE_MODE
689 #define FSCTL_SET_PURGE_FAILURE_MODE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 156, METHOD_BUFFERED, FILE_ANY_ACCESS)
692 case FSCTL_SET_PURGE_FAILURE_MODE:
696 // For the time being just succeed this call
699 ntStatus = STATUS_SUCCESS;
707 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
708 AFS_TRACE_LEVEL_VERBOSE_2,
709 "AFSProcessUserFsRequest Processing default (%08lX) request\n", ulFsControlCode);
711 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
726 AFSProcessShareFsCtrl( IN IRP *Irp,
731 UNREFERENCED_PARAMETER(Fcb);
732 NTSTATUS ntStatus = STATUS_SUCCESS;
733 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
734 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
735 ULONG ulFsControlCode;
740 ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode;
742 ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength;
743 ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength;
745 switch( ulFsControlCode)
748 case FSCTL_PIPE_TRANSCEIVE:
751 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
752 AFS_TRACE_LEVEL_VERBOSE,
753 "AFSProcessShareFsCtrl On pipe %wZ Class FSCTL_PIPE_TRANSCEIVE\n",
754 &Ccb->DirectoryCB->NameInformation.FileName);
756 ntStatus = AFSNotifyPipeTransceive( Ccb,
759 pIrpSp->Parameters.FileSystemControl.Type3InputBuffer,
761 (ULONG *)&Irp->IoStatus.Information);
763 if( !NT_SUCCESS( ntStatus))
766 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
767 AFS_TRACE_LEVEL_VERBOSE,
768 "AFSProcessShareFsCtrl Failure on pipe %wZ Class FSCTL_PIPE_TRANSCEIVE Status %08lX\n",
769 &Ccb->DirectoryCB->NameInformation.FileName,
779 AFSPrint( "AFSProcessShareFsCtrl (%08lX) For IPC$ input %08lX output %08lX\n",