예제 #1
0
 static StringPlus()
 {
     Base64 = UnmanagedPlus.Get(64);
     var base64 = Base64.Byte;
     foreach (var code in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
         *base64++ = (byte) code;
 }
예제 #2
0
 private void _read()
 {
     _length = m_io.ReadU1();
     if (IsPointer)
     {
         _pointer = new PointerStruct(m_io, this, m_root);
     }
     if (!(IsPointer))
     {
         _name = System.Text.Encoding.GetEncoding("utf-8").GetString(m_io.ReadBytes(Length));
     }
 }
예제 #3
0
        private static void VerifyRefName(List <DnsPacket.Label> name)
        {
            Assert.AreEqual((int)1, name.Count);
            Label l = name[0];

            Assert.IsTrue(l.IsPointer);
            Assert.IsTrue(0xC0 == l.Length);
            Assert.IsTrue(0x0C == l.Pointer.Value);

            PointerStruct ps = l.Pointer;

            VerifyName(ps.Contents.Name, StrQueryDomainName);
        }
예제 #4
0
파일: DnsPacket.cs 프로젝트: lulzzz/Tarzan
 private void _parse()
 {
     f_isPointer = false;
     _length     = m_io.ReadU1();
     if (IsPointer)
     {
         _pointer = new PointerStruct(m_io, this, m_root);
     }
     if (!IsPointer)
     {
         _name = System.Text.Encoding.GetEncoding("ASCII").GetString(m_io.ReadBytes(Length));
     }
 }
예제 #5
0
        public void ParseInvalidRefNameLength()
        {
            // Modify name segment length to exceed packet data end
            // offset 36, 0xC0, -> pointer, offset 0 << 8 + data[37]
            // offset 37, 0x0C, -> begining of name in header, 'china'
            // modify offset as 24, so that offset + length >= data size, i.e. 36

            byte[] byteData = udpPackets[2].PayloadData;
            Assert.IsTrue(0xC0 == byteData[36]);
            Assert.IsTrue(0x0C == byteData[37]);

            byteData[36] = 0xC1;
            byteData[37] = (byte)byteData.Length;
            //try
            {
                DnsPacket dnsPacket = new DnsPacket(new KaitaiStream(byteData));

                DnsPacket.Query q = dnsPacket.Body.Queries[0];
                VerifyName(q.Name.Name, StrQueryDomainName);

                DnsPacket.Answer a = dnsPacket.Body.Answers[0];
                Assert.IsTrue(DnsPacket.ClassType.InClass == a.AnswerClass);
                Assert.IsTrue(600 == a.Ttl);
                Assert.IsTrue(DnsPacket.TypeType.A == a.Type);
                //VerifyRefName(a.Name.Name);
                {
                    Assert.AreEqual((int)1, a.Name.Name.Count);
                    Label l = a.Name.Name[0];
                    Assert.IsTrue(l.IsPointer);
                    Assert.IsTrue(0xC1 == l.Length);
                    Assert.IsTrue(byteData.Length == l.Pointer.Value);

                    PointerStruct ps = l.Pointer;
                    try
                    {
                        VerifyName(ps.Contents.Name, StrQueryDomainName);
                    }
                    catch (System.IO.EndOfStreamException)
                    {
                        Assert.IsTrue(true);
                    }
                }
            }
            //catch (System.IO.EndOfStreamException)
            {
                Assert.IsTrue(true);
            }

            return;
        }
예제 #6
0
        public void PointerTStructTest()
        {
            MemoryBufferAddressSpace dataSource = new MemoryBufferAddressSpace(new byte[] { 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 });
            LayoutManager            mgr        = new LayoutManager().AddPrimitives().AddSizeT(4).AddPointerTypes().AddTStructTypes();
            Reader        reader = new Reader(dataSource, mgr);
            PointerStruct s      = reader.Read <PointerStruct>(0);

            Assert.Equal((ulong)0x4, s.P.Value);
            Assert.False(s.P.IsNull);
            Assert.Equal((uint)0x1, s.P.Dereference(dataSource));
            Assert.Equal((ulong)0x1, s.P32.Value);
            Assert.Equal((byte)0x0, s.P32.Dereference(dataSource));
            Assert.Equal((byte)0x1, s.P32.Element(dataSource, 3));
            Assert.Equal((ulong)0x2, s.P64.Value);
            Assert.Equal((ulong)0x0002000000010000, s.P64.Dereference(dataSource));
        }
 /// <summary>
 ///     获取缓冲区
 /// </summary>
 /// <returns>缓冲区,失败返回null</returns>
 public override PointerStruct TryGet()
 {
     var buffer = new PointerStruct();
     InterlockedPlus.NoCheckCompareSetSleep0(ref _bufferLock);
     foreach (var data in _buffers)
     {
         buffer = data;
         break;
     }
     if (buffer.Data != null) _buffers.Remove(buffer);
     _bufferLock = 0;
     return buffer;
 }
 /// <summary>
 ///     保存缓冲区
 /// </summary>
 /// <param name="buffer">缓冲区</param>
 public override void Push(ref PointerStruct buffer)
 {
     var data = buffer.Data;
     buffer.Data = null;
     if (data != null)
     {
         bool isAdd, isMax = false;
         InterlockedPlus.NoCheckCompareSetSleep0(ref _bufferLock);
         try
         {
             if ((isAdd = _buffers.Add(new PointerStruct {Data = data})) &&
                 (isMax = _buffers.Count > _maxCount))
             {
                 _maxCount <<= 1;
             }
         }
         finally
         {
             _bufferLock = 0;
         }
         if (isAdd)
         {
             if (isMax)
             {
                 LogPlus.Default.Add("非托管内存池扩展实例数量 byte*(" + Size + ")[" + _buffers.Count + "]");
             }
         }
         else LogPlus.Error.Add("内存池释放冲突 " + Size, true);
     }
 }
 /// <summary>
 ///     保存缓冲区
 /// </summary>
 /// <param name="buffer">缓冲区</param>
 public override void Push(ref PointerStruct buffer)
 {
     var data = buffer.Data;
     buffer.Data = null;
     if (data != null) _pool.Push(new PointerStruct {Data = data});
 }
 /// <summary>
 ///     保存缓冲区
 /// </summary>
 /// <param name="buffer">缓冲区</param>
 public abstract void Push(ref PointerStruct buffer);
예제 #11
0
 /// <summary>
 ///     释放内存
 /// </summary>
 /// <param name="data">非托管内存起始指针</param>
 public static void Free(ref PointerStruct data)
 {
     if (data.Data != null)
     {
         Interlocked.Decrement(ref _usedCount);
         Marshal.FreeHGlobal((IntPtr) data.Data);
         data.Data = null;
     }
 }
예제 #12
0
 static NumberPlus()
 {
     _deBruijn32 = GetDeBruijn32();
 }
예제 #13
0
        static DatePlus()
        {
            var dataIndex = 0;
            var datas = UnmanagedPlus.Get(false, 7 * sizeof(int), 12 * sizeof(int));
            WeekData = datas[dataIndex++];
            MonthData = datas[dataIndex++];

            var write = WeekData.Int;
            *write = 'S' + ('u' << 8) + ('n' << 16) + (',' << 24);
            *++write = 'M' + ('o' << 8) + ('n' << 16) + (',' << 24);
            *++write = 'T' + ('u' << 8) + ('e' << 16) + (',' << 24);
            *++write = 'W' + ('e' << 8) + ('d' << 16) + (',' << 24);
            *++write = 'T' + ('h' << 8) + ('u' << 16) + (',' << 24);
            *++write = 'F' + ('r' << 8) + ('i' << 16) + (',' << 24);
            *++write = 'S' + ('a' << 8) + ('t' << 16) + (',' << 24);

            write = MonthData.Int;
            *write = 'J' + ('a' << 8) + ('n' << 16) + (' ' << 24);
            *++write = 'F' + ('e' << 8) + ('b' << 16) + (' ' << 24);
            *++write = 'M' + ('a' << 8) + ('r' << 16) + (' ' << 24);
            *++write = 'A' + ('p' << 8) + ('r' << 16) + (' ' << 24);
            *++write = 'M' + ('a' << 8) + ('y' << 16) + (' ' << 24);
            *++write = 'J' + ('u' << 8) + ('n' << 16) + (' ' << 24);
            *++write = 'J' + ('u' << 8) + ('l' << 16) + (' ' << 24);
            *++write = 'A' + ('u' << 8) + ('g' << 16) + (' ' << 24);
            *++write = 'S' + ('e' << 8) + ('p' << 16) + (' ' << 24);
            *++write = 'O' + ('c' << 8) + ('t' << 16) + (' ' << 24);
            *++write = 'N' + ('o' << 8) + ('v' << 16) + (' ' << 24);
            *++write = 'D' + ('e' << 8) + ('c' << 16) + (' ' << 24);
        }
예제 #14
0
        public void ParseLoopRefNameOffset()
        {
            // Modify name segment length to exceed packet data end
            // offset 36, 0xC0, -> pointer, offset 0 << 8 + data[37]
            // offset 37, 0x0C, -> begining of name in header, 'china'
            // modify offset as 24, so that offset + length >= data size, i.e. 36

            byte[] byteData = udpPackets[2].PayloadData;
            Assert.IsTrue(0xC0 == byteData[36]);
            Assert.IsTrue(0x0C == byteData[37]);

            byteData[36] = 0xC0;
            byteData[37] = 36;
            //try
            {
                DnsPacket dnsPacket = new DnsPacket(new KaitaiStream(byteData));

                DnsPacket.Query q = dnsPacket.Body.Queries[0];
                VerifyName(q.Name.Name, StrQueryDomainName);

                DnsPacket.Answer a = dnsPacket.Body.Answers[0];
                Assert.IsTrue(DnsPacket.ClassType.InClass == a.AnswerClass);
                Assert.IsTrue(600 == a.Ttl);
                Assert.IsTrue(DnsPacket.TypeType.A == a.Type);
                //VerifyRefName(a.Name.Name);
                {
                    Assert.AreEqual((int)1, a.Name.Name.Count);
                    Label l = a.Name.Name[0];
                    Assert.IsTrue(l.IsPointer);
                    Assert.IsTrue(0xC0 == l.Length);
                    Assert.IsTrue(36 == l.Pointer.Value);

                    PointerStruct ps = l.Pointer;
                    try
                    {
                        //VerifyName(ps.Contents.Name, StrQueryDomainName);
                        Assert.AreEqual(1, ps.Contents.Name.Count);
                        Label l2 = ps.Contents.Name[0];
                        Assert.AreEqual(true, l2.IsPointer);
                        Assert.AreEqual(0xC0, l2.Length);
                        Assert.AreEqual((byte)36, l2.Pointer.Value);
                    }
                    catch (Exception)
                    {
                        Assert.Fail();
                    }

                    // Try to get full name will cause exception
                    try
                    {
                        Assert.AreEqual(a.Name.GetFullName(), "");
                        Assert.Fail("Exception expected");
                    }
                    catch (ArgumentOutOfRangeException e)
                    {
                        Console.WriteLine("Exception expected in detecting ref loop: {0}", e.Message);
                    }
                }
            }
            //catch (System.IO.EndOfStreamException)
            {
                Assert.IsTrue(true);
            }

            return;
        }
예제 #15
0
 /// <summary>
 ///     指针位图
 /// </summary>
 /// <param name="map">位图指针,不能为null</param>
 public FixedMapStruct(PointerStruct map)
 {
     _map = map.Byte;
 }
예제 #16
0
 /// <summary>
 ///     批量申请非托管内存
 /// </summary>
 /// <param name="isClear">是否需要清除</param>
 /// <param name="sizes">内存字节数集合</param>
 /// <returns>非托管内存起始指针</returns>
 public static PointerStruct[] Get(bool isClear, params int[] sizes)
 {
     if (sizes.Length != 0)
     {
         var sum = 0;
         foreach (var size in sizes)
         {
             if (size < 0) LogPlus.Error.Throw(LogPlus.ExceptionTypeEnum.IndexOutOfRange);
             checked
             {
                 sum += size;
             }
         }
         var pointer = Get(sum, isClear);
         var data = pointer.Byte;
         if (data != null)
         {
             var index = 0;
             var datas = new PointerStruct[sizes.Length];
             foreach (var size in sizes)
             {
                 datas[index++] = new PointerStruct {Data = data};
                 data += size;
             }
             return datas;
         }
     }
     return null;
 }
예제 #17
0
 /// <summary>
 ///     初始化ASCII位图
 /// </summary>
 /// <param name="map">位图指针</param>
 /// <param name="value">初始值集合</param>
 /// <param name="isUnsafe">初始值是否安全</param>
 public AsciiMapStruct(PointerStruct map, string value, bool isUnsafe = true)
     : this(map.Byte, value, isUnsafe)
 {
 }