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')); }
/// <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); }
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; } }