LANMAN 1. 0 и более поздние диалекты протокола CIFS допускают передачу на сервер нескольких запросов SMB в одном сообщении. Сообщения этого типа называются AndX SMB, они подчиняются следующим правилам:
• Вложенные команды не повторяют информацию заголовка SMB. Вместо этого следующее сообщение SMB начинается на поле WordCount.
• Все множественные (сцепленные) запросы должны соответствовать согласованному размеру передачи. Например, если было послано сообщение SMB_COM_TREE_CONNECT_ANDX, включающее SMB_COM_OPEN_ANDX, которое включает SMB_COM_WRITE, то все они должны соответствовать согласованному размеру буфера. Это будет ограничивать размер записи.
• Существует одно посылаемое сообщение, содержащее сцепленные запросы, и одно сообщение ответа на сцепленные запросы. Сервер может НЕ посылать отдельные ответы на каждый из сцепленных запросов.
• Все сцепленные ответы должны соответствовать согласованному размеру передачи. Это ограничивает, например, максимальное значение вложенного SMB_COM_READ. Клиент не должен запрашивать больше байтов, чем может поместиться во множественном ответе.
• Сервер неявно будет использовать результат первой команды в команде "X". Например, TID, полученный через SMB_COM_TREE_ CONNECT_ANDX, мог бы использоваться во вложенном SMB_COM_ OPEN.ANDX, a FID, полученный в SMB_COM_OPEN_ANDX, мог бы использоваться во вложенном SMB_COM_READ.
• Каждый сцепленный запрос может ссылаться только на тот же FID и TID, что и другие команды в комбинированном запросе. Сцепленные запросы могут рассматриваться как выполняющие одну (из нескольких частей) операцию на одном ресурсе.
• Первая КОМАНДА, встретившая ошибку, будет останавливать всю дальнейшую обработку встроенных команд. Сервер не будет возвращать команды, которые выполнились успешно. Поэтому, если сцепленный запрос содержал SMB_COM_OPEN_ANDX и SMB_COM_READ, и сервер смог успешно открыть файл, но чтение встретило ошибку, то после этого файл остался бы открытым. Это в точности то же самое, как если бы запросы были посланы раздельно.
Если при обработке сцепленных запросов возникает ошибка, то последним (из сцепленных запросов в буфере) будет запрос, встретивший ошибку. Другие необработанные сцепленные запросы будет проигнорированы, когда сервер встретит ошибку, и не будут представлены в сцепленном ответе. В действительности последняя допустимая команда ANDXCOMMAND (если существует) будет представлять SMB, на котором встретилась ошибка. Если нет действительной команды ANDXCOMMAND, то возникшая при первом запросе/ответе ошибка и COMMAND содержат отказавшую команду. Во всех случаях информация об ошибке возвращается в заголовке SMB в начале буфера ответа.
Каждый сцепленный запрос и ответ содержит смещение (с начала заголовка SMB) к следующему сцепленному запросу/ответу (в поле AndXOffset в различных протоколах "and X", например, SMB_COM_OPEN_ANDX). Это позволяет создавать запросы распакованными. Между концом предыдущего запроса (как определено WordCount и ByteCount) и началом следующего сцепленного запроса может быть пробел. Это упрощает создание сцепленных запросов протокола. Отметим, что так как клиент должен знать размер возвращаемых данных, чтобы послать правильное число получений (например, SMB_COM_TRANSACTION, SMB_COM_READ_MPX), данные в каждом ответе SMP ожидаются обрезанными до максимального числа 512-байтных блоков (секторов), которые будут соответствовать (начиная с 32-битной границы) согласованному размеру буфера с нечетным числом байтов, остающихся (если остаются) в конечном буфере.
