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