Пример #1
0
        /// <exception cref="WinrtCifs.Dcerpc.Ndr.NdrException"></exception>
        public virtual string Dec_ndr_string()
        {
            Align(4);
            int    i   = Index;
            string val = null;
            int    len = Encdec.Dec_uint32le(Buf, i);

            i += 12;
            if (len != 0)
            {
                len--;
                int size = len * 2;
                try
                {
                    if (size < 0 || size > unchecked (0xFFFF))
                    {
                        throw new NdrException(NdrException.InvalidConformance);
                    }
                    val = Runtime.GetStringForBytes(Buf, i, size, "UTF-16LE");
                    i  += size + 2;
                }
                catch (UnsupportedEncodingException)
                {
                }
            }
            Advance(i - Index);
            return(val);
        }
Пример #2
0
        public virtual int Dec_ndr_long()
        {
            Align(4);
            int val = Encdec.Dec_uint32le(Buf, Index);

            Advance(4);
            return(val);
        }
Пример #3
0
        /// <exception cref="System.IO.IOException"></exception>
        protected internal override void DoRecv(Response response)
        {
            ServerMessageBlock resp = (ServerMessageBlock)response;

            resp.UseUnicode       = UseUnicode;
            resp.ExtendedSecurity = (Capabilities & SmbConstants.CapExtendedSecurity) == SmbConstants.CapExtendedSecurity;
            lock (Buf)
            {
                Array.Copy(Sbuf, 0, Buf, 0, 4 + SmbConstants.HeaderLength);
                int size = Encdec.Dec_uint16be(Buf, 2) & 0xFFFF;
                if (size < (SmbConstants.HeaderLength + 1) || (4 + size) > RcvBufSize)
                {
                    throw new IOException("Invalid payload size: " + size);
                }
                int errorCode = Encdec.Dec_uint32le(Buf, 9) & unchecked ((int)(0xFFFFFFFF));
                if (resp.Command == ServerMessageBlock.SmbComReadAndx && (errorCode == 0 || errorCode
                                                                          == unchecked ((int)(0x80000005))))
                {
                    // overflow indicator normal for pipe
                    SmbComReadAndXResponse r = (SmbComReadAndXResponse)resp;
                    int off = SmbConstants.HeaderLength;
                    Readn(In, Buf, 4 + off, 27);
                    off += 27;
                    resp.Decode(Buf, 4);
                    int pad = r.DataOffset - off;
                    if (r.ByteCount > 0 && pad > 0 && pad < 4)
                    {
                        Readn(In, Buf, 4 + off, pad);
                    }
                    if (r.DataLength > 0)
                    {
                        Readn(In, r.B, r.Off, r.DataLength);
                    }
                }
                else
                {
                    Readn(In, Buf, 4 + 32, size - 32);
                    resp.Decode(Buf, 4);
                    if (resp is SmbComTransactionResponse)
                    {
                        ((SmbComTransactionResponse)resp).Current();
                    }
                }
                if (Digest != null && resp.ErrorCode == 0)
                {
                    Digest.Verify(Buf, 4, resp);
                }
                if (Log.Level >= 4)
                {
                    Log.WriteLine(response);
                    if (Log.Level >= 6)
                    {
                        Hexdump.ToHexdump(Log, Buf, 4, size);
                    }
                }
            }
        }