Kaynağa Gözat

SMB1: NTTransactionHelper / TransactionHelper: Store MaxParameterCount (required for NT_TRANSACT_NOTIFY_CHANGE)

Tal Aloni 7 yıl önce
ebeveyn
işleme
fc96dfcb4c

+ 2 - 1
SMBLibrary/Server/ConnectionState/ProcessStateObject.cs

@@ -13,7 +13,8 @@ namespace SMBLibrary.Server
     internal class ProcessStateObject
     {
         public ushort SubcommandID;
-        public uint MaxDataCount; // The maximum number of TransactionData bytes that the client accepts in the transaction response
+        public uint MaxParameterCount; // The maximum number of Trans_Parameters bytes that the client accepts in the transaction response
+        public uint MaxDataCount;      // The maximum number of Trans_Data bytes that the client accepts in the transaction response
         public string Name; // The pathname of the [..] named pipe to which the transaction subcommand applies, or a client-supplied [..] name for the transaction.
         public byte[] TransactionSetup;
         public byte[] TransactionParameters;

+ 4 - 3
SMBLibrary/Server/SMB1/NTTransactHelper.cs

@@ -25,6 +25,7 @@ namespace SMBLibrary.Server.SMB1
                 // A secondary transaction request is pending
                 ProcessStateObject processState = state.CreateProcessState(header.PID);
                 processState.SubcommandID = (ushort)request.Function;
+                processState.MaxParameterCount = request.MaxParameterCount;
                 processState.MaxDataCount = request.MaxDataCount;
                 processState.TransactionSetup = request.Setup;
                 processState.TransactionParameters = new byte[request.TotalParameterCount];
@@ -38,7 +39,7 @@ namespace SMBLibrary.Server.SMB1
             else
             {
                 // We have a complete command
-                return GetCompleteNTTransactResponse(header, request.MaxDataCount, request.Function, request.Setup, request.TransParameters, request.TransData, share, state);
+                return GetCompleteNTTransactResponse(header, request.MaxParameterCount, request.MaxDataCount, request.Function, request.Setup, request.TransParameters, request.TransData, share, state);
             }
         }
 
@@ -67,11 +68,11 @@ namespace SMBLibrary.Server.SMB1
             {
                 // We have a complete command
                 state.RemoveProcessState(header.PID);
-                return GetCompleteNTTransactResponse(header, processState.MaxDataCount, (NTTransactSubcommandName)processState.SubcommandID, processState.TransactionSetup, processState.TransactionParameters, processState.TransactionData, share, state);
+                return GetCompleteNTTransactResponse(header, processState.MaxParameterCount, processState.MaxDataCount, (NTTransactSubcommandName)processState.SubcommandID, processState.TransactionSetup, processState.TransactionParameters, processState.TransactionData, share, state);
             }
         }
 
-        internal static List<SMB1Command> GetCompleteNTTransactResponse(SMB1Header header, uint maxDataCount, NTTransactSubcommandName subcommandName, byte[] requestSetup, byte[] requestParameters, byte[] requestData, ISMBShare share, SMB1ConnectionState state)
+        internal static List<SMB1Command> GetCompleteNTTransactResponse(SMB1Header header, uint maxParameterCount, uint maxDataCount, NTTransactSubcommandName subcommandName, byte[] requestSetup, byte[] requestParameters, byte[] requestData, ISMBShare share, SMB1ConnectionState state)
         {
             NTTransactSubcommand subcommand = NTTransactSubcommand.GetSubcommandRequest(subcommandName, requestSetup, requestParameters, requestData, header.UnicodeFlag);
             NTTransactSubcommand subcommandResponse = null;

+ 1 - 0
SMBLibrary/Server/SMB1/TransactionHelper.cs

@@ -27,6 +27,7 @@ namespace SMBLibrary.Server.SMB1
             {
                 // A secondary transaction request is pending
                 ProcessStateObject processState = state.CreateProcessState(header.PID);
+                processState.MaxParameterCount = request.MaxParameterCount;
                 processState.MaxDataCount = request.MaxDataCount;
                 processState.Name = request.Name;
                 processState.TransactionSetup = request.Setup;