NTSTATUS AFSProcessShareFsCtrl( IN IRP *Irp, IN AFSFcb *Fcb, IN AFSCcb *Ccb) { NTSTATUS ntStatus = STATUS_SUCCESS; PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp); ULONG ulOutputBufferLen = 0, ulInputBufferLen; ULONG ulFsControlCode; __Enter { ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode; ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength; ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength; switch( ulFsControlCode) { case FSCTL_PIPE_TRANSCEIVE: { AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "AFSProcessShareFsCtrl On pipe %wZ Class FSCTL_PIPE_TRANSCEIVE\n", &Ccb->DirectoryCB->NameInformation.FileName); ntStatus = AFSNotifyPipeTransceive( Ccb, ulInputBufferLen, ulOutputBufferLen, pIrpSp->Parameters.FileSystemControl.Type3InputBuffer, Irp->UserBuffer, (ULONG *)&Irp->IoStatus.Information); if( !NT_SUCCESS( ntStatus)) { AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "AFSProcessShareFsCtrl Failure on pipe %wZ Class FSCTL_PIPE_TRANSCEIVE Status %08lX\n", &Ccb->DirectoryCB->NameInformation.FileName, ntStatus); } break; } default: { if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_SERVER_SERVICE)) { //AFSPrint("AFSProcessShareFsCtrl (%08lX) For srvsvc input %08lX output %08lX\n", // ulFsControlCode, // ulInputBufferLen, // ulOutputBufferLen); } else if( BooleanFlagOn( Ccb->DirectoryCB->Flags, AFS_DIR_ENTRY_WORKSTATION_SERVICE)) { //AFSPrint("AFSProcessShareFsCtrl (%08lX) For wkssvc input %08lX output %08lX\n", // ulFsControlCode, // ulInputBufferLen, // ulOutputBufferLen); } else { //AFSPrint("AFSProcessShareFsCtrl (%08lX) For IPC$ input %08lX output %08lX\n", // ulFsControlCode, // ulInputBufferLen, // ulOutputBufferLen); } break; } } } return ntStatus; }
NTSTATUS AFSProcessShareFsCtrl( IN IRP *Irp, IN AFSFcb *Fcb, IN AFSCcb *Ccb) { UNREFERENCED_PARAMETER(Fcb); NTSTATUS ntStatus = STATUS_SUCCESS; PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp); ULONG ulOutputBufferLen = 0, ulInputBufferLen; ULONG ulFsControlCode; __Enter { ulFsControlCode = pIrpSp->Parameters.FileSystemControl.FsControlCode; ulOutputBufferLen = pIrpSp->Parameters.FileSystemControl.OutputBufferLength; ulInputBufferLen = pIrpSp->Parameters.FileSystemControl.InputBufferLength; switch( ulFsControlCode) { case FSCTL_PIPE_TRANSCEIVE: { AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "AFSProcessShareFsCtrl On pipe %wZ Class FSCTL_PIPE_TRANSCEIVE\n", &Ccb->DirectoryCB->NameInformation.FileName)); ntStatus = AFSNotifyPipeTransceive( Ccb, ulInputBufferLen, ulOutputBufferLen, pIrpSp->Parameters.FileSystemControl.Type3InputBuffer, Irp->UserBuffer, (ULONG *)&Irp->IoStatus.Information); if( !NT_SUCCESS( ntStatus)) { AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "AFSProcessShareFsCtrl Failure on pipe %wZ Class FSCTL_PIPE_TRANSCEIVE Status %08lX\n", &Ccb->DirectoryCB->NameInformation.FileName, ntStatus)); } break; } default: { AFSPrint( "AFSProcessShareFsCtrl (%08lX) For IPC$ input %08lX output %08lX\n", ulFsControlCode, ulInputBufferLen, ulOutputBufferLen); break; } } } return ntStatus; }