Skip to content

Commit 868a224

Browse files
committed
gh-145307: Defer loading psapi.dll until ctypes.util.dllist() is called.
1 parent 171e0fa commit 868a224

2 files changed

Lines changed: 16 additions & 10 deletions

File tree

Lib/ctypes/util.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,24 +85,28 @@ def find_library(name):
8585
wintypes.DWORD,
8686
)
8787

88-
_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-
)
97-
9888
def _get_module_filename(module: wintypes.HMODULE):
9989
name = (wintypes.WCHAR * 32767)() # UNICODE_STRING_MAX_CHARS
10090
if _k32_get_module_file_name(module, name, len(name)):
10191
return name.value
10292
return None
10393

10494

95+
_enum_process_modules = None
96+
10597
def _get_module_handles():
98+
global _enum_process_modules
99+
if _enum_process_modules is None:
100+
_psapi = ctypes.WinDLL('psapi', use_last_error=True)
101+
_enum_process_modules = _psapi["EnumProcessModules"]
102+
_enum_process_modules.restype = wintypes.BOOL
103+
_enum_process_modules.argtypes = (
104+
wintypes.HANDLE,
105+
ctypes.POINTER(wintypes.HMODULE),
106+
wintypes.DWORD,
107+
wintypes.LPDWORD,
108+
)
109+
106110
process = _get_current_process()
107111
space_needed = wintypes.DWORD()
108112
n = 1024
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Defers loading of the ``psapi.dll`` module until it is used by
2+
:func:`ctypes.util.dllist`.

0 commit comments

Comments
 (0)