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

This commit is contained in:
Tal Aloni 2017-07-24 16:28:50 +03:00
parent 8aad4adb9c
commit fc96dfcb4c
3 changed files with 7 additions and 4 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;