3.2.4.14 Application Requests Reading from a File, Named Pipe, or Device

The application provides:

  • A valid Client.Open, representing the file from which the application attempts to read.

  • An offset, in bytes and relative to the start of the file, marking the location within the file at which the application attempts to read.

  • The number of bytes to be read.

  • A minimum number of bytes to be read.

  • An optional time-out value, in milliseconds, indicating how long a server is requested to wait.

The application MAY also provide an estimate of the number of bytes that it attempts to read next. This value MUST represent a sequential read (immediately following the bytes being read in this request), as it is used to allow the server to perform read-ahead caching.

CIFS provides several commands for reading data from a file, named pipe, or device. These are:

  • SMB_COM_READ (deprecated)

    The client MUST construct an SMB_COM_READ request message as defined in section 2.2.4.11.1. This command provides the basic Read operation.

  • SMB_COM_LOCK_AND_READ (deprecated)

    The client MUST construct an SMB_COM_LOCK_AND_READ request as defined in section 2.2.4.20.1. Prior to reading, this command attempts to establish a lock on the specified byte range.

  • SMB_COM_READ_RAW (deprecated)

    The client MUST construct an SMB_COM_READ_RAW request as defined in section 2.2.4.22.1. The behavior of the SMB_COM_READ_RAW request is described in section 3.2.4.14.1.

  • SMB_COM_READ_MPX (obsolescent)

    The client MUST construct SMB_COM_READ_MPX request messages as defined in section 2.2.4.23.1. The behavior of the SMB_COM_READ_MPX request is described in section 3.2.4.14.2.

  • SMB_COM_READ_ANDX

    If the application reads from a named pipe or device specifically, it MUST also provide the minimum number of bytes to be read.

    The client MUST construct an SMB_COM_READ_ANDX request message as defined in section 2.2.4.42.1, with the following additional requirements:

    • If CAP_LARGE_FILES was negotiated during session setup, then the client MAY use a 64-bit Offset value. If the client is using a 64-bit Offset value, SMB_Parameters.WordCount MUST be set to 0x0C and the SMB_Parameters.Words.Offset and SMB_Parameters.Words.OffsetHigh fields MUST be set to the lower 32 bits and higher 32 bits, respectively, of the supplied offset value.

    • If the client is using a 32-bit Offset value, SMB_Parameters.WordCount MUST be set to 0x0A, the SMB_Parameters.Words.Offset field MUST be assigned the offset value supplied by the application, and the SMB_Parameters.Words.OffsetHigh field MUST NOT be included in the request.

    • The SMB_Parameters.Words.MaxCountOfBytesToReturn field MUST be assigned the number of bytes to be returned. This value is supplied by the application. If a value was supplied for a minimum number of bytes to be read, the SMB_Parameters.Words.MinCountOfBytesToReturn field MUST be assigned the value that was supplied by the application. Otherwise, it MUST be set to 0x0000.

    • If a time-out value was supplied, the SMB_Parameters.Words.Timeout field MUST be assigned the value that was supplied by the application. Otherwise, it MUST be set to 0x00000000.

      In addition, if CAP_LARGE_READX was set by the server in the negotiate protocol response and FID refers to a disk file, then the MaxCountOfBytesToReturn field in the client request can exceed the client's Client.MaxBufferSize.

  • TRANS_RAW_READ_NMPIPE

    The client MUST construct the TRANS_RAW_READ_NMPIPE subcommand as defined in section 2.2.5.2. The request MUST be transported to the server using the Transaction subprotocol. TRANS_RAW_READ_NMPIPE allows for a raw read of data from a named pipe. This method of reading data from a named pipe ignores message boundaries even if the pipe is set up as a message mode pipe.

  • TRANS_READ_NMPIPE

    The client MUST construct the TRANS_READ_NMPIPE subcommand as defined in section 2.2.5.8. The request MUST be transported to the server using the Transaction subprotocol. TRANS_READ_NMPIPE allows data to be read from a named pipe in the mode set on the named pipe. If the named pipe is in message mode, this subcommand MUST read a message from the pipe.

The request MUST be sent to the server as described in section 3.2.4.1.