/// <summary> /// convert the payload of transaction packet from base class format to sub class format, that is /// Cifs to Smb format. /// </summary> /// <param name = "baseClassFormatPayload">the base class format, Cifs format </param> /// <returns>the sub class format, Smb format </returns> internal static SMB_COM_TRANSACTION_Request_SMB_Parameters_Mailslot ConvertTransactionMailslotPacketPayload( SMB_COM_TRANSACTION_Request_SMB_Parameters baseClassFormatPayload) { Smb.SMB_COM_TRANSACTION_Request_SMB_Parameters_Mailslot subClassFormatPayload = new Smb.SMB_COM_TRANSACTION_Request_SMB_Parameters_Mailslot(); subClassFormatPayload.WordCount = baseClassFormatPayload.WordCount; subClassFormatPayload.TotalParameterCount = baseClassFormatPayload.TotalParameterCount; subClassFormatPayload.TotalDataCount = baseClassFormatPayload.TotalDataCount; subClassFormatPayload.MaxParameterCount = baseClassFormatPayload.MaxParameterCount; subClassFormatPayload.MaxDataCount = baseClassFormatPayload.MaxDataCount; subClassFormatPayload.MaxSetupCount = baseClassFormatPayload.MaxSetupCount; subClassFormatPayload.Reserved1 = baseClassFormatPayload.Reserved1; subClassFormatPayload.Flags = baseClassFormatPayload.Flags; subClassFormatPayload.Timeout = baseClassFormatPayload.Timeout; subClassFormatPayload.Reserved2 = baseClassFormatPayload.Reserved2; subClassFormatPayload.ParameterCount = baseClassFormatPayload.ParameterCount; subClassFormatPayload.ParameterOffset = baseClassFormatPayload.ParameterOffset; subClassFormatPayload.DataCount = baseClassFormatPayload.DataCount; subClassFormatPayload.DataOffset = baseClassFormatPayload.DataOffset; subClassFormatPayload.SetupCount = baseClassFormatPayload.SetupCount; subClassFormatPayload.Reserved3 = baseClassFormatPayload.Reserved3; subClassFormatPayload.Subcommand = baseClassFormatPayload.Setup[0]; subClassFormatPayload.Priority = baseClassFormatPayload.Setup[1]; subClassFormatPayload.Class = (SmbTransMailslotClass)baseClassFormatPayload.Setup[2]; return(subClassFormatPayload); }
/// <summary> /// to decode the smb parameters: from the general SmbParameters to the concrete Smb Parameters. /// </summary> protected override void DecodeParameters() { this.smbParameters = TypeMarshal.ToStruct <SMB_COM_TRANSACTION_Request_SMB_Parameters>( TypeMarshal.ToBytes(this.smbParametersBlock)); }
/// <summary> /// find the target packet. /// </summary> /// <param name="smbHeader">the header of smb packet</param> /// <param name="channel">the channel to access bytes</param> /// <returns>the target packet</returns> private static SmbPacket FindTheTargetPacket(SmbHeader smbHeader, Channel channel) { SmbPacket smbPacket = null; switch (smbHeader.Command) { case SmbCommand.SMB_COM_NEGOTIATE: smbPacket = new SmbNegotiateRequestPacket(); break; case SmbCommand.SMB_COM_SESSION_SETUP_ANDX: SmbHeader_Flags2_Values flags2 = (SmbHeader_Flags2_Values)smbHeader.Flags2; if ((flags2 & SmbHeader_Flags2_Values.SMB_FLAGS2_EXTENDED_SECURITY) == SmbHeader_Flags2_Values.SMB_FLAGS2_EXTENDED_SECURITY) { smbPacket = new Smb.SmbSessionSetupAndxRequestPacket(); } else { smbPacket = new Cifs.SmbSessionSetupAndxRequestPacket(); } break; case SmbCommand.SMB_COM_TREE_CONNECT_ANDX: smbPacket = new SmbTreeConnectAndxRequestPacket(); break; case SmbCommand.SMB_COM_NT_CREATE_ANDX: smbPacket = new SmbNtCreateAndxRequestPacket(); break; case SmbCommand.SMB_COM_OPEN_ANDX: smbPacket = new SmbOpenAndxRequestPacket(); break; case SmbCommand.SMB_COM_WRITE_ANDX: smbPacket = new SmbWriteAndxRequestPacket(); break; case SmbCommand.SMB_COM_READ_ANDX: smbPacket = new SmbReadAndxRequestPacket(); break; case SmbCommand.SMB_COM_CLOSE: smbPacket = new SmbCloseRequestPacket(); break; case SmbCommand.SMB_COM_TREE_DISCONNECT: smbPacket = new SmbTreeDisconnectRequestPacket(); break; case SmbCommand.SMB_COM_LOGOFF_ANDX: smbPacket = new SmbLogoffAndxRequestPacket(); break; case SmbCommand.SMB_COM_TRANSACTION: SMB_COM_TRANSACTION_Request_SMB_Parameters transaction = channel.Read <SMB_COM_TRANSACTION_Request_SMB_Parameters>(); if (transaction.SetupCount == 0) { smbPacket = new SmbTransRapRequestPacket(); } else { smbPacket = FindTheTransactionPacket( transaction.SetupCount, (TransSubCommand)transaction.Setup[0]); } break; case SmbCommand.SMB_COM_TRANSACTION2: SMB_COM_TRANSACTION2_Request_SMB_Parameters transaction2 = channel.Read <SMB_COM_TRANSACTION2_Request_SMB_Parameters>(); smbPacket = FindTheTrans2Packet((Trans2SubCommand)transaction2.Subcommand); break; case SmbCommand.SMB_COM_NT_TRANSACT: SMB_COM_NT_TRANSACT_Request_SMB_Parameters ntTransactoin = channel.Read <SMB_COM_NT_TRANSACT_Request_SMB_Parameters>(); smbPacket = FindTheNtTransPacket(ntTransactoin.Function, CifsMessageUtils.ToBytesArray <ushort>(ntTransactoin.Setup)); break; default: break; } return(smbPacket); }