public void WriteString3()
        {
            WireEncoder e = new WireEncoder(0x0300);

            e.WriteString(s_normal);
            Assert.That(e.Error, Is.Null);
            Assert.That(e.Buffer.Length, Is.EqualTo(6));
            Assert.That(e.Buffer, Is.EquivalentTo(new byte[] { 0x05, (byte)'h', (byte)'e', (byte)'l', (byte)'l', (byte)'o' }));

            e.Reset();
            e.WriteString(s_long);
            Assert.That(e.Error, Is.Null);
            Assert.That(e.Buffer.Length, Is.EqualTo(130));
            byte[] arr = new[] { e.Buffer[0], e.Buffer[1], e.Buffer[2], e.Buffer[3] };
            Assert.That(arr, Is.EquivalentTo(new byte[] { 0x80, 0x01, (byte)'*', (byte)'*' }));
            Assert.That(e.Buffer[128], Is.EqualTo((byte)'*'));
            Assert.That(e.Buffer[129], Is.EqualTo((byte)'x'));

            e.Reset();
            e.WriteString(s_big);
            Assert.That(e.Error, Is.Null);
            Assert.That(e.Buffer.Length, Is.EqualTo(65540));
            arr = new[] { e.Buffer[0], e.Buffer[1], e.Buffer[2], e.Buffer[3] };
            Assert.That(arr, Is.EquivalentTo(new byte[] { 0x81, 0x80, 0x04, (byte)'*' }));
            Assert.That(e.Buffer[65536], Is.EqualTo((byte)'*'));
            Assert.That(e.Buffer[65537], Is.EqualTo((byte)'x'));
            Assert.That(e.Buffer[65538], Is.EqualTo((byte)'x'));
            Assert.That(e.Buffer[65539], Is.EqualTo((byte)'x'));
        }
Exemple #2
0
        /// <summary>
        /// Pack an Rpc defintion in to a byte array
        /// </summary>
        /// <param name="def">The definition to pack</param>
        /// <returns>The packed data</returns>
        public static byte[] PackRpcDefinition(RpcDefinition def)
        {
            WireEncoder enc = new WireEncoder(0x0300);

            enc.Write8((byte)def.Version);
            enc.WriteString(def.Name);

            int paramsSize = def.Params.Count;

            if (paramsSize > 0xff)
            {
                paramsSize = 0xff;
            }
            enc.Write8((byte)paramsSize);
            for (int i = 0; i < paramsSize; i++)
            {
                enc.WriteType(def.Params[i].DefValue.Type);
                enc.WriteString(def.Params[i].Name);
                enc.WriteValue(def.Params[i].DefValue);
            }

            int resultsSize = def.Results.Count;

            if (resultsSize > 0xff)
            {
                resultsSize = 0xff;
            }
            enc.Write8((byte)resultsSize);
            for (int i = 0; i < resultsSize; i++)
            {
                enc.WriteType(def.Results[i].Type);
                enc.WriteString(def.Results[i].Name);
            }
            return(enc.Buffer);
        }
        public static byte[] PackRpcDefinition(NtRpcDefinition def, out UIntPtr packedLen)
        {
            WireEncoder enc = new WireEncoder();

            enc.Write8((byte)def.Version);
            enc.WriteString(def.Name);

            int paramsSize = def.ParamsArray.Length;

            if (paramsSize > 0xff)
            {
                paramsSize = 0xff;
            }
            enc.Write8((byte)paramsSize);
            for (int i = 0; i < paramsSize; ++i)
            {
                enc.WriteType(def.ParamsArray[i].Value.Type);
                enc.WriteString(def.ParamsArray[i].Name);
                enc.WriteValue(def.ParamsArray[i].Value);
            }

            int resultsSize = def.ResultsArray.Length;

            if (resultsSize > 0xff)
            {
                resultsSize = 0xff;
            }
            enc.Write8((byte)resultsSize);
            for (int i = 0; i < resultsSize; ++i)
            {
                enc.WriteType(def.ResultsArray[i].Type);
                enc.WriteString(def.ResultsArray[i].Name);
            }
            packedLen = (UIntPtr)enc.Buffer.Length;
            return(enc.Buffer);
        }
Exemple #4
0
        public void Write(WireEncoder encoder)
        {
            switch (Type)
            {
            case MsgType.KeepAlive:
                encoder.Write8((byte)MsgType.KeepAlive);
                break;

            case MsgType.ClientHello:
                encoder.Write8((byte)MsgType.ClientHello);
                encoder.Write16((ushort)encoder.ProtoRev);
                if (encoder.ProtoRev < 0x0300u)
                {
                    return;
                }
                encoder.WriteString(m_str);
                break;

            case MsgType.ProtoUnsup:
                encoder.Write8((byte)MsgType.ProtoUnsup);
                encoder.Write16((ushort)encoder.ProtoRev);
                break;

            case MsgType.ServerHelloDone:
                encoder.Write8((byte)MsgType.ServerHelloDone);
                break;

            case MsgType.ServerHello:
                if (encoder.ProtoRev < 0x0300u)
                {
                    return;                                  // new message in version 3.0
                }
                encoder.Write8((byte)MsgType.ServerHello);
                encoder.Write8((byte)Flags);
                encoder.WriteString(m_str);
                break;

            case MsgType.ClientHelloDone:
                if (encoder.ProtoRev < 0x0300u)
                {
                    return;                                  // new message in version 3.0
                }
                encoder.Write8((byte)MsgType.ClientHelloDone);
                break;

            case MsgType.EntryAssign:
                encoder.Write8((byte)MsgType.EntryAssign);
                encoder.WriteString(m_str);
                encoder.WriteType(Val.Type);
                encoder.Write16((ushort)Id);
                encoder.Write16((ushort)SeqNumUid);
                if (encoder.ProtoRev >= 0x0300u)
                {
                    encoder.Write8((byte)Flags);
                }
                encoder.WriteValue(Val);
                break;

            case MsgType.EntryUpdate:
                encoder.Write8((byte)MsgType.EntryUpdate);
                encoder.Write16((ushort)Id);
                encoder.Write16((ushort)SeqNumUid);
                if (encoder.ProtoRev >= 0x0300u)
                {
                    encoder.WriteType(Val.Type);
                }
                encoder.WriteValue(Val);
                break;

            case MsgType.FlagsUpdate:
                if (encoder.ProtoRev < 0x0300u)
                {
                    return;                                  // new message in version 3.0
                }
                encoder.Write8((byte)MsgType.FlagsUpdate);
                encoder.Write16((ushort)Id);
                encoder.Write8((byte)Flags);
                break;

            case MsgType.EntryDelete:
                if (encoder.ProtoRev < 0x0300u)
                {
                    return;                                  // new message in version 3.0
                }
                encoder.Write8((byte)MsgType.EntryDelete);
                encoder.Write16((ushort)Id);
                break;

            case MsgType.ClearEntries:
                if (encoder.ProtoRev < 0x0300u)
                {
                    return;                                  // new message in version 3.0
                }
                encoder.Write8((byte)MsgType.ClearEntries);
                encoder.Write32(ClearAllMagic);
                break;

            case MsgType.ExecuteRpc:
                if (encoder.ProtoRev < 0x0300u)
                {
                    return;                                  // new message in version 3.0
                }
                encoder.Write8((byte)MsgType.ExecuteRpc);
                encoder.Write16((ushort)Id);
                encoder.Write16((ushort)SeqNumUid);
                encoder.WriteValue(Val);
                break;

            case MsgType.RpcResponse:
                if (encoder.ProtoRev < 0x0300u)
                {
                    return;                                  // new message in version 3.0
                }
                encoder.Write8((byte)MsgType.RpcResponse);
                encoder.Write16((ushort)Id);
                encoder.Write16((ushort)SeqNumUid);
                encoder.WriteValue(Val);
                break;
            }
        }