/// <summary> /// server response the tree connect request from client. /// </summary> /// <param name="session">the session between server and client</param> /// <param name="requestPacket">the request</param> /// <returns>The tree connect object</returns> public override IFileServiceServerTreeConnect SendTreeConnectResponse( IFileServiceServerSession session, SmbFamilyPacket requestPacket) { SmbPacket response = this.cifsServer.CreateDefaultResponse(session.Connection as CifsServerPerConnection, requestPacket as SmbPacket); this.cifsServer.SendPacket(response, session.Connection as CifsServerPerConnection); return((session as CifsServerPerSession).GetTreeConnect(response.SmbHeader.Tid)); }
/// <summary> /// server response the negotiate request from client. /// </summary> /// <param name="connection">the connection between server and client</param> /// <param name="requestPacket">the request</param> public override void SendNegotiateResponse( IFileServiceServerConnection connection, SmbFamilyPacket requestPacket) { CifsServerPerConnection cifsConnection = connection as CifsServerPerConnection; SmbPacket response = this.cifsServer.CreateDefaultResponse(cifsConnection, requestPacket as SmbNegotiateRequestPacket); this.cifsServer.SendPacket(response, cifsConnection); }
/// <summary> /// server response the session request from client. /// </summary> /// <param name="connection">the connection between server and client</param> /// <param name="requestPacket">the request</param> /// <returns>The session object.</returns> public override IFileServiceServerSession SendSessionSetupResponse( IFileServiceServerConnection connection, SmbFamilyPacket requestPacket) { CifsServerPerConnection cifsConnection = connection as CifsServerPerConnection; SmbPacket response = this.cifsServer.CreateDefaultResponse(cifsConnection, requestPacket as SmbPacket); this.cifsServer.SendPacket(response, cifsConnection); return(cifsConnection.GetSession(response.SmbHeader.Uid)); }
/// <summary> /// Automatically response latest request. /// </summary> /// <param name="connection">the connection between server and client</param> /// <param name="session">the session between server and client</param> /// <param name="treeConnect">the tree connect between server and client</param> /// <param name="open">the file open between server and client</param> /// <param name="requestPacket">the request</param> public override void DefaultSendResponse( IFileServiceServerConnection connection, IFileServiceServerSession session, IFileServiceServerTreeConnect treeConnect, IFileServiceServerOpen open, SmbFamilyPacket requestPacket) { CifsServerPerConnection cifsConnection = connection as CifsServerPerConnection; SmbPacket response = this.cifsServer.CreateDefaultResponse(cifsConnection, requestPacket as SmbPacket); this.cifsServer.SendPacket(response, cifsConnection); }
/// <summary> /// server response an error packet /// </summary> /// <param name="connection">the connection between server and client</param> /// <param name="status">error code</param> /// <param name="requestPacket">the request packet to send the error response</param> public override void SendErrorResponse( IFileServiceServerConnection connection, uint status, SmbFamilyPacket requestPacket) { CifsServerPerConnection cifsConnection = connection as CifsServerPerConnection; SmbPacket response = this.cifsServer.CreateDefaultResponse(cifsConnection, requestPacket as SmbPacket); SmbHeader smbHeader = response.SmbHeader; smbHeader.Status = status; response.SmbHeader = smbHeader; this.cifsServer.SendPacket(response, cifsConnection); }
/// <summary> /// server response the create request from client. /// </summary> /// <param name="treeConnect">the tree connect between server and client</param> /// <param name="requestPacket">the request</param> /// <returns>The file open object</returns> public override IFileServiceServerOpen SendCreateResponse( IFileServiceServerTreeConnect treeConnect, SmbFamilyPacket requestPacket) { CifsServerPerConnection cifsConnection = treeConnect.Session.Connection as CifsServerPerConnection; IFileServiceServerOpen open = null; SmbCreateResponsePacket response = this.cifsServer.CreateDefaultResponse(cifsConnection, requestPacket as SmbPacket) as SmbCreateResponsePacket; if (response != null) { this.cifsServer.SendPacket(response, cifsConnection); open = (treeConnect as CifsServerPerTreeConnect).GetOpen(response.SmbParameters.FID); } return(open); }
/// <summary> /// server response the tree connect request from client. /// </summary> /// <param name="session">the session between server and client</param> /// <param name="requestPacket">the request</param> /// <returns>The tree connect object</returns> public override IFileServiceServerTreeConnect SendTreeConnectResponse( IFileServiceServerSession session, SmbFamilyPacket requestPacket) { SmbPacket response = this.cifsServer.CreateDefaultResponse(session.Connection as CifsServerPerConnection, requestPacket as SmbPacket); this.cifsServer.SendPacket(response, session.Connection as CifsServerPerConnection); return (session as CifsServerPerSession).GetTreeConnect(response.SmbHeader.Tid); }
/// <summary> /// server response the session request from client. /// </summary> /// <param name="connection">the connection between server and client</param> /// <param name="requestPacket">the request</param> /// <returns>The session object.</returns> public override IFileServiceServerSession SendSessionSetupResponse( IFileServiceServerConnection connection, SmbFamilyPacket requestPacket) { CifsServerPerConnection cifsConnection = connection as CifsServerPerConnection; SmbPacket response = this.cifsServer.CreateDefaultResponse(cifsConnection, requestPacket as SmbPacket); this.cifsServer.SendPacket(response, cifsConnection); return cifsConnection.GetSession(response.SmbHeader.Uid); }
/// <summary> /// server response the create request from client. /// </summary> /// <param name="treeConnect">the tree connect between server and client</param> /// <param name="requestPacket">the request</param> /// <returns>The file open object</returns> public override IFileServiceServerOpen SendCreateResponse( IFileServiceServerTreeConnect treeConnect, SmbFamilyPacket requestPacket) { CifsServerPerConnection cifsConnection = treeConnect.Session.Connection as CifsServerPerConnection; IFileServiceServerOpen open = null; SmbCreateResponsePacket response = this.cifsServer.CreateDefaultResponse(cifsConnection, requestPacket as SmbPacket) as SmbCreateResponsePacket; if (response != null) { this.cifsServer.SendPacket(response, cifsConnection); open = (treeConnect as CifsServerPerTreeConnect).GetOpen(response.SmbParameters.FID); } return open; }
/// <summary> /// Expect a request. If user is not interested in the packet, please call DefaultSendResponse(). /// </summary> /// <param name="timeout">timeout</param> /// <param name="connection">the connection between server and client</param> /// <param name="session">the session between server and client</param> /// <param name="treeConnect">the tree connect between server and client</param> /// <param name="open">the file open between server and client</param> /// <param name="requestPacket">the request</param> public override void ExpectRequest( TimeSpan timeout, out IFileServiceServerConnection connection, out IFileServiceServerSession session, out IFileServiceServerTreeConnect treeConnect, out IFileServiceServerOpen open, out SmbFamilyPacket requestPacket) { CifsServerPerConnection cifsConnection; SmbPacket request = this.cifsServer.ExpectPacket(timeout, out cifsConnection); connection = cifsConnection; requestPacket = request; session = null; treeConnect = null; open = null; if (request != null) { session = cifsConnection.GetSession(request.SmbHeader.Uid); if (session != null) { treeConnect = (session as CifsServerPerSession).GetTreeConnect(request.SmbHeader.Tid); if (treeConnect != null) { ushort fid = 0; SmbTransactionRequestPacket transactionRequest = request as SmbTransactionRequestPacket; SmbNtTransactIoctlRequestPacket ioctlRequest = request as SmbNtTransactIoctlRequestPacket; SmbNtTransactNotifyChangeRequestPacket notifyChange = request as SmbNtTransactNotifyChangeRequestPacket; if (transactionRequest != null) { //SubCommand(2bytes), FID(2bytes) fid = transactionRequest.SmbParameters.Setup[1]; } else if (ioctlRequest != null) { //FunctionCode(4bytes), FID(2bytes), IsFctl(1bytes), IsFlags(1bytes) fid = ioctlRequest.SmbParameters.Setup[2]; } else if (notifyChange != null) { //CompletionFilter(4bytes), FID(2bytes), WatchTree(1bytes), Reserved(1bytes) fid = notifyChange.SmbParameters.Setup[2]; } else { Type packetType = request.GetType(); PropertyInfo pi = packetType.GetProperty( "Trans2Parameters", BindingFlags.Instance | BindingFlags.Public); if (pi == null) { pi = packetType.GetProperty( "NtTransParameters", BindingFlags.Instance | BindingFlags.Public); } if (pi == null) { pi = packetType.GetProperty( "SmbParameters", BindingFlags.Instance | BindingFlags.Public); } if (pi != null) { object smbParameters = pi.GetValue(request, null); FieldInfo fi = smbParameters.GetType().GetField( "FID", BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase); if (fi != null) { fid = (ushort)fi.GetValue(smbParameters); } } } if (fid > 0) { open = (treeConnect as CifsServerPerTreeConnect).GetOpen(fid); } } } } }