/// <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 void WireEncoderWriteDouble() { int off = BUFSIZE - 8; WireEncoder e = new WireEncoder(0x0300); for (int i = 0; i < off; i++) { e.Write8(0); } e.WriteDouble(0.0); e.WriteDouble(2.3e5); e.WriteDouble(double.PositiveInfinity); e.WriteDouble(2.2250738585072014e-308);//Minimum double size e.WriteDouble(double.MaxValue); Assert.That(e.Buffer.Length - off, Is.EqualTo(40)); byte[] checkArray = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x0c, 0x13, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; byte[] bufferArray = new byte[checkArray.Length]; Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length); Assert.That(bufferArray, Is.EquivalentTo(checkArray)); }
public void WireEncoderWrite8() { int off = BUFSIZE - 1; WireEncoder e = new WireEncoder(0x0300); for (int i = 0; i < off; i++) { e.Write8(0); } e.Write8(5); unchecked { e.Write8((byte)0x101u); } e.Write8(0); Assert.That(e.Buffer.Length - off, Is.EqualTo(3)); byte[] checkArray = { 0x05, 0x01, 0x00 }; byte[] bufferArray = new byte[checkArray.Length]; Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length); Assert.That(bufferArray, Is.EquivalentTo(checkArray)); }
public void Reset() { WireEncoder e = new WireEncoder(0x0300); e.WriteType(NtType.Unassigned); Assert.That(e.Error, Is.Not.Null); e.Reset(); Assert.That(e.Error, Is.Null); e.Write8(0); Assert.That(e.Buffer.Length, Is.EqualTo(1)); e.Reset(); Assert.That(e.Buffer, Is.Empty); }
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 WireEncoderWriteLeb128() { int off = BUFSIZE - 2; WireEncoder e = new WireEncoder(0x0300); for (int i = 0; i < off; i++) { e.Write8(0); } e.WriteUleb128(0ul); e.WriteUleb128(0x7ful); e.WriteUleb128(0x80ul); Assert.That(e.Buffer.Length - off, Is.EqualTo(4)); byte[] checkArray = { 0x00, 0x7f, 0x80, 0x01 }; byte[] bufferArray = new byte[checkArray.Length]; Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length); Assert.That(bufferArray, Is.EquivalentTo(checkArray)); }
public void WireEncoderWrite32() { int off = BUFSIZE - 4; WireEncoder e = new WireEncoder(0x0300); for (int i = 0; i < off; i++) { e.Write8(0); } e.Write32(5); e.Write32(1); e.Write32(0xabcd); e.Write32(0x12345678); e.Write32(0); Assert.That(e.Buffer.Length - off, Is.EqualTo(20)); byte[] checkArray = { 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xab, 0xcd, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x00, 0x00 }; byte[] bufferArray = new byte[checkArray.Length]; Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length); Assert.That(bufferArray, Is.EquivalentTo(checkArray)); }
public void TestWireEncoderWrite16() { int off = BUFSIZE - 2; WireEncoder e = new WireEncoder(); for (int i = 0; i < off; i++) { e.Write8(0); } e.Write16(5); unchecked { e.Write16((short)0x10001u); } e.Write16(0x4567); e.Write16(0); Assert.That(e.Buffer.Length - off, Is.EqualTo(8)); byte[] checkArray = { 0x00, 0x05, 0x00, 0x01, 0x45, 0x67, 0x00, 0x00 }; byte[] bufferArray = new byte[checkArray.Length]; Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length); Assert.That(bufferArray, Is.EquivalentTo(checkArray)); }
public void WireEncoderWriteType() { int off = BUFSIZE - 1; WireEncoder e = new WireEncoder(0x0300); for (int i = 0; i < off; i++) { e.Write8(0); } e.WriteType(NtType.Boolean); e.WriteType(NtType.Double); e.WriteType(NtType.String); e.WriteType(NtType.Raw); e.WriteType(NtType.BooleanArray); e.WriteType(NtType.DoubleArray); e.WriteType(NtType.StringArray); e.WriteType(NtType.Rpc); Assert.That(e.Buffer.Length - off, Is.EqualTo(8)); byte[] checkArray = { 0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x20 }; byte[] bufferArray = new byte[checkArray.Length]; Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length); Assert.That(bufferArray, Is.EquivalentTo(checkArray)); }
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; } }