Class: RubySMB::SMB2::Pipe
- Includes:
- Dcerpc
- Defined in:
- lib/ruby_smb/smb2/pipe.rb
Overview
Represents a pipe on the Remote server that we can perform various I/O operations on.
Constant Summary collapse
- STATUS_CONNECTED =
0x00000003
- STATUS_CLOSING =
0x00000004
Constants inherited from File
Instance Attribute Summary
Attributes inherited from File
#attributes, #guid, #last_access, #last_change, #last_write, #name, #size, #size_on_disk, #tree
Instance Method Summary collapse
-
#is_connected? ⇒ Boolean
True if pipe is connected, false otherwise.
-
#peek(peek_size: 0) ⇒ RubySMB::SMB2::Packet::IoctlResponse
Performs a peek operation on the named pipe.
-
#peek_available ⇒ Integer
The number of bytes available to be read from the pipe.
-
#peek_state ⇒ Integer
Pipe status.
Methods included from Dcerpc
#bind, #ioctl_send_recv, #net_share_enum_all, #request
Methods inherited from File
#append, #close, #delete, #delete_packet, #initialize, #read, #read_packet, #rename, #rename_packet, #send_recv_read, #send_recv_write, #set_header_fields, #write, #write_packet
Constructor Details
This class inherits a constructor from RubySMB::SMB2::File
Instance Method Details
#is_connected? ⇒ Boolean
Returns True if pipe is connected, false otherwise.
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/ruby_smb/smb2/pipe.rb', line 58 def is_connected? begin state = peek_state rescue RubySMB::Error::UnexpectedStatusCode => e if e. == 'STATUS_FILE_CLOSED' return false end raise e end state == STATUS_CONNECTED end |
#peek(peek_size: 0) ⇒ RubySMB::SMB2::Packet::IoctlResponse
Performs a peek operation on the named pipe
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/ruby_smb/smb2/pipe.rb', line 19 def peek(peek_size: 0) packet = RubySMB::SMB2::Packet::IoctlRequest.new packet.ctl_code = RubySMB::Fscc::ControlCodes::FSCTL_PIPE_PEEK packet.flags.is_fsctl = true # read at least 16 bytes for state, avail, msg_count, first_msg_len packet.max_output_response = 16 + peek_size packet = set_header_fields(packet) raw_response = @tree.client.send_recv(packet) response = RubySMB::SMB2::Packet::IoctlResponse.read(raw_response) unless response.valid? raise RubySMB::Error::InvalidPacket.new( expected_proto: RubySMB::SMB2::SMB2_PROTOCOL_ID, expected_cmd: RubySMB::SMB2::Packet::IoctlResponse::COMMAND, received_proto: response.smb2_header.protocol, received_cmd: response.smb2_header.command ) end unless response.status_code == WindowsError::NTStatus::STATUS_BUFFER_OVERFLOW or response.status_code == WindowsError::NTStatus::STATUS_SUCCESS raise RubySMB::Error::UnexpectedStatusCode, response.status_code.name end response end |
#peek_available ⇒ Integer
Returns The number of bytes available to be read from the pipe.
44 45 46 47 48 49 |
# File 'lib/ruby_smb/smb2/pipe.rb', line 44 def peek_available packet = peek state, avail, msg_count, first_msg_len = packet.buffer.unpack('VVVV') # Only 1 of these should be non-zero avail or first_msg_len end |
#peek_state ⇒ Integer
Returns Pipe status.
52 53 54 55 |
# File 'lib/ruby_smb/smb2/pipe.rb', line 52 def peek_state packet = peek packet.buffer.unpack('V')[0] end |