{"record":{"id":"96e4cca90e33469e","repo":"peass-ng/PEASS-ng","slug":"resources-no-drive-letters-available","errorCode":null,"errorMessage":"Resources.No_Drive_Letters_Available","messagePattern":"Resources\\.No_Drive_Letters_Available","errorType":"validation","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"winPEAS/winPEASexe/winPEAS/3rdParty/AlphaFS/Device/DriveInfo.cs","lineNumber":311,"sourceCode":"\n\n      /// <summary>Gets an available drive letter on the local system.</summary>\n      /// <param name=\"getLastAvailable\">When <c>true</c> get the last available drive letter. When <c>false</c> gets the first available drive letter.</param>\n      /// <returns>A drive letter as <see cref=\"char\"/>. When no drive letters are available, an exception is thrown.</returns>\n      /// <remarks>The letters \"A\" and \"B\" are reserved for floppy drives and will never be returned by this function.</remarks>\n      /// <exception cref=\"ArgumentOutOfRangeException\">No drive letters available.</exception>\n      [SuppressMessage(\"Microsoft.Design\", \"CA1024:UsePropertiesWhereAppropriate\")]\n      public static char GetFreeDriveLetter(bool getLastAvailable)\n      {\n         var freeDriveLetters = \"CDEFGHIJKLMNOPQRSTUVWXYZ\".Except(Directory.EnumerateLogicalDrivesCore(false, false).Select(d => d.Name[0]));\n\n         try\n         {\n            return getLastAvailable ? freeDriveLetters.Last() : freeDriveLetters.First();\n         }\n         catch\n         {\n            throw new ArgumentOutOfRangeException(Resources.No_Drive_Letters_Available);\n         }\n      }\n\n      #endregion // Methods\n\n\n      #region Private Methods\n\n      /// <summary>Retrieves information about the file system and volume associated with the specified root file or directorystream.</summary>\n      [SuppressMessage(\"Microsoft.Maintainability\", \"CA1502:AvoidExcessiveComplexity\")]\n      [SuppressMessage(\"Microsoft.Design\", \"CA1031:DoNotCatchGeneralExceptionTypes\")]\n      [SecurityCritical]\n      private object GetDeviceInfo(int type, int mode)\n      {\n         try\n         {\n            switch (type)\n            {","sourceCodeStart":293,"sourceCodeEnd":329,"githubUrl":"https://github.com/peass-ng/PEASS-ng/blob/53fb989abc2219826385683a6fee826bd6cd38d6/winPEAS/winPEASexe/winPEAS/3rdParty/AlphaFS/Device/DriveInfo.cs#L293-L329","documentation":"AlphaFS GetFreeDriveLetter collects available drive letters and throws ArgumentOutOfRangeException(Resources.No_Drive_Letters_Available) inside a catch when the candidate list is empty (First()/Last() on an empty sequence). It means the system has no unoccupied drive letters (A-Z all in use).","triggerScenarios":"Calling GetFreeDriveLetter() (or GetFreeDriveLetter(true)) when every drive letter A–Z is already mapped/occupied, so freeDriveLetters is empty and First()/Last() throws.","commonSituations":"Machines with many mapped network drives, mounted VHDs, and subst drives exhausting all 26 letters; container/imaging systems that map everything; repeated drive mounting without cleanup.","solutions":["Free a drive letter: disconnect unused mapped drives ('net use * /delete' selectively) or remove subst mappings","Check occupied letters with 'net use' / Get-PSDrive and clean up stale mappings before retrying","Enumerate existing letters yourself and fail gracefully with a clear message instead of calling GetFreeDriveLetter","Reduce automatic mountpoints (VHDs, network shares) or use UNC paths instead of drive letters"],"exampleFix":"// before\nvar letter = DriveInfo.GetFreeDriveLetter(); // throws when full\n// after\nvar used = System.IO.DriveInfo.GetDrives().Select(d => d.Name[0]).ToHashSet();\nvar free = Enumerable.Range('A', 26).Select(c => (char)c).Where(c => !used.Contains(c)).ToList();\nif (!free.Any()) throw new InvalidOperationException(\"No free drive letters; disconnect unused drives.\");\nvar letter = free[0];","handlingStrategy":"try-catch","validationCode":"var used = System.IO.DriveInfo.GetDrives().Select(d => d.Name[0]).ToHashSet();\nbool hasFree = Enumerable.Range('A', 26).Any(c => !used.Contains((char)c));\nif (!hasFree) throw new InvalidOperationException(\"All drive letters are in use.\");","typeGuard":null,"tryCatchPattern":"try\n{\n    var letter = AlphaFS.Device.DriveInfo.GetFreeDriveLetter();\n}\ncatch (ArgumentOutOfRangeException)\n{\n    // all 26 letters used: free one up or fail gracefully\n    Console.Error.WriteLine(\"No free drive letters; disconnect unused drives.\");\n}","preventionTips":["Monitor mapped drives on servers that mount many shares","Clean up subst/mapped drives when done","Prefer UNC paths over temporary drive mappings","Alert when free drive letters fall below a threshold"],"tags":["csharp","argument-out-of-range","alphafs","drive-letters"],"backgroundTag":"no-drive-letters-available","analyzedSha":"53fb989abc2219826385683a6fee826bd6cd38d6","analyzedAt":"2026-09-02T04:25:09.259Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T11:17:12.671Z"}