From 859e939cffc1f4c9178ec65ba4f0c81e54da50c4 Mon Sep 17 00:00:00 2001 From: Tal Aloni Date: Thu, 19 Jan 2017 22:57:46 +0200 Subject: [PATCH] Minor refactoring --- .../Server/SMB1/SMB1FileSystemHelper.Find.cs | 18 ++++++++++ .../SMB1/Transaction2SubcommandHelper.cs | 36 +++++-------------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/SMBLibrary/Server/SMB1/SMB1FileSystemHelper.Find.cs b/SMBLibrary/Server/SMB1/SMB1FileSystemHelper.Find.cs index 36ba98c..9562cd1 100644 --- a/SMBLibrary/Server/SMB1/SMB1FileSystemHelper.Find.cs +++ b/SMBLibrary/Server/SMB1/SMB1FileSystemHelper.Find.cs @@ -14,6 +14,24 @@ namespace SMBLibrary.Server.SMB1 { public partial class SMB1FileSystemHelper { + /// + public static FindInformationList GetFindInformationList(List entries, FindInformationLevel informationLevel, bool isUnicode, bool returnResumeKeys, int maxLength) + { + FindInformationList result = new FindInformationList(); + for (int index = 0; index < entries.Count; index++) + { + FindInformation infoEntry = GetFindInformation(entries[index], informationLevel, isUnicode, returnResumeKeys); + result.Add(infoEntry); + if (result.GetLength(isUnicode) > maxLength) + { + result.RemoveAt(result.Count - 1); + break; + } + } + return result; + } + + /// public static FindInformation GetFindInformation(FileSystemEntry entry, FindInformationLevel informationLevel, bool isUnicode, bool returnResumeKeys) { switch (informationLevel) diff --git a/SMBLibrary/Server/SMB1/Transaction2SubcommandHelper.cs b/SMBLibrary/Server/SMB1/Transaction2SubcommandHelper.cs index d294315..59434c7 100644 --- a/SMBLibrary/Server/SMB1/Transaction2SubcommandHelper.cs +++ b/SMBLibrary/Server/SMB1/Transaction2SubcommandHelper.cs @@ -29,6 +29,7 @@ namespace SMBLibrary.Server.SMB1 header.Status = searchStatus; return null; } + // We ignore SearchAttributes state.LogToServer(Severity.Verbose, "FindFirst2: Searched for '{0}', found {1} matching entries", fileNamePattern, entries.Count); // [MS-CIFS] If no matching entries are found, the server SHOULD fail the request with STATUS_NO_SUCH_FILE. @@ -40,18 +41,9 @@ namespace SMBLibrary.Server.SMB1 bool returnResumeKeys = (subcommand.Flags & FindFlags.SMB_FIND_RETURN_RESUME_KEYS) > 0; int entriesToReturn = Math.Min(subcommand.SearchCount, entries.Count); - // We ignore SearchAttributes - FindInformationList findInformationList = new FindInformationList(); - for (int index = 0; index < entriesToReturn; index++) - { - FindInformation infoEntry = SMB1FileSystemHelper.GetFindInformation(entries[index], subcommand.InformationLevel, header.UnicodeFlag, returnResumeKeys); - findInformationList.Add(infoEntry); - if (findInformationList.GetLength(header.UnicodeFlag) > state.GetMaxDataCount(header.PID)) - { - findInformationList.RemoveAt(findInformationList.Count - 1); - break; - } - } + List temp = entries.GetRange(0, entriesToReturn); + int maxLength = (int)state.GetMaxDataCount(header.PID).Value; + FindInformationList findInformationList = SMB1FileSystemHelper.GetFindInformationList(temp, subcommand.InformationLevel, header.UnicodeFlag, returnResumeKeys, maxLength); int returnCount = findInformationList.Count; Transaction2FindFirst2Response response = new Transaction2FindFirst2Response(); response.SetFindInformationList(findInformationList, header.UnicodeFlag); @@ -88,22 +80,10 @@ namespace SMBLibrary.Server.SMB1 } bool returnResumeKeys = (subcommand.Flags & FindFlags.SMB_FIND_RETURN_RESUME_KEYS) > 0; - FindInformationList findInformationList = new FindInformationList(); - for (int index = openSearch.EnumerationLocation; index < openSearch.Entries.Count; index++) - { - FindInformation infoEntry = SMB1FileSystemHelper.GetFindInformation(openSearch.Entries[index], subcommand.InformationLevel, header.UnicodeFlag, returnResumeKeys); - findInformationList.Add(infoEntry); - if (findInformationList.GetLength(header.UnicodeFlag) > state.GetMaxDataCount(header.PID)) - { - findInformationList.RemoveAt(findInformationList.Count - 1); - break; - } - - if (findInformationList.Count == subcommand.SearchCount) - { - break; - } - } + int maxLength = (int)state.GetMaxDataCount(header.PID).Value; + int maxCount = Math.Min(openSearch.Entries.Count - openSearch.EnumerationLocation, subcommand.SearchCount); + List temp = openSearch.Entries.GetRange(openSearch.EnumerationLocation, maxCount); + FindInformationList findInformationList = SMB1FileSystemHelper.GetFindInformationList(temp, subcommand.InformationLevel, header.UnicodeFlag, returnResumeKeys, maxLength); int returnCount = findInformationList.Count; Transaction2FindNext2Response response = new Transaction2FindNext2Response(); response.SetFindInformationList(findInformationList, header.UnicodeFlag);