gh-145307: Defer loading psapi.dll until ctypes.util.dllist() is call… · python/cpython@1cf5abe

GitHub

Original file line numberDiff line numberDiff line change@@ -85,24 +85,30 @@ def find_library(name):

8585wintypes.DWORD,

8686 )

878788-_psapi=ctypes.WinDLL('psapi', use_last_error=True)

89-_enum_process_modules=_psapi["EnumProcessModules"]

90-_enum_process_modules.restype=wintypes.BOOL

91-_enum_process_modules.argtypes= (

92-wintypes.HANDLE,

93-ctypes.POINTER(wintypes.HMODULE),

94-wintypes.DWORD,

95-wintypes.LPDWORD,

96- )

88+# gh-145307: We defer loading psapi.dll until _get_module_handles is called.

89+# Loading additional DLLs at startup for functionality that may never be

90+# used is wasteful.

91+_enum_process_modules=None

97929893def_get_module_filename(module: wintypes.HMODULE):

9994name= (wintypes.WCHAR*32767)() # UNICODE_STRING_MAX_CHARS

10095if_k32_get_module_file_name(module, name, len(name)):

10196returnname.value

10297returnNone

10398104-10599def_get_module_handles():

100+global_enum_process_modules

101+if_enum_process_modulesisNone:

102+_psapi=ctypes.WinDLL('psapi', use_last_error=True)

103+_enum_process_modules=_psapi["EnumProcessModules"]

104+_enum_process_modules.restype=wintypes.BOOL

105+_enum_process_modules.argtypes= (

106+wintypes.HANDLE,

107+ctypes.POINTER(wintypes.HMODULE),

108+wintypes.DWORD,

109+wintypes.LPDWORD,

110+ )

111+106112process=_get_current_process()

107113space_needed=wintypes.DWORD()

108114n=1024