/// <exception cref="SharpCifs.Smb.SmbException"></exception>
internal virtual void Send(ServerMessageBlock request, ServerMessageBlock response
)
{
lock (Session.Transport())
{
if (response != null)
{
response.Received = false;
}
TreeConnect(request, response);
if (request == null || (response != null && response.Received))
{
return;
}
if (Service.Equals("A:") == false)
{
switch (request.Command)
{
case ServerMessageBlock.SmbComOpenAndx:
case ServerMessageBlock.SmbComNtCreateAndx:
case ServerMessageBlock.SmbComReadAndx:
case ServerMessageBlock.SmbComWriteAndx:
case ServerMessageBlock.SmbComClose:
case ServerMessageBlock.SmbComTreeDisconnect:
{
break;
}
case ServerMessageBlock.SmbComTransaction:
case ServerMessageBlock.SmbComTransaction2:
{
switch (((SmbComTransaction)request).SubCommand & unchecked (0xFF))
{
case SmbComTransaction.NetShareEnum:
case SmbComTransaction.NetServerEnum2:
case SmbComTransaction.NetServerEnum3:
case SmbComTransaction.TransPeekNamedPipe:
case SmbComTransaction.TransWaitNamedPipe:
case SmbComTransaction.TransCallNamedPipe:
case SmbComTransaction.TransTransactNamedPipe:
case SmbComTransaction.Trans2GetDfsReferral:
{
break;
}
default:
{
throw new SmbException("Invalid operation for " + Service + " service");
}
}
break;
}
default:
{
throw new SmbException("Invalid operation for " + Service + " service" + request);
}
}
}
request.Tid = Tid;
if (InDfs && !Service.Equals("IPC") && !string.IsNullOrEmpty(request.Path))
{
request.Flags2 = SmbConstants.Flags2ResolvePathsInDfs;
request.Path = '\\' + Session.Transport().TconHostName + '\\' + Share + request.Path;
}
try
{
Session.Send(request, response);
}
catch (SmbException se)
{
if (se.GetNtStatus() == NtStatus.NtStatusNetworkNameDeleted)
{
TreeDisconnect(true);
}
throw;
}
}
}