internal static SmbPacket CreateSmbResponsePacket()

in ProtoSDK/MS-CIFS/CifsMessageUtil.cs [492:845]


        internal static SmbPacket CreateSmbResponsePacket(
            SmbPacket request,
            SmbHeader smbHeader,
            Channel channel)
        {
            SmbPacket smbPacket = null;

            switch (smbHeader.Command)
            {
                case SmbCommand.SMB_COM_CREATE_DIRECTORY: // 0x00,
                    smbPacket = new SmbCreateDirectoryResponsePacket();
                    break;

                case SmbCommand.SMB_COM_DELETE_DIRECTORY: // 0x01,
                    smbPacket = new SmbDeleteDirectoryResponsePacket();
                    break;

                case SmbCommand.SMB_COM_OPEN: // 0x02,
                    smbPacket = new SmbOpenResponsePacket();
                    break;

                case SmbCommand.SMB_COM_CREATE: // 0x03,
                    smbPacket = new SmbCreateResponsePacket();
                    break;

                case SmbCommand.SMB_COM_CLOSE: // 0x04,
                    smbPacket = new SmbCloseResponsePacket();
                    break;

                case SmbCommand.SMB_COM_FLUSH: // 0x05,
                    smbPacket = new SmbFlushResponsePacket();
                    break;

                case SmbCommand.SMB_COM_DELETE: // 0x06,
                    smbPacket = new SmbDeleteResponsePacket();
                    break;

                case SmbCommand.SMB_COM_RENAME: // 0x07,
                    smbPacket = new SmbRenameResponsePacket();
                    break;

                case SmbCommand.SMB_COM_QUERY_INFORMATION: // 0x08,
                    smbPacket = new SmbQueryInformationResponsePacket();
                    break;

                case SmbCommand.SMB_COM_SET_INFORMATION: // 0x09,
                    smbPacket = new SmbSetInformationResponsePacket();
                    break;

                case SmbCommand.SMB_COM_READ: // 0x0A,
                    smbPacket = new SmbReadResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE: // 0x0B,
                    smbPacket = new SmbWriteResponsePacket();
                    break;

                case SmbCommand.SMB_COM_LOCK_byte_RANGE: // 0x0C,
                    smbPacket = new SmbLockByteRangeResponsePacket();
                    break;

                case SmbCommand.SMB_COM_UNLOCK_byte_RANGE: // 0x0D,
                    smbPacket = new SmbUnlockByteRangeResponsePacket();
                    break;

                case SmbCommand.SMB_COM_CREATE_TEMPORARY: // 0x0E,
                    smbPacket = new SmbCreateTemporaryResponsePacket();
                    break;

                case SmbCommand.SMB_COM_CREATE_NEW: // 0x0F,
                    smbPacket = new SmbCreateNewResponsePacket();
                    break;

                case SmbCommand.SMB_COM_CHECK_DIRECTORY: // 0x10,
                    smbPacket = new SmbCheckDirectoryResponsePacket();
                    break;

                case SmbCommand.SMB_COM_PROCESS_EXIT: // 0x11,
                    smbPacket = new SmbProcessExitResponsePacket();
                    break;

                case SmbCommand.SMB_COM_SEEK: // 0x12,
                    smbPacket = new SmbSeekResponsePacket();
                    break;

                case SmbCommand.SMB_COM_LOCK_AND_READ: // 0x13,
                    smbPacket = new SmbLockAndReadResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_AND_UNLOCK: // 0x14,
                    smbPacket = new SmbWriteAndUnlockResponsePacket();
                    break;

                case SmbCommand.SMB_COM_READ_RAW: // 0x1A,
                    smbPacket = new SmbReadRawResponsePacket();
                    break;

                case SmbCommand.SMB_COM_READ_MPX: // 0x1B,
                    smbPacket = new SmbReadMpxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_READ_MPX_SECONDARY: // 0x1C,
                    smbPacket = new SmbReadMpxSecondaryResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_RAW: // 0x1D,
                    smbPacket = new SmbWriteRawInterimResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_MPX: // 0x1E,
                    smbPacket = new SmbWriteMpxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_MPX_SECONDARY: // 0x1F,
                    smbPacket = new SmbWriteMpxSecondaryResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_COMPLETE: // 0x20,
                    // This command was introduced in LAN Manager 1.0 dialect. This command is deprecated. 
                    // This commandis sent by the server in the final response of an SMB_COM_WRITE_RAW command. 
                    // See SMB_COM_WRITE_RAW for details.
                    smbPacket = new SmbWriteRawFinalResponsePacket();
                    break;

                case SmbCommand.SMB_COM_QUERY_SERVER: // 0x21,
                    smbPacket = new SmbQueryServerResponsePacket();
                    break;

                case SmbCommand.SMB_COM_SET_INFORMATION2: // 0x22,
                    smbPacket = new SmbSetInformation2ResponsePacket();
                    break;

                case SmbCommand.SMB_COM_QUERY_INFORMATION2: // 0x23,
                    smbPacket = new SmbQueryInformation2ResponsePacket();
                    break;

                case SmbCommand.SMB_COM_LOCKING_ANDX: // 0x24,
                    if (request != null)
                    {
                        smbPacket = new SmbLockingAndxResponsePacket();
                    }
                    else
                    {
                        //OpLock Break Notification sent by server
                        smbPacket = new SmbLockingAndxRequestPacket();
                    }
                    break;

                case SmbCommand.SMB_COM_TRANSACTION: // 0x25,
                    // The format of the SMB_COM_TRANSACTION Interim Server Response message MUST be an SMB header
                    // with an empty Parameter and Data section and the WordCount and ByteCount fields MUST be zero. 
                    if (smbHeader.Status == 0 && channel.Peek<byte>(0) == 0 && channel.Peek<ushort>(1) == 0)
                    {
                        smbPacket = new SmbTransactionInterimResponsePacket();
                    }
                    else
                    {
                        SmbTransactionRequestPacket transactionRequest = request as SmbTransactionRequestPacket;

                        if (transactionRequest != null)
                        {
                            smbPacket = CreateSmbTransResponsePacket(
                                (TransSubCommand)transactionRequest.SmbParameters.Setup[0]);
                        }
                    }
                    break;

                case SmbCommand.SMB_COM_IOCTL: // 0x27,
                    smbPacket = new SmbIoctlResponsePacket();
                    break;

                case SmbCommand.SMB_COM_IOCTL_SECONDARY: // 0x28,
                    smbPacket = new SmbIoctlSecondaryResponsePacket();
                    break;

                case SmbCommand.SMB_COM_COPY: // 0x29,
                    smbPacket = new SmbCopyResponsePacket();
                    break;

                case SmbCommand.SMB_COM_MOVE: // 0x2A,
                    smbPacket = new SmbMoveResponsePacket();
                    break;

                case SmbCommand.SMB_COM_ECHO: // 0x2B,
                    smbPacket = new SmbEchoResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_AND_CLOSE: // 0x2C,
                    smbPacket = new SmbWriteAndCloseResponsePacket();
                    break;

                case SmbCommand.SMB_COM_OPEN_ANDX: // 0x2D,
                    smbPacket = new SmbOpenAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_READ_ANDX: // 0x2E,
                    smbPacket = new SmbReadAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_ANDX: // 0x2F,
                    smbPacket = new SmbWriteAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_NEW_FILE_SIZE: // 0x30,
                    smbPacket = new SmbNewFileSizeResponsePacket();
                    break;

                case SmbCommand.SMB_COM_CLOSE_AND_TREE_DISC: // 0x31,
                    smbPacket = new SmbCloseAndTreeDiscResponsePacket();
                    break;

                case SmbCommand.SMB_COM_TRANSACTION2: // 0x32,
                    // The format of the SMB_COM_TRANSACTION2 Interim Server Response message MUST be an SMB header
                    // with an empty Parameter and Data section and the WordCount and ByteCount fields MUST be zero. 
                    if (smbHeader.Status == 0 && channel.Peek<byte>(0) == 0 && channel.Peek<ushort>(1) == 0)
                    {
                        smbPacket = new SmbTransaction2InterimResponsePacket();
                    }
                    else
                    {
                        SmbTransaction2RequestPacket transaction2Request = request as SmbTransaction2RequestPacket;

                        if (transaction2Request != null)
                        {
                            smbPacket = CreateSmbTrans2ResponsePacket(transaction2Request);
                        }
                    }
                    break;

                case SmbCommand.SMB_COM_FIND_CLOSE2: // 0x34,
                    smbPacket = new SmbFindClose2ResponsePacket();
                    break;

                case SmbCommand.SMB_COM_FIND_NOTIFY_CLOSE: // 0x35,
                    smbPacket = new SmbFindNotifyCloseResponsePacket();
                    break;

                case SmbCommand.SMB_COM_TREE_CONNECT: // 0x70,
                    smbPacket = new SmbTreeConnectResponsePacket();
                    break;

                case SmbCommand.SMB_COM_TREE_DISCONNECT: // 0x71,
                    smbPacket = new SmbTreeDisconnectResponsePacket();
                    break;

                case SmbCommand.SMB_COM_NEGOTIATE: // 0x72,
                    smbPacket = new SmbNegotiateResponsePacket();
                    break;

                case SmbCommand.SMB_COM_SESSION_SETUP_ANDX: // 0x73,
                    smbPacket = new SmbSessionSetupAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_LOGOFF_ANDX: // 0x74,
                    smbPacket = new SmbLogoffAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_TREE_CONNECT_ANDX: // 0x75,
                    smbPacket = new SmbTreeConnectAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_SECURITY_PACKAGE_ANDX: // 0x7E,
                    smbPacket = new SmbSecurityPackageAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_QUERY_INFORMATION_DISK: // 0x80,
                    smbPacket = new SmbQueryInformationDiskResponsePacket();
                    break;

                case SmbCommand.SMB_COM_SEARCH: // 0x81,
                    smbPacket = new SmbSearchResponsePacket();
                    break;

                case SmbCommand.SMB_COM_FIND: // 0x82,
                    smbPacket = new SmbFindResponsePacket();
                    break;

                case SmbCommand.SMB_COM_FIND_UNIQUE: // 0x83,
                    smbPacket = new SmbFindUniqueResponsePacket();
                    break;

                case SmbCommand.SMB_COM_FIND_CLOSE: // 0x84,
                    smbPacket = new SmbFindCloseResponsePacket();
                    break;

                case SmbCommand.SMB_COM_NT_TRANSACT: // 0xA0,
                    // The format of the SMB_COM_NT_TRANSACTION Interim Server Response message MUST be an SMB header
                    // with an empty Parameter and Data section and the WordCount and ByteCount fields MUST be zero. 
                    if (smbHeader.Status == 0 && channel.Peek<byte>(0) == 0 && channel.Peek<ushort>(1) == 0)
                    {
                        smbPacket = new SmbNtTransactInterimResponsePacket();
                    }
                    else
                    {
                        SmbNtTransactRequestPacket ntTransactRequest = request as SmbNtTransactRequestPacket;

                        if (ntTransactRequest != null)
                        {
                            smbPacket = CreateSmbNtTransResponsePacket(
                                (NtTransSubCommand)ntTransactRequest.SmbParameters.Function);
                        }
                    }
                    break;

                case SmbCommand.SMB_COM_NT_CREATE_ANDX: // 0xA2,
                    smbPacket = new SmbNtCreateAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_NT_RENAME: // 0xA5,
                    smbPacket = new SmbNtRenameResponsePacket();
                    break;

                case SmbCommand.SMB_COM_OPEN_PRINT_FILE: // 0xC0,
                    smbPacket = new SmbOpenPrintFileResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_PRINT_FILE: // 0xC1,
                    smbPacket = new SmbWritePrintFileResponsePacket();
                    break;

                case SmbCommand.SMB_COM_CLOSE_PRINT_FILE: // 0xC2,
                    smbPacket = new SmbClosePrintFileResponsePacket();
                    break;

                case SmbCommand.SMB_COM_GET_PRINT_QUEUE: // 0xC3,
                    smbPacket = new SmbGetPrintQueueResponsePacket();
                    break;

                case SmbCommand.SMB_COM_READ_BULK: // 0xD8,
                    smbPacket = new SmbReadBulkResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_BULK: // 0xD9,
                    smbPacket = new SmbWriteBulkResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_BULK_DATA: // 0xDA,
                    smbPacket = new SmbWriteBulkDataResponsePacket();
                    break;

                case SmbCommand.SMB_COM_INVALID: // 0xFE,
                    smbPacket = new SmbInvalidResponsePacket();
                    break;

                case SmbCommand.SMB_COM_NO_ANDX_COMMAND: // 0xFF,
                    smbPacket = new SmbNoAndxCommandResponsePacket();
                    break;
            }
            if (smbPacket != null)
            {
                smbPacket.SmbHeader = smbHeader;
            }
            return smbPacket;
        }