public bool Unpack(MemoryStream stream)
 {
     HostNamePosition   = LittleEndianUtilities.ReadUShort(stream);
     HostNameLength     = LittleEndianUtilities.ReadUShort(stream);
     UserNamePosition   = LittleEndianUtilities.ReadUShort(stream);
     UserNameLength     = LittleEndianUtilities.ReadUShort(stream);
     PasswordPosition   = LittleEndianUtilities.ReadUShort(stream);
     PasswordLength     = LittleEndianUtilities.ReadUShort(stream);
     AppNamePosition    = LittleEndianUtilities.ReadUShort(stream);
     AppNameLength      = LittleEndianUtilities.ReadUShort(stream);
     ServerNamePosition = LittleEndianUtilities.ReadUShort(stream);
     ServerNameLength   = LittleEndianUtilities.ReadUShort(stream);
     ExtensionPosition  = LittleEndianUtilities.ReadUShort(stream);
     ExtensionLength    = LittleEndianUtilities.ReadUShort(stream);
     CltIntNamePosition = LittleEndianUtilities.ReadUShort(stream);
     CltIntNameLength   = LittleEndianUtilities.ReadUShort(stream);
     LanguagePosition   = LittleEndianUtilities.ReadUShort(stream);
     LanguageLength     = LittleEndianUtilities.ReadUShort(stream);
     DatabasePosition   = LittleEndianUtilities.ReadUShort(stream);
     DatabaseLength     = LittleEndianUtilities.ReadUShort(stream);
     stream.Read(ClientID, 0, 6);
     SSPIPosition           = LittleEndianUtilities.ReadUShort(stream);
     SSPILength             = LittleEndianUtilities.ReadUShort(stream);
     AtchDBFilePosition     = LittleEndianUtilities.ReadUShort(stream);
     AtchDBFileLength       = LittleEndianUtilities.ReadUShort(stream);
     ChangePasswordPosition = LittleEndianUtilities.ReadUShort(stream);
     ChangePasswordLength   = LittleEndianUtilities.ReadUShort(stream);
     SSPILengthLong         = LittleEndianUtilities.ReadUInt(stream);
     return(true);
 }
예제 #2
0
        /// <summary>
        /// Used to unpack IPackageable from a stream.
        /// </summary>
        /// <param name="stream">MemoryStream from which to unpack IPackageable.</param>
        /// <returns>Returns true if successful.</returns>
        public override bool Unpack(MemoryStream stream)
        {
            LittleEndianUtilities.ReadUShort(stream);
            this.Number = (int)LittleEndianUtilities.ReadUInt(stream);
            this.State  = Convert.ToByte(stream.ReadByte());
            this.Class  = Convert.ToByte(stream.ReadByte());

            int length = LittleEndianUtilities.ReadUShort(stream) * 2;
            var buffer = new byte[length];

            stream.Read(buffer, 0, length);
            this.MsgText = Encoding.Unicode.GetString(buffer);

            length = stream.ReadByte() * 2;
            buffer = new byte[length];
            stream.Read(buffer, 0, length);
            this.ServerName = Encoding.Unicode.GetString(buffer);

            length = stream.ReadByte() * 2;
            buffer = new byte[length];
            stream.Read(buffer, 0, length);
            this.ProcName = Encoding.Unicode.GetString(buffer);

            this.LineNumber = LittleEndianUtilities.ReadUInt(stream);

            return(true);
        }
 public void Pack(MemoryStream stream)
 {
     LittleEndianUtilities.WriteUShort(stream, HostNamePosition);
     LittleEndianUtilities.WriteUShort(stream, HostNameLength);
     LittleEndianUtilities.WriteUShort(stream, UserNamePosition);
     LittleEndianUtilities.WriteUShort(stream, UserNameLength);
     LittleEndianUtilities.WriteUShort(stream, PasswordPosition);
     LittleEndianUtilities.WriteUShort(stream, PasswordLength);
     LittleEndianUtilities.WriteUShort(stream, AppNamePosition);
     LittleEndianUtilities.WriteUShort(stream, AppNameLength);
     LittleEndianUtilities.WriteUShort(stream, ServerNamePosition);
     LittleEndianUtilities.WriteUShort(stream, ServerNameLength);
     LittleEndianUtilities.WriteUShort(stream, 0); // Extension unsupported
     LittleEndianUtilities.WriteUShort(stream, 0); // Extension unsupported
     LittleEndianUtilities.WriteUShort(stream, CltIntNamePosition);
     LittleEndianUtilities.WriteUShort(stream, CltIntNameLength);
     LittleEndianUtilities.WriteUShort(stream, LanguagePosition);
     LittleEndianUtilities.WriteUShort(stream, LanguageLength);
     LittleEndianUtilities.WriteUShort(stream, DatabasePosition);
     LittleEndianUtilities.WriteUShort(stream, DatabaseLength);
     stream.Write(ClientID, 0, 6);
     LittleEndianUtilities.WriteUShort(stream, SSPIPosition);
     LittleEndianUtilities.WriteUShort(stream, SSPILength);
     LittleEndianUtilities.WriteUShort(stream, AtchDBFilePosition);
     LittleEndianUtilities.WriteUShort(stream, AtchDBFileLength);
     LittleEndianUtilities.WriteUShort(stream, ChangePasswordPosition);
     LittleEndianUtilities.WriteUShort(stream, ChangePasswordLength);
     LittleEndianUtilities.WriteUInt(stream, 0); // Long SSPI not supported
 }
        public void WriteUIntToMemoryStream()
        {
            var stream = new MemoryStream();

            LittleEndianUtilities.WriteUInt(stream, 0x01234567);

            CollectionAssert.AreEqual(new byte[] { 0x67, 0x45, 0x23, 0x01 }, stream.ToArray());
        }
        /// <summary>
        /// Used to unpack IPackageable from a stream.
        /// </summary>
        /// <param name="stream">MemoryStream from which to unpack IPackageable.</param>
        /// <returns>Returns true if successful.</returns>
        public bool Unpack(MemoryStream stream)
        {
            stream.Read(this.TraceID, 0, 16);
            stream.Read(this.ActivityID, 0, 16);
            this.ActivitySequence = LittleEndianUtilities.ReadUInt(stream);

            return(true);
        }
예제 #6
0
        /// <summary>
        /// Skips a token within a stream based on token type
        /// </summary>
        /// <param name="tokenType">Type of the token to ignore</param>
        /// <param name="stream">Stream that contains the token</param>
        private static void IgnoreToken(TDSTokenType tokenType, MemoryStream stream)
        {
            switch (((byte)tokenType >> 4) & 0x3)
            {
            // Variable count token
            case 0:
            {
                throw new NotSupportedException();
            }

            // Zero length token
            case 1:
            {
                return;
            }

            // Variable length token
            case 2:
            {
                if (tokenType == TDSTokenType.DataClassification)
                {
                    throw new NotSupportedException();
                }

                ushort length = LittleEndianUtilities.ReadUShort(stream);
                for (int i = 0; i < length; i++)
                {
                    stream.ReadByte();
                }

                return;
            }

            // Fixed length token
            case 3:
            {
                var bytesToRead = Math.Pow(2, ((byte)tokenType >> 2) & 0x3);

                if (tokenType == TDSTokenType.Done || tokenType == TDSTokenType.DoneInProc || tokenType == TDSTokenType.DoneProc)
                {
                    bytesToRead = 12;         // Untill support is added
                }

                for (int i = 0; i < bytesToRead; i++)
                {
                    stream.ReadByte();
                }

                return;
            }

            default:
            {
                throw new InvalidOperationException();
            }
            }
        }
        public void ReadUIntFromMemoryStream()
        {
            var stream = new MemoryStream();

            stream.Write(new byte[] { 0x01, 0x23, 0x45, 0x67 });
            stream.Seek(0, SeekOrigin.Begin);

            var res = LittleEndianUtilities.ReadUInt(stream);

            Assert.AreEqual((uint)0x67452301, res);
        }
        public void ReadUShortFromMemoryStream()
        {
            var stream = new MemoryStream();

            stream.Write(new byte[] { 0x01, 0x23 });
            stream.Seek(0, SeekOrigin.Begin);

            var res = LittleEndianUtilities.ReadUShort(stream);

            Assert.AreEqual(0x2301, res);
        }
예제 #9
0
        /// <summary>
        /// Used to unpack IPackageable from a stream.
        /// </summary>
        /// <param name="stream">MemoryStream containing the object that needs to be unpacked.</param>
        /// <returns>Returns true if successful.</returns>
        public override bool Unpack(MemoryStream stream)
        {
            var length = LittleEndianUtilities.ReadUShort(stream);

            this.Type = (TDSEnvChangeType)stream.ReadByte();
            switch (this.Type)
            {
            case TDSEnvChangeType.Routing:
                var routingDataValueLength = LittleEndianUtilities.ReadUShort(stream);
                if (routingDataValueLength == 0 || stream.ReadByte() != 0)
                {
                    throw new InvalidOperationException();
                }

                var protocolProperty = LittleEndianUtilities.ReadUShort(stream);
                if (protocolProperty == 0)
                {
                    throw new InvalidOperationException();
                }

                int strLength = LittleEndianUtilities.ReadUShort(stream) * 2;

                var temp = new byte[strLength];
                stream.Read(temp, 0, strLength);

                this.Values["ProtocolProperty"] = string.Format("{0}", protocolProperty);
                this.Values["AlternateServer"]  = Encoding.Unicode.GetString(temp);

                for (int i = 0; i < length - routingDataValueLength - sizeof(byte) - sizeof(ushort); i++)
                {
                    // Ignore oldValue
                    stream.ReadByte();
                }

                break;

            default:
            {
                for (int i = 0; i < length - sizeof(byte); i++)
                {
                    // Ignore unsupported types
                    stream.ReadByte();
                }

                return(false);
            }
            }

            return(true);
        }
예제 #10
0
 /// <summary>
 /// Used to pack IPackageable to a stream.
 /// </summary>
 /// <param name="stream">MemoryStream in which IPackageable is packet into.</param>
 public void Pack(MemoryStream stream)
 {
     LittleEndianUtilities.WriteUInt(stream, this.Length);
     LittleEndianUtilities.WriteUInt(stream, this.TDSVersion);
     LittleEndianUtilities.WriteUInt(stream, this.PacketSize);
     LittleEndianUtilities.WriteUInt(stream, this.ClientProgVer);
     LittleEndianUtilities.WriteUInt(stream, this.ClientPID);
     LittleEndianUtilities.WriteUInt(stream, this.ConnectionID);
     this.OptionFlags1.Pack(stream);
     this.OptionFlags2.Pack(stream);
     this.TypeFlags.Pack(stream);
     this.OptionFlags3.Pack(stream);
     LittleEndianUtilities.WriteUInt(stream, this.ClientTimeZone);
     LittleEndianUtilities.WriteUInt(stream, this.ClientLCID);
     TDSLogin7OptionFactory.WriteOptionsToStream(stream, this.Options, this.ClientID);
 }
 public void Pack(MemoryStream stream)
 {
     LittleEndianUtilities.WriteUInt(stream, Length);
     LittleEndianUtilities.WriteUInt(stream, 1946157060);                           // 7.4 TDS Version
     LittleEndianUtilities.WriteUInt(stream, 4096);                                 // PacketSize
     LittleEndianUtilities.WriteUInt(stream, 117440512);                            // ClientProgramVersion
     LittleEndianUtilities.WriteUInt(stream, (uint)Process.GetCurrentProcess().Id); // Client Process ID
     LittleEndianUtilities.WriteUInt(stream, 0);                                    // Connection ID
     OptionFlags1.Pack(stream);
     OptionFlags2.Pack(stream);
     TypeFlags.Pack(stream);
     OptionFlags3.Pack(stream);
     LittleEndianUtilities.WriteUInt(stream, 480);  // Client time zone
     LittleEndianUtilities.WriteUInt(stream, 1033); // Client LCID
     OffsetLength.Pack(stream);
     stream.Write(Data, 0, Data.Length);
     // Extensions extensions not supported
 }
 public bool Unpack(MemoryStream stream)
 {
     LittleEndianUtilities.ReadUInt(stream);
     TDSVersion    = LittleEndianUtilities.ReadUInt(stream);
     PacketSize    = LittleEndianUtilities.ReadUInt(stream);
     ClientProgVer = LittleEndianUtilities.ReadUInt(stream);
     ClientPID     = LittleEndianUtilities.ReadUInt(stream);
     ConnectionID  = LittleEndianUtilities.ReadUInt(stream);
     OptionFlags1.Unpack(stream);
     OptionFlags2.Unpack(stream);
     TypeFlags.Unpack(stream);
     OptionFlags3.Unpack(stream);
     ClientTimeZone = Convert.ToInt32(LittleEndianUtilities.ReadUInt(stream));
     ClientLCID     = LittleEndianUtilities.ReadUInt(stream);
     OffsetLength.Unpack(stream);
     stream.Read(Data, 0, (int)OffsetLength.TotalLength());
     // Extensions not supported
     return(true);
 }
        /// <summary>
        /// Writes TDS Login7 options to a stream
        /// </summary>
        /// <param name="stream">MemoryStream to write to</param>
        /// <param name="options">Options to write to the stream</param>
        /// <param name="clientID">ClientID to write to the stream</param>
        public static void WriteOptionsToStream(MemoryStream stream, List <TDSLogin7Option> options, byte[] clientID)
        {
            ushort currentPos = 94;

            foreach (var option in OptionOrder)
            {
                if (option != "ClientID")
                {
                    LittleEndianUtilities.WriteUShort(stream, currentPos);

                    var tmp = options.Where(o => o.Name == option);
                    if (tmp.Any())
                    {
                        var opt = tmp.First();

                        LittleEndianUtilities.WriteUShort(stream, opt.Length);
                        opt.Position = currentPos;
                        currentPos  += opt.TrueLength;
                    }
                    else
                    {
                        LittleEndianUtilities.WriteUShort(stream, 0);
                    }
                }
                else
                {
                    stream.Write(clientID, 0, 6);
                }
            }

            // Ignore LongSSPI, not supported
            LittleEndianUtilities.WriteUInt(stream, 0);

            options = options.OrderBy(opt => opt.Position).ToList();

            foreach (var option in options)
            {
                option.Pack(stream);
            }
        }
예제 #14
0
        /// <summary>
        /// Used to unpack IPackageable from a stream.
        /// </summary>
        /// <param name="stream">MemoryStream from which to unpack IPackageable.</param>
        /// <returns>Returns true if successful.</returns>
        public bool Unpack(MemoryStream stream)
        {
            LittleEndianUtilities.ReadUInt(stream);
            this.TDSVersion    = LittleEndianUtilities.ReadUInt(stream);
            this.PacketSize    = LittleEndianUtilities.ReadUInt(stream);
            this.ClientProgVer = LittleEndianUtilities.ReadUInt(stream);
            this.ClientPID     = LittleEndianUtilities.ReadUInt(stream);
            this.ConnectionID  = LittleEndianUtilities.ReadUInt(stream);
            this.OptionFlags1.Unpack(stream);
            this.OptionFlags2.Unpack(stream);
            this.TypeFlags.Unpack(stream);
            this.OptionFlags3.Unpack(stream);
            this.ClientTimeZone = Convert.ToUInt32(LittleEndianUtilities.ReadUInt(stream));
            this.ClientLCID     = LittleEndianUtilities.ReadUInt(stream);

            var result = TDSLogin7OptionFactory.ReadOptionsFromStream(stream);

            this.ClientID = result.Item2;
            this.Options  = result.Item1;

            return(true);
        }
 /// <summary>
 /// Used to pack IPackageable to a stream.
 /// </summary>
 /// <param name="stream">MemoryStream in which IPackageable is packet into.</param>
 public void Pack(MemoryStream stream)
 {
     stream.Write(this.TraceID, 0, this.TraceID.Length);
     stream.Write(this.ActivityID, 0, this.ActivityID.Length);
     LittleEndianUtilities.WriteUInt(stream, this.ActivitySequence);
 }
        /// <summary>
        /// Reads TDS Login7 options from a stream
        /// </summary>
        /// <param name="stream">Stream containing the Login7 packet</param>
        /// <returns>ClientID, TDS Login7 options pair</returns>
        public static Tuple <List <TDSLogin7Option>, byte[]> ReadOptionsFromStream(MemoryStream stream)
        {
            var options  = new List <TDSLogin7Option>();
            var clientID = new byte[6];

            foreach (var option in OptionOrder)
            {
                ushort position = 0;
                ushort length   = 0;

                switch (option)
                {
                case "HostName":
                case "UserName":
                case "AppName":
                case "ServerName":
                case "CltIntName":
                case "Language":
                case "Database":
                {
                    position = LittleEndianUtilities.ReadUShort(stream);
                    length   = LittleEndianUtilities.ReadUShort(stream);

                    if (length != 0)
                    {
                        options.Add(new TDSLogin7TextOption(option, position, length));
                    }

                    break;
                }

                case "ClientID":
                {
                    stream.Read(clientID, 0, 6);
                    break;
                }

                case "Password":
                case "ChangePassword":
                {
                    position = LittleEndianUtilities.ReadUShort(stream);
                    length   = LittleEndianUtilities.ReadUShort(stream);

                    if (length != 0)
                    {
                        options.Add(new TDSLogin7PasswordOption(option, position, length));
                    }

                    break;
                }

                default:
                {
                    position = LittleEndianUtilities.ReadUShort(stream);
                    length   = LittleEndianUtilities.ReadUShort(stream);

                    if (length != 0)
                    {
                        throw new NotSupportedException();
                    }

                    break;
                }
                }
            }

            // Ignore LongSSPI, not supported
            LittleEndianUtilities.ReadUInt(stream);

            options = options.OrderBy(opt => opt.Position).ToList();

            foreach (var option in options)
            {
                option.Unpack(stream);
            }

            return(new Tuple <List <TDSLogin7Option>, byte[]>(options, clientID));
        }