From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mx.groups.io with SMTP id smtpd.web10.2557.1601083731831999581 for ; Fri, 25 Sep 2020 18:28:51 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.115, mailfrom: nathaniel.l.desimone@intel.com) IronPort-SDR: t2Fqd5TZOgr8u28i46GS90OzhywWjlG/6yar14o14Pd0j6k8eV5JmtKbVW1/Vi7DntNoaKKuEk dejJjwjYvSUw== X-IronPort-AV: E=McAfee;i="6000,8403,9755"; a="160930074" X-IronPort-AV: E=Sophos;i="5.77,303,1596524400"; d="scan'208";a="160930074" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Sep 2020 18:28:49 -0700 IronPort-SDR: ng1cmDkf7FGdU6QxoiPHafaFEx5ONFKOGoYsxth/UVhu2lqvr5xU5rDjS+1NqcW3uKJDbWvuRh ghfn7QVRFa7w== X-IronPort-AV: E=Sophos;i="5.77,303,1596524400"; d="scan'208";a="513245996" Received: from nldesimo-desk1.amr.corp.intel.com ([10.212.4.151]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Sep 2020 18:28:48 -0700 From: "Nate DeSimone" To: devel@edk2.groups.io Cc: Ashley E Desimone , Puja Pandya , Bret Barkelew , Prince Agyeman , Erik Bjorge Subject: [edk2-staging/EdkRepo] [PATCH V3 1/2] EdkRepo: Add function to enumerate subst drives Date: Fri, 25 Sep 2020 18:28:25 -0700 Message-Id: <20200926012826.4976-2-nathaniel.l.desimone@intel.com> X-Mailer: git-send-email 2.27.0.windows.1 In-Reply-To: <20200926012826.4976-1-nathaniel.l.desimone@intel.com> References: <20200926012826.4976-1-nathaniel.l.desimone@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Cc: Ashley E Desimone Cc: Puja Pandya Cc: Bret Barkelew Cc: Prince Agyeman Cc: Erik Bjorge Signed-off-by: Nate DeSimone --- edkrepo/common/pathfix.py | 50 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/edkrepo/common/pathfix.py b/edkrepo/common/pathfix.py index 1a9c20f..2775442 100644 --- a/edkrepo/common/pathfix.py +++ b/edkrepo/common/pathfix.py @@ -3,7 +3,7 @@ ## @file # checkout_command.py # -# Copyright (c) 2018- 2020, Intel Corporation. All rights reserved.
+# Copyright (c) 2018 - 2020, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # import os @@ -11,6 +11,7 @@ import sys if sys.platform == "win32": from ctypes import windll, POINTER, byref, GetLastError, Structure, WinError from ctypes import c_void_p, c_ushort, c_int, c_ulong, c_wchar, c_wchar_p + from ctypes import create_unicode_buffer def _is_wow64_process(): kernel32 = windll.kernel32 @@ -211,3 +212,50 @@ def expanduser(path): userhome = os.path.join(os.path.dirname(userhome), path[1:i]) return userhome + path[i:] + +def get_subst_drive_dict(): + if sys.platform != "win32": + return {} + def _query_subst_drive(drive_letter): + kernel32 = windll.kernel32 + QueryDosDevice = kernel32.QueryDosDeviceW + QueryDosDevice.argtypes = [c_wchar_p, c_wchar_p, c_ulong] + QueryDosDevice.restype = c_ulong + MAX_PATH = 260 + + if len(drive_letter) > 1 or len(drive_letter) == 0: + raise ValueError("Bad drive letter") + drive = '{}:'.format(drive_letter.upper()) + drive_buffer = create_unicode_buffer(drive) + target_path_buffer_size = c_ulong(MAX_PATH) + target_path_buffer = create_unicode_buffer(target_path_buffer_size.value) + while True: + count = QueryDosDevice(drive_buffer, target_path_buffer, target_path_buffer_size) + if count == 0: + last_error = GetLastError() + if last_error == 122: #ERROR_INSUFFICIENT_BUFFER + #Increase the buffer size and try again + target_path_buffer_size = c_ulong((target_path_buffer_size.value * 161) / 100) + target_path_buffer = create_unicode_buffer(target_path_buffer_size.value) + elif last_error == 2: #ERROR_FILE_NOT_FOUND + #This is an invalid drive, return an empty string + return '' + else: + raise WinError(last_error) + else: + break + target_path = target_path_buffer.value + if len(target_path) > 4 and target_path[0:4] == '\\??\\': + if (ord(target_path[4]) >= ord('A') and ord(target_path[4]) <= ord('Z')) or \ + (ord(target_path[4]) >= ord('a') and ord(target_path[4]) <= ord('z')): + #This is a SUBST'd drive, return the path + return target_path[4:].strip() + #This is a non-SUBST'd (aka real) drive, return an empty string + return '' + subst_dict = {} + for index in range(26): + drive_letter = chr(ord('A') + index) + target_path = _query_subst_drive(drive_letter) + if target_path != '': + subst_dict[drive_letter] = target_path + return subst_dict -- 2.27.0.windows.1