/// <summary> /// remove request and sequence if the response is the final response. /// </summary> /// <param name="connection">the connection on which to remove the request and sequence</param> /// <param name="response">the response for which to remove the request and sequence</param> protected virtual void RemoveRequestAndSequence(CifsServerPerConnection connection, SmbPacket response) { if (response is SmbWriteRawInterimResponsePacket || response is SmbNtTransactInterimResponsePacket || response is SmbTransactionInterimResponsePacket || response is SmbTransaction2InterimResponsePacket) { return; } connection.RemovePendingRequest(response.SmbHeader.Mid); connection.RemoveSequenceNumber(response); }
/// <summary> /// Update the context of cifs server /// </summary> /// <param name="connection">The connection between client and server.</param> /// <param name="packet">The sent or received packet in stack transport.</param> public virtual void UpdateRoleContext(CifsServerPerConnection connection, SmbPacket packet) { if (connection == null || packet == null) { return; } if (packet is SmbReadRawResponsePacket) { if (connection.PendingRequestTable.Count != 1) { return; } SmbPacket request = connection.PendingRequestTable[0] as SmbPacket; this.UpdateResponseRoleContext(connection, request, packet); connection.RemovePendingRequest(request.SmbHeader.Mid); connection.RemoveSequenceNumber(packet); return; } else { switch(packet.PacketType) { case SmbPacketType.BatchedRequest: case SmbPacketType.SingleRequest: if (connection.IsSigningActive) { packet.IsSignatureCorrect = CifsMessageUtils.VerifySignature(packet, connection.SigningSessionKey, connection.ServerNextReceiveSequenceNumber, connection.SigningChallengeResponse); } this.UpdateRequestRoleConext(connection, packet); break; case SmbPacketType.BatchedResponse: case SmbPacketType.SingleResponse: SmbPacket request = connection.GetPendingRequest(packet.SmbHeader.Mid); this.UpdateResponseRoleContext(connection, request, packet); this.RemoveRequestAndSequence(connection, packet); break; default: break; } } }