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