SMB協議分析

SAMBA協議分析 

http://blog.chinaunix.net/uid-28193347-id-3420341.html#_Toc306604100

 

1 介紹

2 消息

2.1 傳輸

2.2 消息語法

2.2.1 通用數據類型

2.2.2 定義常數

2.2.3 SMB消息結構

2.2.4 SMB命令

2.2.4.1 SMB_COM_CREATE_DIRECTORY (0x00)

2.2.4.2 SMB_COM_DELETE_DIRECTORY (0x01)

2.2.4.3 SMB_COM_OPEN (0x02)

2.2.4.4 SMB_COM_CREATE (0x03)

2.2.4.5 SMB_COM_CLOSE (0x04)

2.2.4.6 SMB_COM_FLUSH (0x05)

2.2.4.7 SMB_COM_DELETE (0x06)

2.2.4.8 SMB_COM_RENAME (0x07)

2.2.4.9 SMB_COM_QUERY_INFORMATION (0x08)

2.2.4.10 SMB_COM_SET_INFORMATION (0x09)

2.2.4.11 SMB_COM_READ (0x0A)

2.2.4.12 SMB_COM_WRITE (0x0B)

2.2.4.13 SMB_COM_LOCK_BYTE_RANGE (0x0C)

2.2.4.14 SMB_COM_UNLOCK_BYTE_RANGE (0x0D)

2.2.4.15 SMB_COM_CREATE_TEMPORARY (0x0E)

2.2.4.16 SMB_COM_CREATE_NEW (0x0F)

2.2.4.17 SMB_COM_CHECK_DIRECTORY (0x10)

2.2.4.18 SMB_COM_PROCESS_EXIT (0x11)

2.2.4.19 SMB_COM_SEEK (0x12)

2.2.4.20 SMB_COM_LOCK_AND_READ (0x13)

2.2.4.21 SMB_COM_WRITE_AND_UNLOCK (0x14)

2.2.4.22 SMB_COM_READ_RAW (0x1A)

2.2.4.23 SMB_COM_READ_MPX (0x1B)

2.2.4.24 SMB_COM_READ_MPX_SECONDARY (0x1C)

2.2.4.25 SMB_COM_WRITE_RAW (0x1D)

2.2.4.26 SMB_COM_WRITE_MPX (0x1E)

2.2.4.27 SMB_COM_WRITE_MPX_SECONDARY (0x1F)

2.2.4.28 SMB_COM_WRITE_COMPLETE (0x20)

2.2.4.29 SMB_COM_QUERY_SERVER (0x21)

2.2.4.30 SMB_COM_SET_INFORMATION2 (0x22)

2.2.4.31 SMB_COM_QUERY_INFORMATION2 (0x23)

2.2.4.32 SMB_COM_LOCKING_ANDX (0x24)

2.2.4.33 SMB_COM_TRANSACTION (0x25)

2.2.4.34 SMB_COM_TRANSACTION_SECONDARY (0x26)

2.2.4.35 SMB_COM_IOCTL (0x27)

2.2.4.36 SMB_COM_IOCTL_SECONDARY (0x28)

2.2.4.37 SMB_COM_COPY (0x29)

2.2.4.38 SMB_COM_MOVE (0x2A)

2.2.4.39 SMB_COM_ECHO (0x2B)

2.2.4.40 SMB_COM_WRITE_AND_CLOSE (0x2C)

2.2.4.41 SMB_COM_OPEN_ANDX (0x2D)

2.2.4.42 SMB_COM_READ_ANDX (0x2E)

2.2.4.43 SMB_COM_WRITE_ANDX (0x2F)

2.2.4.44 SMB_COM_NEW_FILE_SIZE (0x30)

2.2.4.45 SMB_COM_CLOSE_AND_TREE_DISC (0x31)

2.2.4.46 SMB_COM_TRANSACTION2 (0x32)

2.2.4.47 SMB_COM_TRANSACTION2_SECONDARY (0x33)

2.2.4.48 SMB_COM_FIND_CLOSE2 (0x34)

2.2.4.49 SMB_COM_FIND_NOTIFY_CLOSE (0x35)

2.2.4.50 SMB_COM_TREE_CONNECT (0x70)

2.2.4.51 SMB_COM_TREE_DISCONNECT (0x71)

2.2.4.52 SMB_COM_NEGOTIATE (0x72)

2.2.4.53 SMB_COM_SESSION_SETUP_ANDX (0x73)

2.2.4.54 SMB_COM_LOGOFF_ANDX (0x74)

2.2.4.55 SMB_COM_TREE_CONNECT_ANDX (0x75)

2.2.4.56 SMB_COM_SECURITY_PACKAGE_ANDX (0x7E)

2.2.4.57 SMB_COM_QUERY_INFORMATION_DISK (0x80)

2.2.4.58 SMB_COM_SEARCH (0x81)

2.2.4.59 SMB_COM_FIND (0x82)

2.2.4.60 SMB_COM_FIND_UNIQUE (0x83)

2.2.4.61 SMB_COM_FIND_CLOSE (0x84)

2.2.4.62 SMB_COM_NT_TRANSACT (0xA0)

2.2.4.63 SMB_COM_NT_TRANSACT_SECONDARY (0xA1)

2.2.4.64 SMB_COM_NT_CREATE_ANDX (0xA2)

2.2.4.65 SMB_COM_NT_CANCEL (0xA4)

2.2.4.66 SMB_COM_NT_RENAME (0xA5)

2.2.4.67 SMB_COM_OPEN_PRINT_FILE (0xC0)

2.2.4.68 SMB_COM_WRITE_PRINT_FILE (0xC1)

2.2.4.69 SMB_COM_CLOSE_PRINT_FILE (0xC2)

2.2.4.70 SMB_COM_GET_PRINT_QUEUE (0xC3)

2.2.4.71 SMB_COM_READ_BULK (0xD8)

2.2.4.72 SMB_COM_WRITE_BULK (0xD9)

2.2.4.73 SMB_COM_WRITE_BULK_DATA (0xDA)

2.2.4.74 SMB_COM_INVALID (0xFE)

2.2.4.75 SMB_COM_NO_ANDX_COMMAND (0xFF)

參考資料:

2 消息

  2.1 傳輸

  2.2 消息語法

  2.2.1 通用數據類型

  2.2.2 定義常數

  2.2.3 SMB消息結構

  2.2.4 SMB命令

 

2.2.4.1 SMB_COM_CREATE_DIRECTORY (0x00)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用TRANS2_CREATE_DIRECTORY替代。

創建目錄命令用來在連接的共享服務器上建立一個新的目錄。客戶端必須提供一個有效的UID和TID,以及需要創建的目錄的名稱(相對於TID)。

爲了新建一個目錄,服務器要求客戶端至少提供子目錄的創建權限。創建者對新建目錄的存取權限有服務器的本地策略決定。

2.2.4.2 SMB_COM_DELETE_DIRECTORY (0x01)

    這是原始核心協議的一個命令,用來刪除一個空的目錄。

2.2.4.3 SMB_COM_OPEN (0x02)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用SMB_COM_NT_CREATE_ANDX替代。

此命令用來打開一個已存在的常規文件,不能用來打開目錄文件或命名管道文件。命令攜帶了客戶端想要打開的文件的路徑名稱。如果命令執行成功,服務器的響應報文中必須攜帶此文件的標識符FID,客戶端在後續的對此文件的操作命令中也必須攜帶相同的FID。

2.2.4.4 SMB_COM_CREATE (0x03)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用SMB_COM_NT_CREATE_ANDX替代。

此命令用來創建並打開一個新文件,或打開一個已存在的文件並將其內容清空。返回的FID在後續對此文件的操作命令中使用,比如讀、寫、鎖、解鎖和關閉。這個命令不能被用來創建目錄或命名管道。命令請求中攜帶了需要創建的文件名及其路徑。如果命令執行成功,服務器的響應命令中必須攜帶FID,客戶端在後續對此文件的操作命令中也必須攜帶相同的FID。客戶端必須擁有對文件父目錄的寫權限,才能在其中新建文件;或對文件本身具有寫權限,才能清空文件內容。客戶端對新建的文件的訪問權限必須是讀和寫。如果文件原來已存在,只是打開後清空其內容,原來的訪問權限保持不變。文件以讀/寫/兼容模式打開。

2.2.4.5 SMB_COM_CLOSE (0x04)

這是原始核心協議的一個命令,用來關閉和一個有效的FID關聯的對象的一個實例。

2.2.4.6 SMB_COM_FLUSH (0x05)

這是原始核心協議的一個命令,用來要求服務器將當前文件的所有數據和信息都寫回到存儲器上。

2.2.4.7 SMB_COM_DELETE (0x06)

這是原始核心協議的一個命令,用來刪除一個或多個常規文件。支持文件名中有通配符,允許一次刪除多個文件。

2.2.4.8 SMB_COM_RENAME (0x07)

這是原始核心協議的一個命令,用來重命名一個或多個文件或目錄。允許文件名中有通配符,允許一次修改多個文件的文件名。

2.2.4.9 SMB_COM_QUERY_INFORMATION (0x08)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用SMB_COM_TRANSACTION2的子命令TRANS2_QUERY_PATH_INFORMATION來替代。

客戶端可以用這個命令來獲取服務器上某個文件的屬性信息,前提是提供文件名和路徑,不需要提供FID。

2.2.4.10 SMB_COM_SET_INFORMATION (0x09)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用SMB_COM_TRANSACTION2的子命令TRANS2_SET_PATH_INFORMATION來替代。

客戶端可以用這個命令來改變一個常規文件或目錄的屬性。文件名不可以包含通配符,必須使用全名,所有的參數都是可選的。如果服務器不識別某個參數,必須忽略它。如果LastWriteTime字段包含0x00000000,文件的LastWriteTime必須不能改變。

2.2.4.11 SMB_COM_READ (0x0A)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用SMB_COM_READ_ANDX命令來替代。

此命令用來從一個普通文件中讀取數據。如果客戶端和服務器協商可以支持命名管道或直接讀取設備,也可以從其中讀取數據。如果服務器返回的字節數比客戶端要求的少,表示已經讀到文件末尾。如果讀取請求的起始地址在或超過了文件尾部,返回0字節。如果要求讀取的字節數超過了SMB連接規定的最大字節數MaxBufferSize,服務器必須終止此連接,因爲只能支持最大32-bit位移的客戶請求,不適合擁有超過32-bit大小的文件。客戶端最少要擁有文件的讀權限。

2.2.4.12 SMB_COM_WRITE (0x0B)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用SMB_COM_WRITE_ANDX命令來替代。在LAN Manager 1.0 中,引入了對命名管道和I/O設備的支持。

此命令用來向普通文件中寫入數據。如果客戶端和服務器協商支持命名管道、郵箱或直接讀取設備,這個命令也可向這些設備中寫入數據。命令也可以用來截斷或延長文件到某一指定位置。請求命令中必須包含合法的TID和FID。這個命令最大支持32-bit長度的文件,不適合更大的文件,如果要對大文件進行操作,需要使用命令SMB_COM_WRITE_ANDX。

當FID指示操作的文件是一個硬盤文件,而指定的寫入起始偏移量(WriteOffsetInBytes)超過了當前文件的結尾時,文件必須被擴充,文件原來尾部到要求的偏移量之間數據都初始化爲0x00。如果指定寫入的數據長度(CountOfBytesToWrite)爲0x0000,文件將被截斷(或擴充)到偏移量的位置。

客戶端必須最少要擁有文件的寫權限。

2.2.4.13 SMB_COM_LOCK_BYTE_RANGE (0x0C)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用SMB_COM_LOCKING_ANDX命令來替代。

此命令不適用於長度超過32-bit的文件。在LAN Manager 1.0引入的命令SMB_COM_LOCKING_ANDX支持長度超過32-bit的文件,最大支持64-bit長度。SMB_COM_LOCKING_ANDX是LAN Manager 1.0版本以後的客戶端進行鎖/解鎖一段數據的首選。如果客戶端需要支持64-bit長度的文件,必須使用NT LAN Manage或以後的版本。

此命令用來鎖定一個打開的普通文件中一段連續的數據。支持鎖定任一指定文件中任意多的數據段,前提是這些數據段沒有重疊的部分。鎖定可以防止其他客戶或PID對鎖定的數據段進行鎖定、讀和寫操作。如果鎖定的數據段之間有重疊的部分,必須返回失敗,錯誤碼爲STATUS_LOCK_NOT_GRANTED (ERRDOS/ERRlock)。鎖定的範圍可以超出文件大小,但是不會引起文件大小的擴充。只有加鎖的進程纔可以對其進行解鎖。

因爲此請求只支持最大32-bit的offset,所以對於大於32-bit的文件不適用。客戶端必須至少有文件的讀權限。

2.2.4.14 SMB_COM_UNLOCK_BYTE_RANGE (0x0D)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用SMB_COM_LOCKING_ANDX命令來替代。

此命令不適用於長度超過32-bit的文件。在LAN Manager 1.0引入的命令SMB_COM_LOCKING_ANDX支持長度超過32-bit的文件,最大支持64-bit長度。SMB_COM_LOCKING_ANDX是LAN Manager 1.0版本以後的客戶端進行鎖/解鎖一段數據的首選。如果客戶端需要支持64-bit長度的文件,必須使用NT LAN Manage或以後的版本。

此命令用來解鎖一個打開的普通文件中一段連續的數據。指定的數據段範圍必須和先前加鎖的範圍完全一致,並且是由同一CIFS客戶端和進程所加的鎖,FID和PID也必須一致。對未加鎖的數據進行解鎖將被作爲一個錯誤操作。

如果服務器沒有立即(200-300毫秒內)同意對指定數據段範圍進行解鎖,必須返回一個錯誤給客戶端。此命令只支持最大32-bit的文件,不適用大於32-bit的文件。客戶端必須最少擁有文件的讀權限。

2.2.4.15 SMB_COM_CREATE_TEMPORARY (0x0E)

這是原始核心協議的一個命令,已被廢棄。

客戶端使用此命令來創建一個臨時文件。消息包含希望創建文件所在的路徑。服務器會在指定的目錄中爲文件生成一個唯一的文件名。指定的目錄必須和SMB頭部的TID相關聯。客戶端必須擁有指定路徑的寫權限。如果執行成功,服務器返回一個FID,在後續路程中如果還要對此文件進行操作,客戶端必須提供這個FID。文件以讀寫兼容模式打開。在客戶端關閉文件後服務器不會自動刪除它,如果不再使用,客戶端必須下命令給服務器刪除此文件。

2.2.4.16 SMB_COM_CREATE_NEW (0x0F)

這是原始核心協議的一個命令,不推薦使用。客戶程序應該使用SMB_COM_NT_CREATE_ANDX命令來替代。

此命令用來創建一個新文件。不能截斷或覆蓋一個已存在的文件,如果請求的文件已經存在,返回失敗。此命令不能用來創建目錄或命名管道。

請求消息中包含了路徑名(原句:The request message includes the pathname of the file relative to the supplied TID that the client requests to create.),如果執行成功,服務器返回一個FID,在後續的read、write、lock、unlock和close操作中,客戶端必須提供相同的FID。客戶端必須有文件所在目錄的寫權限,對新建的文件擁有讀寫權限。文件以讀寫兼容模式打開。服務器對客戶端提供的創建時間CreationTime(見2.2.4.16.1)的支持是可選的。

2.2.4.17 SMB_COM_CHECK_DIRECTORY (0x10)

這是原始核心協議的一個命令。

此命令用來檢查指定的路徑是否在服務器上存在。

2.2.4.18 SMB_COM_PROCESS_EXIT (0x11)

這是原始核心協議的一個命令,在LAN Manager 1.0中聲明已被廢棄,但是在後續的文檔中又被包含。[MS-CIFS]將其列爲已廢棄。

此命令請求由客戶端發起,通知客戶端程序已崩潰。收到請求後,服務器關閉消息頭部PID進程的所有資源。

2.2.4.19 SMB_COM_SEEK (0x12)

這是原始核心協議的一個命令,已被廢棄。

此命令用來設置一個常規文件的文件指針,也可以用來查詢當前文件指針的位置,文件指針的位置由服務器管理。文件指針在響應報文中以unsigned 32-bit的格式返回,表明從文件頭開始的偏移量。可以設置超過文件大小的偏移量,但是如果設置一個負數的偏移量,將會被重置爲0,即文件的起始位置。

在讀或寫文件之前沒有必要使用SMB_COM_SEEK來設置文件指針,IFS在讀或寫的請求命令中已包含了偏移量字段,讀或寫操作時也會改變文件指針,指針會從要求的offset位置向後移動,讀或寫多少字節,就向後移動多少。

正是因爲讀或寫之前不必使用Since SMB_COM_SEEK,這個命令的作用就非常有限了。你可以用它來獲取當前文件指針,或者通過獲取文件末尾offset的形式來獲得文件大小,但是不適用於非常大的文件(比如接近或大於4G的文件)。

2.2.4.20 SMB_COM_LOCK_AND_READ (0x13)

此命令在CorePlus中引入,但是經常作爲LAN Manager 1.0的一部分。此命令已廢棄。客戶端應該使用SMB_COM_LOCKING_ANDX來替代。

此命令用來鎖定並讀取一段常規文件中的數據。數據段首先被鎖定,然後被讀取。鎖類型是排他性的讀/寫鎖。如果服務器不能立即鎖定數據段,要返回給客戶端錯誤。如果沒有獲取到鎖,服務器不應該再去讀數據。

如果服務器返回的數據比請求的少,說明文件已經到末尾了。如果文件從文件末尾或者超過文件末尾的位置讀取,將會返回0字節。如果請求的字節數超過SMB連接中標記的MaxBufferSize大小,服務器會中斷此連接。此命令只適用於文件大小小於32-bit的情況。客戶端必須最少擁有文件的讀權限。

2.2.4.21 SMB_COM_WRITE_AND_UNLOCK (0x14)

此命令在CorePlus中引入,但是經常作爲LAN Manager 1.0的一部分。此命令已廢棄。客戶端應該使用SMB_COM_LOCKING_ANDX來替代。

此命令用來向文件中寫入一段數據並解鎖數據。通常用在SMB_COM_LOCK_AND_READ之後,作用在同一文件的同一數據段。服務器的響應消息中用ByteCountWritten來指示實際寫入的字節數。

除了不能處理0字節長度的寫操作外,此命令和SMB_COM_UNLOCK+ SMB_COM_WRITE命令組合具有相同的作用。對此命令的支持是可選的,如果支持,服務器應該在SMB_COM_NEGOTIATE 命令的響應消息中,將SMB Header的Flag字段的bit 0設爲1。如果消息長度超過了TID指定的MaxBufferSize(原句:If the command sends a message of length greater than the MaxBufferSize for the TID specified),服務器可以中斷此連接。如果寫數據過程中發生了錯誤,數據保持鎖狀態。

此命令只支持最大32-bit大小的文件,如果需要支持64-bit大小的文件,客戶端應該使用SMB_COM_WRITE_ANDX命令。

如果FID指示此文件是一個磁盤文件並且寫入數據的範圍超過了文件大小,文件會被擴充。文件末尾到指定的offset之間填充0x00。如果要求寫入的字節數爲0,不論指定offset是多少,文件大小都不會改變,既不會截斷也不會擴充。

客戶端必須最少擁有文件的寫權限

2.2.4.22 SMB_COM_READ_RAW (0x1A)

此命令在CorePlus中引入,但是經常作爲LAN Manager 1.0的一部分。此命令已廢棄。客戶端應該使用SMB_COM_READ_ANDX來替代。

如果服務器支持此命令,會在SMB_COM_NEGOTIATE命令的響應消息中設置CAP_RAW_MODE capabilities bit。

2.2.4.23 SMB_COM_READ_MPX (0x1B)

此命令在LAN Manager 1.0中引入,已被廢棄,在NT LAN Manager中被重新設計。在此文檔中只介紹其在NT LAN Manager中的行爲。詳情請見2.1.2.1

這是一個專門用於讀取普通文件中大塊數據的命令,使性能最大化,允許客戶端和服務器之間的其他操作同時進行。只有使用multiplexed session (見2.1.3)時纔有效。服務器在響應此命令請求時,會發幾個響應消息,直到請求的數據全部傳送完畢,或中間發生錯誤。每個響應消息中必須包含TID、UID、PID、MID、客戶端請求的CID、返回數據的offset和長度。

當客戶端收到響應中的DataLength之和等於希望獲取的字節數時(最小長度的數據段已收到),說明所有請求的數據都已傳送完畢。這種機制下,即使響應報文沒有按順序返回協議也可以正常工作。

一個事實是,如果請求的數據超出了磁盤文件的範圍,返回數據的總數可能小於請求的讀取的字節數。在這種情況下,只返回存在的字節。如果一個讀取請求的數據段範圍完全超出了文件,響應消息中Count要置爲0x0000.如果返回的字節數小於請求的字節數,表明已經讀到了文件的末尾(如果讀取的不是標準塊磁盤文件,只返回0字節來表明已到文件末尾)。

一旦開始讀取,需要一直執行完畢。客戶端期望收到所有客戶端的響應數據報。在命令執行期間,客戶端不能發送會引起衝突的命令(比如關閉文件命令)。

此命令只支持32-bit長度的文件。服務器可以支持此命令。如果服務器支持此命令,需要在SMB協議的傳輸協商響應中將Capabilities域置爲CAP_MPX_MODE (0x00000002)。

2.2.4.24 SMB_COM_READ_MPX_SECONDARY (0x1C)

此命令在LAN Manager 1.0中引入,在NT LAN Manager中被廢棄。

此命令不在被用來和SMB_COM_READ_MPX結合使用。客戶端不應該再發送此命令。服務器如果收到了這個命令,應該返回STATUS_NOT_IMPLEMENTED (ERRDOS/ERRbadfunc)。

2.2.4.25 SMB_COM_WRITE_RAW (0x1D)

此命令在CorePlus中引入,但是經常作爲LAN Manager 1.0的一部分。此命令已廢棄。客戶端應該使用SMB_COM_WRITE_ANDX來替代。

服務器對此命令的支持是可選的。如果支持,需要在協議協商過程中將CAP_RAW_MODE相應bit置位。

這是一個專門用於向打開的普通文件、命名管道、設備或後臺中寫入大量數據的命令。此命令允許客戶通過SMB傳輸大量的未格式化的數據(原始字節),而不用普通的SMB請求格式。也允許客戶端發送超過session啓動時規定最大buffer大小的消息。

服務器必須可以接收最多65535字節的原始數據。也必須允許客戶端的SMB_COM_WRITE_RAW請求中包含一個非格式化的消息。客戶端可能會使用此命令發送要寫入數據的一部分。

2.2.4.26 SMB_COM_WRITE_MPX (0x1E)

此命令在LAN Manager 1.0中引入,已被廢棄,在NT LAN Manager中被重新設計。在此文檔中只介紹其在NT LAN Manager中的行爲。詳情請見2.1.2.1

此命令用於客戶端向服務器寫入大量數據,使性能最大化。只有使用multiplexed session (見2.1.3)時纔有效。在一個命令交互中,所有請求和響應消息中的TID、UID、PID、MID、CID必須相同。

此命令只支持最大32-bit的文件。服務器對此命令的支持是可選的。如果服務器支持,必須在SMB協議協商時設置將Capabilities字段的CAP_MPX_MODE bit置位。

2.2.4.27 SMB_COM_WRITE_MPX_SECONDARY (0x1F)

此命令在LAN Manager 1.0中引入,在NT LAN Manager中被廢棄。

此命令不在被用來和SMB_COM_WRITE_MPX結合使用。客戶端不應該再發送此命令。服務器如果收到了這個命令,應該返回STATUS_NOT_IMPLEMENTED (ERRDOS/ERRbadfunc)。

2.2.4.28 SMB_COM_WRITE_COMPLETE (0x20)

此命令在LAN Manager 1.0中引入,已被廢棄。此命令由服務器在SMB_COM_WRITE_RAW的最後一個響應消息中發出。

2.2.4.29 SMB_COM_QUERY_SERVER (0x21)

此命令在NT LAN Manager中引入,但是還沒有實現。

客戶端不應該發送此命令,服務器收到此命令後應當返回STATUS_NOT_IMPLEMENTED (ERRDOS/ERRbadfunc)。

2.2.4.30 SMB_COM_SET_INFORMATION2 (0x22)

此命令在LAN Manager 1.0中引入,已被廢棄。新的客戶端應當使用SMB_COM_TRANSACTION2的子命令TRANS2_SET_FILE_INFORMATION來替代。

此命令可以被客戶端用來設置服務器上一個打開文件的屬性。客戶端要在SMB頭部提供一個有效的FID。這個FID由前面成功打開文件的命令獲得。客戶端必須最少擁有文件的寫權限。目標文件的屬性將按照請求更新。如果請求中的date或time爲0,表明服務器不要修改文件的這兩個屬性。和SMB_COM_SET_INFORMATION(2.2.4.10)相比,此命令允許客戶端設置更多的文件屬性。

2.2.4.31 SMB_COM_QUERY_INFORMATION2 (0x23)

此命令在LAN Manager 1.0中引入,已被廢棄。新的客戶端應當使用SMB_COM_TRANSACTION2的子命令TRANS2_QUERY_FILE_INFORMATION來替代。

此命令可以被客戶端用來獲取服務器上一個打開文件的屬性。客戶端在請求消息中必須提供合法的FID。這個FID由前面成功打開文件的命令獲得。和SMB_COM_QUERY_INFORMATION相比,此命令允許客戶端獲取更多的文件屬性。服務器只能提供最大32-bit的文件的屬性。

2.2.4.32 SMB_COM_LOCKING_ANDX (0x24)

此命令在LAN Manager 1.0中引入,不適用大於32-bit的文件。支持最大64-bit的實現在NT LAN Manager中引入。

此命令用來鎖定一個普通文件中一段連續的數據。支持鎖定任一指定文件中任意多的數據段,前提是這些數據段沒有重疊的部分。鎖定可以防止其他進程使用一個獨立的文件句柄(FID)對文件鎖定部分進行鎖、讀和寫操作。任何進程使用獲取鎖的文件的FID都可以訪問被鎖定的數據(原句:Locks prevent attempts to lock, read, or write the locked portion of the file by other processes using a separate file handle (FID). Any process using the same FID specified in the request that obtained the lock has access to the locked bytes.

此命令也可以被服務器用來發送一個OpLock中斷通知消息給客戶端,客戶端收到後發送確認消息。這是CIFS協議中服務器發送請求消息的一個例子。

下面列舉的是SMB_COM_LOCKING_ANDX後可能發送的命令

·        SMB_COM_CLOSE (section 2.2.4.5 )

·        SMB_COM_FLUSH (section 2.2.4.6 )

·        SMB_COM_LOCKING_ANDX

·        SMB_COM_READ (section 2.2.4.11 )

·        SMB_COM_READ_ANDX (section 2.2.4.42 )

·        SMB_COM_WRITE (section 2.2.4.12 )

·        SMB_COM_WRITE_ANDX (section 2.2.4.43 )

2.2.4.33 SMB_COM_TRANSACTION (0x25)

此命令在LAN Manager 1.0中引入。

此命令爲事務處理協議的傳輸子協議服務。這些命令可以用於CIFS文件系統內部通信的郵箱和命名管道。如果出書的數據超過了會話建立時規定的MaxBufferSize,必須使用SMB_COM_TRANSACTION_SECONDARY命令來傳輸超出的部分:SMB_Data.Trans_Data 和 SMB_Data.Trans_Parameter。這兩部分在初始化消息中沒有固定。

如果客戶端沒有發送完所有的SMB_Data.Trans_Data,會將DataCount設置爲小於TotalDataCount的一個值。同樣的,如果SMB_Data.Trans_Parameters沒有發送完,會設置ParameterCount爲一個小於TotalParameterCount的值。參數部分優先級高於數據部分,客戶端在每個消息中應該儘量多的發送數據。服務器應該可以接收無序到達的SMB_Data.Trans_Parameters 和 SMB_Data.Trans_Data,不論是大量還是少量的數據。

在請求和響應消息中,SMB_Data.Trans_Parameters和SMB_Data.Trans_Data的位置和長度都是由SMB_Parameters.ParameterOffset、SMB_Parameters.ParameterCount,SMB_Parameters.DataOffset和SMB_Parameters.DataCount決定。另外需要說明的是,SMB_Parameters.ParameterDisplacement和SMB_Parameters.DataDisplacement可以用來改變發送數據段的序號。服務器應該優先發送SMB_Data.Trans_Parameters。客戶端應該準備好組裝收到的SMB_Data.Trans_Parameters和SMB_Data.Trans_Data,即使它們是亂序到達的。

2.2.4.34 SMB_COM_TRANSACTION_SECONDARY (0x26)

此命令在LAN Manager 1.0中引入。

此命令用來完成SMB_COM_TRANSACTION中未傳輸完畢數據的傳輸。

在請求和響應消息中,SMB_Data.Trans_Parameters和SMB_Data.Trans_Data的位置和長度都是由SMB_Parameters.ParameterOffset、SMB_Parameters.ParameterCount,SMB_Parameters.DataOffset和SMB_Parameters.DataCount決定。另外需要說明的是,SMB_Parameters.ParameterDisplacement和SMB_Parameters.DataDisplacement可以用來改變發送數據段的序號。服務器應該優先發送SMB_Data.Trans_Parameters。客戶端應該準備好組裝收到的SMB_Data.Trans_Parameters和SMB_Data.Trans_Data,即使它們是亂序到達的。

2.2.4.35 SMB_COM_IOCTL (0x27)

此命令在LAN Manager 1.0中引入,在NT LAN Manager中被廢棄。NT LAN Manager

同時去掉了多路請求和響應消息的傳輸行爲的支持(原句:NT LAN Manager also removed the transaction-like behavior that supported multiple request and response messages to complete an IOCTL)。此命令現在支持一個信號請求及其後的信號響應。

此命令發送一個設備或文件的IOCTL請求到服務器,然後返回IOCTL的響應給客戶端。目標設備或文件由FID區分。請求消息要求指定的設備執行指定的功能。此功能並不是由SMB協議提供,而是由CIFS運行所在的系統提供。協議只是簡單的傳送請求和響應。

2.2.4.36 SMB_COM_IOCTL_SECONDARY (0x28)

此命令在LAN Manager 1.0中引入,在NT LAN Manager中被廢棄,經過考慮後保留但不實現。客戶端不應該使用這個命令,服務器收到此命令後要返回STATUS_NOT_IMPLEMENTED (ERRDOS/ERRbadfunc)。

這個命令是與SMB_COM_IOCTL配合的,但是SMB_COM_IOCTL也已被廢棄。

2.2.4.37 SMB_COM_COPY (0x29)

此命令在LAN Manager 1.0中引入,在NT LAN Manager中被廢棄。

此命令用來執行服務器側的文件拷貝,現在已不使用。客戶端不應該使用這個命令,服務器收到此命令後要返回STATUS_NOT_IMPLEMENTED (ERRDOS/ERRbadfunc)。

2.2.4.38 SMB_COM_MOVE (0x2A)

此命令在LAN Manager 1.0中引入,在NT LAN Manager中被廢棄。

此命令用來移動服務器上的文件,現在已不使用。客戶端不應該使用這個命令,服務器收到此命令後要返回STATUS_NOT_IMPLEMENTED (ERRDOS/ERRbadfunc)。

2.2.4.39 SMB_COM_ECHO (0x2B)

此命令在LAN Manager 1.0中引入。

客戶端發送此命令測試和服務器的傳輸層連接。

2.2.4.40 SMB_COM_WRITE_AND_CLOSE (0x2C)

此命令在LAN Manager 1.0中引入,已被廢棄。客戶端應該使用SMB_COM_WRITE_ANDX命令替代。

此命令用來向指定的FID的文件寫入一段數據並關閉文件。和SMB_COM_WRITE+ SMB_COM_CLOSE組合具有相同的功能。詳細情況請查看SMB_COM_WRITE和SMB_COM_CLOSE命令。命令支持兩種請求格式:一種6個參數,另一種12個參數。

此命令只支持最大32-bit大小的文件,客戶端應該使用SMB_COM_WRITE_ANDX以支持最大64-bit大小的文件。

客戶端至少要擁有文件的寫權限。如果在寫文件到磁盤過程中出錯,服務器應該關閉文件。

2.2.4.41 SMB_COM_OPEN_ANDX (0x2D)

此命令在LAN Manager 1.0中引入。

此命令用來創建並打開一個文件,或者打開一個已存在的普通文件,並執行命令鏈中的命令。命令鏈詳情見3.2.4.1.1,命令中包含客戶端要打開的文件名,命名管道或設備。如果執行成功,服務器響應消息中要攜帶一個合法的FID。客戶端在後續對此文件的操作請求中要提供相同的FID。

下面這些命令是可以放在SMB_COM_OPEN_ANDX命令的AndX鏈中:

·        SMB_COM_READ (section 2.2.4.11)

·        SMB_COM_READ_ANDX (section 2.2.4.42 )

·        SMB_COM_IOCTL (section 2.2.4.35 )

·        SMB_COM_NO_ANDX_COMMAND (section 2.2.4.75 )

 

2.2.4.42 SMB_COM_READ_ANDX (0x2E)

此命令在LAN Manager 1.0中引入,在NT LAN Manager中對其進行了擴展。

此命令用來讀取數據,可以讀取普通文件,命名管道,或直接訪問設別,比如串口(COM)或打印機接口(LPT)。如果客戶端用NT LAN Manager或以後的版本協商,應該發送帶有12個參數的請求,這個版本支持最大64-bit的文件。此命令是唯一一個支持讀取64-bit大小文件的讀取命令。

下面這些命令是可以放在SMB_COM_READ_ANDX命令的AndX鏈中:

·        SMB_COM_CLOSE (section 2.2.4.5 )

2.2.4.43 SMB_COM_WRITE_ANDX (0x2F)

此命令在LAN Manager 1.0中引入。

此命令用來向普通文件,命名管道,或直接訪問設別,比如串口(COM)或打印機接口(LPT)中寫入數據。如果客戶端用NT LAN Manager或以後的版本協商,應該發送帶有14個參數的請求,這個版本支持最大64-bit的文件。此命令是唯一一個支持寫64-bit大小文件的讀取命令。

下面這些命令是可以放在SMB_COM_WRITE_ANDX命令的AndX鏈中:

·        SMB_COM_READ (section 2.2.4.11 )

·        SMB_COM_READ_ANDX (section 2.2.4.42 )

·        SMB_COM_LOCK_AND_READ (section 2.2.4.20 )

·        SMB_COM_CLOSE (section 2.2.4.5 )

2.2.4.44 SMB_COM_NEW_FILE_SIZE (0x30)

此命令保留但是沒有實現,也沒有定義。它在[SNIA]中被列出,但是並沒有被定義,在其他參考資料中也沒有出現過。

客戶端不應該發送此命令,服務器收到此命令後應該返回STATUS_NOT_IMPLEMENTED (ERRDOC/ERRbadfunc)

2.2.4.45 SMB_COM_CLOSE_AND_TREE_DISC (0x31)

此命令在NT LAN Manager中引入,但是被保留沒有實現。

客戶端不應該發送此命令,服務器收到此命令後應該返回STATUS_NOT_IMPLEMENTED (ERRDOC/ERRbadfunc)

2.2.4.46 SMB_COM_TRANSACTION2 (0x32)

此命令在LAN Manager 1.2中引入。

此子命令支持服務器文件系統更豐富的語義集。允許客戶端設置和獲取擴展的key/value屬性對,支持長文件名(比原始的8.3名字格式要長),可以執行目錄搜索及其他任務。

如果客戶端沒有發送完所有的SMB_Data.Trans_Data,會將DataCount設置爲小於TotalDataCount的一個值。同樣的,如果SMB_Data.Trans_Parameters沒有發送完,會設置ParameterCount爲一個小於TotalParameterCount的值。參數部分優先級高於數據部分,客戶端在每個消息中應該儘量多的發送數據。服務器應該可以接收無序到達的SMB_Data.Trans_Parameters 和 SMB_Data.Trans_Data,不論是大量還是少量的數據。

在請求和響應消息中,SMB_Data.Trans2_Parameters和SMB_Data.Trans2_Data的位置和長度都是由SMB_Parameters.ParameterOffset、SMB_Parameters.ParameterCount,SMB_Parameters.DataOffset和SMB_Parameters.DataCount決定。另外需要說明的是,SMB_Parameters.ParameterDisplacement和SMB_Parameters.DataDisplacement可以用來改變發送數據段的序號。服務器應該優先發送SMB_Data.Trans2_Parameters。客戶端應該準備好組裝收到的SMB_Data.Trans2_Parameters和SMB_Data.Trans2_Data,即使它們是亂序到達的。

2.2.4.47 SMB_COM_TRANSACTION2_SECONDARY (0x33)

此命令在LAN Manager 1.2中引入。

此命令用來完成SMB_COM_TRANSACTION2中未傳完的數據。

2.2.4.48 SMB_COM_FIND_CLOSE2 (0x34)

此命令在LAN Manager 1.2中引入。

此命令用來關閉由命令TRANS2_FIND_FIRST2而打開的搜索句柄,服務器釋放所有和此句柄相關的資源。

2.2.4.49 SMB_COM_FIND_NOTIFY_CLOSE (0x35)

此命令在LAN Manager 1.2中引入,被保留而沒有使用。

此命令用來關閉由命令TRANS2_FIND_NOTIFY_FIRST打開的目錄搜索句柄。命令TRANS2_FIND_NOTIFY_FIRST和TRANS2_FIND_NOTIFY_NEXT同樣沒有使用。

客戶端不應該發送此命令,服務器收到此命令後應該返回STATUS_NOT_IMPLEMENTED (ERRDOC/ERRbadfunc)

2.2.4.50 SMB_COM_TREE_CONNECT (0x70)

這是一個原始核心協議命令,已被廢棄,客戶端應該使用SMB_COM_TREE_CONNECT_ANDX來替代。

此命令用來建立一條客戶端和服務器之間的連接,共享資源依靠共享名確定。連接建立後,此連接將用服務器返回的TID作爲識別標記。

2.2.4.51 SMB_COM_TREE_DISCONNECT (0x71)

這是一個原始核心協議命令。

此命令用來關閉客戶端訪問服務器資源時使用的一條邏輯連接,連接依靠SMB頭部的TID識別,斷開後服務器將此TID視爲無效的TID。所有和此TID相關的文件、目錄及其他資源都被釋放,文件和目錄的鎖也會被釋放。

2.2.4.52 SMB_COM_NEGOTIATE (0x72)

這是一個原始核心協議命令。

此命令用來初始化服務器和客戶端之間的SMB會話,必須在其他任何SMB命令發送之前完成。

每個SMB會話只能有一次協商過程,後續的SMB_COM_NEGOTIATE會被服務器拒絕並返回一個錯誤響應。

2.2.4.53 SMB_COM_SESSION_SETUP_ANDX (0x73)

此命令在LAN Manager 1.0中引入。相比最初的定義,請求和響應消息的格式都有所改變。本文介紹CIFS格式,在NT LAN Manager中定義。當協商使用NT LAN Manager時必須使用此格式。

此命令用來配置一個SMB會話。如果服務器運行在user級訪問控制模式,至少發送一個SMB_COM_SESSION_SETUP_ANDX命令,執行用戶登錄服務器並建立一個有效的UID。

在CIFS協議中,在SMB_COM_SESSION_SETUP_ANDX命令執行成功之前發送SMB_COM_TREE_CONNECT或SMB_COM_TREE_CONNECT_ANDX是違反協議的,即使服務器運行在share級的訪問控制模式。在SMB_COM_SESSION_SETUP_ANDX請求之後,包含SMB_COM_TREE_CONNECT_ANDX批處理請求的AndX鏈可以滿足這一需求,匿名認證也可以滿足這一需求(原句:Including an SMB_COM_TREE_CONNECT_ANDX batched request in an AndX chain (section 2.2.3.4) following an SMB_COM_SESSION_SETUP_ANDX request is sufficient to fulfill this requirement. Anonymous authentication is also sufficient to fulfill this requirement)。

一個SMB會話用允許有多個SMB_COM_SESSION_SETUP_ANDX,用來建立額外的UID或建立額外的虛擬鏈路。

下面的命令可以放在SMB_COM_SESSION_SETUP_ANDX後面的AndX鏈中:

·        SMB_COM_TREE_CONNECT_ANDX (section 2.2.4.55 )

·        SMB_COM_OPEN (section 2.2.4.3 )

·        SMB_COM_OPEN_ANDX (section 2.2.4.41 )

·        SMB_COM_CREATE (section 2.2.4.4 )

·        SMB_COM_CREATE_NEW (section 2.2.4.16 )

·        SMB_COM_CREATE_DIRECTORY (section 2.2.4.17 )

·        SMB_COM_DELETE (section 2.2.4.7 )

·        SMB_COM_DELETE_DIRECTORY (section 2.2.4.2 )

·        SMB_COM_FIND (section 2.2.4.59 )

·        SMB_COM_FIND_UNIQUE (section 2.2.4.60 )

·        SMB_COM_RENAME (section 2.2.4.8 )

·        SMB_COM_NT_RENAME (section 2.2.4.66 )

·        SMB_COM_CHECK_DIRECTORY (section 2.2.4.17)

·        SMB_COM_QUERY_INFORMATION (section 2.2.4.57 )

·        SMB_COM_SET_INFORMATION (section 2.2.4.10 )

·        SMB_COM_OPEN_PRINT_FILE (section 2.2.4.67 )

·        SMB_COM_TRANSACTION (section 2.2.4.33 )

2.2.4.54 SMB_COM_LOGOFF_ANDX (0x74)

SMB頭部UID標記的用戶被註銷,服務器將釋放所有此UID相關的資源,包括釋放鎖,關閉所有的文件,斷開連接,取消所有沒有處理完的命令,標記此UID無效。

下面的命令可以放在SMB_COM_LOGOFF_ANDX後面的AndX鏈中:

·        SMB_COM_SESSION_SETUP_ANDX.

2.2.4.55 SMB_COM_TREE_CONNECT_ANDX (0x75)

此命令在LAN Manager 1.0中引入。

此命令用來建立一條客戶端和服務器之間的連接,共享資源依靠共享名確定。連接建立後,此連接將用服務器返回的TID作爲識別標記。

下面的命令可以放在SMB_COM_TREE_CONNECT_ANDX後面的AndX鏈中:

·        SMB_COM_OPEN (section 2.2.4.3 )

·        SMB_COM_OPEN_ANDX (section 2.2.4.41 )

·        SMB_COM_CREATE (section 2.2.4.4 )

·        SMB_COM_CREATE_NEW (section 2.2.4.16 )

·        SMB_COM_CREATE_DIRECTORY (section 2.2.4.17 )

·        SMB_COM_DELETE (section 2.2.4.7 )

·        SMB_COM_DELETE_DIRECTORY (section 2.2.4.2 )

·        SMB_COM_SEARCH (section 2.2.4.58 )

·        SMB_COM_FIND (section 2.2.4.59 )

·        SMB_COM_FIND_UNIQUE (section 2.2.4.60 )

·        SMB_COM_RENAME (section 2.2.4.8 )

·        SMB_COM_NT_RENAME (section 2.2.4.66 )

·        SMB_COM_CHECK_DIRECTORY (section 2.2.4.17)

·        SMB_COM_QUERY_INFORMATION (section 2.2.4.9 )

·        SMB_COM_SET_INFORMATION (section 2.2.4.10 )

·        SMB_COM_OPEN_PRINT_FILE (section 2.2.4.67 )

·        SMB_COM_TRANSACTION (section 2.2.4.33 )

2.2.4.56 SMB_COM_SECURITY_PACKAGE_ANDX (0x7E)

此命令在LAN Manager 1.0中引入,現在已被廢棄。

此命令用來協商包加密以及相關信息,但是現在已不再使用。關於此命令的實現描述可以在[XOPEN-SMB]的11.2節找到。

客戶端不應該發送此命令,服務器收到此命令後應該返回STATUS_NOT_IMPLEMENTED (ERRDOC/ERRbadfunc)

2.2.4.57 SMB_COM_QUERY_INFORMATION_DISK (0x80)

這是一個核心協議命令,已被廢棄。新的實現使用SMB_COM_TRANSACTION2和其子命令TRANS2_QUERY_FS_INFORMATION。

此命令可以由客戶端發送,在SMB頭部指明TID,獲取相關目錄的空間及剩餘空間大小。客戶端必須提供一個有效的TID,此TID應該由前面相關的SMB命令獲取到的。

響應消息中返回的塊或已申請單元大小,可能會與服務器實際物理或邏輯分配算法不一樣,但是必須真實反映服務器上空間大小。

響應消息爲每個域只返回16bit大小的信息,可能有些系統會請求大於此大小的信息。TotalUnits通常要遠大於65535. 然而,典型的客戶端一般只是請求磁盤大小和可用空間大小,因此服務器應該調整BlocksPerUnit和BlockSize的單位來適應16-bit的限制。如果經過調整還是超過了16-bit的限制,應該返回TotalUnits和FreeUnits所能表達的最大值。

2.2.4.58 SMB_COM_SEARCH (0x81)

這是一個原始核心協議命令,已被廢棄。新的實現使用TRANS2_FIND_FIRST2代替。

此命令用來在目錄中搜索名字與指定通配符模板匹配的文件或其它對象。響應消息中在允許的最大傳輸字節內返回儘可能多的匹配的名字。響應消息中也包含一個key,用在後面的SMB_COM_SEARCH命令中返回下一組匹配的名字。

此命令只返回8.3格式的文件名稱,和文件的基本屬性,不支持Unicode,文件名只以擴展ASCII(OEM)字符返回。此命令後續沒有關閉的操作。服務器要管理搜索的狀態,直到搜索完成,或者PID或TID關閉,UID被置爲無效(註銷),或會話關閉。

2.2.4.59 SMB_COM_FIND (0x82)

此命令在LAN Manager 1.0中引入,已被廢棄。新的實現使用SMB_COM_TRANSACTION2的子命令TRANS2_FIND_FIRST2來替代。

此命令的結構和目的都和SMB_COM_SEARCH相同,唯一不同的是有一個匹配的SMB_COM_FIND_CLOSE命令,允許用戶主動關閉一個搜索操作。

2.2.4.60 SMB_COM_FIND_UNIQUE (0x83)

此命令在LAN Manager 1.0中引入,已被廢棄。新的實現使用SMB_COM_TRANSACTION2的子命令TRANS2_FIND_FIRST2來替代。

SMB_COM_FIND_UNIQUE有着和SMB_COM_SEARCH及SMB_COM_FIND幾乎一樣的格式,不同的是請求消息中沒有SMB_Date.ResumeKey。和SMB_COM_SEARCH及SMB_COM_FIND用法不同的是,它不要求服務器管理搜索上下文或其它狀態。命令是單獨使用的,沒有後續命令。

和其它的搜索命令一樣,請求可以包含至少一個的匹配名字。當響應返回後,搜索關閉。

2.2.4.61 SMB_COM_FIND_CLOSE (0x84)

此命令在LAN Manager 1.0中引入,已被廢棄。新的實現使用SMB_COM_TRANSACTION2的子命令TRANS2_FIND_FIRST2替代。

此命令關閉由SMB_COM_FIND打開的目錄搜索。初始化SMB_COM_FIND請求邏輯上打開並啓動了搜索。後續的SMB_COM_FIND使用合法的ResumeKey可以繼續搜索。SMB_COM_FIND_CLOSE關閉了搜索,服務器釋放管理搜索上下文用到的所有資源。

如果SMB_COM_FIND失敗(返回錯誤),搜索不會打開,這個命令也不用調用來關閉搜索。此命令不應該用來關閉SMB_COM_SEARCH開啓的搜索。

此命令的格式和SMB_COM_SEARCH及SMB_COM_FIND幾乎相同,只是響應消息中沒有字段SMB_Data.DirectoryInformationData。

2.2.4.62 SMB_COM_NT_TRANSACT (0xA0)

此命令在NT LAN Manager中引入。

此命令擴展了由SMB_COM_TRANSACTION2提供的文件系統訪問服務,允許處理非常大的參數和數據塊。

SMB_COM_NT_TRANSACT消息可以超過單個SMB消息允許的最大值(由參數MaxBufferSize決定)。在這種情況下,客戶端使用一個或多個SMB_COM_NT_TRANSACT_SECONDARY消息來傳輸和消息初始化不匹配的data和Parameter。

如果客戶端沒有發送完所有的SMB_Data.Trans_Data,會將DataCount設置爲小於TotalDataCount的一個值。同樣的,如果SMB_Data.Trans_Parameters沒有發送完,會設置ParameterCount爲一個小於TotalParameterCount的值。參數部分優先級高於數據部分,客戶端在每個消息中應該儘量多的發送數據。服務器應該可以接收無序到達的SMB_Data.Trans_Parameters 和 SMB_Data.Trans_Data,不論是大量還是少量的數據。

在請求和響應消息中,SMB_Data.NT_Trans_Parameters和SMB_Data.nt_Trans_Data的位置和長度都是由SMB_Parameters.ParameterOffset、SMB_Parameters.ParameterCount,SMB_Parameters.DataOffset和SMB_Parameters.DataCount決定。另外需要說明的是,SMB_Parameters.ParameterDisplacement和SMB_Parameters.DataDisplacement可以用來改變發送數據段的序號。服務器應該按照自己順序發送,優先發送SMB_Data.NT_Trans_Parameters。客戶端應該準備好組裝收到的SMB_Data.NT_Trans_Parameters和SMB_Data.NT_Trans_Data,即使它們是亂序到達的。

2.2.4.63 SMB_COM_NT_TRANSACT_SECONDARY (0xA1)

此命令用來完成SMB_COM_NT_TRANSACT中未傳完的數據。

2.2.4.64 SMB_COM_NT_CREATE_ANDX (0xA2)

此命令在NT LAN Manager中引入。

此命令用來創建並打開一個新文件,或者打開一個已存在的文件,或打開並清空一個已存在的文件,或創建一個目錄,或創建一個命名管道。返回的FID可以用在後續的請求消息中。

消息中包含客戶端想要創建或打開的文件名,目錄,或命名管道和RootDirectoryFID。如果執行成功,服務器返回一個FID標記打開的資源。客戶端在後續的請求消息中必須攜帶此FID。客戶端必須擁有對資源所在目錄的寫權限,才能創建一個新的文件或目錄;或者擁有文件的寫權限來執行截斷文件的操作。

下面的命令可以放在SMB_COM_NT_CREATE_ANDX後面的AndX鏈中:

·        SMB_COM_READ (section 2.2.4.11 )

·        SMB_COM_READ_ANDX (section 2.2.4.42 )

·        SMB_COM_IOCTL (section 2.2.4.35 )

2.2.4.65 SMB_COM_NT_CANCEL (0xA4)

此命令在NT LAN Manager中引入。

此命令使客戶端可以取消掉pending態的請求。服務器用SMB_Header中的信息識別客戶端想要取消哪些請求,服務器可以取消或立即處理這些請求。服務器對此消息不能回覆響應消息。客戶端應該依靠服務器對指定取消的消息的響應來判斷取消消息的結果。如果服務器不能識別客戶端請求中的指定消息,也不應該發送響應。

此命令主要用來取消由SMB_COM_NT_TRANSACT和NT_TRANSACT_NOTIFY_CHANGE子命令引起的多餘的通知消息。客戶端一般用NT_TRANSACT_NOTIFY_CHANGE命令避免輪詢目錄的改變。此命令另外的用途包括取消一個無限期等待繁忙資源的請求,或嘗試很多次來等待一個資源的請求。

2.2.4.66 SMB_COM_NT_RENAME (0xA5)

此命令在NT LAN Manager中引入,已不使用。

客戶端可以使用此命令在源端服務器上建立一個硬鏈接,來執行一個本地的文件重命名,並在存在的路徑結構上移動文件(原句:to perform an in-place file rename, and to move a file within its existing path hierarchy)。詳情請看請求消息中的InformationLevel字段。此命令不支持目錄或文件名中含有通配符,每次只操作一個文件。已存在的文件不能被覆蓋。如果請求消息中NewFileName爲空,新文件的目標路徑必須是文件頭部TID所表示的目錄的根目錄。在本地重命名是,文件路徑必須相同,否則會返回一個錯誤碼。

2.2.4.67 SMB_COM_OPEN_PRINT_FILE (0xC0)

這是一個原始核心協議命令。

此命令用來創建一個打印隊列緩衝文件。此文件將會在打印機中排隊。當文件打印完畢後,服務器應該刪除這個文件。

2.2.4.68 SMB_COM_WRITE_PRINT_FILE (0xC1)

這是一個原始核心協議,已不使用。應該使用SMB_COM_WRITE_ANDX來向打開的spool文件寫入數據。

此命令用來向打開的打印隊列spool文件中寫入數據。

最先寫入打印文件的數據是打印機的控制信息,控制信息的長度由SMB_COM_OPEN_PRINT_FILE請求命令中的參數SMB_Parameters.Words.SetupLength指定。在一個SMB_COM_WRITE_PRINT_FILE中可以同時包含打印機控制數據和打印文件數據,只要保證控制數據已完全寫入即可。

2.2.4.69 SMB_COM_CLOSE_PRINT_FILE (0xC2)

這是一個原始核心協議命令,已不使用。客戶端應該使用SMB_COM_CLOSE來關閉由SMB_COM_OPEN_PRINT_FILE打開的spool文件。

此命令關閉指定的打印隊列spool文件,會觸發服務器將此文件排隊並打印。

2.2.4.70 SMB_COM_GET_PRINT_QUEUE (0xC3)

這是一個原始核心協議(見[SMB-CORE]5.26章節)。在NT LAN Manager中註明已不使用,在[CIFS]中指定爲可選。

此命令用來產生一個和指定TID相關的打印隊列的對象列表,客戶端不應該發送此命令,服務器收到此命令後應該返回STATUS_NOT_IMPLEMENTED (ERRDOC/ERRbadfunc)

2.2.4.71 SMB_COM_READ_BULK (0xD8)

此命令被保留沒有使用。它被列在早期的微軟和第三方的文檔中。儘管如此,此命令還沒有一個正式的定義,並且也從沒有被使用過。兩個相關的命令SMB_COM_WRITE_BULK和SMB_COM_WRITE_BULK_DATA也從來沒有被使用過。

客戶端不應該發送此命令,服務器收到此命令後應該返回STATUS_NOT_IMPLEMENTED (ERRDOC/ERRbadfunc)

2.2.4.72 SMB_COM_WRITE_BULK (0xD9)

此命令被保留沒有使用。它被列在早期的微軟和第三方的文檔中。儘管如此,此命令還沒有一個正式的定義,並且也從沒有被使用過。兩個相關的命令SMB_COM_READ_BULK和SMB_COM_WRITE_BULK_DATA也從來沒有被使用過。

客戶端不應該發送此命令,服務器收到此命令後應該返回STATUS_NOT_IMPLEMENTED (ERRDOC/ERRbadfunc)

2.2.4.73 SMB_COM_WRITE_BULK_DATA (0xDA)

此命令被保留沒有使用。它被列在早期的微軟和第三方的文檔中。儘管如此,此命令還沒有一個正式的定義,並且也從沒有被使用過。兩個相關的命令SMB_COM_READ_BULK和SMB_COM_WRITE_BULK也從來沒有被使用過。

客戶端不應該發送此命令,服務器收到此命令後應該返回STATUS_NOT_IMPLEMENTED (ERRDOC/ERRbadfunc)

2.2.4.74 SMB_COM_INVALID (0xFE)

此命令在LAN Manager 1.0中引入。這是一個保留的值,指明一個非法的命令。

客戶端不應該發送此命令,服務器收到此命令後應該返回STATUS_SMB_BAD_COMMAND (ERRDOC/ERRbadfunc)

2.2.4.75 SMB_COM_NO_ANDX_COMMAND (0xFF)

此命令在LAN Manager 1.0中引入。設計此命令的目的是用來指明一個AndX鏈的結束。

客戶端不應該在主命令中使用此命令,服務器在主命令中收到此命令後應該返回STATUS_SMB_BAD_COMMAND (ERRSRV/ERRbadcmd)

在早期的SMB協議規格(見[IBM-SMB])中,此命令保留來做特定協議的擴展。這個用法已過時。在最新的微軟協議文檔中,包括[SMB-CORE]和[MSFT-XEXTNP],都沒有描述此命令作爲協議擴展或其它目的的作用。

參考資料:

http://msdn.microsoft.com/en-us/library/ee441741%28PROT.13%29.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章