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;
}